summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 9c4ae0b92..c4936eea6 100644
--- a/docs/conf/inspircd.helpop-full.example
+++ b/docs/conf/inspircd.helpop-full.example
@@ -1050,6 +1050,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 f86ebfa6c..9d9b61b93 100644
--- a/docs/conf/modules.conf.example
+++ b/docs/conf/modules.conf.example
@@ -1530,9 +1530,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 cd34e955a..57a08ada4 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>
@@ -137,6 +138,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 */
@@ -210,12 +212,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;
}