diff options
-rw-r--r-- | include/modules.h | 6 | ||||
-rw-r--r-- | src/modules.cpp | 10 | ||||
-rw-r--r-- | src/modules/m_cloaking.cpp | 20 | ||||
-rw-r--r-- | src/modules/m_spanningtree/capab.cpp | 14 | ||||
-rw-r--r-- | src/modules/m_spanningtree/compat.cpp | 6 | ||||
-rw-r--r-- | src/modules/m_spanningtree/treesocket1.cpp | 24 |
6 files changed, 57 insertions, 23 deletions
diff --git a/include/modules.h b/include/modules.h index a3f596091..13e3dc28c 100644 --- a/include/modules.h +++ b/include/modules.h @@ -188,10 +188,12 @@ class CoreExport VersionBase /** Server linking description string */ const std::string link_data; - /** Initialize version class - */ + /** Simple module version */ VersionBase(const std::string &desc, int flags = VF_NONE); + /** Complex version information, including linking compatability data */ + VersionBase(const std::string &desc, int flags, const std::string& linkdata); + virtual ~VersionBase() {} /** Return true if the module can link (default is identity comparison) */ diff --git a/src/modules.cpp b/src/modules.cpp index f460a6a28..cbd6c7b38 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -26,8 +26,14 @@ // Version is a simple class for holding a modules version number template<> -VersionBase<API_VERSION>::VersionBase(const std::string &modv, int flags) -: description(modv), Flags(flags) +VersionBase<API_VERSION>::VersionBase(const std::string &desc, int flags) +: description(desc), Flags(flags) +{ +} + +template<> +VersionBase<API_VERSION>::VersionBase(const std::string &desc, int flags, const std::string& linkdata) +: description(desc), Flags(flags), link_data(linkdata) { } diff --git a/src/modules/m_cloaking.cpp b/src/modules/m_cloaking.cpp index 1f9854a78..22114c54e 100644 --- a/src/modules/m_cloaking.cpp +++ b/src/modules/m_cloaking.cpp @@ -332,9 +332,23 @@ class ModuleCloaking : public Module Version GetVersion() { - // returns the version number of the module to be - // listed in /MODULES - return Version("Provides masking of user hostnames", VF_COMMON|VF_VENDOR); + std::string testcloak; + switch (mode) + { + case MODE_COMPAT_HOST: + testcloak = prefix + "-" + Hash->sumIV(compatkey, xtab[0], "*").substr(0,10); + break; + case MODE_COMPAT_IPONLY: + testcloak = Hash->sumIV(compatkey, xtab[0], "*").substr(0,10); + break; + case MODE_HALF_CLOAK: + testcloak = prefix + SegmentCloak("*", 3); + break; + case MODE_OPAQUE: + default: + testcloak = prefix + SegmentCloak("*", 4); + } + return Version("Provides masking of user hostnames", VF_COMMON|VF_VENDOR, testcloak); } void OnRehash(User* user) diff --git a/src/modules/m_spanningtree/capab.cpp b/src/modules/m_spanningtree/capab.cpp index 91f60d3c3..de97b6c70 100644 --- a/src/modules/m_spanningtree/capab.cpp +++ b/src/modules/m_spanningtree/capab.cpp @@ -33,8 +33,18 @@ std::string TreeSocket::MyModules(int filter) for (unsigned int i = 0; i < modlist.size(); i++) { if (i) - capabilities = capabilities + ","; - capabilities = capabilities + modlist[i]; + capabilities.push_back(','); + capabilities.append(modlist[i]); + Module* m = ServerInstance->Modules->Find(modlist[i]); + if (m && proto_version >= 1202) + { + Version v = m->GetVersion(); + if (!v.link_data.empty()) + { + capabilities.push_back('='); + capabilities.append(v.link_data); + } + } } return capabilities; } diff --git a/src/modules/m_spanningtree/compat.cpp b/src/modules/m_spanningtree/compat.cpp index b00992eca..625a2611e 100644 --- a/src/modules/m_spanningtree/compat.cpp +++ b/src/modules/m_spanningtree/compat.cpp @@ -30,6 +30,7 @@ static const char* const forge_common_1201[] = { }; static std::string wide_newline("\r\n"); +static std::string newline("\n"); void TreeSocket::CompatAddModules(std::vector<std::string>& modlist) { @@ -122,5 +123,8 @@ void TreeSocket::WriteLine(std::string line) ServerInstance->Logs->Log("m_spanningtree",DEBUG, "S[%d] O %s", this->GetFd(), line.c_str()); this->WriteData(line); - this->WriteData(wide_newline); + if (proto_version < 1202) + this->WriteData(wide_newline); + else + this->WriteData(newline); } diff --git a/src/modules/m_spanningtree/treesocket1.cpp b/src/modules/m_spanningtree/treesocket1.cpp index e05c09967..c96bf3bc9 100644 --- a/src/modules/m_spanningtree/treesocket1.cpp +++ b/src/modules/m_spanningtree/treesocket1.cpp @@ -218,20 +218,18 @@ void TreeSocket::Squit(TreeServer* Current, const std::string &reason) void TreeSocket::OnDataReady() { Utils->Creator->loopCall = true; - /* While there is at least one new line in the buffer, - * do something useful (we hope!) with it. - */ - while (recvq.find("\n") != std::string::npos) + std::string line; + while (GetNextLine(line)) { - std::string ret = recvq.substr(0,recvq.find("\n")-1); - recvq = recvq.substr(recvq.find("\n")+1,recvq.length()-recvq.find("\n")); - /* Use rfind here not find, as theres more - * chance of the \r being near the end of the - * string, not the start. - */ - if (ret.find("\r") != std::string::npos) - ret = recvq.substr(0,recvq.find("\r")-1); - ProcessLine(ret); + std::string::size_type rline = line.find('\r'); + if (rline != std::string::npos) + line = line.substr(0,rline); + if (line.find('\0') != std::string::npos) + { + SendError("Read null character from socket"); + break; + } + ProcessLine(line); } Utils->Creator->loopCall = false; } |