X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_services_account.cpp;h=d6cf0b1e772960b6a77fa3ef7d122e2f357eb1dc;hb=6e85701ecb09604f2c87010683638ec0446cc515;hp=6789d26d80adf7c8960d0b65079c1933990a1611;hpb=f209cce90b394acd26e22eacef0bff61e8f5b4e1;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_services_account.cpp b/src/modules/m_services_account.cpp index 6789d26d8..d6cf0b1e7 100644 --- a/src/modules/m_services_account.cpp +++ b/src/modules/m_services_account.cpp @@ -3,7 +3,7 @@ * +------------------------------------+ * * InspIRCd: (C) 2002-2009 InspIRCd Development Team - * See: http://www.inspircd.org/wiki/index.php/Credits + * See: http://wiki.inspircd.org/Credits * * This program is free but copyrighted software; see * the file COPYING for details. @@ -99,24 +99,22 @@ class AChannel_M : public SimpleChannelModeHandler class ModuleServicesAccount : public Module { - AChannel_R* m1; - AChannel_M* m2; - AUser_R* m3; - Channel_r *m4; - User_r *m5; + AChannel_R m1; + AChannel_M m2; + AUser_R m3; + Channel_r m4; + User_r m5; public: - ModuleServicesAccount(InspIRCd* Me) : Module(Me) + ModuleServicesAccount(InspIRCd* Me) : Module(Me), + m1(Me), m2(Me), m3(Me), m4(Me), m5(Me) { - m1 = new AChannel_R(ServerInstance); - m2 = new AChannel_M(ServerInstance); - m3 = new AUser_R(ServerInstance); - m4 = new Channel_r(ServerInstance); - m5 = new User_r(ServerInstance); - if (!ServerInstance->Modes->AddMode(m1) || !ServerInstance->Modes->AddMode(m2) || !ServerInstance->Modes->AddMode(m3) || !ServerInstance->Modes->AddMode(m4) || !ServerInstance->Modes->AddMode(m5)) + if (!ServerInstance->Modes->AddMode(&m1) || !ServerInstance->Modes->AddMode(&m2) || + !ServerInstance->Modes->AddMode(&m3) || !ServerInstance->Modes->AddMode(&m4) || + !ServerInstance->Modes->AddMode(&m5)) throw ModuleException("Some other module has claimed our modes!"); - Implementation eventlist[] = { I_OnWhois, I_OnUserPreMessage, I_OnUserPreNotice, I_OnUserPreJoin, + Implementation eventlist[] = { I_OnWhois, I_OnUserPreMessage, I_OnUserPreNotice, I_OnUserPreJoin, I_OnCheckBan, I_OnSyncUserMetaData, I_OnUserQuit, I_OnCleanup, I_OnDecodeMetaData, I_On005Numeric, I_OnUserPostNick }; ServerInstance->Modules->Attach(eventlist, this, 10); @@ -186,7 +184,7 @@ class ModuleServicesAccount : public Module if (account) { - if (c->IsExtBanned(*account, 'M')) + if (c->GetExtBanStatus(*account, 'M') < 0) { // may not speak (text is deliberately vague, so they don't know which restriction to evade) user->WriteNumeric(477, ""+std::string(user->nick)+" "+std::string(c->name)+" :You may not speak in this channel"); @@ -208,6 +206,14 @@ class ModuleServicesAccount : public Module return 0; } + virtual int OnCheckBan(User* user, Channel* chan) + { + std::string* account; + if (!user->GetExt("accountname", account)) + return 0; + return chan->GetExtBanStatus(*account, 'R'); + } + virtual int OnUserPreNotice(User* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list) { return OnUserPreMessage(user, dest, target_type, text, status, exempt_list); @@ -239,16 +245,6 @@ class ModuleServicesAccount : public Module return 1; } } - - if (account) - { - if (chan->IsExtBanned(*account, 'R')) - { - // may not join - user->WriteNumeric(ERR_BANNEDFROMCHAN, "%s %s :Cannot join channel (You're banned)", user->nick.c_str(), chan->name.c_str()); - return 1; - } - } } return 0; } @@ -320,53 +316,40 @@ class ModuleServicesAccount : public Module { User* dest = (User*)target; - /* logging them out? */ - if (extdata.empty()) - { - std::string* account; - dest->GetExt("accountname", account); - if (account) - { - dest->Shrink("accountname"); - delete account; - } + std::string* account; + if (dest->GetExt("accountname", account)) { + // remove old account so that we can set new (or leave unset) + dest->Shrink("accountname"); + delete account; } - else + + if (!extdata.empty()) { - // if they dont already have an accountname field, accept the remote server's - std::string* text; - if (!dest->GetExt("accountname", text)) - { - text = new std::string(extdata); - // remove any accidental leading/trailing spaces - trim(*text); - dest->Extend("accountname", text); - - if (IS_LOCAL(dest)) - dest->WriteNumeric(900, "%s %s %s :You are now logged in as %s", dest->nick.c_str(), dest->GetFullHost().c_str(), text->c_str(), text->c_str()); - - AccountData ac; - ac.user = dest; - ac.account = *text; - Event n((char*)&ac, this, "account_login"); - n.Send(ServerInstance); - } + account = new std::string(extdata); + // remove any accidental leading/trailing spaces + trim(*account); + dest->Extend("accountname", account); + + if (IS_LOCAL(dest)) + dest->WriteNumeric(900, "%s %s %s :You are now logged in as %s", + dest->nick.c_str(), dest->GetFullHost().c_str(), account->c_str(), account->c_str()); + + AccountData ac; + ac.user = dest; + ac.account = *account; + Event n((char*)&ac, this, "account_login"); + n.Send(ServerInstance); } } } virtual ~ModuleServicesAccount() { - ServerInstance->Modes->DelMode(m1); - ServerInstance->Modes->DelMode(m2); - ServerInstance->Modes->DelMode(m3); - ServerInstance->Modes->DelMode(m4); - ServerInstance->Modes->DelMode(m5); - delete m1; - delete m2; - delete m3; - delete m4; - delete m5; + ServerInstance->Modes->DelMode(&m1); + ServerInstance->Modes->DelMode(&m2); + ServerInstance->Modes->DelMode(&m3); + ServerInstance->Modes->DelMode(&m4); + ServerInstance->Modes->DelMode(&m5); } virtual Version GetVersion()