aboutsummaryrefslogtreecommitdiff
path: root/src/modules/m_spanningtree/capab.cpp
diff options
context:
space:
mode:
authorGravatar danieldg2009-08-17 15:09:46 +0000
committerGravatar danieldg2009-08-17 15:09:46 +0000
commit36cb60f872712e8e5a59df74b5b36177addc4248 (patch)
tree0561023f5469f4ce5ac1d693450bd76cae8e13a2 /src/modules/m_spanningtree/capab.cpp
parentcgiirc: Pass hosts to WEBIRC command on rehash. No fucking wonder this never ... (diff)
Allow forward linking compatability by accepting higher protocol version numbers (other server should fail the link if it becomes link-incompatable)
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@11531 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src/modules/m_spanningtree/capab.cpp')
-rw-r--r--src/modules/m_spanningtree/capab.cpp22
1 files changed, 12 insertions, 10 deletions
diff --git a/src/modules/m_spanningtree/capab.cpp b/src/modules/m_spanningtree/capab.cpp
index d363f31c1..7981bc2a5 100644
--- a/src/modules/m_spanningtree/capab.cpp
+++ b/src/modules/m_spanningtree/capab.cpp
@@ -178,12 +178,19 @@ bool TreeSocket::Capab(const std::deque<std::string> &params)
reason = "We don't both support linking to IPV6 servers";
if (((this->CapKeys.find("IP6NATIVE") != this->CapKeys.end()) && (this->CapKeys.find("IP6NATIVE")->second == "1")) && (!ip6support))
reason = "The remote server is IPV6 native, and we don't support linking to IPV6 servers";
- if (((this->CapKeys.find("PROTOCOL") == this->CapKeys.end()) || ((this->CapKeys.find("PROTOCOL") != this->CapKeys.end()) && (this->CapKeys.find("PROTOCOL")->second != ConvToStr(ProtocolVersion)))))
+ if (this->CapKeys.find("PROTOCOL") == this->CapKeys.end())
{
- if (this->CapKeys.find("PROTOCOL") != this->CapKeys.end())
- reason = "Mismatched protocol versions "+this->CapKeys.find("PROTOCOL")->second+" and "+ConvToStr(ProtocolVersion);
- else
- reason = "Protocol version not specified";
+ reason = "Protocol version not specified";
+ }
+ else
+ {
+ int otherProto = atoi(CapKeys.find("PROTOCOL")->second.c_str());
+ if (otherProto < MinCompatProtocol)
+ {
+ reason = "Server is using protocol version " + ConvToStr(otherProto) +
+ " which is too old to link with this server (version " + ConvToStr(ProtocolVersion)
+ + (ProtocolVersion != MinCompatProtocol ? ", links with " + ConvToStr(MinCompatProtocol) + " and above)" : ")");
+ }
}
if(this->CapKeys.find("PREFIX") != this->CapKeys.end() && this->CapKeys.find("PREFIX")->second != this->ServerInstance->Modes->BuildPrefixes())
@@ -196,11 +203,6 @@ bool TreeSocket::Capab(const std::deque<std::string> &params)
reason = "One or more of the user modes on the remote server are invalid on this server.";
- if (((this->CapKeys.find("HALFOP") == this->CapKeys.end()) && (ServerInstance->Config->AllowHalfop)) || ((this->CapKeys.find("HALFOP") != this->CapKeys.end()) && (this->CapKeys.find("HALFOP")->second != ConvToStr(ServerInstance->Config->AllowHalfop))))
- reason = "We don't both have halfop support enabled/disabled identically";
-
-
-
/* Challenge response, store their challenge for our password */
std::map<std::string,std::string>::iterator n = this->CapKeys.find("CHALLENGE");
if (Utils->ChallengeResponse && (n != this->CapKeys.end()) && (ServerInstance->Modules->Find("m_sha256.so")))