diff options
| author | 2023-03-24 11:22:09 +0000 | |
|---|---|---|
| committer | 2023-03-24 12:01:03 +0000 | |
| commit | 054fd8de79ea8b8b9b198e9511df990aea7bd9ff (patch) | |
| tree | bb93e5a4c8af4df379cba3884f0a556071d04684 /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.cpp | 2 | ||||
| -rw-r--r-- | src/modules.cpp | 2 | ||||
| -rw-r--r-- | src/modules/m_account.cpp | 2 | ||||
| -rw-r--r-- | src/modules/m_dnsbl.cpp | 2 | ||||
| -rw-r--r-- | src/modules/m_gateway.cpp | 2 | ||||
| -rw-r--r-- | src/modules/m_geoclass.cpp | 2 | ||||
| -rw-r--r-- | src/modules/m_ident.cpp | 2 | ||||
| -rw-r--r-- | src/modules/m_sslinfo.cpp | 2 | ||||
| -rw-r--r-- | src/users.cpp | 6 |
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; } |
