summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/users.h11
-rw-r--r--src/configreader.cpp4
-rw-r--r--src/users.cpp17
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<std::string> 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<std::string>& 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<std::string>::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;