From 8c3c4f8e8274a598b4ba573f9eabfd0940d2e88d Mon Sep 17 00:00:00 2001 From: Sadie Powell Date: Mon, 22 Mar 2021 14:43:05 +0000 Subject: [PATCH] Add support for matching multiple hosts in . --- include/users.h | 11 +++++++---- src/configreader.cpp | 4 ++-- src/users.cpp | 17 ++++++++++++++--- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/include/users.h b/include/users.h index b9092b678..136874bab 100644 --- a/include/users.h +++ b/include/users.h @@ -91,10 +91,12 @@ struct CoreExport ConnectClass : public refcountbase */ unsigned int registration_timeout; - /** Host mask for this line - */ + /** Hosts that this user can connect from as a string. */ std::string host; + /** Hosts that this user can connect from as a vector. */ + std::vector hosts; + /** Number of seconds between pings for this line */ unsigned int pingtime; @@ -166,8 +168,9 @@ struct CoreExport ConnectClass : public refcountbase /** Update the settings in this block to match the given block */ void Update(const ConnectClass* newSettings); - const std::string& GetName() { return name; } - const std::string& GetHost() { return host; } + const std::string& GetName() const { return name; } + const std::string& GetHost() const { return host; } + const std::vector& GetHosts() const { return hosts; } /** Returns the registration timeout */ diff --git a/src/configreader.cpp b/src/configreader.cpp index 2cd17e844..381d28d1b 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -242,9 +242,9 @@ void ServerConfig::CrossCheckConnectBlocks(ServerConfig* current) std::string mask; char type; - if (tag->readString("allow", mask, false)) + if (tag->readString("allow", mask, false) && !mask.empty()) type = CC_ALLOW; - else if (tag->readString("deny", mask, false)) + else if (tag->readString("deny", mask, false) && !mask.empty()) type = CC_DENY; else if (!name.empty()) { diff --git a/src/users.cpp b/src/users.cpp index 7029accc0..8ea0de6bc 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -1159,9 +1159,16 @@ void LocalUser::SetClass(const std::string &explicit_name) continue; } - /* check if host matches.. */ - if (!InspIRCd::MatchCIDR(this->GetIPString(), c->GetHost(), NULL) && - !InspIRCd::MatchCIDR(this->GetRealHost(), c->GetHost(), NULL)) + bool hostmatches = false; + for (std::vector::const_iterator host = c->GetHosts().begin(); host != c->GetHosts().end(); ++host) + { + if (InspIRCd::MatchCIDR(this->GetIPString(), *host) || InspIRCd::MatchCIDR(this->GetRealHost(), *host)) + { + hostmatches = true; + break; + } + } + if (!hostmatches) { ServerInstance->Logs->Log("CONNECTCLASS", LOG_DEBUG, "The %s connect class is not suitable as neither the host (%s) nor the IP (%s) matches %s", c->GetName().c_str(), this->GetRealHost().c_str(), this->GetIPString().c_str(), c->GetHost().c_str()); @@ -1266,6 +1273,9 @@ ConnectClass::ConnectClass(ConfigTag* tag, char t, const std::string& mask) , limit(0) , resolvehostnames(true) { + irc::spacesepstream hoststream(host); + for (std::string hostentry; hoststream.GetToken(hostentry); ) + hosts.push_back(hostentry); } ConnectClass::ConnectClass(ConfigTag* tag, char t, const std::string& mask, const ConnectClass& parent) @@ -1309,6 +1319,7 @@ void ConnectClass::Update(const ConnectClass* src) name = src->name; registration_timeout = src->registration_timeout; host = src->host; + hosts = src->hosts; pingtime = src->pingtime; softsendqmax = src->softsendqmax; hardsendqmax = src->hardsendqmax; -- 2.39.2