summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/modules/m_spanningtree/capab.cpp26
-rw-r--r--src/modules/m_spanningtree/compat.cpp56
-rw-r--r--src/modules/m_spanningtree/handshaketimer.cpp4
-rw-r--r--src/modules/m_spanningtree/server.cpp8
-rw-r--r--src/modules/m_spanningtree/treesocket.h7
-rw-r--r--src/modules/m_spanningtree/treesocket1.cpp16
6 files changed, 77 insertions, 40 deletions
diff --git a/src/modules/m_spanningtree/capab.cpp b/src/modules/m_spanningtree/capab.cpp
index 5b68ab4f9..66d448e55 100644
--- a/src/modules/m_spanningtree/capab.cpp
+++ b/src/modules/m_spanningtree/capab.cpp
@@ -21,10 +21,13 @@
/* $ModDep: m_spanningtree/utils.h m_spanningtree/treeserver.h m_spanningtree/treesocket.h */
-
std::string TreeSocket::MyModules(int filter)
{
std::vector<std::string> modlist = this->ServerInstance->Modules->GetAllModuleNames(filter);
+
+ if (filter == VF_COMMON && proto_version != ProtocolVersion)
+ CompatAddModules(modlist);
+
std::string capabilities;
sort(modlist.begin(),modlist.end());
for (unsigned int i = 0; i < modlist.size(); i++)
@@ -36,16 +39,20 @@ std::string TreeSocket::MyModules(int filter)
return capabilities;
}
-void TreeSocket::SendCapabilities()
+void TreeSocket::SendCapabilities(int phase)
{
- if (sentcapab)
+ if (capab_phase >= phase)
+ return;
+
+ if (capab_phase < 1 && phase >= 1)
+ WriteLine("CAPAB START " + ConvToStr(ProtocolVersion));
+
+ capab_phase = phase;
+ if (phase < 2)
return;
- sentcapab = true;
irc::commasepstream modulelist(MyModules(VF_COMMON));
irc::commasepstream optmodulelist(MyModules(VF_OPTCOMMON));
- this->WriteLine("CAPAB START");
-
/* Send module names, split at 509 length */
std::string item;
std::string line = "CAPAB MODULES ";
@@ -160,6 +167,9 @@ bool TreeSocket::Capab(const parameterlist &params)
ModuleList.clear();
OptModuleList.clear();
CapKeys.clear();
+ if (params.size() > 1)
+ proto_version = atoi(params[1].c_str());
+ SendCapabilities(2);
}
else if (params[0] == "END")
{
@@ -244,7 +254,7 @@ bool TreeSocket::Capab(const parameterlist &params)
this->SetTheirChallenge(n->second);
if (!this->GetTheirChallenge().empty() && (this->LinkState == CONNECTING))
{
- this->SendCapabilities();
+ this->SendCapabilities(2);
this->WriteLine(std::string("SERVER ")+this->ServerInstance->Config->ServerName+" "+this->MakePass(OutboundPass, this->GetTheirChallenge())+" 0 "+
ServerInstance->Config->GetSID()+" :"+this->ServerInstance->Config->ServerDesc);
}
@@ -254,7 +264,7 @@ bool TreeSocket::Capab(const parameterlist &params)
/* They didnt specify a challenge or we don't have m_sha256.so, we use plaintext */
if (this->LinkState == CONNECTING)
{
- this->SendCapabilities();
+ this->SendCapabilities(2);
this->WriteLine(std::string("SERVER ")+this->ServerInstance->Config->ServerName+" "+OutboundPass+" 0 "+ServerInstance->Config->GetSID()+" :"+this->ServerInstance->Config->ServerDesc);
}
}
diff --git a/src/modules/m_spanningtree/compat.cpp b/src/modules/m_spanningtree/compat.cpp
index 345215031..f278913c8 100644
--- a/src/modules/m_spanningtree/compat.cpp
+++ b/src/modules/m_spanningtree/compat.cpp
@@ -15,25 +15,53 @@
#include "main.h"
#include "treesocket.h"
-void TreeSocket::WriteLine(std::string line)
+static const char* const forge_common_1201[] = {
+ "m_chghost.so",
+ "m_chgname.so",
+ "m_remove.so",
+ "m_sajoin.so",
+ "m_sakick.so",
+ "m_sanick.so",
+ "m_sapart.so",
+ "m_saquit.so",
+ "m_setident.so",
+};
+
+void TreeSocket::CompatAddModules(std::vector<std::string>& modlist)
{
- if (line[0] != ':' && LinkState == CONNECTED)
+ if (proto_version < 1202)
{
- ServerInstance->Logs->Log("m_spanningtree", DEFAULT, "Sending line without server prefix!");
- line = ":" + ServerInstance->Config->GetSID() + " " + line;
+ // you MUST have chgident loaded in order to be able to translate FIDENT
+ modlist.push_back("m_chgident.so");
+ for(int i=0; i * sizeof(char*) < sizeof(forge_common_1201); i++)
+ {
+ if (ServerInstance->Modules->Find(forge_common_1201[i]))
+ modlist.push_back(forge_common_1201[i]);
+ }
}
- if (proto_version != ProtocolVersion)
+}
+
+void TreeSocket::WriteLine(std::string line)
+{
+ if (LinkState == CONNECTED)
{
- std::string::size_type a = line.find(' ');
- std::string::size_type b = line.find(' ', a);
- std::string command = line.substr(a,b);
- // now try to find a translation entry
- // TODO a more efficient lookup method will be needed later
- if (proto_version < 1202 && command == "FIDENT")
+ if (line[0] != ':')
+ {
+ ServerInstance->Logs->Log("m_spanningtree", DEFAULT, "Sending line without server prefix!");
+ line = ":" + ServerInstance->Config->GetSID() + " " + line;
+ }
+ if (proto_version != ProtocolVersion)
{
- // a more aggressive method would be to translate to CHGIDENT
- ServerInstance->Logs->Log("m_spanningtree",DEBUG,"Dropping FIDENT to 1201-protocol server");
- return;
+ std::string::size_type a = line.find(' ') + 1;
+ std::string::size_type b = line.find(' ', a);
+ std::string command = line.substr(a, b-a);
+ // now try to find a translation entry
+ // TODO a more efficient lookup method will be needed later
+ if (proto_version < 1202 && command == "FIDENT")
+ {
+ ServerInstance->Logs->Log("m_spanningtree",DEBUG,"Rewriting FIDENT for 1201-protocol server");
+ line = ":" + ServerInstance->Config->GetSID() + " CHGIDENT " + line.substr(1,a-2) + line.substr(b);
+ }
}
}
diff --git a/src/modules/m_spanningtree/handshaketimer.cpp b/src/modules/m_spanningtree/handshaketimer.cpp
index 1b3b1dd22..1ccd466ad 100644
--- a/src/modules/m_spanningtree/handshaketimer.cpp
+++ b/src/modules/m_spanningtree/handshaketimer.cpp
@@ -42,13 +42,13 @@ void HandshakeTimer::Tick(time_t TIME)
if (!sock->GetHook())
{
CancelRepeat();
- sock->SendCapabilities();
+ sock->SendCapabilities(1);
}
else if (BufferedSocketHSCompleteRequest(sock, (Module*)Utils->Creator, sock->GetHook()).Send())
{
CancelRepeat();
BufferedSocketAttachCertRequest(sock, (Module*)Utils->Creator, sock->GetHook()).Send();
- sock->SendCapabilities();
+ sock->SendCapabilities(1);
}
// otherwise, try again later
}
diff --git a/src/modules/m_spanningtree/server.cpp b/src/modules/m_spanningtree/server.cpp
index 24d1a66e7..6351c93b5 100644
--- a/src/modules/m_spanningtree/server.cpp
+++ b/src/modules/m_spanningtree/server.cpp
@@ -107,8 +107,7 @@ bool TreeSocket::Outbound_Reply_Server(parameterlist &params)
this->InboundDescription = description;
this->InboundSID = sid;
- if (!sentcapab)
- this->SendCapabilities();
+ this->SendCapabilities(2);
if (hops)
{
@@ -203,8 +202,7 @@ bool TreeSocket::Inbound_Server(parameterlist &params)
this->InboundDescription = description;
this->InboundSID = sid;
- if (!sentcapab)
- this->SendCapabilities();
+ this->SendCapabilities(2);
if (hops)
{
@@ -261,7 +259,7 @@ bool TreeSocket::Inbound_Server(parameterlist &params)
// this is good. Send our details: Our server name and description and hopcount of 0,
// along with the sendpass from this block.
- this->SendCapabilities();
+ this->SendCapabilities(2);
this->WriteLine(std::string("SERVER ")+this->ServerInstance->Config->ServerName+" "+this->MakePass(x->SendPass, this->GetTheirChallenge())+" 0 "+ServerInstance->Config->GetSID()+" :"+this->ServerInstance->Config->ServerDesc);
// move to the next state, we are now waiting for THEM.
this->LinkState = WAIT_AUTH_2;
diff --git a/src/modules/m_spanningtree/treesocket.h b/src/modules/m_spanningtree/treesocket.h
index 93016126b..e9830f9ad 100644
--- a/src/modules/m_spanningtree/treesocket.h
+++ b/src/modules/m_spanningtree/treesocket.h
@@ -89,7 +89,7 @@ class TreeSocket : public BufferedSocket
std::string ourchallenge; /* Challenge sent for challenge/response */
std::string theirchallenge; /* Challenge recv for challenge/response */
std::string OutboundPass; /* Outbound password */
- bool sentcapab; /* Have sent CAPAB already */
+ int capab_phase; /* Have sent CAPAB already */
bool auth_fingerprint; /* Did we auth using SSL fingerprint */
bool auth_challenge; /* Did we auth using challenge/response */
int proto_version; /* Remote protocol version */
@@ -194,7 +194,10 @@ class TreeSocket : public BufferedSocket
/** Send my capabilities to the remote side
*/
- void SendCapabilities();
+ void SendCapabilities(int phase);
+
+ /** Add modules to VF_COMMON list for backwards compatability */
+ void CompatAddModules(std::vector<std::string>& modlist);
/* Check a comma seperated list for an item */
bool HasItem(const std::string &list, const std::string &item);
diff --git a/src/modules/m_spanningtree/treesocket1.cpp b/src/modules/m_spanningtree/treesocket1.cpp
index e77e6717e..f31685c01 100644
--- a/src/modules/m_spanningtree/treesocket1.cpp
+++ b/src/modules/m_spanningtree/treesocket1.cpp
@@ -41,9 +41,9 @@ TreeSocket::TreeSocket(SpanningTreeUtilities* Util, InspIRCd* SI, std::string sh
{
age = SI->Time();
myhost = ServerName;
- theirchallenge.clear();
- ourchallenge.clear();
- this->LinkState = CONNECTING;
+ capab_phase = 0;
+ proto_version = 0;
+ LinkState = CONNECTING;
Utils->timeoutlist[this] = std::pair<std::string, int>(ServerName, maxtime);
if (Hook)
BufferedSocketHookRequest(this, (Module*)Utils->Creator, Hook).Send();
@@ -58,10 +58,9 @@ TreeSocket::TreeSocket(SpanningTreeUtilities* Util, InspIRCd* SI, int newfd, cha
: BufferedSocket(SI, newfd, ip), Utils(Util), Hook(HookMod)
{
age = SI->Time();
- this->LinkState = WAIT_AUTH_1;
- theirchallenge.clear();
- ourchallenge.clear();
- sentcapab = false;
+ LinkState = WAIT_AUTH_1;
+ capab_phase = 0;
+ proto_version = 0;
/* If we have a transport module hooked to the parent, hook the same module to this
* socket, and set a timer waiting for handshake before we send CAPAB etc.
*/
@@ -127,7 +126,6 @@ bool TreeSocket::OnConnected()
x->Hook.c_str());
}
this->OutboundPass = x->SendPass;
- sentcapab = false;
/* found who we're supposed to be connecting to, send the neccessary gubbins. */
if (this->GetHook())
@@ -136,7 +134,7 @@ bool TreeSocket::OnConnected()
ServerInstance->Timers->AddTimer(hstimer);
}
else
- this->SendCapabilities();
+ this->SendCapabilities(1);
return true;
}