/******************************************************************
* 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_auth.c
Description: nickserv auth command
* $Id: ns_auth.c,v 1.4 2005/10/11 16:13:06 jpinto Exp $
*/
#include "module.h"
#include "nickserv.h"
#include "encrypt.h"
#include "email.h"
#include "my_sql.h"
#include "nsmacros.h"
#include "lang/common.lh"
#include "lang/ns_auth.lh"
SVS_Module mod_info =
/* module, version, description */
{"ns_auth", "2.1", "nickserv auth command" };
/* Change Log
2.1 - #61: MaxTimeForAuth setting to expire unauthenticated nicks
2.0 - 0000265: remove nickserv cache system
*/
/* external functions we need */
ServiceUser* (*nickserv_suser)(void);
int (*update_nick_online_info)(IRC_User* u, u_int32_t snid, int lang);
MOD_REQUIRES
MOD_FUNC(nickserv_suser)
MOD_FUNC(update_nick_online_info)
MOD_END
/* functions we provide */
void ns_auth(IRC_User *s, IRC_User *u);
/* local variables */
static ServiceUser* nsu;
int ns_log;
/* module initialization */
int mod_load(void)
{
ns_log = log_handle("nickserv");
/* get service user */
nsu = nickserv_suser();
/* add command */
suser_add_cmd(nsu, "AUTH", ns_auth, AUTH_SUMMARY, AUTH_HELP);
return 0;
}
void mod_unload(void)
{
suser_del_mod_cmds(nsu, &mod_info);
}
/* s = service the command was sent to
u = user the command was sent from */
void ns_auth(IRC_User *s, IRC_User *u)
{
u_int32_t source_snid;
char *auth;
char *nick_sec = NULL;
char *email = NULL;
/* status validation */
CHECK_IF_IDENTIFIED_NICK
auth = strtok(NULL, " ");
if(sql_singlequery("SELECT email FROM nickserv WHERE snid=%d",
source_snid) && sql_field(0))
email = strdup(sql_field(0));
if(sql_singlequery("SELECT securitycode FROM nickserv_security WHERE snid=%d",
source_snid) && sql_field(0))
{
nick_sec = malloc(16);
memcpy(nick_sec, hex_bin(sql_field(0)), 16);
}
/* syntax validation */
if(IsNull(auth))
send_lang(u, s, NICK_AUTH_SYNTAX);
/* check requirements */
else if((email == NULL)|| (nick_sec == NULL)
|| IsAuthenticated(u))
send_lang(u, s, NO_PENDING_AUTH);
/* privileges validation */
else if(memcmp(nick_sec, encrypted_password(auth), 16) != 0)
send_lang(u, s, INVALID_SECURITY_CODE);
/* execute operation */
else
{
log_log(ns_log, mod_info.name, "Nick %s authenticated email %s",
u->nick, email);
send_lang(u, s, AUTH_OK);
irc_SvsMode(u, s, "+r");
SetAuthenticated(u);
update_nick_online_info(u, u->snid, u->lang);
sql_execute("UPDATE nickserv SET flags=(flags | %d) WHERE snid=%d",
NFL_AUTHENTIC, source_snid);
}
FREE(email);
FREE(nick_sec);
}
syntax highlighted by Code2HTML, v. 0.9.1