static int msg_pls_auth(char *nick, char *host, struct userrec *u, char *par) { if (strlen(auth_key) && get_user(&USERENTRY_SECPASS, u)) { if (match_my_nick(nick)) return BIND_RET_BREAK; if (u && u->bot) return BIND_RET_BREAK; Auth *auth = Auth::Find(host); if (!auth || auth->Status() != AUTH_HASH) return BIND_RET_BREAK; if (!strcmp(auth->hash, par)) { /* good hash! */ AuthFinish(auth); } else { /* bad hash! */ char s[300] = ""; putlog(LOG_CMDS, "*", STR("(%s!%s) !%s! failed +AUTH"), nick, host, u->handle); notice(nick, STR("Invalid hash."), DP_HELP); simple_snprintf(s, sizeof(s), "*!%s", host); addignore(s, origbotname, STR("Invalid auth hash."), now + (60 * ignore_time)); delete auth; } return BIND_RET_BREAK; } return BIND_RET_LOG; }
/* Do on NICK, PRIVMSG, NOTICE and JOIN. */ static int detect_flood(char *floodnick, char *floodhost, char *from, int which) { char *p, ftype[10], h[1024]; struct userrec *u; int thr = 0, lapse = 0, atr; /* Okay, make sure i'm not flood-checking myself */ if (match_my_nick(floodnick)) return 0; /* My user@host (?) */ if (!egg_strcasecmp(floodhost, botuserhost)) return 0; u = get_user_by_host(from); atr = u ? u->flags : 0; if (atr & (USER_BOT | USER_FRIEND)) return 0; /* Determine how many are necessary to make a flood */ switch (which) { case FLOOD_PRIVMSG: case FLOOD_NOTICE: thr = flud_thr; lapse = flud_time; strcpy(ftype, "msg"); break; case FLOOD_CTCP: thr = flud_ctcp_thr; lapse = flud_ctcp_time; strcpy(ftype, "ctcp"); break; } if ((thr == 0) || (lapse == 0)) return 0; /* No flood protection */ p = strchr(floodhost, '@'); if (p) { p++; if (egg_strcasecmp(lastmsghost[which], p)) { /* New */ strcpy(lastmsghost[which], p); lastmsgtime[which] = now; lastmsgs[which] = 0; return 0; } } else return 0; /* Uh... whatever. */ if (lastmsgtime[which] < now - lapse) { /* Flood timer expired, reset it */ lastmsgtime[which] = now; lastmsgs[which] = 0; return 0; } lastmsgs[which]++; if (lastmsgs[which] >= thr) { /* FLOOD */ /* Reset counters */ lastmsgs[which] = 0; lastmsgtime[which] = 0; lastmsghost[which][0] = 0; u = get_user_by_host(from); if (check_tcl_flud(floodnick, floodhost, u, ftype, "*")) return 0; /* Private msg */ simple_sprintf(h, "*!*@%s", p); putlog(LOG_MISC, "*", IRC_FLOODIGNORE1, p); addignore(h, botnetnick, (which == FLOOD_CTCP) ? "CTCP flood" : "MSG/NOTICE flood", now + (60 * ignore_time)); } return 0; }