X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_spanningtree%2Fmain.cpp;h=9d7b7db790afbcca368aae49548ece4d289dd6c9;hb=316e19f10c1d30215a2617f44ca61f8d6d2559a8;hp=b2be3386a7380fe5b86adb44052370e5ff751be7;hpb=0ad2ac70a2203d5e76450920022bbcf6bc4ae438;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_spanningtree/main.cpp b/src/modules/m_spanningtree/main.cpp index b2be3386a..9d7b7db79 100644 --- a/src/modules/m_spanningtree/main.cpp +++ b/src/modules/m_spanningtree/main.cpp @@ -14,10 +14,6 @@ /* $ModDesc: Provides a spanning tree server link protocol */ #include "inspircd.h" -#include "configreader.h" -#include "users.h" -#include "channels.h" -#include "modules.h" #include "commands/cmd_whois.h" #include "commands/cmd_stats.h" #include "socket.h" @@ -440,7 +436,7 @@ int ModuleSpanningTree::HandleTime(const char** parameters, int pcnt, userrec* u std::deque params; params.push_back(found->GetName()); params.push_back(user->uuid); - Utils->DoOneToOne(ServerInstance->Config->ServerName,"TIME",params,found->GetName()); + Utils->DoOneToOne(ServerInstance->Config->GetSID(),"TIME",params,found->GetName()); } else { @@ -484,7 +480,7 @@ void ModuleSpanningTree::DoPingChecks(time_t curtime) { if (serv->AnsweredLastPing()) { - sock->WriteLine(std::string(":")+ServerInstance->Config->ServerName+" PING "+serv->GetName()); + sock->WriteLine(std::string(":")+ServerInstance->Config->GetSID()+" PING "+serv->GetName()); serv->SetNextPingTime(curtime + Utils->PingFreq); serv->LastPing = curtime; timeval t; @@ -647,7 +643,7 @@ void ModuleSpanningTree::RemoteMessage(userrec* user, const char* format, ...) ServerInstance->SNO->WriteToSnoMask('l', "%s", text); params.push_back("l"); params.push_back(std::string(":") + text); - Utils->DoOneToMany(ServerInstance->Config->ServerName, "SNONOTICE", params); + Utils->DoOneToMany(ServerInstance->Config->GetSID(), "SNONOTICE", params); } else { @@ -655,10 +651,10 @@ void ModuleSpanningTree::RemoteMessage(userrec* user, const char* format, ...) user->WriteServ("NOTICE %s :%s", user->nick, text); else { - params.push_back(user->uid); + params.push_back(user->uuid); params.push_back(std::string("::") + ServerInstance->Config->ServerName + " NOTICE " + user->nick + " :*** From " + ServerInstance->Config->ServerName+ ": " + text); - Utils->DoOneToMany(ServerInstance->Config->ServerName, "PUSH", params); + Utils->DoOneToMany(ServerInstance->Config->GetSID(), "PUSH", params); } } } @@ -694,7 +690,7 @@ void ModuleSpanningTree::BroadcastTimeSync() std::deque params; params.push_back(ConvToStr(ServerInstance->Time(false))); params.push_back("FORCE"); - Utils->DoOneToMany(Utils->TreeRoot->GetName(), "TIMESET", params); + Utils->DoOneToMany(ServerInstance->Config->GetSID(), "TIMESET", params); } } @@ -803,6 +799,8 @@ void ModuleSpanningTree::OnPostCommand(const std::string &command, const char** { if ((result == CMD_SUCCESS) && (ServerInstance->IsValidModuleCommand(command, pcnt, user))) { + /* Safe, we know its non-null because IsValidModuleCommand returned true */ + command_t* thiscmd = ServerInstance->Parser->GetHandler(command); // this bit of code cleverly routes all module commands // to all remote severs *automatically* so that modules // can just handle commands locally, without having @@ -810,19 +808,29 @@ void ModuleSpanningTree::OnPostCommand(const std::string &command, const char** // commands and linking protocols. std::deque params; params.clear(); + int n_translate = thiscmd->translation.size(); + TranslateType translate_to; + for (int j = 0; j < pcnt; j++) { - /* XXX UID: Translate nicks in this list to UIDs, potentially using some form of lookup - * table that specifies a value type for each parameter, as part of the command_t. - */ - if (strchr(parameters[j],' ')) + std::string target; + + /* Map all items to UUIDs where neccessary */ + if (j < n_translate) { - params.push_back(":" + std::string(parameters[j])); + /* We have a translation mapping for this index */ + translate_to = thiscmd->translation[j] != TR_END ? thiscmd->translation[j] : TR_TEXT; } else - { - params.push_back(std::string(parameters[j])); - } + translate_to = TR_TEXT; + + ServerInstance->Log(DEBUG,"TRANSLATION: %s - type is %d", parameters[j], translate_to); + ServerInstance->Parser->TranslateUIDs(translate_to, parameters[j], target); + + if (strchr(parameters[j],' ')) + params.push_back(":" + target); + else + params.push_back(target); } Utils->DoOneToMany(user->uuid, command, params); } @@ -984,11 +992,11 @@ void ModuleSpanningTree::OnUserJoin(userrec* user, chanrec* channel, bool &silen params.push_back(channel->name); params.push_back(ConvToStr(channel->age)); params.push_back(std::string(channel->GetAllPrefixChars(user))+","+std::string(user->uuid)); - Utils->DoOneToMany(ServerInstance->Config->ServerName,"FJOIN",params); + Utils->DoOneToMany(ServerInstance->Config->GetSID(),"FJOIN",params); /* First user in, sync the modes for the channel */ params.pop_back(); params.push_back(channel->ChanModes(true)); - Utils->DoOneToMany(ServerInstance->Config->ServerName,"FMODE",params); + Utils->DoOneToMany(ServerInstance->Config->GetSID(),"FMODE",params); } else { @@ -1048,7 +1056,7 @@ void ModuleSpanningTree::OnUserConnect(userrec* user) params.push_back("+"+std::string(user->FormatModes())); params.push_back(user->GetIPString()); params.push_back(":"+std::string(user->fullname)); - Utils->DoOneToMany(ServerInstance->Config->ServerName, "UID", params); + Utils->DoOneToMany(ServerInstance->Config->GetSID(), "UID", params); // User is Local, change needs to be reflected! TreeServer* SourceServer = Utils->FindServer(user->server); if (SourceServer) @@ -1087,6 +1095,13 @@ void ModuleSpanningTree::OnUserPostNick(userrec* user, const std::string &oldnic { std::deque params; params.push_back(user->nick); + + /** IMPORTANT: We don't update the TS if the oldnick is just a case change of the newnick! + */ + if (irc::string(user->nick) != assign(oldnick)) + user->age = ServerInstance->Time(true); + + params.push_back(ConvToStr(user->age)); Utils->DoOneToMany(user->uuid,"NICK",params); } } @@ -1107,7 +1122,7 @@ void ModuleSpanningTree::OnUserKick(userrec* source, userrec* user, chanrec* cha params.push_back(chan->name); params.push_back(user->uuid); params.push_back(":"+reason); - Utils->DoOneToMany(ServerInstance->Config->ServerName,"KICK",params); + Utils->DoOneToMany(ServerInstance->Config->GetSID(),"KICK",params); } } @@ -1129,7 +1144,7 @@ void ModuleSpanningTree::OnRehash(userrec* user, const std::string ¶meter) { std::deque params; params.push_back(parameter); - Utils->DoOneToMany(user ? user->nick : ServerInstance->Config->ServerName, "REHASH", params); + Utils->DoOneToMany(user ? user->nick : ServerInstance->Config->GetSID(), "REHASH", params); // check for self if (ServerInstance->MatchText(ServerInstance->Config->ServerName,parameter)) { @@ -1164,7 +1179,7 @@ void ModuleSpanningTree::OnLine(userrec* source, const std::string &host, bool a (unsigned long)duration, reason.c_str()); std::deque params; params.push_back(data); - Utils->DoOneToMany(ServerInstance->Config->ServerName, "ADDLINE", params); + Utils->DoOneToMany(ServerInstance->Config->GetSID(), "ADDLINE", params); } else { @@ -1239,12 +1254,15 @@ void ModuleSpanningTree::OnMode(userrec* user, void* dest, int target_type, cons { std::deque params; std::string command; + std::string output_text; + + ServerInstance->Parser->TranslateUIDs(TR_SPACENICKLIST, text, output_text); if (target_type == TYPE_USER) { userrec* u = (userrec*)dest; params.push_back(u->uuid); - params.push_back(text); + params.push_back(output_text); command = "MODE"; } else @@ -1252,10 +1270,10 @@ void ModuleSpanningTree::OnMode(userrec* user, void* dest, int target_type, cons chanrec* c = (chanrec*)dest; params.push_back(c->name); params.push_back(ConvToStr(c->age)); - params.push_back(text); + params.push_back(output_text); command = "FMODE"; } - /* XXX UID: Translate nick parameters to uuids */ + Utils->DoOneToMany(user->uuid, command, params); } } @@ -1283,18 +1301,21 @@ void ModuleSpanningTree::OnCancelAway(userrec* user) void ModuleSpanningTree::ProtoSendMode(void* opaque, int target_type, void* target, const std::string &modeline) { TreeSocket* s = (TreeSocket*)opaque; + std::string output_text; + + ServerInstance->Parser->TranslateUIDs(TR_SPACENICKLIST, modeline, output_text); + if (target) { if (target_type == TYPE_USER) { userrec* u = (userrec*)target; - s->WriteLine(std::string(":")+ServerInstance->Config->ServerName+" FMODE "+u->uuid+" "+ConvToStr(u->age)+" "+modeline); + s->WriteLine(std::string(":")+ServerInstance->Config->GetSID()+" FMODE "+u->uuid+" "+ConvToStr(u->age)+" "+output_text); } else { chanrec* c = (chanrec*)target; - /* XXX UID: Translate nicks in modeline to uids */ - s->WriteLine(std::string(":")+ServerInstance->Config->ServerName+" FMODE "+c->name+" "+ConvToStr(c->age)+" "+modeline); + s->WriteLine(std::string(":")+ServerInstance->Config->GetSID()+" FMODE "+c->name+" "+ConvToStr(c->age)+" "+output_text); } } } @@ -1307,17 +1328,17 @@ void ModuleSpanningTree::ProtoSendMetaData(void* opaque, int target_type, void* if (target_type == TYPE_USER) { userrec* u = (userrec*)target; - s->WriteLine(std::string(":")+ServerInstance->Config->ServerName+" METADATA "+u->uuid+" "+extname+" :"+extdata); + s->WriteLine(std::string(":")+ServerInstance->Config->GetSID()+" METADATA "+u->uuid+" "+extname+" :"+extdata); } else if (target_type == TYPE_CHANNEL) { chanrec* c = (chanrec*)target; - s->WriteLine(std::string(":")+ServerInstance->Config->ServerName+" METADATA "+c->name+" "+extname+" :"+extdata); + s->WriteLine(std::string(":")+ServerInstance->Config->GetSID()+" METADATA "+c->name+" "+extname+" :"+extdata); } } if (target_type == TYPE_OTHER) { - s->WriteLine(std::string(":")+ServerInstance->Config->ServerName+" METADATA * "+extname+" :"+extdata); + s->WriteLine(std::string(":")+ServerInstance->Config->GetSID()+" METADATA * "+extname+" :"+extdata); } } @@ -1329,7 +1350,7 @@ void ModuleSpanningTree::OnEvent(Event* event) if (params->size() < 3) return; (*params)[2] = ":" + (*params)[2]; - Utils->DoOneToMany(ServerInstance->Config->ServerName,"METADATA",*params); + Utils->DoOneToMany(ServerInstance->Config->GetSID(),"METADATA",*params); } else if (event->GetEventID() == "send_topic") { @@ -1338,7 +1359,7 @@ void ModuleSpanningTree::OnEvent(Event* event) (*params)[1] = ":" + (*params)[1]; params->insert(params->begin() + 1,ServerInstance->Config->ServerName); params->insert(params->begin() + 1,ConvToStr(ServerInstance->Time(true))); - Utils->DoOneToMany(ServerInstance->Config->ServerName,"FTOPIC",*params); + Utils->DoOneToMany(ServerInstance->Config->GetSID(),"FTOPIC",*params); } else if (event->GetEventID() == "send_mode") { @@ -1346,12 +1367,17 @@ void ModuleSpanningTree::OnEvent(Event* event) return; // Insert the TS value of the object, either userrec or chanrec time_t ourTS = 0; + std::string output_text; + + /* Warning: in-place translation is only safe for type TR_NICK */ + for (size_t n = 0; n < params->size(); n++) + ServerInstance->Parser->TranslateUIDs(TR_NICK, (*params)[n], (*params)[n]); + userrec* a = ServerInstance->FindNick((*params)[0]); if (a) { - *(params)[0] = a->uuid; ourTS = a->age; - Utils->DoOneToMany(ServerInstance->Config->ServerName,"MODE",*params); + Utils->DoOneToMany(ServerInstance->Config->GetSID(),"MODE",*params); return; } else @@ -1361,8 +1387,7 @@ void ModuleSpanningTree::OnEvent(Event* event) { ourTS = a->age; params->insert(params->begin() + 1,ConvToStr(ourTS)); - /* XXX UID: Translate modes in string to uids */ - Utils->DoOneToMany(ServerInstance->Config->ServerName,"FMODE",*params); + Utils->DoOneToMany(ServerInstance->Config->GetSID(),"FMODE",*params); } } } @@ -1370,29 +1395,34 @@ void ModuleSpanningTree::OnEvent(Event* event) { if (params->size() < 2) return; - /* XXX UID: Translate modes in string to uids */ - Utils->DoOneToMany(ServerInstance->Config->ServerName,"MODE",*params); + std::string output_text; + + /* Warning: in-place translation is only safe for type TR_NICK */ + for (size_t n = 0; n < params->size(); n++) + ServerInstance->Parser->TranslateUIDs(TR_NICK, (*params)[n], (*params)[n]); + + Utils->DoOneToMany(ServerInstance->Config->GetSID(),"MODE",*params); } else if (event->GetEventID() == "send_opers") { if (params->size() < 1) return; (*params)[0] = ":" + (*params)[0]; - Utils->DoOneToMany(ServerInstance->Config->ServerName,"OPERNOTICE",*params); + Utils->DoOneToMany(ServerInstance->Config->GetSID(),"OPERNOTICE",*params); } else if (event->GetEventID() == "send_modeset") { if (params->size() < 2) return; (*params)[1] = ":" + (*params)[1]; - Utils->DoOneToMany(ServerInstance->Config->ServerName,"MODENOTICE",*params); + Utils->DoOneToMany(ServerInstance->Config->GetSID(),"MODENOTICE",*params); } else if (event->GetEventID() == "send_snoset") { if (params->size() < 2) return; (*params)[1] = ":" + (*params)[1]; - Utils->DoOneToMany(ServerInstance->Config->ServerName,"SNONOTICE",*params); + Utils->DoOneToMany(ServerInstance->Config->GetSID(),"SNONOTICE",*params); } else if (event->GetEventID() == "send_push") { @@ -1406,7 +1436,7 @@ void ModuleSpanningTree::OnEvent(Event* event) (*params)[0] = a->uuid; (*params)[1] = ":" + (*params)[1]; - Utils->DoOneToOne(ServerInstance->Config->ServerName, "PUSH", *params, a->server); + Utils->DoOneToOne(ServerInstance->Config->GetSID(), "PUSH", *params, a->server); } }