Exemple #1
0
/*
[Dec 30 16:03:09.300934 2005] Source inspircd.nomadirc.net
[Dec 30 16:03:09.300990 2005] av[0] = Q
[Dec 30 16:03:09.301046 2005] av[1] = ChanServ
[Dec 30 16:03:09.301102 2005] av[2] = <Config>
[Dec 30 16:03:09.301158 2005] av[3] = 1135968312
[Dec 30 16:03:09.301214 2005] av[4] = 0
[Dec 30 16:03:09.301270 2005] av[5] = Reserved For Services

*/
int denora_event_addline(char *source, int ac, char **av)
{
    char *user, *host;
    int checkdur, timeset;
    char buf[BUFSIZE];
    checkdur = atoi(av[4]);
    timeset = atoi(av[3]);

    if (checkdur != 0) {
        ircsnprintf(buf, BUFSIZE, "%ld", (long int) (checkdur + timeset));
    } else {
        ircsnprintf(buf, BUFSIZE, "%ld", (long int) checkdur);
    }

    if (!stricmp(av[0], "G") || !stricmp(av[0], "E")) {
        user = myStrGetToken(av[1], '@', 0);
        host = myStrGetToken(av[1], '@', 1);
        sql_do_server_bans_add(av[0], user, host, av[2], av[3], buf,
                               av[5]);
        if (user)
            free(user);
        if (host)
            free(host);
    } else if (!stricmp(av[0], "Q")) {
        sql_do_server_bans_add(av[0], (char *) "*", av[1], av[2], av[3],
                               buf, av[5]);
    } else {
        sql_do_server_bans_add(av[0], (char *) "", av[1], av[2], av[3],
                               buf, av[5]);
    }
    return MOD_CONT;
}
Exemple #2
0
/**
* Provide the user interface to add/remove a qdb ban from a nickname
* @param u The user who executed this command
* @return MOD_CONT if we want to process other commands in this command
* stack, MOD_STOP if we dont
**/
int myAddQDBBan(User * u)
{
	char *text;
	char *nick;
	char *command;
	char *setting;
	int stop = 0;
	NickCore *nc;
	NickAlias *na;

	text = moduleGetLastBuffer();
	if (text) {
		nick = myStrGetToken(text, ' ', 0);
		if (nick) {
			command = myStrGetToken(text, ' ', 1);
			if (command) {
				if (stricmp(command, "QDBBAN") == 0) {
					setting = myStrGetToken(text, ' ', 2);
					if (setting) {
						if (!(na = findnick(nick))) {
							notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
						}
						else {
							nc = na->nc;

							if (stricmp(setting, "ON") == 0) {
								moduleAddData(&nc->moduleData, "qdbban", "on");
								moduleNoticeLang(s_NickServ, u, QDBBAN_ADD_SUCCESS, nc->display);
								alog("ns_qdbban: %s!%s@%s banned %s from using the QDB", u->nick, u->username, u->host, nc->display);
							}
							else if (stricmp(setting, "OFF") == 0) {
								moduleDelData(&nc->moduleData, "qdbban");
								moduleNoticeLang(s_NickServ, u, QDBBAN_DEL_SUCCESS, nc->display);
								alog("ns_qdbban: %s!%s@%s unbanned %s from using the QDB", u->nick, u->username, u->host, nc->display);
							}
							else {
								moduleNoticeLang(s_NickServ, u, QDBBAN_HELP);
							}
						}
						free(setting);
					}
					else {
						moduleNoticeLang(s_NickServ, u, QDBBAN_HELP);
					}

					stop = 1;
				}
				free(command);
			}
			free(nick);
		}
	}

	if (stop == 0) {
		return MOD_CONT;
	}
	else {
		return MOD_STOP;
	}
}
Exemple #3
0
int denora_event_eline(char *source, int ac, char **av)
{
    char *user, *host;
    int checkdur;
    char buf[BUFSIZE];
    char buf2[BUFSIZE];

    user = myStrGetToken(av[0], '@', 0);
    host = myStrGetToken(av[0], '@', 1);

    if (ac >= 3) {
        ircsnprintf(buf, BUFSIZE, "%ld", (long int) time(NULL));
        checkdur = atoi(av[1]);
        if (checkdur != 0) {
            ircsnprintf(buf2, BUFSIZE, "%ld",
                        (long int) checkdur + time(NULL));
        } else {
            ircsnprintf(buf2, BUFSIZE, "%ld", (long int) checkdur);
        }
        sql_do_server_bans_add((char *) "E", user, host, source, buf, buf2,
                               av[2]);
    } else {
        sql_do_server_bans_remove((char *) "E", user, host);
    }
    if (user)
        free(user);
    if (host)
        free(host);
    return MOD_CONT;
}
Exemple #4
0
 int do_redirect (User *u) {
     char *buf = moduleGetLastBuffer();
     User *target= NULL;
     Channel *c;
     ChannelInfo *ci;
     char *nick = myStrGetToken (buf,' ', 0);
     char *chan1 = myStrGetToken (buf,' ', 1);
     char *chan2 = myStrGetToken (buf,' ', 2);
     
     if (!u ||!chan1||!nick||!chan2)
     {
                  if (nick) free(nick);
                  if (chan1) free(chan1);
                  if (chan2) free(chan2);
                  return MOD_STOP;
     }
     if (!(target = finduser(nick))) 
     {
                  notice (s_OperServ, u->nick,"No such user to redirect");
                  if (nick) free(nick);
                  if (chan1) free(chan1);
                  if (chan2) free(chan2);
                  return MOD_STOP;
     }
     if (!(ci = cs_findchan(chan1)))
     {
              if (nick) free(nick);
              if (chan1) free(chan1);
              if (chan2) free(chan2);
              return MOD_STOP;
     }
     if (!(c = findchan(ci->name)))
     {
                 notice (s_OperServ, u->nick,"No such channel to be redirected from.");
                 if (nick) free(nick);
                 if (chan1) free(chan1);
                 if (chan2) free(chan2);
                 return MOD_STOP;        
     }
     if (!(is_on_chan(c,target)))
     {
                 notice (s_OperServ, u->nick,"User %s is not in this channel", target->nick);
                 if (nick) free(nick);
                 if (chan1) free(chan1);
                 if (chan2) free(chan2);
                 return MOD_STOP;
     }
    
    notice (s_OperServ, u->nick,"Redirecting user %s from channel %s to channel %s",target->nick,chan1,chan2);
    wallops(c->ci->bi->nick, "%s redirected %s from channel %s to channel %s .", u->nick, nick, c->name , chan2); 
	anope_cmd_svspart(c->ci->bi->nick, nick, c->name);
	anope_cmd_svsjoin(s_OperServ, target->nick, chan2, NULL);
    notice (s_OperServ, target->nick,"You have been redirected from channel %s to channel %s by operator %s", chan1,chan2,u->nick);
    if (nick) free(nick);
    if (chan1) free(chan1);
    if (chan2) free(chan2);
 
     /* Halt processing */
     return MOD_STOP;
 }
