From 2688cfbad5e121945f61e0f5f023c904a19c7009 Mon Sep 17 00:00:00 2001 From: Sadie Powell Date: Tue, 1 Jun 2021 01:33:10 +0100 Subject: [PATCH] Refactor the sslqueries mode handler. This fixes a rare desync where a server with the sslmodes module but without the sslinfo module could desync when a remote user on a server with both enables the sslqueries mode. --- src/modules/m_sslmodes.cpp | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/src/modules/m_sslmodes.cpp b/src/modules/m_sslmodes.cpp index bc5cb5675..fda90c3d8 100644 --- a/src/modules/m_sslmodes.cpp +++ b/src/modules/m_sslmodes.cpp @@ -34,6 +34,8 @@ enum { // From UnrealIRCd. ERR_SECUREONLYCHAN = 489, + + // InspIRCd-specific. ERR_ALLMUSTSSL = 490 }; @@ -120,27 +122,14 @@ class SSLModeUser : public ModeHandler ModeAction OnModeChange(User* user, User* dest, Channel* channel, std::string& parameter, bool adding) CXX11_OVERRIDE { - if (adding) - { - if (!dest->IsModeSet(this)) - { - if (!API || !API->GetCertificate(user)) - return MODEACTION_DENY; + if (adding == dest->IsModeSet(this)) + return MODEACTION_DENY; - dest->SetMode(this, true); - return MODEACTION_ALLOW; - } - } - else - { - if (dest->IsModeSet(this)) - { - dest->SetMode(this, false); - return MODEACTION_ALLOW; - } - } + if (adding && IS_LOCAL(user) && (!API || !API->GetCertificate(user))) + return MODEACTION_DENY; - return MODEACTION_DENY; + dest->SetMode(this, adding); + return MODEACTION_ALLOW; } }; -- 2.39.2