X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_services_account.cpp;h=30baccadf0db10aaa6b008af4386875d8cb6d145;hb=f25c4b7a2263f5f3ce9bb41ba56b43c0d3a6d124;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..30baccadf 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,25 +99,23 @@ 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, - I_OnSyncUserMetaData, I_OnUserQuit, I_OnCleanup, I_OnDecodeMetaData, I_On005Numeric, I_OnUserPostNick }; + Implementation eventlist[] = { I_OnWhois, I_OnUserPreMessage, I_OnUserPreNotice, I_OnUserPreJoin, I_OnCheckBan, + I_OnSyncUser, 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; } @@ -258,23 +254,19 @@ class ModuleServicesAccount : public Module // this method is called. We should use the ProtoSendMetaData function after we've // corrected decided how the data should look, to send the metadata on its way if // it is ours. - virtual void OnSyncUserMetaData(User* user, Module* proto, void* opaque, const std::string &extname, bool displayable) + virtual void OnSyncUser(User* user, Module* proto, void* opaque) { - // check if the linking module wants to know about OUR metadata - if (extname == "accountname") + // check if this user has an swhois field to send + std::string* account; + user->GetExt("accountname", account); + if (account) { - // check if this user has an swhois field to send - std::string* account; - user->GetExt("accountname", account); - if (account) - { - // remove any accidental leading/trailing spaces - trim(*account); + // remove any accidental leading/trailing spaces + trim(*account); - // call this function in the linking module, let it format the data how it - // sees fit, and send it on its way. We dont need or want to know how. - proto->ProtoSendMetaData(opaque,TYPE_USER,user,extname,*account); - } + // call this function in the linking module, let it format the data how it + // sees fit, and send it on its way. We dont need or want to know how. + proto->ProtoSendMetaData(opaque,user,"accountname",*account); } } @@ -313,60 +305,46 @@ class ModuleServicesAccount : public Module // In our case we're only sending a single string around, so we just construct a std::string. // Some modules will probably get much more complex and format more detailed structs and classes // in a textual way for sending over the link. - virtual void OnDecodeMetaData(int target_type, void* target, const std::string &extname, const std::string &extdata) + virtual void OnDecodeMetaData(Extensible* target, const std::string &extname, const std::string &extdata) { + User* dest = dynamic_cast(target); // check if its our metadata key, and its associated with a user - if ((target_type == TYPE_USER) && (extname == "accountname")) + if (dest && (extname == "accountname")) { - 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()