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