Exemple #5
0
/* PONG */
void nefarious_cmd_pong(char *servname, char *who)
{
    char *t, *s;
    uint32 ts, tsnow, value;
    t = myStrGetToken(who, '!', 1);
    s = myStrGetToken(t, '.', 0);
    if (!s) {
        ts = 0;
    } else {
        ts = strtol(s, NULL, 10);
    }
    tsnow = time(NULL);
    value = tsnow - ts;
    if (denora->protocoldebug) {
        alog(LOG_PROTOCOL, "PONG: Server Name %s : Who %s", servname, who);
    }
    send_cmd(p10id, "Z %s %ld %ld %ld %s", p10id, (long int) ts,
             (long int) tsnow, (long int) value, militime_float(NULL));
    if (s) {
        free(s);
    }
    if (t) {
        free(t);
    }
}
Exemple #6
0
int my_ns_set(User * u)
{
    char *cur_buffer;
    char *set;
    char *email;
    int ret;

    cur_buffer = moduleGetLastBuffer();
    set = myStrGetToken(cur_buffer, ' ', 0);
	
	if (!set)
		return MOD_CONT;
	
    if (stricmp(set, "email") != 0) {
        free(set);
        return MOD_CONT;
    }

    free(set);
    email = myStrGetToken(cur_buffer, ' ', 1);
	if (!email)
		return MOD_CONT;

    ret = check_email_limit_reached(email, u);
    free(email);

    return ret;
}
static void hsreq_load_db(void)
{
    FILE *fp;
    char *filename;
    char readbuf[1024];
    char *nick, *vident, *vhost, *creator, *tmp;
    int32 tmp_time;
    char *buf;

    if (HSRequestDBName)
        filename = HSRequestDBName;
    else
        filename = HSREQ_DEFAULT_DBNAME;

    fp = fopen(filename, "r");
    if (!fp) {
        alog("[hs_request] Unable to open database ('%s') for reading",
             filename);
        return;
    }

    while (fgets(readbuf, 1024, fp)) {
        buf = normalizeBuffer(readbuf);
        if (buf || *buf) {
            nick = myStrGetToken(buf, ':', 0);
            vident = myStrGetToken(buf, ':', 1);
            vhost = myStrGetToken(buf, ':', 2);
            tmp = myStrGetToken(buf, ':', 3);
            if (tmp) {
                tmp_time = strtol(tmp, (char **) NULL, 16);
                free(tmp);
            } else {
                tmp_time = 0;
            }
            creator = myStrGetToken(buf, ':', 4);
            if (!nick || !vident || !vhost || !creator) {
                alog("[hs_request] Error while reading database, skipping record");
                continue;
            }
            if (stricmp(vident, "(null)") == 0) {
                free(vident);
                vident = NULL;
            }
            my_add_host_request(nick, vident, vhost, creator, tmp_time);
            free(nick);
            free(vhost);
            free(creator);
            if (vident)
                free(vident);
        }
        free(buf);
    }

    fclose(fp);

    if (debug)
        alog("[hs_request] Succesfully loaded database");
}
Exemple #8
0
int denora_event_push(char *source, int ac, char **av)
{
/* Thanks to w00t from the inspircd team for helping me to write this function
 * debug: Received: :rock.musichat.net PUSH TestBOT ::rock.musichat.net 242 TestBOT :Server up 1 days, 07:47:54
 */
    Server *s;
    char *num;
    char buf[NET_BUFSIZE];

    if (denora->protocoldebug) {
        protocol_debug(source, ac, av);
    }

    num = myStrGetToken(av[1], ' ', 1);
    av[1] = myStrGetTokenRemainder(av[1], ' ', 3);

    if (!num || !av[1]) {
        alog(LOG_ERROR,
             "ERROR: Something wicked while handling the PUSH message (truncated message)");
        return MOD_CONT;
    }

    if (!strcmp(num, "375")) {
        rdb_query(QUERY_LOW, "UPDATE %s SET motd=\'\' WHERE server=\'%s\'",
                  ServerTable, source);
    } else if (!strcmp(num, "372")) {
        s = server_find(source);
        if (!s) {
            return MOD_CONT;
        }
        av[1]++;
        if (ac >= 2) {
            if (s->motd) {
                ircsnprintf(buf, NET_BUFSIZE - 1, "%s\n\r%s", s->motd,
                            av[1]);
                free(s->motd);
                s->motd = sstrdup(buf);
            } else {
                s->motd = sstrdup(av[1]);
            }
        }
    } else if (!strcmp(num, "376")) {
        s = server_find(source);
        if (!s) {
            return MOD_CONT;
        }
        sql_motd_store(s);
    } else if (!strcmp(num, "242")) {
        av[1]++;
        sql_do_uptime(source, av[1]);
    } else if (!strcmp(num, "248")) {
        av[2] = myStrGetTokenRemainder(av[1], ' ', 1);
        av[1] = myStrGetToken(av[1], ' ', 1);   /* possible memleak at this location */
        sql_uline(av[2]);
    }
    return MOD_CONT;
}
Exemple #9
0
static int my_cs_enforce(User * u)
{
    char *cur_buffer;
    char *chan=NULL;
    char *what=NULL;
    Channel *c;
    ChannelInfo *ci;

    cur_buffer = moduleGetLastBuffer();
    chan = myStrGetToken(cur_buffer, ' ', 0);

    if (!chan) {
        moduleNoticeLang(s_ChanServ, u, LNG_ENFORCE_SYNTAX);
    } else if (!(c = findchan(chan))) {
        notice_lang(s_ChanServ, u, CHAN_X_NOT_IN_USE, chan);
    } else if (!(ci = c->ci)) {
        notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan);
    } else if (ci->flags & CI_VERBOTEN) {
        notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, ci->name);
    } else if (!is_services_admin(u) && !check_access(u, ci, CA_AKICK)) {
        notice_lang(s_ChanServ, u, PERMISSION_DENIED);
    } else {
        what = myStrGetToken(cur_buffer, ' ', 1);
        if (!what || (stricmp(what, "SET") == 0)) {
            do_enforce_set(c);
            moduleNoticeLang(s_ChanServ,u,LNG_CHAN_RESPONSE, what ? what : "SET");
        } else if (stricmp(what, "MODES") == 0) {
            do_enforce_modes(c);
            moduleNoticeLang(s_ChanServ,u,LNG_CHAN_RESPONSE,what);
        } else if (stricmp(what, "SECUREOPS") == 0) {
            do_enforce_secureops(c);
            moduleNoticeLang(s_ChanServ,u,LNG_CHAN_RESPONSE,what);
        } else if (stricmp(what, "RESTRICTED") == 0) {
            do_enforce_restricted(c);
            moduleNoticeLang(s_ChanServ,u,LNG_CHAN_RESPONSE,what);
        } else if (stricmp(what, "+R") == 0) {
            do_enforce_cmode_R(c);
            moduleNoticeLang(s_ChanServ,u,LNG_CHAN_RESPONSE,what);
        } else {
            moduleNoticeLang(s_ChanServ, u, LNG_ENFORCE_SYNTAX);
        }
    }

    if(chan) free(chan);
    if(what) free(what);

    return MOD_CONT;
}
Exemple #10
0
/**
* Load data from the db file, and populate our ChanBanInfo lines
* @return 0 for success
**/
int mLoadData(void)
{
	FILE *in;

	char *nick = NULL;
	int len = 0;

	NickCore *nc = NULL;

	/* will _never_ be this big thanks to the 512 limit of a message */
	char buffer[2000];
	if ((in = fopen(qdbBanDBName, "r")) == NULL) {
		alog("ns_qdbban: WARNING: can not open the %s database file! (it might not exist, this is not fatal)", qdbBanDBName);
		return 1;
	} else {
		while (fgets(buffer, 1500, in)) {
			nick = myStrGetToken(buffer, ' ', 0);
			if (nick) {
				len = strlen(nick);
				/* Take the \n from the end of the nick */
				nick[len - 1] = '\0';
				if ((nc = findcore(nick))) {
					moduleAddData(&nc->moduleData, "qdbban", "on");
				}
				free(nick);
			}
		}
		return 0;
	}
	return 0;
}
Exemple #11
0
/**
* Called after an svsadmin does a /ns info nick
* @param u The user who requested info
* @return MOD_CONT to continue processing commands or MOD_STOP to stop
**/
int myNickInfo(User * u)
{
	char *text;
	char *nick;
	char *data;
	NickCore *nc;
	NickAlias *na;

	if (is_services_oper(u)) {
		text = moduleGetLastBuffer();
		if (text) {
			nick = myStrGetToken(text, ' ', 0);
			if (nick) {
				if ((na = findnick(nick))) {
					nc = na->nc;

					if ((data = moduleGetData(&nc->moduleData, "qdbban"))) {
						notice_user(s_NickServ, u, "%s is banned from submitting to the QDB", na->nick);
					}

					if (data)
						free(data);
				}
				free(nick);
			}
		}
	}

	return MOD_CONT;
}
Exemple #12
0
/**
 * Handle NOTICE commands
 *
 * @param source is the nick of the person whom sent the notice
 * @param receiver is the nick whom it was sent to
 * @param msg is the message that was sent
 *
 * @return always returns MOD_CONT
 */
