X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_services_account.cpp;h=08a29f27dc4335041aa7bb73484cc580da6b4fc1;hb=a032cd90ad5582914759e226085efee5aae1a1ef;hp=2a5915f252334ccf45db020cb1443d2575200b6a;hpb=91e0af0fc4889f20d2f63426f8fe379674fc0393;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_services_account.cpp b/src/modules/m_services_account.cpp index 2a5915f25..08a29f27d 100644 --- a/src/modules/m_services_account.cpp +++ b/src/modules/m_services_account.cpp @@ -24,10 +24,18 @@ #include "inspircd.h" #include "modules/account.h" +#include "modules/callerid.h" #include "modules/exemption.h" +#include "modules/whois.h" enum { + // From UnrealIRCd. + RPL_WHOISREGNICK = 307, + + // From ircu. + RPL_WHOISACCOUNT = 330, + // From ircd-hybrid? ERR_NEEDREGGEDNICK = 477, @@ -57,7 +65,7 @@ class Channel_r : public ModeHandler } else { - source->WriteNumeric(500, "Only a server may modify the +r channel mode"); + source->WriteNumeric(ERR_NOPRIVILEGES, "Only a server may modify the +r channel mode"); } return MODEACTION_DENY; } @@ -83,7 +91,7 @@ class User_r : public ModeHandler } else { - source->WriteNumeric(500, "Only a server may modify the +r user mode"); + source->WriteNumeric(ERR_NOPRIVILEGES, "Only a server may modify the +r user mode"); } return MODEACTION_DENY; } @@ -130,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; @@ -138,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') @@ -165,13 +177,13 @@ class ModuleServicesAccount : public Module, public Whois::EventListener if (account) { - whois.SendLine(330, *account, "is logged in as"); + whois.SendLine(RPL_WHOISACCOUNT, *account, "is logged in as"); } if (whois.GetTarget()->IsModeSet(m5)) { /* user is registered */ - whois.SendLine(307, "is a registered nick"); + whois.SendLine(RPL_WHOISREGNICK, "is a registered nick"); } } @@ -182,7 +194,7 @@ class ModuleServicesAccount : public Module, public Whois::EventListener m5.RemoveMode(user); } - ModResult OnUserPreMessage(User* user, void* dest, int target_type, std::string& text, char status, CUList& exempt_list, MessageType msgtype) CXX11_OVERRIDE + ModResult OnUserPreMessage(User* user, const MessageTarget& target, MessageDetails& details) CXX11_OVERRIDE { if (!IS_LOCAL(user)) return MOD_RES_PASSTHRU; @@ -190,28 +202,32 @@ class ModuleServicesAccount : public Module, public Whois::EventListener std::string *account = accountname.get(user); bool is_registered = account && !account->empty(); - if (target_type == TYPE_CHANNEL) + if (target.type == MessageTarget::TYPE_CHANNEL) { - Channel* c = (Channel*)dest; - ModResult res = CheckExemption::Call(exemptionprov, user, c, "regmoderated"); + Channel* targchan = target.Get(); - 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 == TYPE_USER) + else if (target.type == MessageTarget::TYPE_USER) { - User* u = (User*)dest; + User* targuser = target.Get(); + 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; }