/*
* InspIRCd -- Internet Relay Chat Daemon
*
- * Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
+ * Copyright (C) 2018 linuxdaemon <linuxdaemon.irc@gmail.com>
+ * Copyright (C) 2018 B00mX0r <b00mx0r@aureus.pw>
+ * Copyright (C) 2017-2019 Sadie Powell <sadie@witchery.services>
+ * Copyright (C) 2013-2014, 2016 Attila Molnar <attilamolnar@hush.com>
*
* 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
{
ConfigTagList tags = ServerInstance->Config->ConfTags("maxlist");
limitlist newlimits;
+ bool seen_default = false;
for (ConfigIter i = tags.first; i != tags.second; i++)
{
ConfigTag* c = i->second;
if (!mname.empty() && !stdalgo::string::equalsci(mname, name) && !(mname.length() == 1 && GetModeChar() == mname[0]))
continue;
- ListLimit limit(c->getString("chan", "*"), c->getUInt("limit", 0));
+ ListLimit limit(c->getString("chan", "*", 1), c->getUInt("limit", DEFAULT_LIST_SIZE));
if (limit.mask.empty())
throw ModuleException(InspIRCd::Format("<maxlist:chan> is empty, at %s", c->getTagLocation().c_str()));
- if (limit.limit <= 0)
- throw ModuleException(InspIRCd::Format("<maxlist:limit> must be non-zero, at %s", c->getTagLocation().c_str()));
+ if (limit.mask == "*" || limit.mask == "#*")
+ seen_default = true;
newlimits.push_back(limit);
}
- // Add the default entry. This is inserted last so if the user specifies a
- // wildcard record in the config it will take precedence over this entry.
- newlimits.push_back(ListLimit("*", DEFAULT_LIST_SIZE));
+ // If no default limit has been specified then insert one.
+ if (!seen_default)
+ {
+ ServerInstance->Logs->Log("MODE", LOG_DEBUG, "No default <maxlist> entry was found for the %s mode; defaulting to %u",
+ name.c_str(), DEFAULT_LIST_SIZE);
+ newlimits.push_back(ListLimit("*", DEFAULT_LIST_SIZE));
+ }
// Most of the time our settings are unchanged, so we can avoid iterating the chanlist
if (chanlimits == newlimits)
return it->limit;
}
}
- return DEFAULT_LIST_SIZE;
+ return 0;
}
unsigned int ListModeBase::GetLimitInternal(const std::string& channame, ChanData* cd)
unsigned int ListModeBase::GetLowerLimit()
{
+ if (chanlimits.empty())
+ return DEFAULT_LIST_SIZE;
+
unsigned int limit = UINT_MAX;
for (limitlist::iterator iter = chanlimits.begin(); iter != chanlimits.end(); ++iter)
{
if (iter->limit < limit)
limit = iter->limit;
}
- return limit == UINT_MAX ? DEFAULT_LIST_SIZE : limit;
+ return limit;
}
ModeAction ListModeBase::OnModeChange(User* source, User*, Channel* channel, std::string ¶meter, bool adding)
if (tidy)
ModeParser::CleanMask(parameter);
- if (parameter.length() > 250)
- return MODEACTION_DENY;
-
// If there was no list
if (!cd)
{