/******************************************************************
* 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_getpass.c
Description: nickserv auth command
* $Id: ns_getpass.c,v 1.5 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_getpass.lh"
SVS_Module mod_info =
/* module, version, description */
{"ns_getpass", "1.0", "nickserv getpass/getsec command" };
/* Change Log
1.0 -
*/
/* external functions we need */
ServiceUser* (*nickserv_suser)(void);
MOD_REQUIRES
MOD_FUNC(nickserv_suser)
EMAIL_FUNCTIONS
MOD_END
/* functions we provide */
void ns_getpass(IRC_User *s, IRC_User *u);
void ns_getsec(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, "GETPASS", ns_getpass, GETPASS_SUMMARY, GETPASS_HELP);
suser_add_cmd(nsu, "GETSEC", ns_getsec, GETSEC_SUMMARY, GETSEC_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_getpass(IRC_User *s, IRC_User *u)
{
char *auth;
char *target;
char *email = NULL;
char *nick = NULL;
int diff = 1;
u_int32_t snid;
int lang = 0;
target = strtok(NULL, " ");
auth = strtok(NULL, " ");
if(!target || !auth)
send_lang(u, s, INVALID_GETPASS_SYNTAX);
else
if((snid = nick2snid(target)) == 0)
send_lang(u, s, NICK_X_NOT_REGISTERED, target);
else
{
u_int32_t flags = 0;
if(sql_singlequery("SELECT flags, email, nick, lang FROM nickserv WHERE snid=%d", snid) == 0)
return ;
flags = sql_field_i(0);
lang = sql_field_i(3);
if(((flags & NFL_AUTHENTIC) == 0) || (sql_field(1) == NULL))
{
send_lang(u, s, NICK_X_NOT_AUTHENTICATED, sql_field(2));
return;
}
email = strdup(sql_field(1));
nick = strdup(sql_field(2));
if(sql_singlequery("SELECT securitycode FROM nickserv_security WHERE snid=%d",
snid) && sql_field(0))
{
diff = memcmp(hex_bin(sql_field(0)), encrypted_password(auth), 16);
}
if(diff != 0)
send_lang(u, s, INVALID_SECURITY_CODE);
else
{
char buf[512];
char *email_body;
log_log(ns_log, mod_info.name, "Nick %s used GETPASS for %s, %s",
u->nick, nick, email);
email_body = strdup(lang_str_l(lang, GETPASS_BODY_X_X, nick, sql_field(0)));
snprintf(buf, sizeof(buf),
"From: \"%%from_name%%\" <%%from%%>\r\nTo:\"%s\" <%s>\r\nSubject:%s\r\n\r\n%s",
nick, email,
lang_str_l(lang, GETPASS_SUBJECT),
email_body
);
free(email_body);
email_init_symbols();
email_add_symbol("email", email);
email_send(buf);
send_lang(u, s, GETPASS_CHECK_EMAIL_X, email);
}
FREE(nick);
FREE(email);
}
}
/* s = service the command was sent to
u = user the command was sent from */
void ns_getsec(IRC_User *s, IRC_User *u)
{
char *email = NULL;
u_int32_t source_snid;
char *email_body;
char buf[512];
CHECK_IF_IDENTIFIED_NICK
if(sql_singlequery("SELECT email FROM nickserv WHERE snid=%d", source_snid) == 0)
return ;
if(((u->flags & NFL_AUTHENTIC) == 0) || (sql_field(0) == NULL))
{
send_lang(u, s, NICK_X_NOT_AUTHENTICATED, u->nick);
return;
}
email = strdup(sql_field(0));
if((sql_singlequery("SELECT securitycode FROM nickserv_security WHERE snid=%d",
source_snid) == 0) || (sql_field(0) == NULL))
{
FREE(email);
return; /* this should never happen */
}
log_log(ns_log, mod_info.name, "Nick %s used GETSEC, %s",
u->nick, email);
email_body = strdup(lang_str_l(u->lang, GETSEC_BODY_X_X, email, sql_field(0)));
snprintf(buf, sizeof(buf),
"From: \"%%from_name%%\" <%%from%%>\r\nTo:\"%s\" <%s>\r\nSubject:%s\r\n\r\n%s",
u->nick, email,
lang_str_l(u->lang, GETSEC_SUBJECT),
email_body
);
free(email_body);
email_init_symbols();
email_add_symbol("email", email);
email_send(buf);
send_lang(u, s, GETSEC_CHECK_EMAIL_X, email);
FREE(email);
}
syntax highlighted by Code2HTML, v. 0.9.1