From aae97bda3ea3452e8a6a3da82d3cfdf0adb8e038 Mon Sep 17 00:00:00 2001 From: Sadie Powell Date: Tue, 2 May 2023 13:33:31 +0100 Subject: [PATCH] Add to limit cloaks to a specific connect class. --- docs/conf/modules.conf.example | 8 ++++++++ include/modules/cloak.h | 17 ++++++++++++++++- src/modules/m_cloak_md5.cpp | 4 ++-- src/modules/m_cloak_sha256.cpp | 4 ++-- 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/docs/conf/modules.conf.example b/docs/conf/modules.conf.example index 74643a53c..5aecd58de 100644 --- a/docs/conf/modules.conf.example +++ b/docs/conf/modules.conf.example @@ -561,12 +561,14 @@ # # # # @@ -586,6 +588,10 @@ # key - The secret key to use when hashing hostnames. This # # MUST be at least 30 characters long. # # # +# class - If non-empty then a comma-delimited list of connect # +# class names that a user has to be in to get the cloak # +# from this tag. # +# # # prefix - A freeform value to prefix cloaks with. This must not # # contain spaces. # # # @@ -615,6 +621,7 @@ # # classes; + protected: - Method(const Engine* engine) ATTR_NOT_NULL(2) + Method(const Engine* engine, const std::shared_ptr& tag) ATTR_NOT_NULL(2) : provname(engine->name) { + irc::commasepstream klassstream(tag->getString("class")); + for (std::string klass; klassstream.GetToken(klass); ) + classes.insert(klass); + } + + bool MatchesUser(LocalUser* user) const + { + if (!classes.empty() && !stdalgo::isin(classes, user->GetClass()->GetName())) + return false; + + // All fields matched. + return true; } public: diff --git a/src/modules/m_cloak_md5.cpp b/src/modules/m_cloak_md5.cpp index abbdfa4db..f09a651b4 100644 --- a/src/modules/m_cloak_md5.cpp +++ b/src/modules/m_cloak_md5.cpp @@ -75,7 +75,7 @@ struct CloakInfo final std::string suffix; CloakInfo(const Cloak::Engine* engine, const std::shared_ptr& tag, CloakMode Mode, const std::string& Key) - : Cloak::Method(engine) + : Cloak::Method(engine, tag) , mode(Mode) , domainparts(tag->getNum("domainparts", 3, 1, 10)) , ignorecase(tag->getBool("ignorecase")) @@ -253,7 +253,7 @@ struct CloakInfo final std::string Generate(LocalUser* user) override ATTR_NOT_NULL(2) { - if (!md5 || !user->client_sa.is_ip()) + if (!md5 || !user->client_sa.is_ip() || !MatchesUser(user)) return {}; return GenCloak(user->client_sa, user->GetAddress(), user->GetRealHost()); diff --git a/src/modules/m_cloak_sha256.cpp b/src/modules/m_cloak_sha256.cpp index 97038a569..a269048da 100644 --- a/src/modules/m_cloak_sha256.cpp +++ b/src/modules/m_cloak_sha256.cpp @@ -186,7 +186,7 @@ private: public: SHA256Method(const Cloak::Engine* engine, const std::shared_ptr& tag, const std::string& k, psl_ctx_t* p, bool ch) ATTR_NOT_NULL(2) - : Cloak::Method(engine) + : Cloak::Method(engine, tag) , cloakhost(ch) , hostparts(tag->getNum("hostparts", 3, 0, ServerInstance->Config->Limits.MaxHost / 2)) , key(k) @@ -214,7 +214,7 @@ public: std::string Generate(LocalUser* user) override ATTR_NOT_NULL(2) { - if (!sha256) + if (!sha256 || !MatchesUser(user)) return {}; irc::sockets::sockaddrs sa(false);