diff options
author | Peter Powell <petpow@saberuk.com> | 2018-09-21 20:54:05 +0100 |
---|---|---|
committer | Peter Powell <petpow@saberuk.com> | 2018-09-23 13:35:15 +0100 |
commit | 876b1ae4e280e99f24d37da4b819f108ddb3f1e3 (patch) | |
tree | f1449e0b93da7ecd6e4d233a48befd4cef4e9ec4 | |
parent | f020429fd33ec1a7bf1114b2db1b2fd5d6bc1650 (diff) |
Don't sync xlines defined in the config and expire them on rehash.
Closes #1427.
-rw-r--r-- | include/xline.h | 13 | ||||
-rw-r--r-- | src/configreader.cpp | 2 | ||||
-rw-r--r-- | src/xline.cpp | 23 |
3 files changed, 36 insertions, 2 deletions
diff --git a/include/xline.h b/include/xline.h index 9aae32b24..7c102c882 100644 --- a/include/xline.h +++ b/include/xline.h @@ -50,7 +50,12 @@ class CoreExport XLine : public classbase * @param t The line type, should be set by the derived class constructor */ XLine(time_t s_time, long d, std::string src, std::string re, const std::string &t) - : set_time(s_time), duration(d), source(src), reason(re), type(t) + : set_time(s_time) + , duration(d) + , source(src) + , reason(re) + , type(t) + , from_config(false) { expiry = set_time + duration; } @@ -140,6 +145,9 @@ class CoreExport XLine : public classbase */ const std::string type; + // Whether this XLine was loaded from the server config. + bool from_config; + virtual bool IsBurstable(); }; @@ -523,4 +531,7 @@ class CoreExport XLineManager * @param stats Stats context */ void InvokeStats(const std::string& type, unsigned int numeric, Stats::Context& stats); + + /** Clears any XLines which were added by the server configuration. */ + void ClearConfigLines(); }; diff --git a/src/configreader.cpp b/src/configreader.cpp index 6c7cb492a..a8e94586d 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -108,6 +108,7 @@ static void ReadXLine(ServerConfig* conf, const std::string& tag, const std::str throw CoreException("<"+tag+":"+key+"> missing at " + ctag->getTagLocation()); std::string reason = ctag->getString("reason", "<Config>"); XLine* xl = make->Generate(ServerInstance->Time(), 0, "<Config>", reason, mask); + xl->from_config = true; if (!ServerInstance->XLines->AddLine(xl, NULL)) delete xl; } @@ -446,6 +447,7 @@ void ServerConfig::Fill() SocketEngine::Close(socktest); } + ServerInstance->XLines->ClearConfigLines(); ReadXLine(this, "badip", "ipmask", ServerInstance->XLines->GetFactory("Z")); ReadXLine(this, "badnick", "nick", ServerInstance->XLines->GetFactory("Q")); ReadXLine(this, "badhost", "host", ServerInstance->XLines->GetFactory("K")); diff --git a/src/xline.cpp b/src/xline.cpp index cb4f011c0..d07fe0dc5 100644 --- a/src/xline.cpp +++ b/src/xline.cpp @@ -518,7 +518,7 @@ void XLine::Apply(User* u) bool XLine::IsBurstable() { - return true; + return !from_config; } void XLine::DefaultApply(User* u, const std::string &line, bool bancache) @@ -747,3 +747,24 @@ XLineFactory* XLineManager::GetFactory(const std::string &type) return n->second; } + +void XLineManager::ClearConfigLines() +{ + // Nothing to do. + if (lookup_lines.empty()) + return; + + ServerInstance->SNO->WriteToSnoMask('x', "Server rehashing; expiring lines defined in the server config ..."); + for (ContainerIter type = lookup_lines.begin(); type != lookup_lines.end(); ++type) + { + for (LookupIter xline = type->second.begin(); xline != type->second.end(); ) + { + // We cache this to avoid iterator invalidation. + LookupIter cachedxline = xline++; + if (cachedxline->second->from_config) + { + ExpireLine(type, cachedxline); + } + } + } +} |