int m_notice(char *source, char *receiver, char *msg)
{
    char *temp = NULL;
    char *version;
    char *clean;

    if (BadPtr(source) || BadPtr(receiver) || BadPtr(msg)) {
        return MOD_CONT;
    }

    if (!stricmp(receiver, s_StatServ)
        || (s_StatServ_alias && !stricmp(receiver, s_StatServ_alias))) {
        clean = normalizeBuffer(msg);
        doCleanBuffer((char *) clean);
        temp = myStrGetToken(clean, ' ', 0);
        if (!temp) {
            free(clean);
            return MOD_CONT;
        }
        if (!stricmp(temp, "VERSION")) {
            version = myStrGetTokenRemainder(clean, ' ', 1);
            handle_ctcp_version(source, version);
            free(version);
        }
        free(clean);
        free(temp);
    }

    return MOD_CONT;
}
void ConnectServ(User * u, char *buf)
{
    char *cmd, *buf2;
    char *str;

    buf2 = sstrdup(buf);
    cmd = myStrGetToken(buf, ' ', 0);
    str = myStrGetTokenRemainder(buf, ' ', 1);

    SET_SEGV_LOCATION();

    if (!cmd) {
        free(buf2);
        return;
    } else if (stricmp(cmd, "\1PING") == 0) {
        denora_cmd_ctcp(s_StatServ, u->nick, "PING %s", str);
    } else {
        SET_SEGV_LOCATION();
        mod_run_cmd(s_StatServ, u, STATSERV, cmd, str);
    }
    free(cmd);
    if (str) {
        free(str);
    }
    free(buf2);
}
Exemple #14
0
int do_resendcode(User * u)
{
    char *buffer = NULL;
    char *nick = NULL;
    NickAlias *na = NULL;

    buffer = moduleGetLastBuffer();
    if (buffer)
        nick = myStrGetToken(buffer, ' ', 0);

    if (!nick) {
        moduleNoticeLang(s_NickServ, u, RESENDCODE_SYNTAX);
    } else if (!anope_valid_nick(nick)) {
        notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, nick);
    } else if (!(na = findnick(nick))) {
        notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
    } else if (nick_identified(na->u)) {
        notice_lang(s_NickServ, u, NICK_ALREADY_IDENTIFIED);
    } else if (!(moduleGetData(&na->nc->moduleData, MODULEDATAKEY))) {
        moduleNoticeLang(s_NickServ, u, RESETPASS_NOT_REQUESTED, u->nick);
    } else {
        if (do_sendmail(u, na) != 0) {
            alog(LOG_COULDNT_SENDMAIL, MYNAME, na->nick);
        } else {
            moduleNoticeLang(s_NickServ, u, RESETPASS_SUCCESS, na->nick);
            moduleNoticeLang(s_NickServ, u, RESETPASS_INSTRUC);
        }
    }

    return MOD_CONT;
}
/**
 * Handle unban fantasy command.
 * @param argc Argument count
 * @param argv Argument list
 * @return MOD_CONT or MOD_STOP
 **/
