diff options
| author | 2023-01-13 20:43:13 +0000 | |
|---|---|---|
| committer | 2023-01-13 20:50:00 +0000 | |
| commit | 1f4ffdfee959614e3afe7e7daab06a040ca1ac41 (patch) | |
| tree | f49b94d8d59e9d08867501c23b21828a3bb9976b /src | |
| parent | Document the cloak_sha256 <cloak:case> option. (diff) | |
Various improvements to the cloak system.
- Only rewrite cloak => cloaking if the cloak_md5 module is also
loaded.
- Include the cloak method in the link data.
- If 1206 servers are using different cloak methods then ignore
the other data when telling operators about the link failure.
- Clean up the code in a few places.
Diffstat (limited to 'src')
| -rw-r--r-- | src/modules/m_cloak.cpp | 27 | ||||
| -rw-r--r-- | src/modules/m_cloak_md5.cpp | 9 | ||||
| -rw-r--r-- | src/modules/m_cloak_sha256.cpp | 22 | ||||
| -rw-r--r-- | src/modules/m_spanningtree/capab.cpp | 2 |
4 files changed, 34 insertions, 26 deletions
diff --git a/src/modules/m_cloak.cpp b/src/modules/m_cloak.cpp index f7ef8fdb8..f6e0c2e98 100644 --- a/src/modules/m_cloak.cpp +++ b/src/modules/m_cloak.cpp @@ -21,6 +21,7 @@ #include "clientprotocolevent.h" #include "modules/cloak.h" #include "modules/ircv3_replies.h" +#include "utility/map.h" typedef std::vector<Cloak::MethodPtr> CloakMethodList; @@ -233,10 +234,30 @@ class ModuleCloakSHA256 final cloakmethods.swap(newcloakmethods); } - void GetLinkData(Module::LinkData& data, std::string& compatdata) override + void CompareLinkData(const LinkData& otherdata, LinkDataDiff& diffs) { - if (!cloakmethods.empty()) - cloakmethods.front()->GetLinkData(data, compatdata); + std::string unused; + LinkData data; + this->GetLinkData(data, unused); + + // If the only difference is the method then just include that. + insp::map::difference(data, otherdata, diffs); + auto it = diffs.find("method"); + if (it != diffs.end()) + diffs = { *it }; + } + + void GetLinkData(LinkData& data, std::string& compatdata) override + { + if (cloakmethods.empty()) + return; + + auto& cloakmethod = cloakmethods.front(); + cloakmethod->GetLinkData(data, compatdata); + + data["method"] = cloakmethod->GetName(); + if (compatdata.empty()) + compatdata.assign(cloakmethod->GetName()); } void Prioritize() override diff --git a/src/modules/m_cloak_md5.cpp b/src/modules/m_cloak_md5.cpp index 0e2971d85..cab08cad9 100644 --- a/src/modules/m_cloak_md5.cpp +++ b/src/modules/m_cloak_md5.cpp @@ -209,15 +209,6 @@ struct CloakInfo final void GetLinkData(Module::LinkData& data, std::string& compatdata) override { - switch (mode) - { - case MODE_HALF_CLOAK: - data["mode"] = "half"; - break; - case MODE_OPAQUE: - data["mode"] = "full"; - break; - } data["domain-parts"] = ConvToStr(domainparts); data["ignore-case"] = ignorecase ? "yes" : "no"; data["prefix"] = prefix; diff --git a/src/modules/m_cloak_sha256.cpp b/src/modules/m_cloak_sha256.cpp index ebd0c178d..a8ad87a5e 100644 --- a/src/modules/m_cloak_sha256.cpp +++ b/src/modules/m_cloak_sha256.cpp @@ -85,7 +85,7 @@ private: const std::string beta = Hash(InspIRCd::Format("%u.%u.%u", a, b, c)); const std::string gamma = Hash(InspIRCd::Format("%u.%u", a, b)); - return Wrap(InspIRCd::Format("%s.%s.%s", alpha.c_str(), beta.c_str(), gamma.c_str()), "."); + return Wrap(InspIRCd::Format("%s.%s.%s", alpha.c_str(), beta.c_str(), gamma.c_str()), '.'); } std::string CloakIPv6(const unsigned char* address) @@ -109,7 +109,7 @@ private: const std::string beta = Hash(InspIRCd::Format("%x:%x:%x:%x:%x:%x:%x", a, b, c, d, e, f, g)); const std::string gamma = Hash(InspIRCd::Format("%x:%x:%x:%x", a, b, c, d)); - return Wrap(InspIRCd::Format("%s:%s:%s", alpha.c_str(), beta.c_str(), gamma.c_str()), ":"); + return Wrap(InspIRCd::Format("%s:%s:%s", alpha.c_str(), beta.c_str(), gamma.c_str()), ':'); } std::string CloakHost(const std::string& host, char separator) @@ -136,14 +136,14 @@ private: return out; } - std::string Wrap(const std::string& cloak, const char* separator) + std::string Wrap(const std::string& cloak, char separator) { std::string fullcloak; if (!prefix.empty()) - fullcloak.append(prefix).append(separator); + fullcloak.append(prefix).append(1, separator); fullcloak.append(cloak); if (!suffix.empty()) - fullcloak.append(separator).append(suffix); + fullcloak.append(1, separator).append(suffix); return fullcloak; } @@ -190,15 +190,11 @@ public: // IMPORTANT: link data is sent over unauthenticated server links so we // can't directly send the key here. Instead we use dummy cloaks that // allow verification of or less the same thing. - irc::sockets::sockaddrs sa; - if (sa.from_ip("123.123.123.123")) - data["cloak-v4"] = sha256 ? CloakAddress(sa) : broken; + data["cloak-v4"] = sha256 ? Generate("123.123.123.123") : broken; + data["cloak-v6"] = sha256 ? Generate("dead:beef:cafe::") : broken; + data["cloak-host"] = sha256 ? Generate("cloak.inspircd.org") : broken; + data["cloak-unix"] = sha256 ? Generate("/inspircd/cloak.sock") : broken; - if (sa.from_ip("dead:beef:cafe::")) - data["cloak-v6"] = sha256 ? CloakAddress(sa) : broken; - - data["cloak-host"] = sha256 ? CloakHost("cloak.inspircd.org", '.') : broken; - data["cloak-unix"] = sha256 ? CloakHost("/inspircd/cloak.sock", '/') : broken; data["host-parts"] = ConvToStr(hostparts); data["prefix"] = prefix; data["suffix"] = suffix; diff --git a/src/modules/m_spanningtree/capab.cpp b/src/modules/m_spanningtree/capab.cpp index 14e90f987..5ae7f5ff0 100644 --- a/src/modules/m_spanningtree/capab.cpp +++ b/src/modules/m_spanningtree/capab.cpp @@ -57,7 +57,7 @@ namespace modname.append(name.substr(0, endpos)).append(".so"); // Handle renamed modules. - if (stdalgo::string::equalsci(modname, "m_cloak.so")) + if (stdalgo::string::equalsci(modname, "m_cloak.so") && ServerInstance->Modules.Find("cloak_md5")) modname = "m_cloaking.so"; else if (stdalgo::string::equalsci(modname, "m_realnameban.so")) modname = "m_gecosban.so"; |
