X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fxline.cpp;h=4e18a0dea347083524916b3fb0b68da4e512d30e;hb=dd930143a15ce7429527f0afd52b01bc31e9ed12;hp=accffb8d0ebaf7ba0181f69b506ed3f2c2f59b86;hpb=f9a258fa768362279cb5365856fe3f4dce5d6245;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/xline.cpp b/src/xline.cpp index accffb8d0..4e18a0dea 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, 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) 2004, 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 @@ -395,7 +400,7 @@ XLine* XLineManager::MatchesLine(const std::string &type, const std::string &pat const time_t current = ServerInstance->Time(); - LookupIter safei; + LookupIter safei; for (LookupIter i = x->second.begin(); i != x->second.end(); ) { @@ -493,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() { @@ -580,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; } @@ -603,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; } @@ -622,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; } @@ -660,6 +688,7 @@ bool QLine::Matches(User *u) void QLine::Apply(User* u) { /* Force to uuid on apply of Q-line, no need to disconnect anymore :) */ + u->WriteNumeric(RPL_SAVENICK, u->uuid, "Your nickname has been Q-lined."); u->ChangeNick(u->uuid); }