static int do_fantasy(int argc, char **argv)
{
    User *u;
    ChannelInfo *ci;
    char *target = NULL;

    if (argc < 3)
        return MOD_CONT;

    if (stricmp(argv[0], "unban") == 0) {
        u = finduser(argv[1]);
        ci = cs_findchan(argv[2]);
        if (!u || !ci || !check_access(u, ci, CA_UNBAN))
            return MOD_CONT;

        if (argc >= 4)
            target = myStrGetToken(argv[3], ' ', 0);
        if (!target)
            common_unban_full(ci, u->nick, true);
        else
            common_unban(ci, target);

        /* free target if needed (#852) */
        Anope_Free(target);
    }

    return MOD_CONT;
}
Exemple #16
0
/**
 * Handle seen fantasy command.
 **/
int do_fantasy_seen(int argc, char **argv)
{
    User *u;
    char *target = NULL;
    ChannelStats *cs;
    char *message = NULL;

    if (denora->debug)
        protocol_debug(NULL, argc, argv);

    if (argc >= 3 && stricmp(argv[0], "seen") == 0) {
        u = finduser(argv[1]);
        cs = find_cs(argv[2]);
        if (argc == 3) {
            if (cs->flags & CS_NOTICE)
                moduleNoticeLang(s_StatServ, u, SEEN_USAGE,
                                 ChanStatsTrigger);
            else
                moduleNoticeChanLang(s_StatServ, cs, SEEN_USAGE,
                                     ChanStatsTrigger);
        } else {
            target = myStrGetToken(argv[3], ' ', 0);
            message = do_seen(u, target);
            if (cs->flags & CS_NOTICE)
                notice(s_StatServ, u->nick, message);
            else
                denora_cmd_privmsg(s_StatServ, cs->name, message);
        }
    }
    return MOD_CONT;
}
Exemple #17
0
int do_confirm(User * u)
{
    char *buffer = NULL;
    char *nick = NULL;
    char *passcode = NULL;
    char *moduledata = NULL;
    NickAlias *na = NULL;

    buffer = moduleGetLastBuffer();

    if (buffer)
    {
        nick = myStrGetToken(buffer, ' ', 0);
        passcode = myStrGetToken(buffer, ' ', 1);
    }

    if (!nick) {
        moduleNoticeLang(s_NickServ, u, ENTERCODE_SYNTAX);
    } else if (!anope_valid_nick(nick)) {
        notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, nick);
    } else if (!(na = findnick(nick))) {
        notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
    } else if (nick_identified(na->u)) {
        notice_lang(s_NickServ, u, NICK_ALREADY_IDENTIFIED);
    } else if (!passcode) {
        moduleNoticeLang(s_NickServ, u, ENTERCODE_SYNTAX);
    } else {
        if (!(moduledata = moduleGetData(&na->nc->moduleData, MODULEDATAKEY))) {
            moduleNoticeLang(s_NickServ, u, RESETPASS_NOT_REQUESTED, nick);
        } else if (strcmp(passcode, moduledata) != 0) {
            moduleNoticeLang(s_NickServ, u, ENTERCODE_WRONG_PASSCODE);
            free(moduledata);
        } else {
            ns_setpassword(u, na->nc);
            moduleDelData(&na->nc->moduleData, MODULEDATAKEY);
            free(moduledata);
        }
    }

    return MOD_CONT;
}
Exemple #18
0
int mLoadData(int argc, char **argv)
{
    FILE *fp;
	char *filename;
    char *type = NULL;
    char *name = NULL;
    ChannelInfo *ci;
    char buffer[1024];
	if (CSAVoiceDBName) {
		filename = CSAVoiceDBName;
	} else {
		filename = DEFAULT_DB_NAME;
	}
	fp = fopen(filename, "r");
	if (!fp) {
		if (debug)
			alog("cs_autovoice: Unable to open database ('%s') for reading!", filename);
		return MOD_CONT;
	}
	while (fgets(buffer, 1024, fp)) {
		type = myStrGetToken(buffer, ' ', 0);
		name = myStrGetToken(buffer, ' ', 1);
		if (type) {
			if (name) {
				if ((ci = cs_findchan(name))) {
					if (stricmp(type, "REG") == 0) {
						moduleAddData(&ci->moduleData, "avoice", "REG");
					} else if (stricmp(type, "ALL") == 0) {
						moduleAddData(&ci->moduleData, "avoice", "ALL");
					} else {
						alog("cs_autovoice: Possible invalid entry [%s] in .db file, ignoring...", name);
					}
				}
				free(name);
			}
			free(type);
		}
	}
	fclose(fp);
	return MOD_CONT;
}
Exemple #19
0
static int do_tban(User * u)
{
    char mask[BUFSIZE];
    Channel *c;
    User *u2 = NULL;

    char *buffer = moduleGetLastBuffer();
    char *chan;
    char *nick;
    char *time;

    chan = myStrGetToken(buffer, ' ', 0);
    nick = myStrGetToken(buffer, ' ', 1);
    time = myStrGetToken(buffer, ' ', 2);

    if (time && chan && nick) {

        if (!(c = findchan(chan))) {
            notice_lang(s_ChanServ, u, CHAN_X_NOT_IN_USE, chan);
        } else if (!(u2 = finduser(nick))) {
            notice_lang(s_ChanServ, u, NICK_X_NOT_IN_USE, nick);
        } else {
            if (canBanUser(c, u, u2)) {
                get_idealban(c->ci, u2, mask, sizeof(mask));
                addBan(c, dotime(time), mask);
                mySendResponse(u, chan, mask, time);
            }
        }
    } else {
        myFullHelpSyntax(u);
    }
    if (time)
        free(time);
    if (nick)
        free(nick);
    if (chan)
        free(chan);

    return MOD_CONT;
}
Exemple #20
0
/* AB Z AB 1116103763 1116103763 0 1116103763.867010 */
void asuka_cmd_pong(char *servname, char *who)
{
    char *t, *s;
    uint32 ts, tsnow, value;

    SET_SEGV_LOCATION();

    t = myStrGetToken(who, '!', 1);
    s = myStrGetToken(t, '.', 0);
    if (!s) {
        ts = 0;
        alog(LOG_NORMAL,
             "This is an error, you should report this as a problem");
        alog(LOG_NORMAL, "Server Name %s : Who %s", servname, who);
    } else {
        ts = strtol(s, NULL, 10);
    }
    tsnow = time(NULL);
    value = tsnow - ts;

    SET_SEGV_LOCATION();

    if (denora->protocoldebug) {
        alog(LOG_PROTOCOL, "PONG: Server Name %s : Who %s", servname, who);
    }
    send_cmd(p10id, "Z %s %ld %ld %ld %s", p10id, (long int) ts,
             (long int) tsnow, (long int) value, militime_float(NULL));

    SET_SEGV_LOCATION();

    if (s) {
        free(s);
    }
    if (t) {
        free(t);
    }
}
static int hs_do_reject(User * u)
{
    char *cur_buffer;
    char *nick;
    char *reason;
    HostCore *tmp, *hc;
    boolean found = false;

    cur_buffer = moduleGetLastBuffer();
    nick = myStrGetToken(cur_buffer, ' ', 0);
    reason = myStrGetTokenRemainder(cur_buffer, ' ', 1);

    if (!nick) {
        moduleNoticeLang(s_HostServ, u, LNG_REJECT_SYNTAX);
        if (reason)
            free(reason);
        return MOD_CONT;
    }

    tmp = findHostCore(hs_request_head, nick, &found);
    if (found) {
        if (!tmp)
            hc = hs_request_head;
        else
            hc = tmp->next;

        if (HSRequestMemoUser) {
            if (reason)
                my_memo_lang(u, hc->nick, 2, NULL, LNG_REJECT_MEMO_REASON,
                             reason);
            else
                my_memo_lang(u, hc->nick, 2, NULL, LNG_REJECT_MEMO);
        }

        hs_request_head = deleteHostCore(hs_request_head, tmp);
        moduleNoticeLang(s_HostServ, u, LNG_REJECTED, nick);
        alog("Host Request for %s rejected by %s (%s)", nick, u->nick,
             reason ? reason : "");
    } else {
        moduleNoticeLang(s_HostServ, u, LNG_NO_REQUEST, nick);
    }

    free(nick);
    if (reason)
        free(reason);

    return MOD_CONT;
}
Exemple #22
0
int my_ns_register(User * u)
{
    char *cur_buffer;
    char *email;
    int ret;

    cur_buffer = moduleGetLastBuffer();
    email = myStrGetToken(cur_buffer, ' ', 1);
	if (!email)
		return MOD_CONT;

    ret = check_email_limit_reached(email, u);
    free(email);

    return ret;
}
Exemple #23
0
/**
 * Handle msg fantasy command.
 **/
