/******************************************************************
 * 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