diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/config.c | 3 | ||||
-rw-r--r-- | src/modes.cpp | 57 | ||||
-rw-r--r-- | src/protocol/bahamut.c | 5 | ||||
-rw-r--r-- | src/protocol/inspircd11.c | 5 | ||||
-rw-r--r-- | src/protocol/inspircd12.cpp | 5 | ||||
-rw-r--r-- | src/protocol/ratbox.c | 4 | ||||
-rw-r--r-- | src/protocol/unreal32.c | 5 | ||||
-rw-r--r-- | src/regchannel.cpp | 6 |
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 */ |