From 8c3c4f8e8274a598b4ba573f9eabfd0940d2e88d Mon Sep 17 00:00:00 2001 From: Sadie Powell Date: Mon, 22 Mar 2021 14:43:05 +0000 Subject: Add support for matching multiple hosts in . --- src/configreader.cpp | 4 ++-- src/users.cpp | 17 ++++++++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) (limited to 'src') 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; -- cgit v1.2.3