if (u)
{
Utils->DoOneToAllButSender(prefix,"SVSNICK",params,prefix);
+
if (IS_LOCAL(u))
{
std::deque<std::string> par;
par.push_back(params[1]);
+
if (!u->ForceNickChange(params[1].c_str()))
{
- userrec::QuitUser(this->Instance, u, "Nickname collision");
- return true;
+ /* buh. UID them */
+ if (!u->ForceNickChange(u->uuid))
+ {
+ userrec::QuitUser(this->Instance, u, "Nickname collision");
+ return true;
+ }
}
+
u->age = atoi(params[2].c_str());
}
}
+
return true;
}
if (params.size() < 2)
return true;
+ if (!this->Instance->IsChannel(params[1].c_str()))
+ return true;
+
userrec* u = this->Instance->FindNick(params[0]);
if (u)
bool TreeSocket::RemoteServer(const std::string &prefix, std::deque<std::string> ¶ms)
{
- if (params.size() < 4)
+ if (params.size() < 5)
return false;
std::string servername = params[0];
std::string password = params[1];
// hopcount is not used for a remote server, we calculate this ourselves
- std::string description = params[3];
+ std::string sid = params[3];
+ std::string description = params[4];
TreeServer* ParentOfThis = Utils->FindServer(prefix);
if (!ParentOfThis)
{
this->Instance->SNO->WriteToSnoMask('l',"Server \2"+servername+"\2 being introduced from \2" + prefix + "\2 denied, already exists. Closing link with " + prefix);
return false;
}
+
Link* lnk = Utils->FindLink(servername);
- TreeServer* Node = new TreeServer(this->Utils,this->Instance,servername,description,ParentOfThis,NULL, lnk ? lnk->Hidden : false);
+
+ TreeServer *Node = new TreeServer(this->Utils, this->Instance, servername, description, sid, ParentOfThis,NULL, lnk ? lnk->Hidden : false);
+
+ if (Node->DuplicateID())
+ {
+ this->SendError("Server ID "+sid+" already exists on the network!");
+ this->Instance->SNO->WriteToSnoMask('l',"Server \2"+servername+"\2 being introduced from \2" + prefix + "\2 denied, server ID already exists on the network. Closing link with " + prefix);
+ return false;
+ }
+
ParentOfThis->AddChild(Node);
- params[3] = ":" + params[3];
+ params[4] = ":" + params[4];
Utils->SetRemoteBursting(Node, true);
Utils->DoOneToAllButSender(prefix,"SERVER",params,prefix);
this->Instance->SNO->WriteToSnoMask('l',"Server \002"+prefix+"\002 introduced server \002"+servername+"\002 ("+description+")");
bool TreeSocket::Outbound_Reply_Server(std::deque<std::string> ¶ms)
{
- if (params.size() < 4)
+ if (params.size() < 5)
return false;
irc::string servername = params[0].c_str();
std::string sname = params[0];
std::string password = params[1];
- std::string description = params[3];
+ std::string sid = params[3];
+ std::string description = params[4];
int hops = atoi(params[2].c_str());
this->InboundServerName = sname;
this->InboundDescription = description;
+ this->InboundSID = sid;
if (!sentcapab)
this->SendCapabilities();
// we should add the details of this server now
// to the servers tree, as a child of the root
// node.
- TreeServer* Node = new TreeServer(this->Utils,this->Instance,sname,description,Utils->TreeRoot,this,x->Hidden);
+
+ TreeServer *Node = new TreeServer(this->Utils, this->Instance, sname, description, sid, Utils->TreeRoot, this, x->Hidden);
+
+ if (Node->DuplicateID())
+ {
+ this->SendError("Server ID "+sid+" already exists on the network!");
+ this->Instance->SNO->WriteToSnoMask('l',"Server \2"+assign(servername)+"\2 being introduced denied, server ID already exists on the network. Closing link.");
+ return false;
+ }
+
Utils->TreeRoot->AddChild(Node);
- params[3] = ":" + params[3];
+ params[4] = ":" + params[4];
Utils->DoOneToAllButSender(Utils->TreeRoot->GetName(),"SERVER",params,sname);
this->bursting = true;
this->DoBurst(Node);
bool TreeSocket::Inbound_Server(std::deque<std::string> ¶ms)
{
- if (params.size() < 4)
+ if (params.size() < 5)
return false;
irc::string servername = params[0].c_str();
std::string sname = params[0];
std::string password = params[1];
- std::string description = params[3];
+ std::string sid = params[3];
+ std::string description = params[4];
+ std::string OurSID;
int hops = atoi(params[2].c_str());
this->InboundServerName = sname;
this->InboundDescription = description;
+ this->InboundSID = sid;
+
+ OurSID += (char)((Instance->Config->sid / 100) + 48);
+ OurSID += (char)((Instance->Config->sid / 10) % 10 + 48);
+ OurSID += (char)(Instance->Config->sid % 10 + 48);
if (!sentcapab)
this->SendCapabilities();
CheckDupeSocket->Close();
return false;
}
- /* Now check for fully initialized instances of the server */
+ /* Check for fully initialized instances of the server by id */
+ Instance->Log(DEBUG,"Looking for dupe SID %s", sid.c_str());
+ TreeServer* CheckDupeSID = Utils->FindServerID(sid);
+ if (CheckDupeSID)
+ {
+ this->SendError("Server ID "+CheckDupeSID->GetID()+" already exists on server "+CheckDupeSID->GetName()+"!");
+ this->Instance->SNO->WriteToSnoMask('l',"Server connection from \2"+sname+"\2 denied, server ID '"+CheckDupeSID->GetID()+
+ "' already exists on server "+CheckDupeSID->GetName());
+ return false;
+ }
+ /* Now check for fully initialized instances of the server by name */
TreeServer* CheckDupe = Utils->FindServer(sname);
if (CheckDupe)
{
// this is good. Send our details: Our server name and description and hopcount of 0,
// along with the sendpass from this block.
- this->WriteLine(std::string("SERVER ")+this->Instance->Config->ServerName+" "+this->MakePass(x->SendPass, this->GetTheirChallenge())+" 0 :"+this->Instance->Config->ServerDesc);
+ this->WriteLine(std::string("SERVER ")+this->Instance->Config->ServerName+" "+this->MakePass(x->SendPass, this->GetTheirChallenge())+" 0 "+OurSID+" :"+this->Instance->Config->ServerDesc);
// move to the next state, we are now waiting for THEM.
this->LinkState = WAIT_AUTH_2;
return true;
{
return this->Capab(params);
}
- else if ((command == "U") || (command == "S"))
- {
- this->SendError("Cannot use the old-style mesh linking protocol with m_spanningtree.so!");
- return false;
- }
else
{
irc::string error = "Invalid command in negotiation phase: " + command;
// silently ignore.
return true;
}
- else if ((command == "U") || (command == "S"))
- {
- this->SendError("Cannot use the old-style mesh linking protocol with m_spanningtree.so!");
- return false;
- }
else if (command == "BURST")
{
if (params.size() && Utils->EnableTimeSync)
}
this->LinkState = CONNECTED;
Link* lnk = Utils->FindLink(InboundServerName);
- Node = new TreeServer(this->Utils,this->Instance, InboundServerName, InboundDescription, Utils->TreeRoot, this, lnk ? lnk->Hidden : false);
+
+ Node = new TreeServer(this->Utils,this->Instance, InboundServerName, InboundDescription, InboundSID, Utils->TreeRoot, this, lnk ? lnk->Hidden : false);
+
+ if (Node->DuplicateID())
+ {
+ this->SendError("Server ID "+InboundSID+" already exists on the network!");
+ this->Instance->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->DelBurstingServer(this);
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(Utils->TreeRoot->GetName(),"SERVER",params,InboundServerName);
this->bursting = true;
if (!prefix.empty())
{
std::string direction = prefix;
- userrec* t = this->Instance->FindNick(prefix);
+
+ userrec *t = this->Instance->FindUUID(prefix);
if (t)
{
direction = t->server;
}
+
TreeServer* route_back_again = Utils->BestRouteTo(direction);
if ((!route_back_again) || (route_back_again->GetSocket() != this))
{
/* Yes, know, this is a mess. Its reasonably fast though as we're
* working with std::string here.
*/
- if ((command == "NICK") && (params.size() >= 8))
+ if (command == "UID")
{
- return this->IntroduceClient(prefix,params);
+ return this->ParseUID(prefix, params);
}
else if (command == "FJOIN")
{
}
else
{
- // not a special inter-server command.
- // Emulate the actual user doing the command,
- // this saves us having a huge ugly parser.
- userrec* who = this->Instance->FindNick(prefix);
+ /*
+ * Not a special s2s command. Emulate the user doing it.
+ * This saves us having a huge ugly command parser again.
+ */
+ userrec *who = this->Instance->FindUUID(prefix);
+
std::string sourceserv = this->myhost;
if (!this->InboundServerName.empty())
{