aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGravatar Sadie Powell2023-03-24 11:22:09 +0000
committerGravatar Sadie Powell2023-03-24 12:01:03 +0000
commit054fd8de79ea8b8b9b198e9511df990aea7bd9ff (patch)
treebb93e5a4c8af4df379cba3884f0a556071d04684 /src
parent[workflow] Fix misspell-fixer exceptions. (diff)
Allow modules to provide an error for when a class doesn't match.
Diffstat (limited to 'src')
-rw-r--r--src/coremods/core_user/core_user.cpp2
-rw-r--r--src/modules.cpp2
-rw-r--r--src/modules/m_account.cpp2
-rw-r--r--src/modules/m_dnsbl.cpp2
-rw-r--r--src/modules/m_gateway.cpp2
-rw-r--r--src/modules/m_geoclass.cpp2
-rw-r--r--src/modules/m_ident.cpp2
-rw-r--r--src/modules/m_sslinfo.cpp2
-rw-r--r--src/users.cpp6
9 files changed, 13 insertions, 9 deletions
diff --git a/src/coremods/core_user/core_user.cpp b/src/coremods/core_user/core_user.cpp
index d354494c3..426a4e27f 100644
--- a/src/coremods/core_user/core_user.cpp
+++ b/src/coremods/core_user/core_user.cpp
@@ -168,7 +168,7 @@ public:
{
}
- ModResult OnPreChangeConnectClass(LocalUser* user, const std::shared_ptr<ConnectClass>& klass) override
+ ModResult OnPreChangeConnectClass(LocalUser* user, const std::shared_ptr<ConnectClass>& klass, std::optional<Numeric::Numeric>& errnum) override
{
bool conndone = user->connected != User::CONN_NONE;
if (klass->config->getBool("connected", klass->config->getBool("registered", conndone)) != conndone)
diff --git a/src/modules.cpp b/src/modules.cpp
index 13ff2d9c9..d3d6dc18d 100644
--- a/src/modules.cpp
+++ b/src/modules.cpp
@@ -165,7 +165,7 @@ void Module::OnOperLogin(User*, const std::shared_ptr<OperAccount>&, bool) { De
void Module::OnPostOperLogin(User*, bool) { DetachEvent(I_OnPostOperLogin); }
void Module::OnOperLogout(User*) { DetachEvent(I_OnOperLogout); }
void Module::OnPostOperLogout(User*, const std::shared_ptr<OperAccount>&) { DetachEvent(I_OnPostOperLogout); }
-ModResult Module::OnPreChangeConnectClass(LocalUser*, const std::shared_ptr<ConnectClass>&) { DetachEvent(I_OnPreChangeConnectClass); return MOD_RES_PASSTHRU; }
+ModResult Module::OnPreChangeConnectClass(LocalUser*, const std::shared_ptr<ConnectClass>&, std::optional<Numeric::Numeric>&) { DetachEvent(I_OnPreChangeConnectClass); return MOD_RES_PASSTHRU; }
void Module::OnChangeConnectClass(LocalUser*, const std::shared_ptr<ConnectClass>&, bool) { DetachEvent(I_OnChangeConnectClass); }
void Module::OnPostChangeConnectClass(LocalUser*, bool) { DetachEvent(I_OnPostChangeConnectClass); }
diff --git a/src/modules/m_account.cpp b/src/modules/m_account.cpp
index b33d98c14..38b3ec6b2 100644
--- a/src/modules/m_account.cpp
+++ b/src/modules/m_account.cpp
@@ -324,7 +324,7 @@ public:
return MOD_RES_DENY; // Account required but it does not match.
}
- ModResult OnPreChangeConnectClass(LocalUser* user, const std::shared_ptr<ConnectClass>& klass) override
+ ModResult OnPreChangeConnectClass(LocalUser* user, const std::shared_ptr<ConnectClass>& klass, std::optional<Numeric::Numeric>& errnum) override
{
const char* error = nullptr;
if (stdalgo::string::equalsci(klass->config->getString("requireaccount"), "nick"))
diff --git a/src/modules/m_dnsbl.cpp b/src/modules/m_dnsbl.cpp
index 3d6a5074e..fb215c1b4 100644
--- a/src/modules/m_dnsbl.cpp
+++ b/src/modules/m_dnsbl.cpp
@@ -505,7 +505,7 @@ public:
}
}
- ModResult OnPreChangeConnectClass(LocalUser* user, const std::shared_ptr<ConnectClass>& klass) override
+ ModResult OnPreChangeConnectClass(LocalUser* user, const std::shared_ptr<ConnectClass>& klass, std::optional<Numeric::Numeric>& errnum) override
{
const std::string dnsbl = klass->config->getString("dnsbl");
if (!dnsbl.empty())
diff --git a/src/modules/m_gateway.cpp b/src/modules/m_gateway.cpp
index af776d816..370c06337 100644
--- a/src/modules/m_gateway.cpp
+++ b/src/modules/m_gateway.cpp
@@ -406,7 +406,7 @@ public:
cmdwebirc.hosts.swap(webirchosts);
}
- ModResult OnPreChangeConnectClass(LocalUser* user, const std::shared_ptr<ConnectClass>& klass) override
+ ModResult OnPreChangeConnectClass(LocalUser* user, const std::shared_ptr<ConnectClass>& klass, std::optional<Numeric::Numeric>& errnum) override
{
// If <connect:webirc> is not set then we have nothing to do.
const std::string webirc = klass->config->getString("webirc");
diff --git a/src/modules/m_geoclass.cpp b/src/modules/m_geoclass.cpp
index f9de87033..e229d475c 100644
--- a/src/modules/m_geoclass.cpp
+++ b/src/modules/m_geoclass.cpp
@@ -36,7 +36,7 @@ public:
{
}
- ModResult OnPreChangeConnectClass(LocalUser* user, const std::shared_ptr<ConnectClass>& klass) override
+ ModResult OnPreChangeConnectClass(LocalUser* user, const std::shared_ptr<ConnectClass>& klass, std::optional<Numeric::Numeric>& errnum) override
{
const std::string country = klass->config->getString("country");
if (country.empty())
diff --git a/src/modules/m_ident.cpp b/src/modules/m_ident.cpp
index e08482d13..4e324d87c 100644
--- a/src/modules/m_ident.cpp
+++ b/src/modules/m_ident.cpp
@@ -403,7 +403,7 @@ public:
return MOD_RES_PASSTHRU;
}
- ModResult OnPreChangeConnectClass(LocalUser* user, const std::shared_ptr<ConnectClass>& klass) override
+ ModResult OnPreChangeConnectClass(LocalUser* user, const std::shared_ptr<ConnectClass>& klass, std::optional<Numeric::Numeric>& errnum) override
{
if (klass->config->getBool("requireident") && state.Get(user) != IDENT_FOUND)
{
diff --git a/src/modules/m_sslinfo.cpp b/src/modules/m_sslinfo.cpp
index 2531c5201..046481754 100644
--- a/src/modules/m_sslinfo.cpp
+++ b/src/modules/m_sslinfo.cpp
@@ -400,7 +400,7 @@ public:
user->WriteNotice(text);
}
- ModResult OnPreChangeConnectClass(LocalUser* user, const std::shared_ptr<ConnectClass>& klass) override
+ ModResult OnPreChangeConnectClass(LocalUser* user, const std::shared_ptr<ConnectClass>& klass, std::optional<Numeric::Numeric>& errnum) override
{
ssl_cert* cert = cmd.sslapi.GetCertificate(user);
const char* error = nullptr;
diff --git a/src/users.cpp b/src/users.cpp
index 84ad1240f..646949b5a 100644
--- a/src/users.cpp
+++ b/src/users.cpp
@@ -660,6 +660,7 @@ bool LocalUser::FindConnectClass()
ServerInstance->Logs.Debug("CONNECTCLASS", "Finding a connect class for {} ({}) ...",
uuid, GetRealMask());
+ std::optional<Numeric::Numeric> errnum;
for (const auto& klass : ServerInstance->Config->Classes)
{
ServerInstance->Logs.Debug("CONNECTCLASS", "Checking the {} connect class ...",
@@ -674,7 +675,7 @@ bool LocalUser::FindConnectClass()
}
ModResult modres;
- FIRST_MOD_RESULT(OnPreChangeConnectClass, modres, (this, klass));
+ FIRST_MOD_RESULT(OnPreChangeConnectClass, modres, (this, klass, errnum));
if (modres != MOD_RES_DENY)
{
ServerInstance->Logs.Debug("CONNECTCLASS", "The {} connect class is suitable for {} ({}).",
@@ -691,6 +692,9 @@ bool LocalUser::FindConnectClass()
connectclass->use_count--;
connectclass = nullptr;
}
+
+ if (errnum)
+ WriteNumeric(*errnum);
ServerInstance->Users.QuitUser(this, "You are not allowed to connect to this server");
return false;
}