#include "protocolinterface.h"
ModuleSpanningTree::ModuleSpanningTree()
+ : KeepNickTS(false)
{
Utils = new SpanningTreeUtilities(this);
commands = new SpanningTreeCommands(this);
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
{
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;
for (std::vector<reference<Link> >::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;
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;
/** 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)
{
void ModuleSpanningTree::OnPreRehash(User* user, const std::string ¶meter)
{
+ if (loopCall)
+ return; // Don't generate a REHASH here if we're in the middle of processing a message that generated this one
+
ServerInstance->Logs->Log("remoterehash", DEBUG, "called with param %s", parameter.c_str());
// Send out to other servers
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);
}
}
sock->Close();
}
}
+
+ 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
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);