From cbdcd051c63c4ff98dfb4ff45388e722f8d0a2de Mon Sep 17 00:00:00 2001 From: Sadie Powell Date: Fri, 27 Mar 2026 13:10:26 +0000 Subject: Switch the extensible system to using shared pointers. --- modules/sslinfo.cpp | 67 +++++++++++++---------------------------------------- 1 file changed, 16 insertions(+), 51 deletions(-) (limited to 'modules/sslinfo.cpp') diff --git a/modules/sslinfo.cpp b/modules/sslinfo.cpp index 6916707bf..f1c26baa2 100644 --- a/modules/sslinfo.cpp +++ b/modules/sslinfo.cpp @@ -38,35 +38,14 @@ #include "timeutils.h" class SSLCertExt final - : public ExtensionItem + : public SimpleExtItem { public: - SSLCertExt(Module* parent) - : ExtensionItem(parent, "ssl_cert", ExtensionType::USER) + SSLCertExt(Module* mod) + : SimpleExtItem(mod, "ssl_cert", ExtensionType::USER) { } - ssl_cert* Get(const User* user) const - { - return static_cast(GetRaw(user)); - } - - void Set(User* user, ssl_cert* value, bool sync = true) - { - value->refcount_inc(); - ssl_cert* old = static_cast(SetRaw(user, value)); - if (old && old->refcount_dec()) - delete old; - - if (sync) - Sync(user, value); - } - - void Unset(User* user) - { - Delete(user, UnsetRaw(user)); - } - static std::string GetFlags(const ssl_cert* cert) { std::string ret; @@ -78,16 +57,12 @@ public: return ret; } - std::string ToInternal(const Extensible* container, void* item) const noexcept override + std::string ToInternal(const Extensible* container, const ExtensionPtr& item) const noexcept override { - return ToNetwork(container, item); - } + const auto& cert = std::static_pointer_cast(item); - std::string ToNetwork(const Extensible* container, void* item) const noexcept override - { - const ssl_cert* cert = static_cast(item); std::stringstream value; - value << GetFlags(cert) << " "; + value << GetFlags(cert.get()) << " "; if (cert->GetError().empty()) value << insp::join(cert->GetFingerprints(), ',') << " " << cert->GetDN() << " " << cert->GetIssuer(); @@ -98,17 +73,12 @@ public: } void FromInternal(Extensible* container, const std::string& value) noexcept override - { - FromNetwork(container, value); - } - - void FromNetwork(Extensible* container, const std::string& value) noexcept override { if (container->extype != this->extype) return; - auto* cert = new ssl_cert(); - Set(static_cast(container), cert, false); + auto cert = std::make_shared(); + Set(container, cert, false); std::stringstream s(value); std::string v; @@ -134,13 +104,6 @@ public: getline(s, cert->issuer, '\n'); } } - - void Delete(Extensible* container, void* item) override - { - ssl_cert* old = static_cast(item); - if (old && old->refcount_dec()) - delete old; - } }; class UserCertificateAPIImpl final @@ -172,11 +135,13 @@ public: if (!ssliohook) return nullptr; - cert = ssliohook->GetCertificate(); - if (!cert) - return nullptr; + auto newcert = ssliohook->GetCertificate(); + if (newcert) + { + SetCertificate(user, newcert); + cert = newcert.get(); + } - SetCertificate(user, cert); return cert; } @@ -192,7 +157,7 @@ public: return false; } - void SetCertificate(User* user, ssl_cert* cert) override + void SetCertificate(User* user, const std::shared_ptr& cert) override { ServerInstance->Logs.Debug(MODNAME, "Setting TLS client certificate for {}: {}", user->GetMask(), sslext.ToNetwork(user, cert)); @@ -557,7 +522,7 @@ public: } // Create a fake ssl_cert for the user. - auto* cert = new ssl_cert(); + auto cert = std::make_shared(); cert->dn = "(unknown)"; cert->invalid = false; cert->issuer = "(unknown)"; -- cgit v1.3.1-10-gc9f91