X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fxline.cpp;h=cb4f011c0fffa76f8c8caa90d01c474a2a93b34f;hb=c60f88bb5ce23d1291dddfd3e15ba71c801b7d3c;hp=3eb556234d3a12a16bb9cb851725cdc5c4cd65c3;hpb=3a3ff949670c61a4a8856e1391222e156eb1cd17;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/xline.cpp b/src/xline.cpp index 3eb556234..cb4f011c0 100644 --- a/src/xline.cpp +++ b/src/xline.cpp @@ -23,6 +23,7 @@ #include "inspircd.h" #include "xline.h" +#include "modules/stats.h" /** An XLineFactory specialized to generate GLine* pointers */ @@ -33,7 +34,7 @@ class GLineFactory : public XLineFactory /** Generate a GLine */ - XLine* Generate(time_t set_time, long duration, std::string source, std::string reason, std::string xline_specific_mask) + XLine* Generate(time_t set_time, long duration, std::string source, std::string reason, std::string xline_specific_mask) CXX11_OVERRIDE { IdentHostPair ih = ServerInstance->XLines->IdentSplit(xline_specific_mask); return new GLine(set_time, duration, source, reason, ih.first, ih.second); @@ -49,7 +50,7 @@ class ELineFactory : public XLineFactory /** Generate an ELine */ - XLine* Generate(time_t set_time, long duration, std::string source, std::string reason, std::string xline_specific_mask) + XLine* Generate(time_t set_time, long duration, std::string source, std::string reason, std::string xline_specific_mask) CXX11_OVERRIDE { IdentHostPair ih = ServerInstance->XLines->IdentSplit(xline_specific_mask); return new ELine(set_time, duration, source, reason, ih.first, ih.second); @@ -65,7 +66,7 @@ class KLineFactory : public XLineFactory /** Generate a KLine */ - XLine* Generate(time_t set_time, long duration, std::string source, std::string reason, std::string xline_specific_mask) + XLine* Generate(time_t set_time, long duration, std::string source, std::string reason, std::string xline_specific_mask) CXX11_OVERRIDE { IdentHostPair ih = ServerInstance->XLines->IdentSplit(xline_specific_mask); return new KLine(set_time, duration, source, reason, ih.first, ih.second); @@ -81,7 +82,7 @@ class QLineFactory : public XLineFactory /** Generate a QLine */ - XLine* Generate(time_t set_time, long duration, std::string source, std::string reason, std::string xline_specific_mask) + XLine* Generate(time_t set_time, long duration, std::string source, std::string reason, std::string xline_specific_mask) CXX11_OVERRIDE { return new QLine(set_time, duration, source, reason, xline_specific_mask); } @@ -96,7 +97,7 @@ class ZLineFactory : public XLineFactory /** Generate a ZLine */ - XLine* Generate(time_t set_time, long duration, std::string source, std::string reason, std::string xline_specific_mask) + XLine* Generate(time_t set_time, long duration, std::string source, std::string reason, std::string xline_specific_mask) CXX11_OVERRIDE { return new ZLine(set_time, duration, source, reason, xline_specific_mask); } @@ -159,6 +160,7 @@ void XLineManager::CheckELines() for (UserManager::LocalList::const_iterator u2 = list.begin(); u2 != list.end(); u2++) { LocalUser* u = *u2; + u->exempt = false; /* This uses safe iteration to ensure that if a line expires here, it doenst trash the iterator */ LookupIter safei; @@ -169,7 +171,8 @@ void XLineManager::CheckELines() safei++; XLine *e = i->second; - u->exempt = e->Matches(u); + if ((!e->duration || ServerInstance->Time() < e->expiry) && e->Matches(u)) + u->exempt = true; i = safei; } @@ -259,7 +262,7 @@ bool XLineManager::AddLine(XLine* line, User* user) ContainerIter x = lookup_lines.find(line->type); if (x != lookup_lines.end()) { - LookupIter i = x->second.find(line->Displayable().c_str()); + LookupIter i = x->second.find(line->Displayable()); if (i != x->second.end()) { // XLine propagation bug was here, if the line to be added already exists and @@ -281,7 +284,7 @@ bool XLineManager::AddLine(XLine* line, User* user) if (xlf->AutoApplyToUserList(line)) pending_lines.push_back(line); - lookup_lines[line->type][line->Displayable().c_str()] = line; + lookup_lines[line->type][line->Displayable()] = line; line->OnAdd(); FOREACH_MOD(OnAddLine, (user, line)); @@ -312,9 +315,7 @@ bool XLineManager::DelLine(const char* hostmask, const std::string &type, User* y->second->Unset(); - std::vector::iterator pptr = std::find(pending_lines.begin(), pending_lines.end(), y->second); - if (pptr != pending_lines.end()) - pending_lines.erase(pptr); + stdalgo::erase(pending_lines, y->second); delete y->second; x->second.erase(y); @@ -325,14 +326,6 @@ bool XLineManager::DelLine(const char* hostmask, const std::string &type, User* void ELine::Unset() { - /* remove exempt from everyone and force recheck after deleting eline */ - const UserManager::LocalList& list = ServerInstance->Users.GetLocalUsers(); - for (UserManager::LocalList::const_iterator u2 = list.begin(); u2 != list.end(); u2++) - { - LocalUser* u = *u2; - u->exempt = false; - } - ServerInstance->XLines->CheckELines(); } @@ -419,9 +412,7 @@ void XLineManager::ExpireLine(ContainerIter container, LookupIter item) * is pending, cleared when it is no longer pending, so we skip over this loop if its not pending? * -- Brain */ - std::vector::iterator pptr = std::find(pending_lines.begin(), pending_lines.end(), item->second); - if (pptr != pending_lines.end()) - pending_lines.erase(pptr); + stdalgo::erase(pending_lines, item->second); delete item->second; container->second.erase(item); @@ -451,7 +442,7 @@ void XLineManager::ApplyLines() pending_lines.clear(); } -void XLineManager::InvokeStats(const std::string &type, int numeric, User* user, string_list &results) +void XLineManager::InvokeStats(const std::string& type, unsigned int numeric, Stats::Context& stats) { ContainerIter n = lookup_lines.find(type); @@ -472,7 +463,7 @@ void XLineManager::InvokeStats(const std::string &type, int numeric, User* user, ExpireLine(n, i); } else - results.push_back(ConvToStr(numeric)+" "+user->nick+" :"+i->second->Displayable()+" "+ + stats.AddRow(numeric, i->second->Displayable()+" "+ ConvToStr(i->second->set_time)+" "+ConvToStr(i->second->duration)+" "+i->second->source+" :"+i->second->reason); i = safei; } @@ -535,7 +526,7 @@ void XLine::DefaultApply(User* u, const std::string &line, bool bancache) const std::string banReason = line + "-Lined: " + reason; if (!ServerInstance->Config->XLineMessage.empty()) - u->WriteNotice("*** " + ServerInstance->Config->XLineMessage); + u->WriteNumeric(ERR_YOUREBANNEDCREEP, ServerInstance->Config->XLineMessage); if (ServerInstance->Config->HideBans) ServerInstance->Users->QuitUser(u, line + "-Lined", &banReason); @@ -558,7 +549,7 @@ bool KLine::Matches(User *u) if (InspIRCd::Match(u->ident, this->identmask, ascii_case_insensitive_map)) { - if (InspIRCd::MatchCIDR(u->host, this->hostmask, ascii_case_insensitive_map) || + if (InspIRCd::MatchCIDR(u->GetRealHost(), this->hostmask, ascii_case_insensitive_map) || InspIRCd::MatchCIDR(u->GetIPString(), this->hostmask, ascii_case_insensitive_map)) { return true; @@ -581,7 +572,7 @@ bool GLine::Matches(User *u) if (InspIRCd::Match(u->ident, this->identmask, ascii_case_insensitive_map)) { - if (InspIRCd::MatchCIDR(u->host, this->hostmask, ascii_case_insensitive_map) || + if (InspIRCd::MatchCIDR(u->GetRealHost(), this->hostmask, ascii_case_insensitive_map) || InspIRCd::MatchCIDR(u->GetIPString(), this->hostmask, ascii_case_insensitive_map)) { return true; @@ -598,13 +589,9 @@ void GLine::Apply(User* u) bool ELine::Matches(User *u) { - LocalUser* lu = IS_LOCAL(u); - if (lu && lu->exempt) - return false; - if (InspIRCd::Match(u->ident, this->identmask, ascii_case_insensitive_map)) { - if (InspIRCd::MatchCIDR(u->host, this->hostmask, ascii_case_insensitive_map) || + if (InspIRCd::MatchCIDR(u->GetRealHost(), this->hostmask, ascii_case_insensitive_map) || InspIRCd::MatchCIDR(u->GetIPString(), this->hostmask, ascii_case_insensitive_map)) { return true;