X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_services_account.cpp;h=7aebaa1b986bef896210c56ee26eeef6eb570129;hb=fcafba14c5408360ec725ed1649ede75b7ae52c1;hp=ceba3a7bd7b2a53bcc893587829a1734e4110122;hpb=43847ec9c7e1a195163eb4c529f1c92fd1ace0a4;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_services_account.cpp b/src/modules/m_services_account.cpp index ceba3a7bd..7aebaa1b9 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. @@ -54,9 +54,9 @@ class User_r : public ModeHandler public: User_r(InspIRCd* Instance) : ModeHandler(Instance, 'r', 0, 0, false, MODETYPE_USER, false) { } - ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding, bool) + ModeAction OnModeChange(User* source, User* dest, Channel* channel, std::string ¶meter, bool adding, bool servermode) { - if (IS_REMOTE(source) || ServerInstance->ULine(source->nick.c_str()) || ServerInstance->ULine(source->server)) + if (servermode || IS_REMOTE(source) || ServerInstance->ULine(source->nick.c_str()) || ServerInstance->ULine(source->server)) { if ((adding && !dest->IsModeSet('r')) || (!adding && dest->IsModeSet('r'))) { @@ -116,7 +116,7 @@ class ModuleServicesAccount : public Module 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 +186,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 +208,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); @@ -229,7 +237,7 @@ class ModuleServicesAccount : public Module // user is ulined, won't be stopped from joining return 0; } - + if (chan->IsModeSet('R')) { if (!is_registered) @@ -239,16 +247,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,37 +318,29 @@ 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); } } }