summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/config.c3
-rw-r--r--src/modes.cpp57
-rw-r--r--src/protocol/bahamut.c5
-rw-r--r--src/protocol/inspircd11.c5
-rw-r--r--src/protocol/inspircd12.cpp5
-rw-r--r--src/protocol/ratbox.c4
-rw-r--r--src/protocol/unreal32.c5
-rw-r--r--src/regchannel.cpp6
8 files changed, 65 insertions, 25 deletions
diff --git a/src/config.c b/src/config.c
index 549e19594..aa7577cbf 100644
--- a/src/config.c
+++ b/src/config.c
@@ -642,6 +642,7 @@ int ServerConfig::Read(bool bail)
{"options", "newscount", "3", new ValueContainerUInt(&Config.NewsCount), DT_UINTEGER, NoValidation},
{"options", "ulineservers", "", new ValueContainerChar(&UlineServers), DT_CHARPTR, NoValidation},
{"options", "enablelogchannel", "no", new ValueContainerBool(&LogChan), DT_BOOLEAN, NoValidation},
+ {"options", "mlock", "+nrt", new ValueContainerString(&Config.MLock), DT_STRING, NoValidation},
{"nickserv", "nick", "NickServ", new ValueContainerChar(&Config.s_NickServ), DT_CHARPTR | DT_NORELOAD, ValidateNotEmpty},
{"nickserv", "description", "Nickname Registration Service", new ValueContainerChar(&Config.desc_NickServ), DT_CHARPTR | DT_NORELOAD, ValidateNotEmpty},
{"nickserv", "database", "nick.db", new ValueContainerChar(&Config.NickDBName), DT_CHARPTR, ValidateNotEmpty},
@@ -1786,6 +1787,8 @@ int read_config(int reload)
Config.NSRExpire = 0;
}
+ SetDefaultMLock();
+
if (!retval) {
printf
("\n*** Support resources: Read through the services.conf self-contained \n*** documentation. Read the documentation files found in the 'docs' \n*** folder. Visit our portal located at http://www.anope.org/. Join \n*** our support channel on /server irc.anope.org channel #anope.\n\n");
diff --git a/src/modes.cpp b/src/modes.cpp
index 7094b79b1..e43596620 100644
--- a/src/modes.cpp
+++ b/src/modes.cpp
@@ -22,6 +22,60 @@ std::map<ChannelModeName, ChannelMode *> ModeManager::ChannelModesByName;
* efficiency.
*/
+/* Default mlocked modes on */
+std::bitset<128> DefMLockOn;
+/* Default mlocked modes off */
+std::bitset<128> DefMLockOff;
+/* Map for default mlocked mode parameters */
+std::map<ChannelModeName, std::string> DefMLockParams;
+
+/** Parse the mode string from the config file and set the default mlocked modes
+ */
+void SetDefaultMLock()
+{
+ DefMLockOn.reset();
+ DefMLockOff.reset();
+ DefMLockParams.clear();
+ std::bitset<128> *ptr = NULL;
+
+ std::string modes, param;
+ spacesepstream sep(Config.MLock);
+ sep.GetToken(modes);
+
+ for (unsigned i = 0; i < modes.size(); ++i)
+ {
+ if (modes[i] == '+')
+ ptr = &DefMLockOn;
+ else if (modes[i] == '-')
+ ptr = &DefMLockOff;
+ else
+ {
+ if (!ptr)
+ continue;
+
+ ChannelMode *cm = ModeManager::FindChannelModeByChar(modes[i]);
+
+ if (cm && (cm->Type == MODE_REGULAR || cm->Type == MODE_PARAM))
+ {
+ ptr->set(cm->Name);
+
+ if (*ptr == DefMLockOn && cm->Type == MODE_PARAM)
+ {
+ if (sep.GetToken(param))
+ {
+ DefMLockParams.insert(std::make_pair(cm->Name, param));
+ }
+ else
+ {
+ alog("Warning: Got default mlock mode %c with no param?", cm->ModeChar);
+ ptr->set(cm->Name, false);
+ }
+ }
+ }
+ }
+ }
+}
+
/** Add a user mode to Anope
* @param Mode The mode
* @param um A UserMode or UserMode derived class
@@ -56,6 +110,9 @@ bool ModeManager::AddChannelMode(char Mode, ChannelMode *cm)
if (ret)
{
+ /* Apply this mode to the new default mlock if its used */
+ SetDefaultMLock();
+
FOREACH_MOD(I_OnChannelModeAdd, OnChannelModeAdd(cm));
}
diff --git a/src/protocol/bahamut.c b/src/protocol/bahamut.c
index c14eb945f..c3ff0747c 100644
--- a/src/protocol/bahamut.c
+++ b/src/protocol/bahamut.c
@@ -44,7 +44,6 @@ IRCDVar myIrcd[] = {
1, /* UMODE */
0, /* VHOST ON NICK */
0, /* Change RealName */
- 0,
1,
1, /* No Knock requires +i */
NULL, /* CAPAB Chan Modes */
@@ -765,10 +764,6 @@ class ProtoBahamut : public Module
moduleAddModes();
- ircd->DefMLock[CMODE_NOEXTERNAL] = true;
- ircd->DefMLock[CMODE_TOPIC] = true;
- ircd->DefMLock[CMODE_REGISTERED] = true;
-
pmodule_ircd_proto(&ircd_proto);
moduleAddIRCDMsgs();
diff --git a/src/protocol/inspircd11.c b/src/protocol/inspircd11.c
index 722d8668d..6c2b22c2b 100644
--- a/src/protocol/inspircd11.c
+++ b/src/protocol/inspircd11.c
@@ -62,7 +62,6 @@ IRCDVar myIrcd[] = {
1, /* VHOST ON NICK */
0, /* Change RealName */
0,
- 0,
1, /* No Knock requires +i */
NULL, /* CAPAB Chan Modes */
0, /* We support inspircd TOKENS */
@@ -1108,10 +1107,6 @@ class ProtoInspIRCd : public Module
moduleAddModes();
- ircd->DefMLock[CMODE_NOEXTERNAL] = true;
- ircd->DefMLock[CMODE_TOPIC] = true;
- ircd->DefMLock[CMODE_REGISTERED] = true;
-
pmodule_ircd_proto(&ircd_proto);
moduleAddIRCDMsgs();
diff --git a/src/protocol/inspircd12.cpp b/src/protocol/inspircd12.cpp
index 78216d1c8..da04bddb4 100644
--- a/src/protocol/inspircd12.cpp
+++ b/src/protocol/inspircd12.cpp
@@ -62,7 +62,6 @@ IRCDVar myIrcd[] = {
1, /* VHOST ON NICK */
0, /* Change RealName */
0,
- 0,
1, /* No Knock requires +i */
NULL, /* CAPAB Chan Modes */
0, /* We support inspircd TOKENS */
@@ -1296,10 +1295,6 @@ class ProtoInspIRCd : public Module
moduleAddModes();
- ircd->DefMLock[CMODE_NOEXTERNAL] = true;
- ircd->DefMLock[CMODE_TOPIC] = true;
- ircd->DefMLock[CMODE_REGISTERED] = true;
-
pmodule_ircd_proto(&ircd_proto);
moduleAddIRCDMsgs();
}
diff --git a/src/protocol/ratbox.c b/src/protocol/ratbox.c
index 1af8e3a4a..73820de7e 100644
--- a/src/protocol/ratbox.c
+++ b/src/protocol/ratbox.c
@@ -42,7 +42,6 @@ IRCDVar myIrcd[] = {
0, /* O:LINE */
0, /* VHOST ON NICK */
0, /* Change RealName */
- 0,
0, /* On nick change check if they could be identified */
0, /* No Knock requires +i */
NULL, /* CAPAB Chan Modes */
@@ -899,9 +898,6 @@ class ProtoRatbox : public Module
moduleAddModes();
- ircd->DefMLock[CMODE_NOEXTERNAL] = true;
- ircd->DefMLock[CMODE_TOPIC] = true;
-
pmodule_ircd_proto(&ircd_proto);
moduleAddIRCDMsgs();
diff --git a/src/protocol/unreal32.c b/src/protocol/unreal32.c
index b4a86525c..bf619d27d 100644
--- a/src/protocol/unreal32.c
+++ b/src/protocol/unreal32.c
@@ -44,7 +44,6 @@ IRCDVar myIrcd[] = {
1, /* UMODE */
1, /* VHOST ON NICK */
1, /* Change RealName */
- 0,
0, /* On nick change check if they could be identified */
1, /* No Knock requires +i */
NULL, /* CAPAB Chan Modes */
@@ -1235,10 +1234,6 @@ class ProtoUnreal : public Module
moduleAddModes();
- ircd->DefMLock[CMODE_NOEXTERNAL] = true;
- ircd->DefMLock[CMODE_TOPIC] = true;
- ircd->DefMLock[CMODE_REGISTERED] = true;
-
pmodule_ircd_proto(&ircd_proto);
moduleAddIRCDMsgs();
diff --git a/src/regchannel.cpp b/src/regchannel.cpp
index 993000b38..07bdc1c15 100644
--- a/src/regchannel.cpp
+++ b/src/regchannel.cpp
@@ -39,7 +39,11 @@ ChannelInfo::ChannelInfo(const std::string &chname)
/* If ircd doesn't exist, this is from DB load and mlock is set later */
if (ircd)
- mlock_on = ircd->DefMLock;
+ {
+ mlock_on = DefMLockOn;
+ mlock_off = DefMLockOff;
+ Params = DefMLockParams;
+ }
size_t t;
/* Set default channel flags */