* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
- * InspIRCd: (C) 2002-2008 InspIRCd Development Team
- * See: http://www.inspircd.org/wiki/index.php/Credits
+ * InspIRCd: (C) 2002-2009 InspIRCd Development Team
+ * See: http://wiki.inspircd.org/Credits
*
* This program is free but copyrighted software; see
* the file COPYING for details.
Node = new TreeServer(this->Utils, this->ServerInstance, InboundServerName, InboundDescription, InboundSID, Utils->TreeRoot, this, lnk ? lnk->Hidden : false);
- if (Node->DuplicateID())
- {
- this->SendError("Server ID "+InboundSID+" already exists on the network!");
- this->ServerInstance->SNO->WriteToSnoMask('l',"Server \2"+InboundServerName+"\2 being introduced from \2" + prefix + "\2 denied, server ID already exists on the network. Closing link.");
- return false;
- }
-
Utils->TreeRoot->AddChild(Node);
- params.clear();
- params.push_back(InboundServerName);
- params.push_back("*");
- params.push_back("1");
- params.push_back(InboundSID);
- params.push_back(":"+InboundDescription);
- Utils->DoOneToAllButSender(ServerInstance->Config->GetSID(),"SERVER",params,InboundServerName);
+ parameterlist sparams;
+ sparams.push_back(InboundServerName);
+ sparams.push_back("*");
+ sparams.push_back("1");
+ sparams.push_back(InboundSID);
+ sparams.push_back(":"+InboundDescription);
+ Utils->DoOneToAllButSender(ServerInstance->Config->GetSID(),"SERVER",sparams,InboundServerName);
+ Utils->DoOneToAllButSenderRaw(line, InboundServerName, prefix, command, params);
Node->bursting = true;
this->DoBurst(Node);
}
* When would this be seen?
* Well, hopefully never. It could be caused by race conditions, bugs, or
* "miscreant" servers, though, so let's check anyway. -- w
+ *
+ * We also check here for totally invalid prefixes (prefixes that are neither
+ * a valid SID or a valid UUID, so that invalid UUID or SID never makes it
+ * to the higher level functions. -- B
*/
std::string direction = prefix;
User *t = this->ServerInstance->FindUUID(prefix);
if (t)
{
+ /* Find UID */
direction = t->server;
}
+ else if (!this->Utils->FindServer(direction))
+ {
+ /* Find SID */
+ ServerInstance->Logs->Log("m_spanningtree",DEFAULT,"Protocol violation: Invalid prefix '%s' from connection '%s'", direction.c_str(), this->GetName().c_str());
+ return true;
+ }
TreeServer* route_back_again = Utils->BestRouteTo(direction);
if ((!route_back_again) || (route_back_again->GetSocket() != this))
if (params.size() == 3)
{
TreeServer* pf = Utils->FindServer(prefix);
- User* user = this->ServerInstance->FindNick(params[1]);
- Channel* chan = this->ServerInstance->FindChan(params[0]);
- if (pf && user && chan)
+ if (pf)
{
- if (!chan->ServerKickUser(user, params[2].c_str(), false, pf->GetName().c_str()))
- /* Yikes, the channels gone! */
- delete chan;
+ irc::commasepstream nicks(params[1]);
+ std::string nick;
+ Channel* chan = this->ServerInstance->FindChan(params[0]);
+ if (chan)
+ {
+ while (nicks.GetToken(nick))
+ {
+ User* user = this->ServerInstance->FindNick(nick);
+ if (user)
+ {
+ if (!chan->ServerKickUser(user, params[2].c_str(), false, pf->GetName().c_str()))
+ /* Yikes, the channels gone! */
+ delete chan;
+ }
+ }
+ }
}
}
{
if (params.size() >= 2)
{
+ std::string oldprefix;
+ if (!ServerSource)
+ {
+ oldprefix = prefix;
+ User *u = ServerInstance->FindNick(prefix);
+ if (!u)
+ return true;
+ prefix = u->nick;
+ }
+
ServerInstance->SNO->WriteToSnoMask(*(params[0].c_str()), "From " + (ServerSource ? ServerSource->GetName().c_str() : prefix) + ": "+ params[1]);
+ prefix = oldprefix;
return Utils->DoOneToAllButSenderRaw(line, sourceserv, prefix, command, params);
}
if (collideret != 1)
{
/*
- * Remote client lost, or both lost, parsing this nickchange would be
- * pointless, as the incoming client's server will soon recieve SVSNICK to
- * change its nick to its UID. :) -- w00t
+ * Remote client lost, or both lost, parsing or passing on this
+ * nickchange would be pointless, as the incoming client's server will
+ * soon recieve SVSNICK to change its nick to its UID. :) -- w00t
*/
return true;
}
this->ServerInstance->SNO->WriteToSnoMask('l', "Connection to '\2%s\2' was established for %s", quitserver.c_str(), Utils->Creator->TimeToStr(server_uptime).c_str());
}
}
-
-