diff options
-rw-r--r-- | conf/modules.conf.example | 11 | ||||
-rw-r--r-- | src/modules/m_nickban.cpp | 65 | ||||
-rw-r--r-- | src/modules/m_nonicks.cpp | 44 |
3 files changed, 31 insertions, 89 deletions
diff --git a/conf/modules.conf.example b/conf/modules.conf.example index 687d45d61..d30aac30e 100644 --- a/conf/modules.conf.example +++ b/conf/modules.conf.example @@ -865,12 +865,6 @@ #<module name="m_namesx.so"> #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# -# Nickban: Implements extended ban n:, which stops anyone matching -# a mask like +b n:nick!user@host from changing their nick on channel. -#<module name="m_nickban.so"> -# - -#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# # Nickchange flood protection module: Allows up to X nick changes in Y seconds. # Provides channel mode +F. #<module name="m_nickflood.so"> @@ -893,7 +887,10 @@ #<module name="m_nokicks.so"> #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# -# No nicks module: Adds the +N channel mode +# No nicks module: Adds the +N channel mode, as well as the +b N: +# extended bantype. +N stops all users from changing their nick, +# the +b N: extban stops anyone from matching a +b N:nick!user@host +# mask from changing their nick. #<module name="m_nonicks.so"> #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-# diff --git a/src/modules/m_nickban.cpp b/src/modules/m_nickban.cpp deleted file mode 100644 index c2bd883a8..000000000 --- a/src/modules/m_nickban.cpp +++ /dev/null @@ -1,65 +0,0 @@ -/* +------------------------------------+ - * | Inspire Internet Relay Chat Daemon | - * +------------------------------------+ - * - * InspIRCd: (C) 2002-2008 InspIRCd Development Team - * See: http://www.inspircd.org/wiki/index.php/Credits - * - * This program is free but copyrighted software; see - * the file COPYING for details. - * - * --------------------------------------------------- - */ - -#include "inspircd.h" - -/* $ModDesc: Implements extban +b n: - nick change bans */ - -class ModuleNickBan : public Module -{ - private: - public: - ModuleNickBan(InspIRCd* Me) : Module(Me) - { - Implementation eventlist[] = { I_OnUserPreNick, I_On005Numeric }; - ServerInstance->Modules->Attach(eventlist, this, 2); - } - - virtual ~ModuleNickBan() - { - } - - virtual Version GetVersion() - { - return Version(1,2,0,0,VF_VENDOR,API_VERSION); - } - - virtual int OnUserPreNick(User *user, const std::string &newnick) - { - if (!IS_LOCAL(user)) - return 0; - - for (UCListIter i = user->chans.begin(); i != user->chans.end(); i++) - { - if (i->first->IsExtBanned(user, 'n')) - { - user->WriteServ("NOTICE "+std::string(user->nick)+" :*** Cannot change nick on " + i->first->name + ", as you match a nickname-change ban"); - return 1; - } - } - - return 0; - } - - virtual void On005Numeric(std::string &output) - { - if (output.find(" EXTBAN=:") == std::string::npos) - output.append(" EXTBAN=:n"); - else - output.insert(output.find(" EXTBAN=:") + 9, "n"); - } -}; - - -MODULE_INIT(ModuleNickBan) - diff --git a/src/modules/m_nonicks.cpp b/src/modules/m_nonicks.cpp index ed02af39f..7405c7149 100644 --- a/src/modules/m_nonicks.cpp +++ b/src/modules/m_nonicks.cpp @@ -13,7 +13,7 @@ #include "inspircd.h" -/* $ModDesc: Provides support for channel mode +N which prevents nick changes on channel */ +/* $ModDesc: Provides support for channel mode +N & extban +b N: which prevents nick changes on channel */ class NoNicks : public ModeHandler { @@ -47,14 +47,13 @@ class ModuleNoNickChange : public Module { NoNicks* nn; public: - ModuleNoNickChange(InspIRCd* Me) - : Module(Me) + ModuleNoNickChange(InspIRCd* Me) : Module(Me) { nn = new NoNicks(ServerInstance); ServerInstance->Modes->AddMode(nn); - Implementation eventlist[] = { I_OnUserPreNick }; - ServerInstance->Modules->Attach(eventlist, this, 1); + Implementation eventlist[] = { I_OnUserPreNick, I_On005Numeric }; + ServerInstance->Modules->Attach(eventlist, this, 2); } virtual ~ModuleNoNickChange() @@ -69,25 +68,36 @@ class ModuleNoNickChange : public Module } + virtual void On005Numeric(std::string &output) + { + ServerInstance->AddExtBanChar("n"); + } + virtual int OnUserPreNick(User* user, const std::string &newnick) { - if (IS_LOCAL(user)) + if (!IS_LOCAL(user)) + return 0; + + if (isdigit(newnick[0])) /* don't even think about touching a switch to uid! */ + return 0; + + for (UCListIter i = user->chans.begin(); i != user->chans.end(); i++) { - if (isdigit(newnick[0])) /* don't even think about touching a switch to uid! */ - return 0; + Channel* curr = i->first; - for (UCListIter i = user->chans.begin(); i != user->chans.end(); i++) + if (curr->IsModeSet('N')) { - Channel* curr = i->first; + if (CHANOPS_EXEMPT(ServerInstance, 'N') && curr->GetStatus(user) == STATUS_OP) + continue; - if (curr->IsModeSet('N')) - { - if (CHANOPS_EXEMPT(ServerInstance, 'N') && curr->GetStatus(user) == STATUS_OP) - continue; + user->WriteNumeric(ERR_CANTCHANGENICK, "%s :Can't change nickname while on %s (+N is set)", user->nick.c_str(), curr->name.c_str()); + return 1; + } - user->WriteNumeric(ERR_CANTCHANGENICK, "%s :Can't change nickname while on %s (+N is set)", user->nick.c_str(), curr->name.c_str()); - return 1; - } + if (curr->IsExtBanned(user, 'N')) + { + user->WriteNumeric(ERR_CANTCHANGENICK, "%s :Can't change nickname while on %s (+N is set)", user->nick.c_str(), curr->name.c_str()); + return 1; } } |