]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Add extban 'a' to m_gecosban.
authorRenegade334 <contact.caaeed4f@renegade334.me.uk>
Sat, 28 Mar 2015 21:18:30 +0000 (21:18 +0000)
committerPeter Powell <petpow@saberuk.com>
Tue, 25 Sep 2018 11:30:06 +0000 (12:30 +0100)
This has the format a:nick!user@host+gecos.

e.g. a:*!*@abusive.host+*MegaBot?v2.0*

Closes #1023.
Closes #1026.

docs/conf/helpop-full.conf.example
docs/conf/helpop.conf.example
docs/conf/modules.conf.example
src/modules/m_gecosban.cpp

index c33b80fd7f3bfb0ee95cf0cf93e557280d68bf42..17e9ee37dc8422c894cd5e71302ce0c617633da8 100644 (file)
@@ -1091,6 +1091,9 @@ setting +I <extban>.
 
 Matching extbans:
 
+ a:<mask>      Matches user with both a matching banmask and realname,
+               where <mask> is in the format nick!user@host+realname
+               (requires gecosban module).
  j:<channel>   Matches anyone in the given channel. Does not support
                wildcards (requires the channelban module).
  n:<class>     Matches users in a matching connect class (requires the
index 89c2716a6a185b7112727b6d81cf4fe49558fed9..8456346d98dd241da4719a94104e8d1dd618ee93 100644 (file)
@@ -277,6 +277,9 @@ setting +I <extban>.
 
 Matching extbans:
 
+ a:<mask>      Matches user with both a matching banmask and realname,
+               where <mask> is in the format nick!user@host+realname
+               (requires gecosban module).
  j:<channel>   Matches anyone in the given channel. Does not support
                wildcards (requires the channelban module).
  n:<class>     Matches users in a matching connect class (requires
index 7823e2d30f5ef138d849d51d2002ef195de3b90c..8a22a8c719b245920833a962eabecf0590dd7d46 100644 (file)
 #<module name="flashpolicyd">                                         #
 
 #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
-# Real name ban: Implements extended ban 'r', which stops anyone
-# matching a mask like +b r:*realname?here* from joining a channel.
+# Real name ban: Implements two extended bans:                        #
+# 'a', which matches a n!u@h+realname mask like +b a:*!*@host+*real*  #
+# 'r', which matches a realname mask like +b r:*realname?here*        #
 #<module name="gecosban">
 
 #-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
index ae399a81f713375ffae6c982dcd9ff2d074e6fd3..09f3c9dc7f4870fcfb0aa33b40cb8547b76153e8 100644 (file)
@@ -24,21 +24,40 @@ class ModuleGecosBan : public Module
  public:
        Version GetVersion() CXX11_OVERRIDE
        {
-               return Version("Extban 'r' - real name ban", VF_OPTCOMMON|VF_VENDOR);
+               return Version("Provides a way to ban users by their real name with the 'a' and 'r' extbans", VF_OPTCOMMON|VF_VENDOR);
        }
 
        ModResult OnCheckBan(User *user, Channel *c, const std::string& mask) CXX11_OVERRIDE
        {
-               if ((mask.length() > 2) && (mask[0] == 'r') && (mask[1] == ':'))
+               if ((mask.length() > 2) && (mask[1] == ':'))
                {
-                       if (InspIRCd::Match(user->GetRealName(), mask.substr(2)))
-                               return MOD_RES_DENY;
+                       if (mask[0] == 'r')
+                       {
+                               if (InspIRCd::Match(user->GetRealName(), mask.substr(2)))
+                                       return MOD_RES_DENY;
+                       }
+                       else if (mask[0] == 'a')
+                       {
+                               // Check that the user actually specified a real name.
+                               const size_t divider = mask.find('+', 1);
+                               if (divider == std::string::npos)
+                                       return MOD_RES_PASSTHRU;
+
+                               // Check whether the user's mask matches.
+                               if (!c->CheckBan(user, mask.substr(2, divider - 2)))
+                                       return MOD_RES_PASSTHRU;
+
+                               // Check whether the user's real name matches.
+                               if (InspIRCd::Match(user->GetRealName(), mask.substr(divider + 1)))
+                                       return MOD_RES_DENY;
+                       }
                }
                return MOD_RES_PASSTHRU;
        }
 
        void On005Numeric(std::map<std::string, std::string>& tokens) CXX11_OVERRIDE
        {
+               tokens["EXTBAN"].push_back('a');
                tokens["EXTBAN"].push_back('r');
        }
 };