aboutsummaryrefslogtreecommitdiffstats
path: root/modules/spanningtree/capab.cpp
diff options
context:
space:
mode:
authorGravatar Sadie Powell2024-08-17 00:08:52 +0100
committerGravatar Sadie Powell2024-08-17 00:13:17 +0100
commit6c12543edc50cf9c1ae978438253d46d79eac96e (patch)
tree6efb05bd81bd06f596facafdc9b832505959b912 /modules/spanningtree/capab.cpp
parentDrop the protocol version from module capab functions. (diff)
Refactor "CAPAB CAPABILITIES" code.
Diffstat (limited to 'modules/spanningtree/capab.cpp')
-rw-r--r--modules/spanningtree/capab.cpp69
1 files changed, 38 insertions, 31 deletions
diff --git a/modules/spanningtree/capab.cpp b/modules/spanningtree/capab.cpp
index 4f29f4d4d..2be02e29a 100644
--- a/modules/spanningtree/capab.cpp
+++ b/modules/spanningtree/capab.cpp
@@ -163,6 +163,43 @@ namespace
return okay;
}
+ // Generates a capability list in the format "FOO=BAR BAZ=BAX".
+ std::string FormatCapabilities(TreeSocket* ts)
+ {
+ std::unordered_map<std::string, std::string> capabilities = {
+ { "CASEMAPPING", ServerInstance->Config->CaseMapping },
+ { "MAXAWAY", ConvToStr(ServerInstance->Config->Limits.MaxAway) },
+ { "MAXCHANNEL", ConvToStr(ServerInstance->Config->Limits.MaxChannel) },
+ { "MAXHOST", ConvToStr(ServerInstance->Config->Limits.MaxHost) },
+ { "MAXKICK", ConvToStr(ServerInstance->Config->Limits.MaxKick) },
+ { "MAXLINE", ConvToStr(ServerInstance->Config->Limits.MaxLine) },
+ { "MAXMODES", ConvToStr(ServerInstance->Config->Limits.MaxModes) },
+ { "MAXNICK", ConvToStr(ServerInstance->Config->Limits.MaxNick) },
+ { "MAXQUIT", ConvToStr(ServerInstance->Config->Limits.MaxQuit) },
+ { "MAXREAL", ConvToStr(ServerInstance->Config->Limits.MaxReal) },
+ { "MAXTOPIC", ConvToStr(ServerInstance->Config->Limits.MaxTopic) },
+ { "MAXUSER", ConvToStr(ServerInstance->Config->Limits.MaxUser) },
+ };
+
+ // If SHA256 hashing support is available then send a challenge token.
+ if (ServerInstance->Modules.FindService(SERVICE_DATA, "hash/sha256"))
+ {
+ ts->SetOurChallenge(ServerInstance->GenRandomStr(20));
+ capabilities["CHALLENGE"] = ts->GetOurChallenge();
+ }
+
+ auto first = true;
+ std::stringstream capabilitystr;
+ for (const auto& [capkey, capvalue] : capabilities)
+ {
+ if (!first)
+ capabilitystr << ' ';
+ capabilitystr << capkey << '=' << capvalue;
+ first = false;
+ }
+ return capabilitystr.str();
+ }
+
// Generates a module list in the format "m_foo.so=bar m_bar.so=baz".
std::string FormatModules(ModuleFlags property)
{
@@ -265,46 +302,16 @@ void TreeSocket::SendCapabilities(int phase)
if (phase < 2)
return;
+ WriteLine("CAPAB CAPABILITIES :" + FormatCapabilities(this));
WriteLine("CAPAB MODULES :" + FormatModules(VF_COMMON));
WriteLine("CAPAB MODSUPPORT :" + FormatModules(VF_OPTCOMMON));
WriteLine("CAPAB CHANMODES :" + BuildModeList(MODETYPE_CHANNEL));
WriteLine("CAPAB USERMODES :" + BuildModeList(MODETYPE_USER));
- std::unordered_map<std::string, std::string> capabilities = {
- { "CASEMAPPING", ServerInstance->Config->CaseMapping },
- { "MAXAWAY", ConvToStr(ServerInstance->Config->Limits.MaxAway) },
- { "MAXCHANNEL", ConvToStr(ServerInstance->Config->Limits.MaxChannel) },
- { "MAXHOST", ConvToStr(ServerInstance->Config->Limits.MaxHost) },
- { "MAXKICK", ConvToStr(ServerInstance->Config->Limits.MaxKick) },
- { "MAXLINE", ConvToStr(ServerInstance->Config->Limits.MaxLine) },
- { "MAXMODES", ConvToStr(ServerInstance->Config->Limits.MaxModes) },
- { "MAXNICK", ConvToStr(ServerInstance->Config->Limits.MaxNick) },
- { "MAXQUIT", ConvToStr(ServerInstance->Config->Limits.MaxQuit) },
- { "MAXREAL", ConvToStr(ServerInstance->Config->Limits.MaxReal) },
- { "MAXTOPIC", ConvToStr(ServerInstance->Config->Limits.MaxTopic) },
- { "MAXUSER", ConvToStr(ServerInstance->Config->Limits.MaxUser) },
- };
-
std::string extbans;
if (BuildExtBanList(extbans))
WriteLine("CAPAB EXTBANS :" + extbans);
- // If SHA256 hashing support is available then send a challenge token.
- if (ServerInstance->Modules.FindService(SERVICE_DATA, "hash/sha256"))
- {
- SetOurChallenge(ServerInstance->GenRandomStr(20));
- capabilities["CHALLENGE"] = GetOurChallenge();
- }
-
- std::stringstream capabilitystr;
- char separator = ':';
- for (const auto& [capkey, capvalue] : capabilities)
- {
- capabilitystr << separator << capkey << '=' << capvalue;
- separator = ' ';
- }
-
- this->WriteLine("CAPAB CAPABILITIES " + capabilitystr.str());
this->WriteLine("CAPAB END");
}