/* [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; }
/** * 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; } }
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; }
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; }
/* 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); } }
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"); }
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; }
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; }
/** * 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; }
/** * 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; }
/** * 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); }
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; }
/** * 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; }
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; }
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; }
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; }
/* 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; }
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; }
/** * 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; }
/* 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; }
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; }
/** * 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; }
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; }