X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fxline.cpp;h=0d627023e7a6dabdc160ad326e098ec328f0b877;hb=f3d3ccaac1038775bf2cca62066e32cc2d52edc4;hp=f9d94e447b06d7aa24e2618c61e84ae5f3a02ee3;hpb=0ab7720ea4b53996a4bb6b8e47e8aae9304861a1;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/xline.cpp b/src/xline.cpp index f9d94e447..0d627023e 100644 --- a/src/xline.cpp +++ b/src/xline.cpp @@ -1,11 +1,16 @@ /* * InspIRCd -- Internet Relay Chat Daemon * + * Copyright (C) 2019 Matt Schatz + * Copyright (C) 2013, 2017-2020 Sadie Powell + * Copyright (C) 2013 Adam + * Copyright (C) 2012-2014, 2016 Attila Molnar + * Copyright (C) 2012, 2018-2019 Robby + * Copyright (C) 2009 Uli Schlachter * Copyright (C) 2009 Daniel De Graaf - * Copyright (C) 2005-2009 Robin Burchell - * Copyright (C) 2004-2008 Craig Edwards + * Copyright (C) 2007-2009 Robin Burchell * Copyright (C) 2007 Dennis Friis - * Copyright (C) 2007 John Brooks + * Copyright (C) 2006-2008, 2010 Craig Edwards * * This file is part of InspIRCd. InspIRCd is free software: you can * redistribute it and/or modify it under the terms of the GNU General Public @@ -62,15 +67,15 @@ class ELineFactory : public XLineFactory class KLineFactory : public XLineFactory { public: - KLineFactory() : XLineFactory("K") { } + KLineFactory() : XLineFactory("K") { } /** Generate a KLine */ - XLine* Generate(time_t set_time, unsigned long duration, const std::string& source, const std::string& reason, const 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); - } + XLine* Generate(time_t set_time, unsigned long duration, const std::string& source, const std::string& reason, const 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); + } }; /** An XLineFactory specialized to generate QLine* pointers @@ -78,14 +83,14 @@ class KLineFactory : public XLineFactory class QLineFactory : public XLineFactory { public: - QLineFactory() : XLineFactory("Q") { } + QLineFactory() : XLineFactory("Q") { } /** Generate a QLine */ - XLine* Generate(time_t set_time, unsigned long duration, const std::string& source, const std::string& reason, const std::string& xline_specific_mask) CXX11_OVERRIDE - { - return new QLine(set_time, duration, source, reason, xline_specific_mask); - } + XLine* Generate(time_t set_time, unsigned long duration, const std::string& source, const std::string& reason, const std::string& xline_specific_mask) CXX11_OVERRIDE + { + return new QLine(set_time, duration, source, reason, xline_specific_mask); + } }; /** An XLineFactory specialized to generate ZLine* pointers @@ -93,14 +98,14 @@ class QLineFactory : public XLineFactory class ZLineFactory : public XLineFactory { public: - ZLineFactory() : XLineFactory("Z") { } + ZLineFactory() : XLineFactory("Z") { } /** Generate a ZLine */ - XLine* Generate(time_t set_time, unsigned long duration, const std::string& source, const std::string& reason, const std::string& xline_specific_mask) CXX11_OVERRIDE - { - return new ZLine(set_time, duration, source, reason, xline_specific_mask); - } + XLine* Generate(time_t set_time, unsigned long duration, const std::string& source, const std::string& reason, const std::string& xline_specific_mask) CXX11_OVERRIDE + { + return new ZLine(set_time, duration, source, reason, xline_specific_mask); + } }; @@ -114,7 +119,7 @@ class ZLineFactory : public XLineFactory * was added, it iterated every existing line for every existing user. Ow. Expiry was also * expensive, as the lists were NOT sorted. * - * Version 2 moved permanent lines into a seperate list from non-permanent to help optimize + * Version 2 moved permanent lines into a separate list from non-permanent to help optimize * matching speed, but matched in the same way. * Expiry was also sped up by sorting the list by expiry (meaning just remove the items at the * head of the list that are outdated.) @@ -123,7 +128,7 @@ class ZLineFactory : public XLineFactory * than it could have been, something which we address here. * * VERSION 3: - * All lines are (as in v1) stored together -- no seperation of perm and non-perm. They are stored in + * All lines are (as in v1) stored together -- no separation of perm and non-perm. They are stored in * a map of maps (first map is line type, second map is for quick lookup on add/delete/etc). * * Expiry is *no longer* performed on a timer, and no longer uses a sorted list of any variety. This @@ -460,7 +465,11 @@ void XLineManager::ApplyLines() if (x->Matches(u)) { x->Apply(u); - break; + + // If applying the X-line has killed the user then don't + // apply any more lines to them. + if (u->quitting) + break; } } } @@ -489,13 +498,36 @@ void XLineManager::InvokeStats(const std::string& type, unsigned int numeric, St ExpireLine(n, i); } else - stats.AddRow(numeric, i->second->Displayable()+" "+ - ConvToStr(i->second->set_time)+" "+ConvToStr(i->second->duration)+" "+i->second->source+" :"+i->second->reason); + stats.AddRow(numeric, i->second->Displayable(), i->second->set_time, i->second->duration, i->second->source, i->second->reason); i = safei; } } } +bool XLineManager::InvokeStats(const std::string& type, Stats::Context& context) +{ + ContainerIter citer = lookup_lines.find(type); + if (citer == lookup_lines.end()) + return false; + + for (LookupIter liter = citer->second.begin(); liter != citer->second.end(); ) + { + // We might be about to expire the XLine so we have to increment the + // iterator early to avoid doing that causing iterator invalidation. + LookupIter current = liter++; + + XLine* xline = current->second; + if (xline->duration && xline->expiry <= ServerInstance->Time()) + { + // This XLine has expired so remove and skip it. + ExpireLine(citer, current); + continue; + } + + context.AddRow(RPL_STATS, context.GetSymbol(), xline->Displayable(), xline->set_time, xline->duration, xline->source, xline->reason); + } + return true; +} XLineManager::XLineManager() { @@ -576,7 +608,7 @@ bool KLine::Matches(User *u) if (InspIRCd::Match(u->ident, this->identmask, 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)) + InspIRCd::MatchCIDR(u->GetIPString(), this->hostmask, ascii_case_insensitive_map)) { return true; } @@ -599,7 +631,7 @@ bool GLine::Matches(User *u) if (InspIRCd::Match(u->ident, this->identmask, 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)) + InspIRCd::MatchCIDR(u->GetIPString(), this->hostmask, ascii_case_insensitive_map)) { return true; } @@ -618,7 +650,7 @@ bool ELine::Matches(User *u) if (InspIRCd::Match(u->ident, this->identmask, 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)) + InspIRCd::MatchCIDR(u->GetIPString(), this->hostmask, ascii_case_insensitive_map)) { return true; }