int do_msg_seen(User * u, int argc, char **argv)
{
    char *target = NULL;
    char *message = NULL;

    if (denora->debug)
        protocol_debug(NULL, argc, argv);

    if (argc < 1 || BadChar(argv[0])) {
        moduleNoticeLang(s_StatServ, u, SEEN_USAGE, "");
    } else {
        target = myStrGetToken(argv[0], ' ', 0);
        message = do_seen(u, target);
        notice(s_StatServ, u->nick, message);
    }
    return MOD_CONT;
}
/**
 * Handle kickban/kb fantasy commands.
 * @param argc Argument count
 * @param argv Argument list
 * @return MOD_CONT or MOD_STOP
 **/
int do_fantasy(int argc, char **argv)
{
    User *u, *u2;
    ChannelInfo *ci;
    char *target = NULL;
    char *reason = NULL;

    if (argc < 3)
        return MOD_CONT;

    if ((stricmp(argv[0], "kickban") == 0)
        || (stricmp(argv[0], "kb") == 0)) {
        u = finduser(argv[1]);
        ci = cs_findchan(argv[2]);
        if (!u || !ci)
            return MOD_CONT;

        if (argc >= 4) {
            target = myStrGetToken(argv[3], ' ', 0);
            reason = myStrGetTokenRemainder(argv[3], ' ', 1);
        }
        if (!target && check_access(u, ci, CA_BANME)) {
            bot_raw_ban(u, ci, u->nick, "Requested");
        } else if (target && check_access(u, ci, CA_BAN)) {
            if (stricmp(target, ci->bi->nick) == 0) {
                bot_raw_ban(u, ci, u->nick, "Oops!");
            } else {
                u2 = finduser(target);
                if (u2 && ci->c && is_on_chan(ci->c, u2)) {
                    if (!reason && !is_protected(u2))
                        bot_raw_ban(u, ci, target, "Requested");
                    else if (!is_protected(u2))
                        bot_raw_ban(u, ci, target, reason);
                }
            }
        }
    }

    if (target)
       free(target);
    if (reason)
       free(reason);

    return MOD_CONT;
}
static int hs_do_activate(User * u)
{
    char *cur_buffer;
    char *nick;
    NickAlias *na;
    HostCore *tmp, *hc;
    boolean found = false;

    cur_buffer = moduleGetLastBuffer();
    nick = myStrGetToken(cur_buffer, ' ', 0);

    if (!nick) {
        moduleNoticeLang(s_HostServ, u, LNG_ACTIVATE_SYNTAX);
        return MOD_CONT;
    }

    if ((na = findnick(nick))) {
        tmp = findHostCore(hs_request_head, nick, &found);
        if (found) {
            if (!tmp)
                hc = hs_request_head;
            else
                hc = tmp->next;

            addHostCore(hc->nick, hc->vIdent, hc->vHost, u->nick,
                        time(NULL));

            if (HSRequestMemoUser)
                my_memo_lang(u, hc->nick, 2, NULL, LNG_ACTIVATE_MEMO);

            hs_request_head = deleteHostCore(hs_request_head, tmp);
            moduleNoticeLang(s_HostServ, u, LNG_ACTIVATED, nick);
            alog("Host Request for %s activated by %s", nick, u->nick);
        } else {
            moduleNoticeLang(s_HostServ, u, LNG_NO_REQUEST, nick);
        }
    } else {
        notice_lang(s_HostServ, u, NICK_X_NOT_REGISTERED, nick);
    }

    free(nick);
    return MOD_CONT;
}
Exemple #26
0
/* Event: PROTOCTL */
int
anope_event_capab (char *source, int ac, char **av)
{
  int argvsize = 8;
  int argc;
  char **argv;
  char *str;

  if (ac < 1)
    return MOD_CONT;

  /* We get the params as one arg, we should split it for capab_parse */
  argv = scalloc (argvsize, sizeof (char *));
  argc = 0;
  while ((str = myStrGetToken (av[0], ' ', argc)))
    {
      if (argc == argvsize)
	{
	  argvsize += 8;
	  argv = srealloc (argv, argvsize * sizeof (char *));
	}
      argv[argc] = str;
      argc++;
    }

  capab_parse (argc, argv);

  /* Free our built ac/av */
  for (argvsize = 0; argvsize < argc; argvsize++)
    {
      free (argv[argvsize]);
    }
  free (argv);

  return MOD_CONT;
}
Exemple #27
0
int do_avoice(User *u)
{
	char *buf = moduleGetLastBuffer();
    char *chan = myStrGetToken(buf, ' ', 0);
    char *option = myStrGetTokenRemainder(buf, ' ', 1);
	char *data;
    ChannelInfo *ci;
    if (!chan) {
		moduleNoticeLang(s_ChanServ, u, CS_AUTOVOICE_SYNTAX);
		return MOD_CONT;
    }
    if ((ci = cs_findchan(chan))) {
        if (!check_access(u, ci, CA_PROTECT)) {
            notice_lang(s_ChanServ, u, PERMISSION_DENIED);
			if (chan) free(chan);
			if (option) free(option);
            return MOD_CONT;
        }
		if (!option) {
			if ((data = moduleGetData(&ci->moduleData, "avoice"))) {
				if (stricmp(data, "REG") == 0) {
					moduleNoticeLang(s_ChanServ, u, CS_AUTOVOICE_STATUS_REG, chan);
				} else if (stricmp(data, "ALL") == 0) {
					moduleNoticeLang(s_ChanServ, u, CS_AUTOVOICE_STATUS_ALL, chan);
				}
				free(data);
			} else {
				moduleNoticeLang(s_ChanServ, u, CS_AUTOVOICE_STATUS_OFF, chan);
			}
		} else {
			if (stricmp(option, "REG") == 0) {
				moduleAddData(&ci->moduleData, "avoice", "REG");
				moduleNoticeLang(s_ChanServ, u, CS_AUTOVOICE_SET_REG, chan);
			} else if (stricmp(option, "ALL") == 0) {
				moduleAddData(&ci->moduleData, "avoice", "ALL");
				moduleNoticeLang(s_ChanServ, u, CS_AUTOVOICE_SET_ALL, chan);
			} else if (stricmp(option, "OFF") == 0) {
				moduleDelData(&ci->moduleData, "avoice");
				moduleNoticeLang(s_ChanServ, u, CS_AUTOVOICE_SET_OFF, chan);
			} else if (stricmp(option, "STATUS") == 0) {
				if ((data = moduleGetData(&ci->moduleData, "avoice"))) {
					if (stricmp(data, "REG") == 0) {
						moduleNoticeLang(s_ChanServ, u, CS_AUTOVOICE_STATUS_REG, chan);
					} else if (stricmp(data, "ALL") == 0) {
						moduleNoticeLang(s_ChanServ, u, CS_AUTOVOICE_STATUS_ALL, chan);
					}
					free(data);
				} else {
					moduleNoticeLang(s_ChanServ, u, CS_AUTOVOICE_STATUS_OFF, chan);
				}
			} else {
				moduleNoticeLang(s_ChanServ, u, CS_AUTOVOICE_SYNTAX);
			}
		}
	} else {
        notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan);
    }
	if (chan)
		free(chan);
	if (option)
		free(option);
    return MOD_CONT;
}
Exemple #28
0
/**
 * Seen
 **/
