Permalink
Browse files

Add networkinfo:modelistsize config option to set the max size of b/e…

…/I lists
  • Loading branch information...
1 parent 7e7556f commit 6e0dc0e2103494d50dd4bd9920550d1653365f05 @Adam- Adam- committed Mar 31, 2013
Showing with 38 additions and 6 deletions.
  1. +5 −0 data/example.conf
  2. +2 −0 include/config.h
  3. +5 −0 include/protocol.h
  4. +14 −5 modules/commands/cs_ban.cpp
  5. +6 −1 modules/commands/cs_mode.cpp
  6. +1 −0 src/config.cpp
  7. +5 −0 src/protocol.cpp
View
@@ -273,6 +273,11 @@ networkinfo
/* Set this to the maximum allowed channel length on your network.
*/
chanlen = 32
+
+ /* The maximum number of list modes settable on a channel (such as b, e, I).
+ * Comment out or set to 0 to disable.
+ */
+ modelistsize = 100
}
/*
View
@@ -375,6 +375,8 @@ class CoreExport ServerConfig
unsigned HostLen;
/* Max length of channel names */
unsigned ChanLen;
+ /* Max length of b/e/I lists */
+ unsigned ListSize;
/* User and group to run as */
Anope::string User;
View
@@ -223,6 +223,11 @@ class CoreExport IRCDProto : public Service
virtual bool IsIdentValid(const Anope::string &);
virtual bool IsHostValid(const Anope::string &);
virtual bool IsExtbanValid(const Anope::string &) { return false; }
+
+ /** Retrieve the maximum number of list modes settable on this channel
+ * Defaults to Config->ListSize
+ */
+ virtual unsigned GetMaxListFor(Channel *c);
};
class CoreExport MessageSource
@@ -53,6 +53,18 @@ class CommandCSBan : public Command
return;
}
+ Channel *c = ci->c;
+ if (c == NULL)
+ {
+ source.Reply(CHAN_X_NOT_IN_USE, chan.c_str());
+ return;
+ }
+ else if (IRCD->GetMaxListFor(c) && c->HasMode("BAN") >= IRCD->GetMaxListFor(c))
+ {
+ source.Reply(_("The ban list for %s is full."), c->name.c_str());
+ return;
+ }
+
Anope::string expiry, target, reason;
time_t ban_time;
if (params[1][0] == '+')
@@ -82,15 +94,12 @@ class CommandCSBan : public Command
if (reason.length() > Config->CSReasonMax)
reason = reason.substr(0, Config->CSReasonMax);
- Channel *c = ci->c;
User *u = source.GetUser();
User *u2 = User::Find(target, true);
AccessGroup u_access = source.AccessFor(ci);
- if (!c)
- source.Reply(CHAN_X_NOT_IN_USE, chan.c_str());
- else if (!u_access.HasPriv("BAN") && !source.HasPriv("chanserv/kick"))
+ if (!u_access.HasPriv("BAN") && !source.HasPriv("chanserv/kick"))
source.Reply(ACCESS_DENIED);
else if (u2)
{
@@ -102,7 +111,7 @@ class CommandCSBan : public Command
* Dont ban/kick the user on channels where he is excepted
* to prevent services <-> server wars.
*/
- else if (ci->c->MatchesList(u2, "EXCEPT"))
+ else if (c->MatchesList(u2, "EXCEPT"))
source.Reply(CHAN_EXCEPTED, u2->nick.c_str(), ci->name.c_str());
else if (u2->IsProtected())
source.Reply(ACCESS_DENIED);
@@ -102,6 +102,8 @@ class CommandCSMode : public Command
Anope::string mode_param;
if (((cm->type == MODE_STATUS || cm->type == MODE_LIST) && !sep.GetToken(mode_param)) || (cm->type == MODE_PARAM && adding && !sep.GetToken(mode_param)))
source.Reply(_("Missing parameter for mode %c."), cm->mchar);
+ else if (cm->type == MODE_LIST && ci->c && IRCD->GetMaxListFor(ci->c) && ci->c->HasMode(cm->name) >= IRCD->GetMaxListFor(ci->c))
+ source.Reply(_("List for mode %c is full."), cm->mchar);
else
{
ci->SetMLock(cm, adding, mode_param, source.GetNick());
@@ -371,7 +373,10 @@ class CommandCSMode : public Command
if (!sep.GetToken(param))
break;
if (adding)
- ci->c->SetMode(NULL, cm, param);
+ {
+ if (IRCD->GetMaxListFor(ci->c) && ci->c->HasMode(cm->name) < IRCD->GetMaxListFor(ci->c))
+ ci->c->SetMode(NULL, cm, param);
+ }
else
{
std::pair<Channel::ModeList::iterator, Channel::ModeList::iterator> its = ci->c->GetModeList(cm->name);
View
@@ -1139,6 +1139,7 @@ ConfigItems::ConfigItems(ServerConfig *conf)
{"networkinfo", "userlen", "10", new ValueContainerUInt(&conf->UserLen), DT_UINTEGER | DT_NORELOAD, NoValidation},
{"networkinfo", "hostlen", "64", new ValueContainerUInt(&conf->HostLen), DT_UINTEGER | DT_NORELOAD, NoValidation},
{"networkinfo", "chanlen", "32", new ValueContainerUInt(&conf->ChanLen), DT_UINTEGER | DT_NORELOAD, NoValidation},
+ {"networkinfo", "modelistsize", "0", new ValueContainerUInt(&conf->ListSize), DT_UINTEGER, NoValidation},
{"options", "user", "", new ValueContainerString(&conf->User), DT_STRING, NoValidation},
{"options", "group", "", new ValueContainerString(&conf->Group), DT_STRING, NoValidation},
{"options", "casemap", "ascii", new ValueContainerString(&conf->CaseMap), DT_STRING, NoValidation},
View
@@ -385,6 +385,11 @@ void IRCDProto::SendOper(User *u)
u->SetMode(OperServ, "OPER");
}
+unsigned IRCDProto::GetMaxListFor(Channel *c)
+{
+ return c->HasMode("LBAN") ? 0 : Config->ListSize;
+}
+
MessageSource::MessageSource(const Anope::string &src) : source(src), u(NULL), s(NULL)
{
if (src.empty())

0 comments on commit 6e0dc0e

Please sign in to comment.