summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Burchell <viroteck@viroteck.net>2012-08-13 01:08:35 -0700
committerRobin Burchell <viroteck@viroteck.net>2012-08-13 01:08:35 -0700
commit388e4ff40931dda5870ddef149e54bdcc6c5a711 (patch)
tree681df373af0c37d1c356abeb31ed81fa7d62da21
parent46d3b5e9fc806924c1025b273c9138d452f659f7 (diff)
parent61429d9c680188abd63e629d72fbc09e7e5cfc38 (diff)
Merge pull request #251 from Shawn-Smith/insp20+extbanU
[2.0] Add ExtBan U to match only unregistered users
-rw-r--r--docs/conf/inspircd.helpop-full.example2
-rw-r--r--docs/conf/inspircd.helpop.example2
-rw-r--r--docs/conf/modules.conf.example3
-rw-r--r--src/modules/m_services_account.cpp28
4 files changed, 30 insertions, 5 deletions
diff --git a/docs/conf/inspircd.helpop-full.example b/docs/conf/inspircd.helpop-full.example
index 1887b1a80..27b689f51 100644
--- a/docs/conf/inspircd.helpop-full.example
+++ b/docs/conf/inspircd.helpop-full.example
@@ -1051,6 +1051,8 @@ Acting extbans:
users (requires stripcolor module).
T:<ban> Blocks notices from matching users (requires nonotice
module).
+ U:<ban> Blocks unregistered users matching the given ban.
+ (requires m_services_account)
A ban given to an acting extban may either be a nick!user@host mask,
matched against users as for a normal ban, or a matching extban.
diff --git a/docs/conf/inspircd.helpop.example b/docs/conf/inspircd.helpop.example
index 4b3354837..2ba4ac5a1 100644
--- a/docs/conf/inspircd.helpop.example
+++ b/docs/conf/inspircd.helpop.example
@@ -288,6 +288,8 @@ help channel if you have any questions.">
users (requires stripcolor module).
T:n!u@h Blocks notices from matching users (requires nonotice
module).
+ U:n!u@h Blocks unregistered users matching the given ban.
+ (requires m_services_account)
Redirect n!u@h#channel will redirect the banned user to #channel
when they try to join (requires banredirect module).
diff --git a/docs/conf/modules.conf.example b/docs/conf/modules.conf.example
index 0f0da74c7..76563fbeb 100644
--- a/docs/conf/modules.conf.example
+++ b/docs/conf/modules.conf.example
@@ -1535,9 +1535,10 @@
#
# This replaces m_services from 1.1 and earlier.
#
-# Also of note is that this module implements two extbans:
+# Also of note is that this module implements three extbans:
# +b R: (stop matching account names from joining)
# +b M: (stop matching account names from speaking)
+# +b U:n!u@h (blocks matching unregistered users)
#
#<module name="m_services_account.so">
diff --git a/src/modules/m_services_account.cpp b/src/modules/m_services_account.cpp
index a28be61dc..08986d53c 100644
--- a/src/modules/m_services_account.cpp
+++ b/src/modules/m_services_account.cpp
@@ -1,6 +1,7 @@
/*
* InspIRCd -- Internet Relay Chat Daemon
*
+ * Copyright (C) 2012 Shawn Smith <shawn@inspircd.org>
* Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
* Copyright (C) 2006-2008 Robin Burchell <robin+git@viroteck.net>
* Copyright (C) 2008 Pippijn van Steenhoven <pip88nl@gmail.com>
@@ -134,6 +135,7 @@ class ModuleServicesAccount : public Module
void On005Numeric(std::string &t)
{
ServerInstance->AddExtBanChar('R');
+ ServerInstance->AddExtBanChar('U');
}
/* <- :twisted.oscnet.org 330 w00t2 w00t2 w00t :is logged in as */
@@ -207,12 +209,30 @@ class ModuleServicesAccount : public Module
ModResult OnCheckBan(User* user, Channel* chan, const std::string& mask)
{
- if (mask[0] == 'R' && mask[1] == ':')
+ if (mask[1] == ':')
{
- std::string *account = accountname.get(user);
- if (account && InspIRCd::Match(*account, mask.substr(2)))
- return MOD_RES_DENY;
+ if (mask[0] == 'R')
+ {
+ std::string *account = accountname.get(user);
+ if (account && InspIRCd::Match(*account, mask.substr(2)))
+ return MOD_RES_DENY;
+ }
+ else if (mask[0] == 'U')
+ {
+ std::string *account = accountname.get(user);
+ /* If the user is registered we don't care. */
+ if (account)
+ return MOD_RES_PASSTHRU;
+
+ /* If we made it this far we know the user isn't registered
+ so just deny if it matches */
+ if (chan->GetExtBanStatus(user, 'U') == MOD_RES_DENY)
+ return MOD_RES_DENY;
+ }
}
+
+ /* If we made it this far then the ban wasn't an ExtBan
+ or the user we were checking for didn't match either ExtBan */
return MOD_RES_PASSTHRU;
}