void check_bind_chof(char *hand, int idx) { struct userrec *u = NULL; u = get_user_by_handle(userlist, hand); touch_laston(u, "partyline", now); }
void check_bind_chon(char *hand, int idx) { struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0 }; struct userrec *u = NULL; u = get_user_by_handle(userlist, hand); touch_laston(u, "partyline", now); get_user_flagrec(u, &fr, NULL); check_bind(BT_chon, hand, &fr, hand, idx); }
static void set_handle_laston(char *chan, struct userrec *u, time_t n) { struct chanuserrec *ch; if (!u) return; touch_laston(u, chan, n); ch = get_chanrec(u, chan); if (!ch) return; ch->laston = n; }
static int cmd_files(struct userrec *u, int idx, char *par) { int atr = u ? u->flags : 0; static struct chat_info *ci; Context; if (dccdir[0] == 0) dprintf(idx, "There is no file transfer area.\n"); else if (too_many_filers()) { dprintf(idx, "The maximum of %d people are in the file area right now.\n", dcc_users); dprintf(idx, "Please try again later.\n"); } else { if (!(atr & (USER_MASTER | USER_XFER))) dprintf(idx, "You don't have access to the file area.\n"); else { putlog(LOG_CMDS, "*", "#%s# files", dcc[idx].nick); dprintf(idx, "Entering file system...\n"); if (dcc[idx].u.chat->channel >= 0) { chanout_but(-1, dcc[idx].u.chat->channel, "*** %s has left: file system\n", dcc[idx].nick); if (dcc[idx].u.chat->channel < 100000) botnet_send_part_idx(idx, "file system"); } ci = dcc[idx].u.chat; dcc[idx].u.file = get_data_ptr(sizeof(struct file_info)); dcc[idx].u.file->chat = ci; dcc[idx].type = &DCC_FILES; dcc[idx].status |= STAT_CHAT; if (!welcome_to_files(idx)) { struct chat_info *ci = dcc[idx].u.file->chat; nfree(dcc[idx].u.file); dcc[idx].u.chat = ci; dcc[idx].type = &DCC_CHAT; putlog(LOG_FILES, "*", "File system broken."); if (dcc[idx].u.chat->channel >= 0) { chanout_but(-1, dcc[idx].u.chat->channel, "*** %s has returned.\n", dcc[idx].nick); if (dcc[idx].u.chat->channel < 100000) botnet_send_join_idx(idx, -1); } } else touch_laston(u, "filearea", now); } } return 0; }
static void dcc_files(int idx, char *buf, int i) { Context; if (buf[0] && detect_dcc_flood(&dcc[idx].timeval, dcc[idx].u.file->chat, idx)) return; dcc[idx].timeval = now; strcpy(buf, check_tcl_filt(idx, buf)); if (!buf[0]) return; touch_laston(dcc[idx].user, "filearea", now); if (buf[0] == ',') { for (i = 0; i < dcc_total; i++) { if ((dcc[i].type->flags & DCT_MASTER) && dcc[idx].user && (dcc[idx].user->flags & USER_MASTER) && ((dcc[i].type == &DCC_FILES) || (dcc[i].u.chat->channel >= 0)) && ((i != idx) || (dcc[idx].status & STAT_ECHO))) dprintf(i, "-%s- %s\n", dcc[idx].nick, &buf[1]); } } else if (got_files_cmd(idx, buf)) { dprintf(idx, "*** Ja mata!\n"); flush_lines(idx, dcc[idx].u.file->chat); putlog(LOG_FILES, "*", "DCC user [%s]%s left file system", dcc[idx].nick, dcc[idx].host); set_user(&USERENTRY_DCCDIR, dcc[idx].user, dcc[idx].u.file->dir); if (dcc[idx].status & STAT_CHAT) { struct chat_info *ci; dprintf(idx, "Returning you to command mode...\n"); ci = dcc[idx].u.file->chat; nfree(dcc[idx].u.file); dcc[idx].u.chat = ci; dcc[idx].status &= (~STAT_CHAT); dcc[idx].type = &DCC_CHAT; if (dcc[idx].u.chat->channel >= 0) { chanout_but(-1, dcc[idx].u.chat->channel, "*** %s has returned.\n", dcc[idx].nick); if (dcc[idx].u.chat->channel < 100000) botnet_send_join_idx(idx, -1); } } else { dprintf(idx, "Dropping connection now.\n"); putlog(LOG_FILES, "*", "Left files: [%s]%s/%d", dcc[idx].nick, dcc[idx].host, dcc[idx].port); killsock(dcc[idx].sock); lostdcc(idx); } } if (dcc[idx].status & STAT_PAGE) flush_lines(idx, dcc[idx].u.file->chat); }
/* part <bot> <nick> <sock> [etc..] */ static void bot_part(int idx, char *par) { char *bot = NULL, *nick = NULL, *etc = NULL; struct userrec *u = NULL; int sock, partyidx; int silent = 0; bot = newsplit(&par); if (bot[0] == '!') { silent = 1; bot++; } nick = newsplit(&par); etc = newsplit(&par); sock = base64_to_int(etc); u = get_user_by_handle(userlist, nick); if (u) { simple_snprintf(TBUF, sizeof(TBUF), "@%s", bot); touch_laston(u, TBUF, now); } if ((partyidx = getparty(bot, sock)) != -1) { if (!silent) { register int chan = party[partyidx].chan; if (par[0]) chanout_but(-1, chan, "*** (%s) %s %s %s (%s).\n", conf.bot->hub ? bot : "[botnet]", nick, "has left the", chan ? "channel" : "party line", par); else chanout_but(-1, chan, "*** (%s) %s %s %s.\n", conf.bot->hub ? bot : "[botnet]", nick, "has left the", chan ? "channel" : "party line"); } botnet_send_part_party(idx, partyidx, par, silent); remparty(bot, sock); } /* check if we have a remote idx for them */ int i = 0; for (i = 0; i < dcc_total; i++) { /* This will potentially close all simul-idxs with matching nick, even though they may be connected multiple times but, it won't matter as a new will just be made as needed. */ if (dcc[i].type && dcc[i].simul >= 0 && !strcasecmp(dcc[i].nick, nick)) { dcc[i].simul = -1; lostdcc(i); } } }
void check_tcl_chonof(char *hand, int sock, tcl_bind_list_t *tl) { struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0 }; char s[11]; struct userrec *u; u = get_user_by_handle(userlist, hand); touch_laston(u, "partyline", now); get_user_flagrec(u, &fr, NULL); Tcl_SetVar(interp, "_chonof1", (char *) hand, 0); egg_snprintf(s, sizeof s, "%d", sock); Tcl_SetVar(interp, "_chonof2", (char *) s, 0); check_tcl_bind(tl, hand, &fr, " $_chonof1 $_chonof2", MATCH_MASK | BIND_USE_ATTR | BIND_STACKABLE | BIND_WANTRET); }
static bool laston_gotshare(struct userrec *u, struct user_entry *e, char *par, int idx) { char *where = NULL; time_t timeval = 0; if (par[0]) where = newsplit(&par); if (!strcmp(where, "-")) where = NULL; if (par[0]) timeval = atol(newsplit(&par)); touch_laston(u, where, timeval); return 1; }
/* join <bot> <nick> <chan> <flag><sock> <from> */ static void bot_join(int idx, char *par) { char *bot = NULL, *nick = NULL, *x = NULL, *y = NULL; struct userrec *u = NULL; int i, sock, chan, i2, linking = 0; bot = newsplit(&par); if (bot[0] == '!') { linking = 1; bot++; } if (b_status(idx) & STAT_LINKING) { linking = 1; } nick = newsplit(&par); x = newsplit(&par); chan = base64_to_int(x); y = newsplit(&par); if ((chan < 0) || !y[0]) return; /* Woops! pre 1.2.1's send .chat off'ers * too!! */ if (!y[0]) { y[0] = '-'; sock = 0; } else { sock = base64_to_int(y + 1); } i = nextbot(bot); if (i != idx) { /* Ok, garbage from a 1.0g (who uses that * now?) OR raistlin being evil :) */ fake_alert(idx, "direction", bot, "join"); return; } u = get_user_by_handle(userlist, nick); if (u) { simple_snprintf(TBUF, sizeof(TBUF), "@%s", bot); touch_laston(u, TBUF, now); } i = addparty(bot, nick, chan, y[0], sock, par, &i2); botnet_send_join_party(idx, linking, i2); if (i != chan) { if (i >= 0) { chanout_but(-1, i, "*** (%s) %s %s %s.\n", conf.bot->hub ? bot : "[botnet]", nick, "has left the", i ? "channel" : "party line"); } if (!linking) chanout_but(-1, chan, "*** (%s) %s %s %s.\n", conf.bot->hub ? bot : "[botnet]", nick, "has joined the", chan ? "channel" : "party line"); } }
/* part <bot> <nick> <sock> [etc..] */ static void bot_part(int idx, char *par) { char *bot, *nick, *etc; struct userrec *u; int sock, partyidx; int silent = 0; if (bot_flags(dcc[idx].user) & BOT_ISOLATE) return; bot = newsplit(&par); if (bot[0] == '!') { silent = 1; bot++; } nick = newsplit(&par); etc = newsplit(&par); #ifndef NO_OLD_BOTNET if (dcc[idx].u.bot->numver < NEAT_BOTNET) { sock = atoi(etc); silent = 1; } else #endif sock = base64_to_int(etc); if (sock == 0) sock = partysock(bot, nick); u = get_user_by_handle(userlist, nick); if (u) { sprintf(TBUF, "@%s", bot); touch_laston(u, TBUF, now); } if ((partyidx = getparty(bot, sock)) != -1) { if (party[partyidx].chan >= 0) check_tcl_chpt(bot, nick, sock, party[partyidx].chan); if ((dcc[idx].u.bot->numver >= NEAT_BOTNET) && !silent) { register int chan = party[partyidx].chan; if (par[0]) chanout_but(-1, chan, "*** (%s) %s %s %s (%s).\n", bot, nick, NET_LEFTTHE, chan ? "channel" : "party line", par); else chanout_but(-1, chan, "*** (%s) %s %s %s.\n", bot, nick, NET_LEFTTHE, chan ? "channel" : "party line"); } botnet_send_part_party(idx, partyidx, par, silent); remparty(bot, sock); } }
static void dcc_files_pass(int idx, char *buf, int x) { struct userrec *u = get_user_by_handle(userlist, dcc[idx].nick); if (!x) return; if (u_pass_match(u, buf)) { if (too_many_filers()) { dprintf(idx, "Too many people are in the file system right now.\n"); dprintf(idx, "Please try again later.\n"); putlog(LOG_MISC, "*", "File area full: DCC chat [%s]%s", dcc[idx].nick, dcc[idx].host); killsock(dcc[idx].sock); lostdcc(idx); return; } dcc[idx].type = &DCC_FILES; if (dcc[idx].status & STAT_TELNET) dprintf(idx, "\377\374\001\n"); /* turn echo back on */ putlog(LOG_FILES, "*", "File system: [%s]%s/%d", dcc[idx].nick, dcc[idx].host, dcc[idx].port); if (!welcome_to_files(idx)) { putlog(LOG_FILES, "*", "File system broken."); killsock(dcc[idx].sock); lostdcc(idx); } else { struct userrec *u = get_user_by_handle(userlist, dcc[idx].nick); touch_laston(u, "filearea", now); } return; } dprintf(idx, "Negative on that, Houston.\n"); putlog(LOG_MISC, "*", "Bad password: DCC chat [%s]%s", dcc[idx].nick, dcc[idx].host); killsock(dcc[idx].sock); lostdcc(idx); }
/* join <bot> <nick> <chan> <flag><sock> <from> */ static void bot_join(int idx, char *par) { char *bot, *nick, *x, *y; struct userrec *u; int i, sock, chan, i2, linking = 0; if (bot_flags(dcc[idx].user) & BOT_ISOLATE) return; bot = newsplit(&par); #ifndef NO_OLD_BOTNET if (dcc[idx].u.bot->numver >= NEAT_BOTNET) #endif if (bot[0] == '!') { linking = 1; bot++; } if (dcc[idx].status & BSTAT_LINKING) linking = 1; nick = newsplit(&par); x = newsplit(&par); #ifndef NO_OLD_BOTNET if (dcc[idx].u.bot->numver < NEAT_BOTNET) chan = atoi(x); else #endif chan = base64_to_int(x); y = newsplit(&par); if ((chan < 0) || !y[0]) return; /* Woops! pre 1.2.1's send .chat off'ers * too!! */ if (!y[0]) { y[0] = '-'; sock = 0; } else { #ifndef NO_OLD_BOTNET if (dcc[idx].u.bot->numver < NEAT_BOTNET) sock = atoi(y + 1); else #endif sock = base64_to_int(y + 1); } /* 1.1 bots always send a sock#, even on a channel change * so if sock# is 0, this is from an old bot and we must tread softly * grab old sock# if there is one, otherwise make up one. */ if (sock == 0) sock = partysock(bot, nick); if (sock == 0) sock = fakesock++; i = nextbot(bot); if (i != idx) { /* Ok, garbage from a 1.0g (who uses that * now?) OR raistlin being evil :) */ fake_alert(idx, "direction", bot); return; } u = get_user_by_handle(userlist, nick); if (u) { sprintf(TBUF, "@%s", bot); touch_laston(u, TBUF, now); } i = addparty(bot, nick, chan, y[0], sock, par, &i2); botnet_send_join_party(idx, linking, i2, i); if (i != chan) { if (i >= 0) { if (dcc[idx].u.bot->numver >= NEAT_BOTNET) chanout_but(-1, i, "*** (%s) %s %s %s.\n", bot, nick, NET_LEFTTHE, i ? "channel" : "party line"); check_tcl_chpt(bot, nick, sock, i); } if ((dcc[idx].u.bot->numver >= NEAT_BOTNET) && !linking) chanout_but(-1, chan, "*** (%s) %s %s %s.\n", bot, nick, NET_JOINEDTHE, chan ? "channel" : "party line"); check_tcl_chjn(bot, nick, chan, y[0], sock, par); } }