void check_ctcp_ban_flood(char *channel, char *nick) { NickList *Nick = NULL; ChannelList *chan = NULL; for (chan = get_server_channels(from_server); chan; chan = chan->next) if ((Nick = find_nicklist_in_channellist(nick, chan, 0))) break; if (chan && chan->have_op && get_cset_int_var(chan->csets, CTCP_FLOOD_BAN_CSET) && Nick) { if (!Nick->userlist || (Nick->userlist && !(Nick->userlist->flags & ADD_FLOOD))) { if (!nick_isop(Nick) || get_cset_int_var(chan->csets, KICK_OPS_CSET)) { char *ban, *u, *h; u = alloca(strlen(Nick->host)+1); strcpy(u, Nick->host); h = strchr(u, '@'); *h++ = 0; ban = ban_it(Nick->nick, u, h, Nick->ip); if (!ban_is_on_channel(ban, chan) && !eban_is_on_channel(ban, chan)) send_to_server("MODE %s +b %s", chan->channel, ban); } } } }
void userhost_ban(UserhostItem *stuff, char *nick1, char *args) { char *temp; char *str= NULL; char *channel; ChannelList *c = NULL; NickList *n = NULL; char *ob = "-o+b"; char *b = "+b"; char *host = NULL, *nick = NULL, *user = NULL, *chan = NULL; WhowasList *whowas = NULL; int f**k = 0; int set_ignore = 0; channel = next_arg(args, &args); temp = next_arg(args, &args); f**k = !my_stricmp("F**K", args); set_ignore = !my_stricmp("BKI", args); if (!stuff || !stuff->nick || !nick1 || !strcmp(stuff->user, "<UNKNOWN>") || my_stricmp(stuff->nick, nick1)) { if (nick1 && channel && (whowas = check_whowas_nick_buffer(nick1, channel, 0))) { nick = whowas->nicklist->nick; user = m_strdup(clear_server_flags(whowas->nicklist->host)); host = strchr(user, '@'); *host++ = 0; bitchsay("Using WhoWas info for ban of %s ", nick1); n = whowas->nicklist; } else if (nick1) { bitchsay("No match for the %s of %s on %s", f**k ? "F**k":"Ban", nick1, channel); return; } } else { nick = stuff->nick; user = m_strdup(clear_server_flags(stuff->user)); host = stuff->host; } if (!(my_stricmp(nick, get_server_nickname(from_server)))) { bitchsay("Try to kick yourself again!!"); new_free(&user); return; } if (is_on_channel(channel, from_server, nick)) chan = channel; c = lookup_channel(channel, from_server, 0); if (c && !n) n = find_nicklist_in_channellist(nick, c, 0); send_to_server("MODE %s %s %s %s", channel, chan ? ob : b, chan?nick:empty_string, ban_it(nick, user, host, (n && n->ip)?n->ip:NULL)); if (f**k) { malloc_sprintf(&str, "%s!*%s@%s %s 3 Auto-Shit", nick, user, host, channel); #ifdef WANT_USERLIST add_shit(NULL, str, NULL, NULL); #endif new_free(&str); } else if (set_ignore) ignore_nickname(ban_it("*", user, host, NULL) , IGNORE_ALL, 0); new_free(&user); }
/* * Protection levels * 1 Reop if de-oped * 2 De-op offender * 3 Kick offender * 4 KickBan offender */ int check_prot(char *from, char *person, ChannelList *chan, BanList *thisban, NickList *n) { NickList *tmp = NULL; NickList *kicker; char *tmp_ban = NULL; char *nick = NULL, *userhost = NULL, *p; if (!from || !*from || !person || !*person || !chan) return 0; if (!my_stricmp(person, from)) return 0; tmp_ban = LOCAL_COPY(person); if ((p = strchr(tmp_ban, '!'))) { nick = tmp_ban; *p++ = 0; userhost = p; } else nick = person; if (!n) { if (!(tmp = find_nicklist_in_channellist(person, chan, 0))) { for (tmp = next_nicklist(chan, NULL); tmp; tmp = next_nicklist(chan, tmp)) { if (wild_match(nick, tmp->nick) && wild_match(userhost, tmp->host) && tmp->userlist) { n = tmp; break; } } } } if (get_cset_int_var(chan->csets, USERLIST_CSET) && chan->chop && ((n && n->userlist) || (tmp && tmp->userlist))) { UserList *user = NULL; time_t current = now; if (n) user = n->userlist; else user = tmp->userlist; if (!user || (user && !check_channel_match(user->channels, chan->channel))) return 0; if (!(kicker = find_nicklist_in_channellist(from, chan, 0))) return 0; if ((user->flags & (PROT_DEOP | PROT_INVITE | PROT_BAN | PROT_KICK | PROT_REOP))) { int do_reop = 0; if (user->flags & PROT_DEOP) { if (!kicker->sent_deop) { if (!kicker->userlist || (kicker->userlist && !(kicker->userlist->flags & PROT_DEOP))) send_to_server("MODE %s -o %s", chan->channel, from); kicker->sent_deop++; } do_reop = 1; } if (user->flags & PROT_INVITE) { if (thisban && !thisban->sent_unban) { thisban->sent_unban++; thisban->sent_unban_time = current; send_to_server("MODE %s -b %s", chan->channel, thisban->ban); send_to_server("INVITE %s %s", n?n->nick:tmp->nick, chan->channel); } } if (user->flags & PROT_BAN) { /* do_reop = 1; */ if (kicker->userlist) send_to_server("MODE %s -o %s", chan->channel, from); else { char *h, *u; u = LOCAL_COPY(kicker->host); h = strchr(u, '@'); *h++ = 0; send_to_server("MODE %s -o+b %s %s", chan->channel, kicker->nick, ban_it(kicker->nick, u, h, kicker->ip)); if (get_int_var(AUTO_UNBAN_VAR)) add_timer(0, empty_string, get_int_var(AUTO_UNBAN_VAR) * 1000, 1, timer_unban, m_sprintf("%d %s %s", from_server, chan->channel, ban_it(kicker->nick, u, h, kicker->ip)), NULL, -1, "auto-unban"); } } if (user->flags & PROT_KICK) { if (kicker && (!kicker->userlist || (kicker->userlist && !(kicker->userlist->flags & PROT_KICK)))) send_to_server("KICK %s %s :\002BitchX\002 Protected User", chan->channel, kicker->nick); } if ((user->flags & PROT_REOP) || do_reop) { /* added by Sergs [email protected] */ if (thisban) { if (thisban->sent_unban_time - current > 30) { thisban->sent_unban++; thisban->sent_unban_time = current; send_to_server("MODE %s -b %s", chan->channel, thisban->ban); } else if (thisban->sent_unban < 3) { thisban->sent_unban++; thisban->sent_unban_time = current; send_to_server("MODE %s -b %s", chan->channel, thisban->ban); } } if (n && (!n->sent_reop || (n->sent_reop_time && (current - n->sent_reop_time > 60)))) { char *u = NULL; malloc_sprintf(&u, "%s %s %s %s %d", chan->channel, n->nick, n->host, "o", from_server); add_timer(0, empty_string, 10 * 1000, 1, delay_opz, u, NULL, -1, "delay-ops"); n->sent_reop++; n->sent_reop_time = current; } } } if ((user->flags & USER_FLAG_PROT) && (p = get_string_var(USER_FLAG_PROT_VAR))) run_user_flag("USER_FLAG_PROT", p, n, kicker); return 1; } return 0; }