void detected(int code, const char *msg) { char tmp[512] = ""; struct flag_record fr = { FR_GLOBAL, 0, 0, 0 }; int act = DET_WARN, do_fatal = 0, killbots = 0; if (code == DETECT_LOGIN) act = login; if (code == DETECT_TRACE) act = trace; if (code == DETECT_PROMISC) act = promisc; #ifdef NOT_USED if (code == DETECT_PROCESS) act = badprocess; #endif if (code == DETECT_HIJACK) act = hijack; switch (act) { case DET_IGNORE: break; case DET_WARN: putlog(LOG_WARN, "*", msg); break; case DET_REJECT: do_fork(); putlog(LOG_WARN, "*", STR("Setting myself +d: %s"), msg); simple_snprintf(tmp, sizeof(tmp), "+d: %s", msg); set_user(&USERENTRY_COMMENT, conf.bot->u, tmp); fr.global = USER_DEOP; fr.bot = 1; set_user_flagrec(conf.bot->u, &fr, 0); sleep(1); break; case DET_DIE: putlog(LOG_WARN, "*", STR("Dying: %s"), msg); simple_snprintf(tmp, sizeof(tmp), STR("Dying: %s"), msg); set_user(&USERENTRY_COMMENT, conf.bot->u, tmp); if (!conf.bot->hub) nuke_server(STR("BBL")); sleep(1); killbots++; do_fatal++; break; case DET_SUICIDE: suicide(msg); break; } if (killbots && conf.bot->localhub) { conf_checkpids(conf.bots); conf_killbot(conf.bots, NULL, NULL, SIGKILL); } if (do_fatal) fatal(msg, 0); }
void deflag_user(struct userrec *u, int why, char *msg, struct chanset_t *chan) { char tmp[30] = "", tmp2[1024] = ""; struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0 }; int which = 0; switch (why) { case DEFLAG_BADCOOKIE: strlcpy(tmp, "Bad op cookie", sizeof(tmp)); which = chan->bad_cookie; break; case DEFLAG_MANUALOP: strlcpy(tmp, STR("Manual op in -manop channel"), sizeof(tmp)); which = chan->manop; break; #ifdef G_MEAN case DEFLAG_MEAN_DEOP: strlcpy(tmp, STR("Deopped bot in +mean channel"), sizeof(tmp)); ent = &CFG_MEANDEOP; break; case DEFLAG_MEAN_KICK: strlcpy(tmp, STR("Kicked bot in +mean channel"), sizeof(tmp)); ent = &CFG_MEANDEOP; break; case DEFLAG_MEAN_BAN: strlcpy(tmp, STR("Banned bot in +mean channel"), sizeof(tmp)); ent = &CFG_MEANDEOP; break; #endif /* G_MEAN */ case DEFLAG_MDOP: strlcpy(tmp, "Mass deop", sizeof(tmp)); which = chan->mdop; break; case DEFLAG_MOP: strlcpy(tmp, "Mass op", sizeof(tmp)); which = chan->mop; break; default: simple_snprintf(tmp, sizeof(tmp), "Reason #%i", why); } if (which == P_DEOP) { putlog(LOG_WARN, "*", "Setting %s +d (%s): %s", u->handle, tmp, msg); simple_snprintf(tmp2, sizeof(tmp2), "+d: %s (%s)", tmp, msg); set_user(&USERENTRY_COMMENT, u, tmp2); get_user_flagrec(u, &fr, chan->dname); if (fr.global == USER_DEOP) fr.match &= ~FR_GLOBAL; else fr.global = USER_DEOP; if (fr.chan == USER_DEOP) fr.match &= ~FR_CHAN; else fr.chan = USER_DEOP; /* did anything change? */ if (fr.match) set_user_flagrec(u, &fr, chan->dname); } else if (which == P_KICK) { putlog(LOG_WARN, "*", "Setting %s +dk (%s): %s", u->handle, tmp, msg); simple_snprintf(tmp2, sizeof(tmp2), "+dk: %s (%s)", tmp, msg); set_user(&USERENTRY_COMMENT, u, tmp2); get_user_flagrec(u, &fr, chan->dname); if (fr.global == (USER_DEOP|USER_KICK)) fr.match &= ~FR_GLOBAL; else fr.global = USER_DEOP | USER_KICK; if (fr.chan == (USER_DEOP|USER_KICK)) fr.match &= ~FR_CHAN; else fr.chan = USER_DEOP | USER_KICK; /* did anything change */ if (fr.match) set_user_flagrec(u, &fr, chan->dname); } else if (which == P_DELETE) { putlog(LOG_WARN, "*", "Deleting %s (%s): %s", u->handle, tmp, msg); deluser(u->handle); } else { putlog(LOG_WARN, "*", "No user flag effects for %s (%s): %s", u->handle, tmp, msg); simple_snprintf(tmp2, sizeof(tmp2), "Warning: %s (%s)", tmp, msg); set_user(&USERENTRY_COMMENT, u, tmp2); } }
/* Dependant on revenge_mode, punish the offender. */ static void punish_badguy(struct chanset_t *chan, char *whobad, struct userrec *u, char *badnick, char *victim, int mevictim, int type) { char reason[1024], ct[81], *kick_msg; memberlist *m; struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0 }; m = ismember(chan, badnick); if (!m) return; get_user_flagrec(u, &fr, chan->dname); /* Get current time into a string */ egg_strftime(ct, 7, "%d %b", localtime(&now)); /* Put together log and kick messages */ reason[0] = 0; switch (type) { case REVENGE_KICK: kick_msg = IRC_KICK_PROTECT; simple_sprintf(reason, "kicked %s off %s", victim, chan->dname); break; case REVENGE_DEOP: simple_sprintf(reason, "deopped %s on %s", victim, chan->dname); kick_msg = IRC_DEOP_PROTECT; break; default: kick_msg = "revenge!"; } putlog(LOG_MISC, chan->dname, "Punishing %s (%s)", badnick, reason); /* Set the offender +d */ if ((chan->revenge_mode > 0) && !(chan_deop(fr) || glob_deop(fr))) { char s[UHOSTLEN], s1[UHOSTLEN]; memberlist *mx = NULL; /* Removing op */ if (chan_op(fr) || (glob_op(fr) && !chan_deop(fr))) { fr.match = FR_CHAN; if (chan_op(fr)) fr.chan &= ~USER_OP; else fr.chan |= USER_DEOP; set_user_flagrec(u, &fr, chan->dname); putlog(LOG_MISC, "*", "No longer opping %s[%s] (%s)", u->handle, whobad, reason); } /* ... or just setting to deop */ else if (u) { /* In the user list already, cool :) */ fr.match = FR_CHAN; fr.chan |= USER_DEOP; set_user_flagrec(u, &fr, chan->dname); simple_sprintf(s, "(%s) %s", ct, reason); putlog(LOG_MISC, "*", "Now deopping %s[%s] (%s)", u->handle, whobad, s); } /* ... or creating new user and setting that to deop */ else { strcpy(s1, whobad); maskaddr(s1, s, chan->ban_type); strcpy(s1, badnick); /* If that handle exists use "badX" (where X is an increasing number) * instead. */ while (get_user_by_handle(userlist, s1)) { if (!strncmp(s1, "bad", 3)) { int i; i = atoi(s1 + 3); simple_sprintf(s1 + 3, "%d", i + 1); } else strcpy(s1, "bad1"); /* Start with '1' */ } userlist = adduser(userlist, s1, s, "-", 0); fr.match = FR_CHAN; fr.chan = USER_DEOP; fr.udef_chan = 0; u = get_user_by_handle(userlist, s1); if ((mx = ismember(chan, badnick))) mx->user = u; set_user_flagrec(u, &fr, chan->dname); simple_sprintf(s, "(%s) %s (%s)", ct, reason, whobad); set_user(&USERENTRY_COMMENT, u, (void *) s); putlog(LOG_MISC, "*", "Now deopping %s (%s)", whobad, reason); } } /* Always try to deop the offender */ if (!mevictim) add_mode(chan, '-', 'o', badnick); /* Ban. Should be done before kicking. */ if (chan->revenge_mode > 2) { char s[UHOSTLEN], s1[UHOSTLEN]; splitnick(&whobad); maskaddr(whobad, s1, chan->ban_type); simple_sprintf(s, "(%s) %s", ct, reason); u_addban(chan, s1, botnetnick, s, now + (60 * chan->ban_time), 0); if (!mevictim && HALFOP_CANDOMODE('b')) { add_mode(chan, '+', 'b', s1); flush_mode(chan, QUICK); } } /* Kick the offender */ if (!mevictim && (chan->revenge_mode > 1) && (!channel_dontkickops(chan) || (!chan_op(fr) && (!glob_op(fr) || chan_deop(fr)))) && !chan_sentkick(m) && (me_op(chan) || (me_halfop(chan) && !chan_hasop(m) && (strchr(NOHALFOPS_MODES, 'b') == NULL)))) { dprintf(DP_MODE, "KICK %s %s :%s\n", chan->name, badnick, kick_msg); m->flags |= SENTKICK; } }