int BX_is_other_flood(ChannelList *channel, NickList *tmpnick, int type, int *t_flood) { time_t diff = 0, flood_time = 0; int doit = 0; int count = 0; int flood_rate = 0, flood_count = 0; flood_time = now; if (!channel || !tmpnick) return 0; if (isme(tmpnick->nick)) return 0; if (find_name_in_genericlist(tmpnick->nick, no_flood_list, FLOOD_HASHSIZE, 0)) return 0; set_flood(type, flood_time, NO_RESET, tmpnick); switch(type) { case JOIN_FLOOD: if (!get_cset_int_var(channel->csets, JOINFLOOD_CSET)) break; diff = flood_time - tmpnick->jointime; count = tmpnick->joincount; doit = 1; break; case PUBLIC_FLOOD: if (!get_cset_int_var(channel->csets, PUBFLOOD_CSET)) break; diff = flood_time - tmpnick->floodtime; count = tmpnick->floodcount; doit = 1; break; case NICK_FLOOD: if (!get_cset_int_var(channel->csets, NICKFLOOD_CSET)) break; diff = flood_time - tmpnick->nicktime; count = tmpnick->nickcount; doit = 1; break; case DEOP_FLOOD: if (!get_cset_int_var(channel->csets, DEOPFLOOD_CSET)) break; diff = flood_time - tmpnick->doptime; count = tmpnick->dopcount; doit = 1; break; case KICK_FLOOD: if (!get_cset_int_var(channel->csets, KICKFLOOD_CSET)) break; diff = flood_time - tmpnick->kicktime; count = tmpnick->kickcount; doit = 1; break; default: return 0; break; } if (doit) { int is_user = 0; if (!get_int_var(FLOOD_PROTECTION_VAR)) return 0; get_flood_val(channel, type, &flood_count, &flood_rate); if ((tmpnick->userlist && (tmpnick->userlist->flags & ADD_FLOOD))) is_user = 1; if (!is_user && (count >= flood_count)) { int flooded = 0; if (count >= flood_count) { if (!diff || (flood_rate && (diff < flood_rate))) { *t_flood = diff; flooded = 1; do_hook(FLOOD_LIST, "%s %s %s %s", tmpnick->nick, get_flood_types(type),channel?channel->channel:zero, tmpnick->host); } set_flood(type, flood_time, RESET, tmpnick); return flooded; } else if (diff > flood_rate) set_flood(type, flood_time, RESET, tmpnick); } } return 0; }
NickList *check_auto(char *channel, NickList *nicklist, ChannelList *chan) { ShitList *shitptr = NULL; UserList *userptr = NULL; ChannelList *chan_ptr = NULL; char *ban; if (!channel || !*channel || !nicklist) return NULL; if (!chan) { ChannelList *chan2; chan2 = get_server_channels(from_server); chan_ptr = (ChannelList *) find_in_list((List **)&chan2, channel, 0); } else chan_ptr = chan; if (!chan_ptr) return NULL; if (!chan_ptr->chop) return nicklist; userptr = nicklist->userlist; shitptr = nicklist->shitlist; if (userptr && !check_channel_match(userptr->channels, channel)) userptr = NULL; if (shitptr && (!check_channel_match(shitptr->channels, channel) || isme(nicklist->nick))) shitptr = NULL; if (get_cset_int_var(chan_ptr->csets, SHITLIST_CSET) && shitptr != NULL && userptr == NULL) { char *theshit; time_t current = now; theshit = get_string_var(SHITLIST_REASON_VAR); switch(shitptr->level) { case 0: return nicklist; break; case 1:/* never give opz */ if (nicklist->sent_deop < 4 && nick_isop(nicklist)) { add_mode(chan_ptr, "o", 0, nicklist->nick, NULL, get_int_var(NUM_OPMODES_VAR)); nicklist->sent_deop++; nicklist->sent_deop_time = current; } break; case 2: /* Auto Kick offender */ add_mode(chan_ptr, NULL, 0, nicklist->nick, shitptr->reason?shitptr->reason:theshit, 0); break; case 3: /* kick ban the offender */ case 4: /* perm ban on offender */ if (nicklist->sent_deop < 4 || (nicklist->sent_deop < 4 && shitptr->level == 4)) { send_to_server("MODE %s -o+b %s %s", channel, nicklist->nick, shitptr->filter); nicklist->sent_deop++; nicklist->sent_deop_time = current; if (get_int_var(AUTO_UNBAN_VAR) && shitptr->level != 4) add_timer(0, empty_string, get_int_var(AUTO_UNBAN_VAR) * 1000, 1, timer_unban, m_sprintf("%d %s %s", from_server, channel, shitptr->filter), NULL, -1, "auto-unban"); } if (get_cset_int_var(chan_ptr->csets, KICK_IF_BANNED_CSET)) send_to_server("KICK %s %s :%s", channel, nicklist->nick, (shitptr->reason && *shitptr->reason) ? shitptr->reason : theshit); default: break; } return nicklist; } if (userptr && get_cset_int_var(chan_ptr->csets, USERLIST_CSET)) { char *buffer = NULL; time_t current = now; int done = 0; char *p = NULL; if (get_cset_int_var(chan_ptr->csets, AOP_CSET)) { if ((userptr->flags & ADD_OPS)) { done++; if (!userptr->password && !nicklist->sent_reop && !nick_isop(nicklist)) { nicklist->sent_reop++; nicklist->sent_reop_time = current; if (!(userptr->flags & ADD_IOPS)) { malloc_sprintf(&buffer, "%s %s %s %s %d", channel, nicklist->nick, nicklist->host, "o", from_server); add_timer(0, empty_string, 10 * 1000, 1, delay_opz, buffer, NULL, -1, "delay-ops"); } else send_to_server("MODE %s +o %s", chan_ptr->channel, nicklist->nick); } } else if ((userptr->flags & ADD_VOICE)) { done++; if (!nicklist->sent_voice && !nick_isvoice(nicklist)) { nicklist->sent_voice++; nicklist->sent_voice_time = current; if (!(userptr->flags & ADD_IOPS)) { malloc_sprintf(&buffer, "%s %s %s %s %d", channel, nicklist->nick, nicklist->host, "v", from_server); add_timer(0, empty_string, 10 * 1000, 1, delay_opz, buffer, NULL, -1, "delay-ops"); } else send_to_server("MODE %s +v %s", chan_ptr->channel, nicklist->nick); } } } if ((userptr->flags & USER_FLAG_OPS) && (p = get_string_var(USER_FLAG_OPS_VAR))) { done++; run_user_flag("USER_FLAG_OPS", p, nicklist, NULL); } if (done) return nicklist; } if (get_cset_int_var(chan_ptr->csets, KICK_IF_BANNED_CSET) && check_channel_match(get_string_var(PROTECT_CHANNELS_VAR), chan_ptr->channel)) { char *ipban = NULL; char *u = NULL; if (!nicklist->host) return nicklist; ban = m_3dup(nicklist->nick, "!", nicklist->host); if (nicklist->ip && nicklist->host) { char *user = alloca(strlen(nicklist->host)+1); strcpy(user, nicklist->host); if ((u = strchr(user, '@'))) *u = 0; ipban = m_opendup(nicklist->nick, "!", user, "@", nicklist->ip, NULL); } if (!isme(nicklist->nick) && (!eban_is_on_channel(ban, chan_ptr) && (ban_is_on_channel(ban, chan_ptr) || (ipban && ban_is_on_channel(ipban, chan_ptr)))) ) { new_free(&ban); new_free(&ipban); if (nick_isop(nicklist) && !get_cset_int_var(chan_ptr->csets, KICK_OPS_CSET)) return nicklist; my_send_to_server(from_server, "KICK %s %s :Banned", chan_ptr->channel, nicklist->nick); } new_free(&ban); new_free(&ipban); } return nicklist; }