char *do_seen(User * u, char *target)
{
    char *split1 = NULL;
    char *seenhost = NULL;
    char *seennick = NULL;
    char *seenuname = NULL;
    struct tm tm;
    char buf[255];
    int i;
    MYSQL_RES *mysql_res;
    char *sqltarget;
    char usrchans[1024] = "\0";
    time_t tsnow = time(NULL);
    MYSQL_RES *mysql_res2;
    MYSQL_ROW mysql_row2;
    char cmodep[32] = "\0";
    char cmodes[32] = "\0";
    char cmodeA[32] = "\0";
    char cmodeO[32] = "\0";
    char umodep[32] = "\0";
	char umodeQ[32] = "\0";
	char umodeI[32] = "\0";
    double ctsdiff;
    time_t time0 = time(NULL);
    time_t time1 = time(NULL);
	time_t tt = time(NULL);
    char *message;
	char *uname = NULL;
    message = malloc(1024);

    sqltarget = rdb_escape(rdb_escape(target));
    for (i = 0; sqltarget[i]; i++)
        if (sqltarget[i] == '*')
            sqltarget[i] = '%';
    seenhost = myStrGetToken(sqltarget, '@', 1);
    split1 = myStrGetToken(sqltarget, '@', 0);
    seennick = myStrGetToken(split1, '!', 0);
    seenuname = myStrGetToken(split1, '!', 1);
    if (seenhost == NULL)
        seenhost = (char *) "%";
    if (seennick == NULL)
        seennick = (char *) "%";
    if (seenuname == NULL)
        seenuname = (char *) "%";
    free(sqltarget);
	
	if (!strcmp(seennick, "%")) {
		uname = sstrdup("%");
	} else {	
		rdb_query(QUERY_LOW, "SELECT uname FROM %s WHERE nick LIKE \'%s\' ",
					  AliasesTable, seennick);
		mysql_res = mysql_store_result(mysql);
		if (mysql_res && mysql_num_rows(mysql_res)) {
			mysql_row = mysql_fetch_row(mysql_res);
			uname = rdb_escape(mysql_row[0]);
		}
	}
	
	if (uname) {
		rdb_query(QUERY_LOW,
              "SELECT %s.nickid, %s.nick, %s.hostname, %s.hiddenhostname, %s.username, UNIX_TIMESTAMP(%s.connecttime), %s.away, %s.awaymsg, %s.online, UNIX_TIMESTAMP(%s.lastquit), %s.lastquitmsg FROM %s,%s,%s WHERE %s.uname LIKE \"%s\" AND %s.nick = %s.nick AND %s.username LIKE \"%s\" AND (%s.hostname LIKE \"%s\" OR %s.hiddenhostname LIKE \"%s\") AND %s.server = %s.server AND %s.uline = \"0\" ORDER BY online,lastquit DESC, %s.connecttime ASC LIMIT 1;",
              UserTable, UserTable, UserTable, UserTable, UserTable,
              UserTable, UserTable, UserTable, UserTable, UserTable,
              UserTable, UserTable, ServerTable, AliasesTable,
              AliasesTable, uname, UserTable,
              AliasesTable, UserTable, seenuname, UserTable, seenhost,
              UserTable, seenhost, UserTable, ServerTable, ServerTable, UserTable);
		mysql_res = mysql_store_result(mysql);
	} else {
		rdb_query(QUERY_LOW,
              "SELECT %s.nickid, %s.nick, %s.hostname, %s.hiddenhostname, %s.username, UNIX_TIMESTAMP(%s.connecttime), %s.away, %s.awaymsg, %s.online, UNIX_TIMESTAMP(%s.lastquit), %s.lastquitmsg FROM %s,%s WHERE %s.nick LIKE \"%s\" AND %s.username LIKE \"%s\" AND (%s.hostname LIKE \"%s\" OR %s.hiddenhostname LIKE \"%s\") AND %s.server = %s.server AND %s.uline = \"0\" ORDER BY online,lastquit DESC, %s.connecttime ASC LIMIT 1;",
              UserTable, UserTable, UserTable, UserTable, UserTable,
              UserTable, UserTable, UserTable, UserTable, UserTable,
              UserTable, UserTable, ServerTable, UserTable, seennick,
              UserTable, seenuname, UserTable, seenhost,
              UserTable, seenhost, UserTable, ServerTable, ServerTable, UserTable);
		mysql_res = mysql_store_result(mysql);
	}

    if (mysql_num_rows(mysql_res) > 0) {
        SET_SEGV_LOCATION();
        while ((mysql_row = mysql_fetch_row(mysql_res)) != NULL) {
            double tsdiff;
            if (mysql_row[5] != NULL) { 
                time0 = atoi(mysql_row[5]); /* connect time */
            }
            if (mysql_row[9] != NULL) {   
                time1 = atoi(mysql_row[9]); /* quit time */
            }
            if (strlen(mysql_row[3]) <= 1)
                mysql_row[3] = mysql_row[2];    /* no vhost, so using real host */
            if (stricmp(mysql_row[8], "Y") == 0) {
                if (mysql_row[5] != NULL) {
					tt = atoi(mysql_row[5]);
					tm = *localtime(&tt);
                    strftime(buf, sizeof(buf), "%d.%m %H:%M", &tm);
                    mysql_row[5] = buf;
                }

                /* Display channels the user is in */
                /* check for ircd compatibility: chanmodes +AOsp and usermode +p */
                if (denora_cmode(CMODE_p) == 1)
                    sprintf(cmodep, "AND %s.mode_lp = 'N' ", ChanTable);
                if (denora_cmode(CMODE_s) == 1)
                    sprintf(cmodes, "AND %s.mode_ls = 'N' ", ChanTable);
                if (denora_cmode(CMODE_A) == 1)
                    sprintf(cmodeA, "AND %s.mode_ua = 'N' ", ChanTable);
                if (denora_cmode(CMODE_O) == 1)
                    sprintf(cmodeO, "AND %s.mode_uo = 'N' ", ChanTable);
                if (denora_umode(UMODE_p) == 1)
                    sprintf(umodep, "AND %s.mode_lp = 'N' ", UserTable);
				if (denora_get_ircd() == IRC_INSPIRCD11 || denora_get_ircd() == IRC_INSPIRCD12) {
					if (denora_umode(UMODE_Q) == 1)
						sprintf(umodeQ, "AND %s.mode_uq = 'N' ", UserTable);
					if (denora_umode(UMODE_I) == 1)
						sprintf(umodeI, "AND %s.mode_ui = 'N' ", UserTable);
				}
                rdb_query(QUERY_LOW,
                          "SELECT %s.channel FROM %s,%s,%s WHERE %s.nickid =%s AND %s.chanid = %s.chanid AND %s.nickid = %s.nickid %s%s%s%s%s%s%s ORDER BY %s.channel ASC",
                          ChanTable, ChanTable, UserTable, IsOnTable,
                          IsOnTable, mysql_row[0], ChanTable, IsOnTable,
                          UserTable, IsOnTable, cmodep, cmodes, cmodeA,
                          cmodeO, umodep, umodeQ, umodeI, ChanTable);
                mysql_res2 = mysql_store_result(mysql);
                while ((mysql_row2 = mysql_fetch_row(mysql_res2)) != NULL) {
                    strlcat(usrchans, mysql_row2[0], sizeof(usrchans));
                    strlcat(usrchans, " ", sizeof(usrchans));
                }
                mysql_free_result(mysql_res2);

                ctsdiff = difftime(tsnow, time0);       /* total online time */

                /* Prepare the reply for the user */
                if (stricmp(mysql_row[6], "N") == 0) {
                    if (strlen(usrchans) < 3) {
                        sprintf(message,
                                moduleGetLangString(u, SEEN_ONLINE),
                                mysql_row[1], mysql_row[4], mysql_row[3],
                                get_timestring(u, ctsdiff), mysql_row[5]);
                    } else {
                        sprintf(message,
                                moduleGetLangString(u, SEEN_ONLINEC),
                                mysql_row[1], mysql_row[4], mysql_row[3],
                                get_timestring(u, ctsdiff), mysql_row[5],
                                usrchans);
                    }
                } else {
                    if (strlen(usrchans) < 3) {
                        sprintf(message, moduleGetLangString(u, SEEN_AWAY),
                                mysql_row[1], mysql_row[4], mysql_row[3],
                                get_timestring(u, ctsdiff), mysql_row[5],
                                mysql_row[7]);
                    } else {
                        sprintf(message,
                                moduleGetLangString(u, SEEN_AWAYC),
                                mysql_row[1], mysql_row[4], mysql_row[3],
                                get_timestring(u, ctsdiff), mysql_row[5],
                                mysql_row[7], usrchans);
                    }
                }
            } else {
                double dtsdiff;
                if (mysql_row[9] != NULL && mysql_row[5] != NULL) {
					tt = atoi(mysql_row[9]);
					tm = *localtime(&tt);
                    strftime(buf, sizeof(buf), "%d.%m %H:%M", &tm);
                    mysql_row[9] = buf;
                    dtsdiff = difftime(tsnow, time1);   /* total offline time */
                    tsdiff = difftime(time1, time0);    /* total online time */
                    sprintf(message, moduleGetLangString(u, SEEN_OFFLINE),
                            mysql_row[1], mysql_row[4], mysql_row[3],
                            get_timestring(u, dtsdiff), mysql_row[9],
                            get_timestring(u, tsdiff), mysql_row[10]);
                } else {
                    sprintf(message, moduleGetLangString(u, SEEN_UNKNOWN),
                            mysql_row[1], mysql_row[4], mysql_row[3]);
                }
            }
        }
    } else {
        sprintf(message, moduleGetLangString(u, SEEN_EMPTY), target);
    }
    SET_SEGV_LOCATION();
    mysql_free_result(mysql_res);

    return message;
}
int do_saregister(User *u)
{
	char *buf, *nick, *pass, *email;
	NickRequest *nr;
	NickAlias *na;
	User *user;

	buf = moduleGetLastBuffer();
	nick = myStrGetToken(buf, ' ', 0);
	pass = myStrGetToken(buf, ' ', 1);
	email = myStrGetToken(buf, ' ', 2);

	if (!email)
	{
		notice_user(s_NickServ, u, "Syntax: \2SAREGISTER \37nick\37 \37password\37 \37email\37");
		notice_lang(s_NickServ, u, MORE_INFO, s_NickServ, "SAREGISTER");
	}
	else if (readonly)
	{
		notice_lang(s_NickServ, u, NICK_REGISTRATION_DISABLED);
	}
	else if ((nr = findrequestnick(nick)))
	{
		notice_lang(s_NickServ, u, NICK_REQUESTED);
	}
	else if (!anope_valid_nick(nick))
	{
		notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, nick);
	}
	else if ((na = findnick(nick)))
	{
		if (na->status & NS_VERBOTEN)
			notice_lang(s_NickServ, u, NICK_CANNOT_BE_REGISTERED, nick);
		else
			notice_lang(s_NickServ, u, NICK_ALREADY_REGISTERED, nick);
	}
	else if (!MailValidate(email))
	{
		notice_lang(s_NickServ, u, MAIL_X_INVALID, email);
	}
	else
	{
		na = makenick(nick);

		if (!na)
		{
			alog("%s: makenick(%s) failed", s_NickServ, u->nick);
			notice_lang(s_NickServ, u, NICK_REGISTRATION_FAILED);
		}
		else
		{
			user = finduser(nick);

			enc_encrypt(pass, strlen(pass), na->nc->pass, PASSMAX - 1);
			na->nc->flags |= NSDefFlags;
			na->nc->memos.memomax = MSMaxMemos;
			if (user)
				na->last_usermask = user->vhost ? sstrdup(user->vhost) : sstrdup(user->host);
			else
				na->last_usermask = sstrdup("*@*");
			if (user)
				na->last_realname = sstrdup(user->realname);
			else
				na->last_realname = sstrdup("unknown");
			na->time_registered = na->last_seen = time(NULL);
			na->nc->language = NSDefLanguage;
			na->nc->email = sstrdup(email);

			send_event(EVENT_NICK_REGISTERED, 1, nick);
			
			alog("%s: %s (%s@%s) used saregister to register %s", s_NickServ, u->nick, u->username, u->host, nick);

			notice_user(s_NickServ, u, "Nick \2%s\2 has been registered", nick);

			if (user)
			{
				user->na = na;
				validate_user(user);
			}
		}
	}

	if (email)
		free(email);
	if (pass)
		free(pass);
	if (nick)
		free(nick);

	return MOD_CONT;
}
Exemple #30
0
int do_resetpass(User * u)
{
    char *buffer = NULL;
    char *nick = NULL;
    char *email = NULL;

    char passcode[PASSCODELEN];
    char *callBackinfo[1];
    NickAlias *na = NULL;

    if ((RestrictReset == 1) && !(is_oper(u))) {
        notice_lang(s_NickServ, u, ACCESS_DENIED);
        return MOD_CONT;
    }

    buffer = moduleGetLastBuffer();
    nick = myStrGetToken(buffer, ' ', 0);
    email = myStrGetToken(buffer, ' ', 1);

    if (!nick) {
        moduleNoticeLang(s_NickServ, u, RESETPASS_SYNTAX);
    } else if (!anope_valid_nick(nick)) {
        notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, nick);
    } else if (!(na = findnick(nick))) {
        notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
    } else if (na->status & NS_VERBOTEN) {
         notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
    } else if (na->nc->flags & NI_SUSPENDED) {
        notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick);
    } else if (!na->nc->email) {
         notice_user(s_NickServ, u, "%s has no email associated with their account.", na->nick);
    } else if (moduleGetData(&na->nc->moduleData, MODULEDATAKEY)) {
        moduleNoticeLang(s_NickServ, u, RESETPASS_ALREADY_REQUESTED1,
                         na->nick);
        moduleNoticeLang(s_NickServ, u, RESETPASS_ALREADY_REQUESTED2); 
    } else if (!email && !is_oper(u) && !is_helpop(u)) {
	notice(s_NickServ, u->nick, "You need to provide the e-mail address associated with the account you are trying to reset the password on.");
	notice(s_NickServ, u->nick, "Syntax: /ns resetpass <nickname> <e-mail>");
    } else if (!is_oper(u) && !is_helpop(u) && strcasecmp(email, na->nc->email)) {
	notice(s_NickServ, u->nick, "The e-mail address %s does not match the one associated with account %s.", email, na->nc->display);
    } else {
        generatePassCode(passcode);
        moduleAddData(&na->nc->moduleData, MODULEDATAKEY, passcode);
        if (do_sendmail(u, na) != 0) {
            alog(LOG_COULDNT_SENDMAIL, MYNAME, na->nick);
            moduleDelData(&na->nc->moduleData, MODULEDATAKEY);
        } else {
            callBackinfo[0] = na->nick;
            moduleAddCallback(MYNAME, time(NULL) + ExpirePassCode, expirePassCode, 1, callBackinfo);
            alog(LOG_RESETPASS_REQUESTED, MYNAME, u->nick, na->nick);
            moduleNoticeLang(s_NickServ, u, RESETPASS_SUCCESS, na->nick);
            moduleNoticeLang(s_NickServ, u, RESETPASS_INSTRUC);
        }
    }

    if (nick)
    	free(nick);
    if (email)
	free(email);

    return MOD_CONT;
}