From 95684187b636c2a02822eb2e9ee26e3b9555d4c4 Mon Sep 17 00:00:00 2001 From: Alexander Barton Date: Sun, 30 Nov 2014 21:46:50 +0100 Subject: [PATCH 1/2] Fix server token assignment of servers in the network 1. the directly linked server, our upstream, always has token "1", and 2. for remote servers in the network, the token and description filds were interchanged during registration, therefore up to now no server could be found by Server::Find() using its assigned server token. --- modules/protocol/ngircd.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp index 6078b87b8..1b28ea399 100644 --- a/modules/protocol/ngircd.cpp +++ b/modules/protocol/ngircd.cpp @@ -524,18 +524,17 @@ struct IRCDMessageServer : IRCDMessage IRCDMessageServer(Module *creator) : IRCDMessage(creator, "SERVER", 3) { SetFlag(IRCDMESSAGE_SOFT_LIMIT); } /* + * New directly linked server: + * * SERVER tolsun.oulu.fi 1 :Experimental server * New server tolsun.oulu.fi introducing itself * and attempting to register. * - * RFC 2813 says the server has to send a hopcount - * AND a servertoken. Not quite sure what ngIRCd is - * sending here. - * * params[0] = servername - * params[1] = hop count (or servertoken?) + * params[1] = hop count * params[2] = server description * + * New remote server in the network: * * :tolsun.oulu.fi SERVER csd.bu.edu 5 34 :BU Central Server * Server tolsun.oulu.fi is our uplink for csd.bu.edu @@ -554,13 +553,13 @@ struct IRCDMessageServer : IRCDMessage if (params.size() == 3) { // our uplink is introducing itself - new Server(Me, params[0], 1, params[2], ""); + new Server(Me, params[0], 1, params[2], "1"); } else { // our uplink is introducing a new server unsigned int hops = params[1].is_pos_number_only() ? convertTo(params[1]) : 0; - new Server(source.GetServer(), params[0], hops, params[2], params[3]); + new Server(source.GetServer(), params[0], hops, params[3], params[2]); } /* * ngIRCd does not send an EOB, so we send a PING immediately From d4732faf4156297a83e27dafdf9e7c30dcf70355 Mon Sep 17 00:00:00 2001 From: Alexander Barton Date: Sun, 30 Nov 2014 21:50:11 +0100 Subject: [PATCH 2/2] Correctly assign nicks to their respective host servers Use the "server token" parameter of NICK commands to find the host server and correctly assign the nick name to this server. This allows Anope to correctly free all nick names again when (remote) servers leave the network, which fixes arbitrary "KILL attacks" when such nick names reconnect later on. Initial debugging and patch by DukePyrolator, thanks a lot! --- modules/protocol/ngircd.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/protocol/ngircd.cpp b/modules/protocol/ngircd.cpp index 1b28ea399..61613423e 100644 --- a/modules/protocol/ngircd.cpp +++ b/modules/protocol/ngircd.cpp @@ -448,7 +448,14 @@ struct IRCDMessageNick : IRCDMessage else if (params.size() == 7) { // a new user is connecting to the network - User::OnIntroduce(params[0], params[2], params[3], "", "", source.GetServer(), params[6], Anope::CurTime, params[5], "", NULL); + Server *s = Server::Find(params[4]); + if (s == NULL) + { + Log(LOG_DEBUG) << "User " << params[0] << " introduced from nonexistant server " << params[4] << "?"; + return; + } + User::OnIntroduce(params[0], params[2], params[3], "", "", s, params[6], Anope::CurTime, params[5], "", NULL); + Log(LOG_DEBUG) << "Registered nick \"" << params[0] << "\" on server " << s->GetName() << "."; } else {