X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2Fevent_neonspam_chanmsg.c;h=117d5ad85c96130175b1774731f71bcc20439501;hb=bb5692b9cbff069abbf9573c81e86c3cd2061ceb;hp=b7f124fbf8154ed3f7f0069d5ab752e12674d4ac;hpb=ff6c5041af889bbc986199316daba8676b8e9cfd;p=NeonServV5.git diff --git a/src/event_neonspam_chanmsg.c b/src/event_neonspam_chanmsg.c index b7f124f..117d5ad 100644 --- a/src/event_neonspam_chanmsg.c +++ b/src/event_neonspam_chanmsg.c @@ -1,5 +1,5 @@ -/* event_neonspam_chanmsg.c - NeonServ v5.1 - * Copyright (C) 2011 Philipp Kreil (pk910) +/* event_neonspam_chanmsg.c - NeonServ v5.3 + * Copyright (C) 2011-2012 Philipp Kreil (pk910) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,6 +18,8 @@ static int neonspam_spamscan(struct NeonSpamSettings *settings, struct ChanUser *chanuser, char *message); static int neonspam_floodscan(struct NeonSpamSettings *settings, struct ChanUser *chanuser); static int neonspam_botnetscan(struct ClientSocket *client, struct NeonSpamSettings *settings, struct ChanUser *chanuser, char *message); +static int neonspam_capsscan(struct NeonSpamSettings *settings, struct ChanUser *chanuser, char *message); +static int neonspam_digitscan(struct NeonSpamSettings *settings, struct ChanUser *chanuser, char *message); static USERAUTH_CALLBACK(neonspam_event_chanmsg_nick_lookup); static void neonspam_event_chanmsg_punish(struct ClientSocket *client, struct ChanUser *chanuser, struct NeonSpamSettings *settings, unsigned int warn, unsigned int punish); @@ -34,7 +36,7 @@ struct neonspam_event_chanmsg_cache { static void neonspam_event_chanmsg(struct UserNode *user, struct ChanNode *chan, char *message) { struct ClientSocket *client = getChannelBot(chan, BOTID); - if(!client) return; //we can't "see" this event + if(!client || (user->flags & USERFLAG_ISBOT)) return; //we can't "see" this event loadNeonSpamSettings(chan); struct NeonSpamSettings *settings = chan->spam_settings; struct ChanUser *chanuser = getChanUser(user, chan); @@ -91,6 +93,40 @@ static void neonspam_event_chanmsg(struct UserNode *user, struct ChanNode *chan, break; } } + if((settings->flags & SPAMSETTINGS_CAPSSCAN) && NEONSPAM_CHANMSG_DO_SCANOPS(SPAMSETTINGS_CAPSSCAN_OPS) && NEONSPAM_CHANMSG_DO_SCANVOICE(SPAMSETTINGS_CAPSSCAN_VOICE) && NEONSPAM_CHANMSG_DO_EXCEPT(SPAMSETTINGS_CAPSEXCINDEX)) { + result = neonspam_capsscan(settings, chanuser, message); + switch(result) { + case SPAMSERV_CHECK_IGNORE: + break; + case SPAMSERV_CHECK_WARN: + warn |= SPAMSETTINGS_CAPSSCAN; + if(NEONSPAM_CHANMSG_NEED_WHO(SPAMSETTINGS_CAPSEXCINDEX)) + needwho = 1; + break; + case SPAMSERV_CHECK_PUNISH: + punish |= SPAMSETTINGS_CAPSSCAN; + if(NEONSPAM_CHANMSG_NEED_WHO(SPAMSETTINGS_CAPSEXCINDEX)) + needwho = 1; + break; + } + } + if((settings->flags & SPAMSETTINGS_DIGITSCAN) && NEONSPAM_CHANMSG_DO_SCANOPS(SPAMSETTINGS_DIGITSCAN_OPS) && NEONSPAM_CHANMSG_DO_SCANVOICE(SPAMSETTINGS_DIGITSCAN_VOICE) && NEONSPAM_CHANMSG_DO_EXCEPT(SPAMSETTINGS_DIGITEXCINDEX)) { + result = neonspam_digitscan(settings, chanuser, message); + switch(result) { + case SPAMSERV_CHECK_IGNORE: + break; + case SPAMSERV_CHECK_WARN: + warn |= SPAMSETTINGS_DIGITSCAN; + if(NEONSPAM_CHANMSG_NEED_WHO(SPAMSETTINGS_DIGITEXCINDEX)) + needwho = 1; + break; + case SPAMSERV_CHECK_PUNISH: + punish |= SPAMSETTINGS_DIGITSCAN; + if(NEONSPAM_CHANMSG_NEED_WHO(SPAMSETTINGS_DIGITEXCINDEX)) + needwho = 1; + break; + } + } //some other checks? if(warn || punish) { @@ -130,7 +166,7 @@ static void neonspam_event_chanmsg_punish(struct ClientSocket *client, struct Ch loadChannelSettings(chanuser->chan); int uaccess = 0; if(chanuser->user->flags & USERFLAG_ISAUTHED) - uaccess = getChannelAccess(chanuser->user, chanuser->chan, 0); + uaccess = getChannelAccess(chanuser->user, chanuser->chan); char reason[MAXLEN]; reason[0] = '\0'; int punishment = 0; @@ -161,17 +197,49 @@ static void neonspam_event_chanmsg_punish(struct ClientSocket *client, struct Ch punishment = atoi(row[0]) + 1; punish_time = atoi(row[1]); } + if(!punishment && (punish & SPAMSETTINGS_CAPSSCAN) && settings->exceptlevel[SPAMSETTINGS_CAPSEXCINDEX] > uaccess) { + printf_mysql_query("SELECT `channel_caps_reaction`, `channel_caps_reaction_duration` FROM `channels` WHERE `channel_id` = '%d'", chanuser->chan->channel_id); + res = mysql_use(); + row = mysql_fetch_row(res); + if(!row[0]) { + printf_mysql_query("SELECT `channel_caps_reaction`, `channel_caps_reaction_duration` FROM `channels` WHERE `channel_name` = 'defaults'"); + res = mysql_use(); + row = mysql_fetch_row(res); + } + sprintf(reason, SPAMSERV_MSG_WARNING, SPAMSERV_MSG_CAPS); + punishment = atoi(row[0]) + 1; + punish_time = atoi(row[1]); + } + if(!punishment && (punish & SPAMSETTINGS_DIGITSCAN) && settings->exceptlevel[SPAMSETTINGS_DIGITEXCINDEX] > uaccess) { + printf_mysql_query("SELECT `channel_digit_reaction`, `channel_digit_reaction_duration` FROM `channels` WHERE `channel_id` = '%d'", chanuser->chan->channel_id); + res = mysql_use(); + row = mysql_fetch_row(res); + if(!row[0]) { + printf_mysql_query("SELECT `channel_digit_reaction`, `channel_digit_reaction_duration` FROM `channels` WHERE `channel_name` = 'defaults'"); + res = mysql_use(); + row = mysql_fetch_row(res); + } + sprintf(reason, SPAMSERV_MSG_WARNING, SPAMSERV_MSG_DIGIT); + punishment = atoi(row[0]) + 1; + punish_time = atoi(row[1]); + } if(!punishment && (warn & SPAMSETTINGS_SPAMSCAN) && settings->exceptlevel[SPAMSETTINGS_SPAMEXCINDEX] > uaccess) { sprintf(reason, SPAMSERV_MSG_WARNING, SPAMSERV_MSG_SPAM); } if(!punishment && (warn & SPAMSETTINGS_FLOODSCAN) && settings->exceptlevel[SPAMSETTINGS_FLOODEXCINDEX] > uaccess) { sprintf(reason, SPAMSERV_MSG_WARNING, SPAMSERV_MSG_FLOOD); } + if(!punishment && (warn & SPAMSETTINGS_CAPSSCAN) && settings->exceptlevel[SPAMSETTINGS_CAPSEXCINDEX] > uaccess) { + sprintf(reason, SPAMSERV_MSG_WARNING, SPAMSERV_MSG_CAPS); + } + if(!punishment && (warn & SPAMSETTINGS_DIGITSCAN) && settings->exceptlevel[SPAMSETTINGS_DIGITEXCINDEX] > uaccess) { + sprintf(reason, SPAMSERV_MSG_WARNING, SPAMSERV_MSG_DIGIT); + } if(punishment) { char banmaskBuf[NICKLEN+USERLEN+HOSTLEN+3]; char *banmask = NULL; switch (punishment) { - case 3: //TIMEBAN: 1h + case 3: //TIMEBAN banmask = generate_banmask(chanuser->user, banmaskBuf); printf_mysql_query("INSERT INTO `bans` (`ban_channel`, `ban_mask`, `ban_triggered`, `ban_timeout`, `ban_owner`, `ban_reason`) VALUES ('%d', '%s', UNIX_TIMESTAMP(), '%lu', '%d', '%s')", chanuser->chan->channel_id, escape_string(banmask), (unsigned long) (punish_time ? (time(0) + punish_time) : 0), 0, escape_string(reason)); if(punish_time) { @@ -279,3 +347,46 @@ static int neonspam_botnetscan(struct ClientSocket *client, struct NeonSpamSetti settings->lastmsg_time = time(0); return SPAMSERV_CHECK_IGNORE; } + +static int neonspam_capsscan(struct NeonSpamSettings *settings, struct ChanUser *chanuser, char *message) { + int caps = 0, msglen = strlen(message); + int i; + if(msglen <= 4) return SPAMSERV_CHECK_IGNORE; + for(i = 0; i < msglen; i++) { + if(isupper(message[i])) caps++; + } + caps = 100*caps/msglen; + if(caps >= settings->percent[SPAMSETTINGS_CAPSPERCENTINDEX]) { + if(!chanuser->spamnode) + createSpamNode(chanuser); + if(chanuser->spamnode->flags & NEONSPAMNODE_FLAG_CAPSSCAN_WARNED) + return SPAMSERV_CHECK_PUNISH; + else { + chanuser->spamnode->flags |= NEONSPAMNODE_FLAG_CAPSSCAN_WARNED; + return SPAMSERV_CHECK_WARN; + } + } + return SPAMSERV_CHECK_IGNORE; +} + +static int neonspam_digitscan(struct NeonSpamSettings *settings, struct ChanUser *chanuser, char *message) { + int digit = 0, msglen = strlen(message); + int i; + if(msglen <= 4) return SPAMSERV_CHECK_IGNORE; + for(i = 0; i < msglen; i++) { + if(isdigit(message[i])) digit++; + } + digit = 100*digit/msglen; + if(digit >= settings->percent[SPAMSETTINGS_DIGITPERCENTINDEX]) { + if(!chanuser->spamnode) + createSpamNode(chanuser); + if(chanuser->spamnode->flags & NEONSPAMNODE_FLAG_DIGITSCAN_WARNED) + return SPAMSERV_CHECK_PUNISH; + else { + chanuser->spamnode->flags |= NEONSPAMNODE_FLAG_DIGITSCAN_WARNED; + return SPAMSERV_CHECK_WARN; + } + } + return SPAMSERV_CHECK_IGNORE; +} +