/*
* InspIRCd -- Internet Relay Chat Daemon
*
+ * Copyright (C) 2019 Matt Schatz <genius3000@g3k.solutions>
+ * Copyright (C) 2013, 2017-2020 Sadie Powell <sadie@witchery.services>
+ * Copyright (C) 2013 Adam <Adam@anope.org>
+ * Copyright (C) 2012-2014, 2016 Attila Molnar <attilamolnar@hush.com>
+ * Copyright (C) 2012, 2018-2019 Robby <robby@chatbelgie.be>
+ * Copyright (C) 2009 Uli Schlachter <psychon@inspircd.org>
* Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
- * Copyright (C) 2005-2009 Robin Burchell <robin+git@viroteck.net>
- * Copyright (C) 2004-2008 Craig Edwards <craigedwards@brainbox.cc>
+ * Copyright (C) 2007-2009 Robin Burchell <robin+git@viroteck.net>
* Copyright (C) 2007 Dennis Friis <peavey@inspircd.org>
- * Copyright (C) 2007 John Brooks <john.brooks@dereferenced.net>
+ * Copyright (C) 2006-2008, 2010 Craig Edwards <brain@inspircd.org>
*
* 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
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
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
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);
+ }
};
* 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.)
* 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
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()
{
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;
}
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;
}
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;
}