X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_spanningtree%2Fmain.cpp;h=78d202c477c764fc4dab8ad733af35d220f0ea0f;hb=18ecf9d7e4056c4de789064508074266208e678f;hp=ffc466a82758d9c8e64774e785713a744bb0bbb0;hpb=b4034e2231afcfcb5cf29156288c666d90831fed;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_spanningtree/main.cpp b/src/modules/m_spanningtree/main.cpp index ffc466a82..78d202c47 100644 --- a/src/modules/m_spanningtree/main.cpp +++ b/src/modules/m_spanningtree/main.cpp @@ -38,6 +38,7 @@ #include "protocolinterface.h" ModuleSpanningTree::ModuleSpanningTree() + : KeepNickTS(false) { Utils = new SpanningTreeUtilities(this); commands = new SpanningTreeCommands(this); @@ -83,11 +84,11 @@ void ModuleSpanningTree::init() ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation)); delete ServerInstance->PI; - ServerInstance->PI = new SpanningTreeProtocolInterface(this, Utils); + ServerInstance->PI = new SpanningTreeProtocolInterface(Utils); loopCall = false; // update our local user count - Utils->TreeRoot->SetUserCount(ServerInstance->Users->local_users.size()); + Utils->TreeRoot->SetUserCount(ServerInstance->Users->LocalUserCount()); } void ModuleSpanningTree::ShowLinks(TreeServer* Current, User* user, int hops) @@ -265,14 +266,13 @@ void ModuleSpanningTree::ConnectServer(Link* x, Autoconnect* y) { bool ipvalid = true; - if (InspIRCd::Match(ServerInstance->Config->ServerName, assign(x->Name))) + if (InspIRCd::Match(ServerInstance->Config->ServerName, assign(x->Name), rfc_case_insensitive_map)) { ServerInstance->SNO->WriteToSnoMask('l', "CONNECT: Not connecting to myself."); return; } - QueryType start_type = DNS_QUERY_A; - start_type = DNS_QUERY_AAAA; + QueryType start_type = DNS_QUERY_AAAA; if (strchr(x->IPAddr.c_str(),':')) { in6_addr n; @@ -396,9 +396,9 @@ ModResult ModuleSpanningTree::HandleConnect(const std::vector& para for (std::vector >::iterator i = Utils->LinkBlocks.begin(); i < Utils->LinkBlocks.end(); i++) { Link* x = *i; - if (InspIRCd::Match(x->Name.c_str(),parameters[0])) + if (InspIRCd::Match(x->Name.c_str(),parameters[0], rfc_case_insensitive_map)) { - if (InspIRCd::Match(ServerInstance->Config->ServerName, assign(x->Name))) + if (InspIRCd::Match(ServerInstance->Config->ServerName, assign(x->Name), rfc_case_insensitive_map)) { RemoteMessage(user, "*** CONNECT: Server \002%s\002 is ME, not connecting.",x->Name.c_str()); return MOD_RES_DENY; @@ -646,14 +646,13 @@ void ModuleSpanningTree::OnChangeName(User* user, const std::string &gecos) return; parameterlist params; - params.push_back(gecos); + params.push_back(":" + gecos); Utils->DoOneToMany(user->uuid,"FNAME",params); } void ModuleSpanningTree::OnChangeIdent(User* user, const std::string &ident) { - // only occurs for local clients - if (user->registered != REG_ALL) + if ((user->registered != REG_ALL) || (!IS_LOCAL(user))) return; parameterlist params; @@ -706,11 +705,12 @@ void ModuleSpanningTree::OnUserPostNick(User* user, const std::string &oldnick) /** IMPORTANT: We don't update the TS if the oldnick is just a case change of the newnick! */ - if (irc::string(user->nick.c_str()) != assign(oldnick)) + if ((irc::string(user->nick.c_str()) != assign(oldnick)) && (!this->KeepNickTS)) user->age = ServerInstance->Time(); params.push_back(ConvToStr(user->age)); Utils->DoOneToMany(user->uuid,"NICK",params); + this->KeepNickTS = false; } else if (!loopCall && user->nick == user->uuid) { @@ -783,7 +783,7 @@ void ModuleSpanningTree::OnRehash(User* user) std::string msg = "Error in configuration: "; msg.append(e.GetReason()); ServerInstance->SNO->WriteToSnoMask('l', msg); - if (!IS_LOCAL(user)) + if (user && !IS_LOCAL(user)) ServerInstance->PI->SendSNONotice("L", msg); } } @@ -806,6 +806,7 @@ void ModuleSpanningTree::OnUnloadModule(Module* mod) { ServerInstance->PI->SendMetaData(NULL, "modules", "-" + mod->ModuleSourceFile); +restart: unsigned int items = Utils->TreeRoot->ChildCount(); for(unsigned int x = 0; x < items; x++) { @@ -815,8 +816,17 @@ void ModuleSpanningTree::OnUnloadModule(Module* mod) { sock->SendError("SSL module unloaded"); sock->Close(); + // XXX: The list we're iterating is modified by TreeSocket::Squit() which is called by Close() + goto restart; } } + + for (SpanningTreeUtilities::TimeoutList::const_iterator i = Utils->timeoutlist.begin(); i != Utils->timeoutlist.end(); ++i) + { + TreeSocket* sock = i->first; + if (sock->GetIOHook() == mod) + sock->Close(); + } } // note: the protocol does not allow direct umode +o except @@ -839,7 +849,7 @@ void ModuleSpanningTree::OnAddLine(User* user, XLine *x) parameterlist params; params.push_back(x->type); params.push_back(x->Displayable()); - params.push_back(ServerInstance->Config->ServerName); + params.push_back(x->source); params.push_back(ConvToStr(x->set_time)); params.push_back(ConvToStr(x->duration)); params.push_back(":" + x->reason); @@ -911,7 +921,7 @@ ModResult ModuleSpanningTree::OnSetAway(User* user, const std::string &awaymsg) parameterlist params; if (!awaymsg.empty()) { - params.push_back(ConvToStr(user->awaytime)); + params.push_back(ConvToStr(ServerInstance->Time())); params.push_back(":" + awaymsg); } Utils->DoOneToMany(user->uuid, "AWAY", params); @@ -920,6 +930,12 @@ ModResult ModuleSpanningTree::OnSetAway(User* user, const std::string &awaymsg) return MOD_RES_PASSTHRU; } +void ModuleSpanningTree::OnRequest(Request& request) +{ + if (!strcmp(request.id, "rehash")) + Utils->Rehash(); +} + void ModuleSpanningTree::ProtoSendMode(void* opaque, TargetTypeFlags target_type, void* target, const parameterlist &modeline, const std::vector &translate) { TreeSocket* s = (TreeSocket*)opaque;