diff options
author | Peter Powell <petpow@saberuk.com> | 2018-12-09 04:28:25 +0000 |
---|---|---|
committer | Peter Powell <petpow@saberuk.com> | 2018-12-09 04:28:25 +0000 |
commit | 5cf88fd79eee763cde0e586c9524a52686263cee (patch) | |
tree | 5f7a8a70271b05fa4ac2e19b877e98a365263155 /src | |
parent | 9dab477dadb5d65be1eee584d37f1622b6a396c0 (diff) |
Allow users on an accept list to bypass the +R user mode.
As implemented in ircd-seven and possibly other servers.
Diffstat (limited to 'src')
-rw-r--r-- | src/modules/m_services_account.cpp | 39 |
1 files changed, 24 insertions, 15 deletions
diff --git a/src/modules/m_services_account.cpp b/src/modules/m_services_account.cpp index c3b84dbba..08a29f27d 100644 --- a/src/modules/m_services_account.cpp +++ b/src/modules/m_services_account.cpp @@ -24,6 +24,7 @@ #include "inspircd.h" #include "modules/account.h" +#include "modules/callerid.h" #include "modules/exemption.h" #include "modules/whois.h" @@ -137,6 +138,8 @@ class AccountExtItemImpl : public AccountExtItem class ModuleServicesAccount : public Module, public Whois::EventListener { + private: + CallerID::API calleridapi; CheckExemption::EventProvider exemptionprov; SimpleChannelModeHandler m1; SimpleChannelModeHandler m2; @@ -145,9 +148,11 @@ class ModuleServicesAccount : public Module, public Whois::EventListener User_r m5; AccountExtItemImpl accountname; bool checking_ban; + public: ModuleServicesAccount() : Whois::EventListener(this) + , calleridapi(this) , exemptionprov(this) , m1(this, "reginvite", 'R') , m2(this, "regmoderated", 'M') @@ -199,26 +204,30 @@ class ModuleServicesAccount : public Module, public Whois::EventListener if (target.type == MessageTarget::TYPE_CHANNEL) { - Channel* c = target.Get<Channel>(); - ModResult res = CheckExemption::Call(exemptionprov, user, c, "regmoderated"); + Channel* targchan = target.Get<Channel>(); - if (c->IsModeSet(m2) && !is_registered && res != MOD_RES_ALLOW) - { - // user messaging a +M channel and is not registered - user->WriteNumeric(ERR_NEEDREGGEDNICK, c->name, "You need to be identified to a registered account to message this channel"); - return MOD_RES_DENY; - } + if (!targchan->IsModeSet(m2) || is_registered) + return MOD_RES_PASSTHRU; + + if (CheckExemption::Call(exemptionprov, user, targchan, "regmoderated") == MOD_RES_ALLOW) + return MOD_RES_PASSTHRU; + + // User is messaging a +M channel and is not registered or exempt. + user->WriteNumeric(ERR_NEEDREGGEDNICK, targchan->name, "You need to be identified to a registered account to message this channel"); + return MOD_RES_DENY; } else if (target.type == MessageTarget::TYPE_USER) { - User* u = target.Get<User>(); + User* targuser = target.Get<User>(); + if (!targuser->IsModeSet(m3) || is_registered) + return MOD_RES_PASSTHRU; - if (u->IsModeSet(m3) && !is_registered) - { - // user messaging a +R user and is not registered - user->WriteNumeric(ERR_NEEDREGGEDNICK, u->nick, "You need to be identified to a registered account to message this user"); - return MOD_RES_DENY; - } + if (calleridapi && calleridapi->IsOnAcceptList(user, targuser)) + return MOD_RES_PASSTHRU; + + // User is messaging a +R user and is not registered or on an accept list. + user->WriteNumeric(ERR_NEEDREGGEDNICK, targuser->nick, "You need to be identified to a registered account to message this user"); + return MOD_RES_DENY; } return MOD_RES_PASSTHRU; } |