/******************************************************************
* PTlink Services is (C) CopyRight PTlink IRC Software 1999-2005 *
* http://software.pt-link.net *
* This program is distributed under GNU Public License *
* Please read the file COPYING for copyright information. *
******************************************************************
File: ns_drop.c
Description: nickserv drop command
* $Id: ns_drop.c,v 1.4 2005/10/11 16:13:06 jpinto Exp $
*/
#include "module.h"
#include "encrypt.h" /* we need encrypted_password() */
#include "nickserv.h"
#include "nsmacros.h"
#include "my_sql.h"
#include "ns_group.h"
/* lang files */
#include "lang/common.lh"
#include "lang/ns_drop.lh"
SVS_Module mod_info =
/* module, version, description */
{ "ns_drop", "2.1","nickserv drop command" };
/* Change Log
2.1 - 0000305: foreign keys for data integrity
2.0 - 0000265: remove nickserv cache system
1.1 - 0000246: help display with group filter
*/
/* external functions we need */
ServiceUser* (*nickserv_suser)(void);
u_int32_t (*find_group)(char *name);
int e_nick_delete;
MOD_REQUIRES
MOD_FUNC(nickserv_suser)
MOD_FUNC(e_nick_delete)
MOD_FUNC(is_sadmin)
MOD_FUNC(find_group)
MOD_END
/* internal functions */
void drop_nick(u_int32_t snid, char* nick);
/* available commands from module */
void ns_drop(IRC_User *s, IRC_User *u);
void ns_sdrop(IRC_User *s, IRC_User *u);
/* Local settings */
/* Local vars */
ServiceUser* nsu;
int ns_log;
int mod_load(void)
{
ns_log = log_handle("nickserv");
nsu = nickserv_suser();
suser_add_cmd(nsu, "DROP", ns_drop, DROP_SUMMARY, DROP_HELP);
suser_add_cmd_g(nsu, "SDROP", ns_sdrop, SDROP_SUMMARY, SDROP_HELP,
find_group("Admin"));
return 0;
}
void mod_unload(void)
{
suser_del_mod_cmds(nsu, &mod_info);
}
/* Internal Functions */
void drop_nick(u_int32_t snid, char* nick)
{
log_log(ns_log, mod_info.name, "Dropping snid %d, nick %s", snid, nick);
/* call related actions */
mod_do_event(e_nick_delete, &snid, NULL);
/* and delete it */
sql_execute("DELETE FROM nickserv WHERE snid=%d", snid);
}
/* s = service the command was sent to
u = user the command was sent from */
void ns_drop(IRC_User *s, IRC_User *u)
{
u_int32_t source_snid;
char *nick_sec = NULL;
char* securitycode = strtok(NULL, " ");
CHECK_IF_IDENTIFIED_NICK
if(sql_singlequery("SELECT securitycode FROM nickserv_security WHERE snid=%d",
source_snid))
{
if(sql_field(0))
{
nick_sec = malloc(16);
memcpy(nick_sec, hex_bin(sql_field(0)), 16);
}
}
if(nick_sec && IsAuthenticated(u))
{
if(IsNull(securitycode))
{
send_lang(u, s, DROP_SECURITY_REQUIRED);
FREE(nick_sec);
return;
}
else if(memcmp(nick_sec, encrypted_password(securitycode), 16) != 0)
{
send_lang(u, s, INVALID_SECURITY_CODE);
FREE(nick_sec);
return;
}
}
FREE(nick_sec);
drop_nick(source_snid, u->nick);
u->snid = 0;
u->flags = 0;
u->status = 0;
irc_SvsMode(u, s, "-r");
send_lang(u, s, NICK_DROPPED);
}
void ns_sdrop(IRC_User *s, IRC_User *u)
{
u_int32_t source_snid;
u_int32_t snid;
char *nick;
nick = strtok(NULL, " ");
CHECK_IF_IDENTIFIED_NICK
if(!is_sadmin(source_snid))
send_lang(u, s, ONLY_FOR_SADMINS);
else if(IsNull(nick))
send_lang(u, s, NICK_SDROP_SYNTAX);
else if((snid = nick2snid(nick)) == 0)
send_lang(u, s, NICK_X_NOT_REGISTERED, nick);
else
{
IRC_User *target = irc_FindUser(nick);
drop_nick(snid, nick);
if(target && target->snid)
{
target->snid = 0;
target->status = 0;
target->flags = 0;
irc_SvsMode(target, s, "-r");
}
log_log(ns_log, mod_info.name, "%s SDROPPED nick: %s", u->nick, nick);
send_lang(u, s, NICK_SDROPPED, nick);
}
}
syntax highlighted by Code2HTML, v. 0.9.1