diff options
author | Sadie Powell <sadie@witchery.services> | 2024-01-10 17:47:27 +0000 |
---|---|---|
committer | Sadie Powell <sadie@witchery.services> | 2024-01-10 17:47:27 +0000 |
commit | 4056af00e3a433fb0b255eecd844a7ed2614a917 (patch) | |
tree | 18e8874cff49b7a960e3301bba2c7447869403e1 | |
parent | 99b4305573fae56c6b774ed5c86af224c5f1e9b7 (diff) |
Parse InspIRCd module names in a way which is 1206 compatible.
-rw-r--r-- | modules/protocol/inspircd.cpp | 66 |
1 files changed, 40 insertions, 26 deletions
diff --git a/modules/protocol/inspircd.cpp b/modules/protocol/inspircd.cpp index 0029d37bb..ef5e22e71 100644 --- a/modules/protocol/inspircd.cpp +++ b/modules/protocol/inspircd.cpp @@ -26,6 +26,24 @@ static std::list<SASLUser> saslusers; static Anope::string rsquit_server, rsquit_id; +static void ParseModule(const Anope::string &module, Anope::string &modname, Anope::string &moddata) +{ + size_t sep = module.find('='); + + // Extract and clean up the module name. + modname = module.substr(0, sep); + if (modname.compare(0, 2, "m_", 2) == 0) + modname.erase(0, 2); + + if (modname.length() > 3 && modname.compare(modname.length() - 3, 3, ".so", 3) == 0) + modname.erase(modname.length() - 3); + + // Extract the module link data (if any). + moddata = sep == Anope::string::npos ? "" : module.substr(sep); + + Log(LOG_DEBUG) << "Parsed module: " << "name=" << modname << " data=" << moddata; +} + class InspIRCdProto : public IRCDProto { private: @@ -1119,14 +1137,17 @@ struct IRCDMessageCapab : Message::Capab ModeManager::AddUserMode(um); } } - else if (params[0].equals_cs("MODULES") && params.size() > 1) + else if ((params[0].equals_cs("MODULES") || params[0].equals_cs("MODSUPPORT")) && params.size() > 1) { spacesepstream ssep(params[1]); Anope::string module; while (ssep.GetToken(module)) { - if (module.equals_cs("m_svshold.so")) + Anope::string modname, moddata; + ParseModule(module, modname, moddata); + + if (modname.equals_cs("svshold")) IRCD->CanSVSHold = true; else if (module.find("m_rline.so") == 0) { @@ -1135,28 +1156,19 @@ struct IRCDMessageCapab : Message::Capab if (!regexengine.empty() && module.length() > 11 && regexengine != module.substr(11)) Log() << "Warning: InspIRCd is using regex engine " << module.substr(11) << ", but we have " << regexengine << ". This may cause inconsistencies."; } - else if (module.equals_cs("m_topiclock.so")) + else if (modname.equals_cs("topiclock")) Servers::Capab.insert("TOPICLOCK"); - else if (module.equals_cs("m_cban.so=glob")) + else if (module.equals_cs("cban" && moddata.equals_cs("glob"))) IRCD->CanSQLineChannel = true; - } - } - else if (params[0].equals_cs("MODSUPPORT") && params.size() > 1) - { - spacesepstream ssep(params[1]); - Anope::string module; - - while (ssep.GetToken(module)) - { - if (module.equals_cs("m_services_account.so")) + else if (modname.equals_cs("services_account")) { Servers::Capab.insert("SERVICES"); ModeManager::AddChannelMode(new InspIRCdExtban::AccountMatcher("ACCOUNTBAN", "BAN", 'R')); ModeManager::AddChannelMode(new InspIRCdExtban::UnidentifiedMatcher("UNREGISTEREDBAN", "BAN", 'U')); } - else if (module.equals_cs("m_chghost.so")) + else if (modname.equals_cs("chghost")) Servers::Capab.insert("CHGHOST"); - else if (module.equals_cs("m_chgident.so")) + else if (modname.equals_cs("chgident")) Servers::Capab.insert("CHGIDENT"); else if (module == "m_channelban.so") ModeManager::AddChannelMode(new InspIRCdExtban::ChannelMatcher("CHANNELBAN", "BAN", 'j')); @@ -1455,21 +1467,23 @@ public: return; bool required = false; - Anope::string capab, module = params[2].substr(1); + Anope::string capab, modname, moddata; + ParseModule(params[2].substr(1), modname, moddata); + - if (module.equals_cs("m_services_account.so")) + if (modname.equals_cs("services_account")) required = true; - else if (module.equals_cs("m_hidechans.so")) + else if (modname.equals_cs("hidechans")) required = true; - else if (module.equals_cs("m_chghost.so")) + else if (modname.equals_cs("chghost")) capab = "CHGHOST"; - else if (module.equals_cs("m_chgident.so")) + else if (modname.equals_cs("chgident")) capab = "CHGIDENT"; - else if (module.equals_cs("m_svshold.so")) + else if (modname.equals_cs("svshold")) capab = "SVSHOLD"; - else if (module.equals_cs("m_rline.so")) + else if (modname.equals_cs("rline")) capab = "RLINE"; - else if (module.equals_cs("m_topiclock.so")) + else if (modname.equals_cs("topiclock")) capab = "TOPICLOCK"; else return; @@ -1477,7 +1491,7 @@ public: if (required) { if (!plus) - Log() << "Warning: InspIRCd unloaded module " << module << ", Anope won't function correctly without it"; + Log() << "Warning: InspIRCd unloaded module " << modname << ", Anope won't function correctly without it"; } else { @@ -1486,7 +1500,7 @@ public: else Servers::Capab.erase(capab); - Log() << "InspIRCd " << (plus ? "loaded" : "unloaded") << " module " << module << ", adjusted functionality"; + Log() << "InspIRCd " << (plus ? "loaded" : "unloaded") << " module " << modname << ", adjusted functionality"; } } |