Esempio n. 1
0
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;
} 
Esempio n. 2
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;
}