X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_spanningtree.cpp;h=fa22f80a1555bd523e0328078845a33f21e23990;hb=8b126657e79754e1d843da6c48d770937b589dab;hp=af800ec7d279bf61c34cb5d679b9065031adb5dc;hpb=e7f4cc66f1beb9ebab8b7415b4a56f81b3eb0c0b;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_spanningtree.cpp b/src/modules/m_spanningtree.cpp index af800ec7d..fa22f80a1 100644 --- a/src/modules/m_spanningtree.cpp +++ b/src/modules/m_spanningtree.cpp @@ -222,6 +222,11 @@ TreeServer* RouteEnumerate(TreeServer* Current, std::string ServerName) TreeServer* BestRouteTo(std::string ServerName) { log(DEBUG,"Finding best route to %s",ServerName.c_str()); + if (ServerName.c_str() == TreeRoot->GetName()) + { + log(DEBUG,"Cant route to myself!!!"); + return NULL; + } // first, find the server by recursively walking the tree TreeServer* Found = RouteEnumerate(TreeRoot,ServerName); // did we find it? If not, they did something wrong, abort. @@ -556,37 +561,11 @@ class TreeSocket : public InspSocket if (iter != clientlist.end()) { // nick collision - log(DEBUG,"Nick collision on %s!%s@%s",tempnick,ident.c_str(),host.c_str()); - if (age <= iter->second->age) - { - // remote client is older - // if hosts are identical, kill the remote, - // else kill the local. We must send KILL for - // removal of remote users. - if (!strcmp(iter->second->host,host.c_str())) - { - // kill the remote by sending KILL, - // and ABORT to stop it being introduced here. - log(DEBUG,"**** LOCATION ONE"); - this->WriteLine(":"+Srv->GetServerName()+" KILL "+tempnick+" :Killed (Nickname collision from "+Srv->GetServerName()+")"); - return true; - } - else - { - log(DEBUG,"*** LOCATION TWO"); - // kill our local and continue to let the remote be introduced - Srv->QuitUser(iter->second,"Killed (Nickname collision from "+source+")"); - } - } - else - { - log(DEBUG,"*** LOCATION THREE"); - // remote is newer, kill it and bail to stop it being introduced - this->WriteLine(":"+Srv->GetServerName()+" KILL "+tempnick+" :Killed (Nickname collision from "+Srv->GetServerName()+")"); - return true; - } + log(DEBUG,"Nick collision on %s!%s@%s: %lu %lu",tempnick,ident.c_str(),host.c_str(),(unsigned long)age,(unsigned long)iter->second->age); + this->WriteLine(":"+Srv->GetServerName()+" KILL "+tempnick+" :Nickname collision"); + return true; } - + clientlist[tempnick] = new userrec(); clientlist[tempnick]->fd = FD_MAGIC_NUMBER; strlcpy(clientlist[tempnick]->nick, tempnick,NICKMAX); @@ -727,6 +706,19 @@ class TreeSocket : public InspSocket return true; } + bool RemoteRehash(std::string prefix, std::deque params) + { + if (params.size() < 1) + return true; + std::string servermask = params[0]; + if (Srv->MatchText(Srv->GetServerName(),servermask)) + { + Srv->RehashServer(); + } + DoOneToAllButSender(prefix,"REHASH",params,prefix); + return; + } + bool RemoteKill(std::string prefix, std::deque params) { if (params.size() != 2) @@ -1003,6 +995,10 @@ class TreeSocket : public InspSocket { return this->ForceTopic(prefix,params); } + else if (command == "REHASH") + { + return this->RemoteRehash(prefix,params); + } else if (command == "SQUIT") { if (params.size() == 2) @@ -1392,6 +1388,15 @@ class ModuleSpanningTree : public Module return 0; } + virtual void OnGetServerDescription(std::string servername,std::string &description) + { + TreeServer* s = FindServer(servername); + if (s) + { + description = s->GetDesc(); + } + } + virtual void OnUserInvite(userrec* source,userrec* dest,chanrec* channel) { if (std::string(source->server) == Srv->GetServerName()) @@ -1562,6 +1567,21 @@ class ModuleSpanningTree : public Module DoOneToMany(source->nick,"KILL",params); } + virtual void OnRehash(std::string parameter) + { + if (parameter != "") + { + std::deque params; + params.push_back(parameter); + DoOneToMany(Srv->GetServerName(),"REHASH",params); + // check for self + if (Srv->MatchText(Srv->GetServerName(),parameter)) + { + Srv->RehashServer(); + } + } + } + // note: the protocol does not allow direct umode +o except // via NICK with 8 params. sending OPERTYPE infers +o modechange // locally.