X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_callerid.cpp;h=2df6d7af0cdb46c9a3c42b160bbe266ce69057aa;hb=e5518238259b9988a2a6d8ef654b69034628c10d;hp=b0d6b9c64835829315a5bd764d83cb927c3f37eb;hpb=5ca81cf89a1d7cf78a2bb078a25305c1ebab8746;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_callerid.cpp b/src/modules/m_callerid.cpp index b0d6b9c64..2df6d7af0 100644 --- a/src/modules/m_callerid.cpp +++ b/src/modules/m_callerid.cpp @@ -68,7 +68,12 @@ struct CallerIDExtInfo : public ExtensionItem void unserialize(SerializeFormat format, Extensible* container, const std::string& value) { + void* old = get_raw(container); + if (old) + this->free(old); callerid_data* dat = new callerid_data; + set_raw(container, dat); + irc::commasepstream s(value); std::string tok; if (s.GetToken(tok)) @@ -89,10 +94,6 @@ struct CallerIDExtInfo : public ExtensionItem } } } - - void* old = set_raw(container, dat); - if (old) - this->free(old); } callerid_data* get(User* user, bool create) @@ -116,11 +117,16 @@ struct CallerIDExtInfo : public ExtensionItem callerid_data *targ = this->get(*it, false); if (!targ) + { + ServerInstance->Logs->Log("m_callerid", DEFAULT, "ERROR: Inconsistency detected in callerid state, please report (1)"); continue; // shouldn't happen, but oh well. + } std::list::iterator it2 = std::find(targ->wholistsme.begin(), targ->wholistsme.end(), dat); if (it2 != targ->wholistsme.end()) targ->wholistsme.erase(it2); + else + ServerInstance->Logs->Log("m_callerid", DEFAULT, "ERROR: Inconsistency detected in callerid state, please report (2)"); } delete dat; } @@ -141,7 +147,7 @@ public: extInfo(Creator) { allow_empty_last_param = false; - syntax = "{[+|-]}|*}"; + syntax = "*|(+|-)[,(+|-) ...]"; TRANSLATE2(TR_CUSTOM, TR_END); } @@ -166,6 +172,9 @@ public: dash = true; tok.erase(0, 1); // Remove the dash. } + else if (tok[0] == '+') + tok.erase(0, 1); + User* u = ServerInstance->FindNick(tok); if ((!u) || (u->registered != REG_ALL) || (u->quitting) || (IS_SERVER(u))) continue; @@ -189,7 +198,7 @@ public: /* Even if callerid mode is not set, we let them manage their ACCEPT list so that if they go +g they can * have a list already setup. */ - std::string tok = parameters[0]; + const std::string& tok = parameters[0]; if (tok == "*") { @@ -199,7 +208,12 @@ public: } else if (tok[0] == '-') { - User* whotoremove = ServerInstance->FindNick(tok.substr(1)); + User* whotoremove; + if (IS_LOCAL(user)) + whotoremove = ServerInstance->FindNickOnly(tok.substr(1)); + else + whotoremove = ServerInstance->FindNick(tok.substr(1)); + if (whotoremove) return (RemoveAccept(user, whotoremove) ? CMD_SUCCESS : CMD_FAILURE); else @@ -207,7 +221,13 @@ public: } else { - User* whotoadd = ServerInstance->FindNick(tok[0] == '+' ? tok.substr(1) : tok); + const std::string target = (tok[0] == '+' ? tok.substr(1) : tok); + User* whotoadd; + if (IS_LOCAL(user)) + whotoadd = ServerInstance->FindNickOnly(target); + else + whotoadd = ServerInstance->FindNick(target); + if ((whotoadd) && (whotoadd->registered == REG_ALL) && (!whotoadd->quitting) && (!IS_SERVER(whotoadd))) return (AddAccept(user, whotoadd) ? CMD_SUCCESS : CMD_FAILURE); else @@ -280,6 +300,7 @@ public: if (!dat2) { // How the fuck is this possible. + ServerInstance->Logs->Log("m_callerid", DEFAULT, "ERROR: Inconsistency detected in callerid state, please report (3)"); return false; } @@ -287,6 +308,9 @@ public: if (it != dat2->wholistsme.end()) // Found me! dat2->wholistsme.erase(it); + else + ServerInstance->Logs->Log("m_callerid", DEFAULT, "ERROR: Inconsistency detected in callerid state, please report (4)"); + user->WriteServ("NOTICE %s :%s is no longer on your accept list", user->nick.c_str(), whotoremove->nick.c_str()); return true; @@ -324,6 +348,8 @@ private: if (it2 != dat->accepting.end()) dat->accepting.erase(it2); + else + ServerInstance->Logs->Log("m_callerid", DEFAULT, "ERROR: Inconsistency detected in callerid state, please report (5)"); } userdata->wholistsme.clear(); @@ -362,7 +388,7 @@ public: ModResult PreText(User* user, User* dest, std::string& text) { - if (!dest->IsModeSet('g')) + if (!dest->IsModeSet('g') || (user == dest)) return MOD_RES_PASSTHRU; if (operoverride && IS_OPER(user))