diff options
author | michael <michael@82007160-df01-0410-b94d-b575c5fd34c7> | 2013-07-04 22:42:00 +0000 |
---|---|---|
committer | michael <michael@82007160-df01-0410-b94d-b575c5fd34c7> | 2013-07-04 22:42:00 +0000 |
commit | 64e8625aae82a1a71ab953342e66442a36a3149c (patch) | |
tree | 4f2b6060df406c6e87bf9ee2ff21b594be8d915c /modules/core | |
parent | bd7469c5c19b5a85b697b6bbdd7fae1a75b19575 (diff) |
- m_nick.c:change_local_nick(): fixed nickchange-flooding logic
not to further penalize already penalized clients
git-svn-id: svn://svn.ircd-hybrid.org/svnroot/ircd-hybrid/branches/8.1.x@2367 82007160-df01-0410-b94d-b575c5fd34c7
Diffstat (limited to 'modules/core')
-rw-r--r-- | modules/core/m_nick.c | 93 |
1 files changed, 48 insertions, 45 deletions
diff --git a/modules/core/m_nick.c b/modules/core/m_nick.c index aaedb30..e271494 100644 --- a/modules/core/m_nick.c +++ b/modules/core/m_nick.c @@ -187,6 +187,8 @@ set_initial_nick(struct Client *source_p, const char *nick) static void change_local_nick(struct Client *source_p, const char *nick) { + int samenick = 0; + assert(source_p->name[0] && !EmptyString(nick)); assert(MyConnect(source_p)); @@ -198,62 +200,63 @@ change_local_nick(struct Client *source_p, const char *nick) if ((source_p->localClient->last_nick_change + ConfigFileEntry.max_nick_time) < CurrentTime) source_p->localClient->number_of_nick_changes = 0; + + if (ConfigFileEntry.anti_nick_flood && + !HasUMode(source_p, UMODE_OPER) && + source_p->localClient->number_of_nick_changes > + ConfigFileEntry.max_nick_changes) + { + sendto_one(source_p, form_str(ERR_NICKTOOFAST), me.name, + source_p->name, source_p->name, nick, + ConfigFileEntry.max_nick_time); + return; + } + source_p->localClient->last_nick_change = CurrentTime; source_p->localClient->number_of_nick_changes++; - if ((ConfigFileEntry.anti_nick_flood && - (source_p->localClient->number_of_nick_changes - <= ConfigFileEntry.max_nick_changes)) || - !ConfigFileEntry.anti_nick_flood || - (HasUMode(source_p, UMODE_OPER) && ConfigFileEntry.no_oper_flood)) + samenick = !irccmp(source_p->name, nick); + + if (!samenick) { - int samenick = !irccmp(source_p->name, nick); + source_p->tsinfo = CurrentTime; + clear_ban_cache_client(source_p); + watch_check_hash(source_p, RPL_LOGOFF); - if (!samenick) + if (HasUMode(source_p, UMODE_REGISTERED)) { - source_p->tsinfo = CurrentTime; - clear_ban_cache_client(source_p); - watch_check_hash(source_p, RPL_LOGOFF); + unsigned int oldmodes = source_p->umodes; + char modebuf[IRCD_BUFSIZE] = { '\0' }; - if (HasUMode(source_p, UMODE_REGISTERED)) - { - unsigned int oldmodes = source_p->umodes; - char modebuf[IRCD_BUFSIZE] = { '\0' }; - - DelUMode(source_p, UMODE_REGISTERED); - send_umode(source_p, source_p, oldmodes, 0xffffffff, modebuf); - } + DelUMode(source_p, UMODE_REGISTERED); + send_umode(source_p, source_p, oldmodes, 0xffffffff, modebuf); } + } - sendto_realops_flags(UMODE_NCHANGE, L_ALL, SEND_NOTICE, - "Nick change: From %s to %s [%s@%s]", - source_p->name, nick, source_p->username, source_p->host); - sendto_common_channels_local(source_p, 1, 0, ":%s!%s@%s NICK :%s", - source_p->name, source_p->username, - source_p->host, nick); - whowas_add_history(source_p, 1); - - sendto_server(source_p, CAP_TS6, NOCAPS, - ":%s NICK %s :%lu", - ID(source_p), nick, (unsigned long)source_p->tsinfo); - sendto_server(source_p, NOCAPS, CAP_TS6, - ":%s NICK %s :%lu", - source_p->name, nick, (unsigned long)source_p->tsinfo); - - hash_del_client(source_p); - strlcpy(source_p->name, nick, sizeof(source_p->name)); - hash_add_client(source_p); + sendto_realops_flags(UMODE_NCHANGE, L_ALL, SEND_NOTICE, + "Nick change: From %s to %s [%s@%s]", + source_p->name, nick, source_p->username, source_p->host); + sendto_common_channels_local(source_p, 1, 0, ":%s!%s@%s NICK :%s", + source_p->name, source_p->username, + source_p->host, nick); + whowas_add_history(source_p, 1); + + sendto_server(source_p, CAP_TS6, NOCAPS, + ":%s NICK %s :%lu", + ID(source_p), nick, (unsigned long)source_p->tsinfo); + sendto_server(source_p, NOCAPS, CAP_TS6, + ":%s NICK %s :%lu", + source_p->name, nick, (unsigned long)source_p->tsinfo); + + hash_del_client(source_p); + strlcpy(source_p->name, nick, sizeof(source_p->name)); + hash_add_client(source_p); - if (!samenick) - watch_check_hash(source_p, RPL_LOGON); + if (!samenick) + watch_check_hash(source_p, RPL_LOGON); - /* fd_desc is long enough */ - fd_note(&source_p->localClient->fd, "Nick: %s", nick); - } - else - sendto_one(source_p, form_str(ERR_NICKTOOFAST), me.name, - source_p->name, source_p->name, nick, - ConfigFileEntry.max_nick_time); + /* fd_desc is long enough */ + fd_note(&source_p->localClient->fd, "Nick: %s", nick); } /* |