]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_sslinfo.cpp
Import the anticaps module from inspircd-extras.
[user/henk/code/inspircd.git] / src / modules / m_sslinfo.cpp
index 9682e92cfce2c43ccd5f26d904baf85b3016cb08..76fc6ebf062ded015ddaf00f9f2480a73e72b7ac 100644 (file)
 #include "inspircd.h"
 #include "modules/ssl.h"
 
+enum
+{
+       // From oftc-hybrid.
+       RPL_WHOISCERTFP = 276,
+
+       // From UnrealIRCd.
+       RPL_WHOISSECURE = 671
+};
+
 class SSLCertExt : public ExtensionItem {
  public:
        SSLCertExt(Module* parent)
@@ -39,12 +48,12 @@ class SSLCertExt : public ExtensionItem {
                        delete old;
        }
 
-       std::string serialize(SerializeFormat format, const Extensible* container, void* item) const
+       std::string serialize(SerializeFormat format, const Extensible* container, void* item) const CXX11_OVERRIDE
        {
                return static_cast<ssl_cert*>(item)->GetMetaLine();
        }
 
-       void unserialize(SerializeFormat format, Extensible* container, const std::string& value)
+       void unserialize(SerializeFormat format, Extensible* container, const std::string& value) CXX11_OVERRIDE
        {
                ssl_cert* cert = new ssl_cert;
                set(container, cert);
@@ -69,7 +78,7 @@ class SSLCertExt : public ExtensionItem {
                }
        }
 
-       void free(void* item)
+       void free(void* item) CXX11_OVERRIDE
        {
                ssl_cert* old = static_cast<ssl_cert*>(item);
                if (old && old->refcount_dec())
@@ -89,7 +98,7 @@ class CommandSSLInfo : public Command
                this->syntax = "<nick>";
        }
 
-       CmdResult Handle (const std::vector<std::string> &parameters, User *user)
+       CmdResult Handle(const std::vector<std::string>& parameters, User* user) CXX11_OVERRIDE
        {
                User* target = ServerInstance->FindNickOnly(parameters[0]);
 
@@ -162,10 +171,10 @@ class ModuleSSLInfo : public Module, public Whois::EventListener
                ssl_cert* cert = cmd.CertExt.get(whois.GetTarget());
                if (cert)
                {
-                       whois.SendLine(671, "is using a secure connection");
+                       whois.SendLine(RPL_WHOISSECURE, "is using a secure connection");
                        bool operonlyfp = ServerInstance->Config->ConfValue("sslinfo")->getBool("operonly");
                        if ((!operonlyfp || whois.IsSelfWhois() || whois.GetSource()->IsOper()) && !cert->fingerprint.empty())
-                               whois.SendLine(276, InspIRCd::Format("has client certificate fingerprint %s", cert->fingerprint.c_str()));
+                               whois.SendLine(RPL_WHOISCERTFP, InspIRCd::Format("has client certificate fingerprint %s", cert->fingerprint.c_str()));
                }
        }
 
@@ -181,7 +190,7 @@ class ModuleSSLInfo : public Module, public Whois::EventListener
 
                                if (ifo->oper_block->getBool("sslonly") && !cert)
                                {
-                                       user->WriteNumeric(491, "This oper login requires an SSL connection.");
+                                       user->WriteNumeric(ERR_NOOPERHOST, "This oper login requires an SSL connection.");
                                        user->CommandFloodPenalty += 10000;
                                        return MOD_RES_DENY;
                                }
@@ -189,7 +198,7 @@ class ModuleSSLInfo : public Module, public Whois::EventListener
                                std::string fingerprint;
                                if (ifo->oper_block->readString("fingerprint", fingerprint) && (!cert || cert->GetFingerprint() != fingerprint))
                                {
-                                       user->WriteNumeric(491, "This oper login requires a matching SSL certificate fingerprint.");
+                                       user->WriteNumeric(ERR_NOOPERHOST, "This oper login requires a matching SSL certificate fingerprint.");
                                        user->CommandFloodPenalty += 10000;
                                        return MOD_RES_DENY;
                                }
@@ -220,7 +229,10 @@ class ModuleSSLInfo : public Module, public Whois::EventListener
                ssl_cert* const cert = ssliohook->GetCertificate();
 
                {
-                       std::string text = "*** You are connected using SSL cipher '";
+                       std::string text = "*** You are connected to ";
+                       if (!ssliohook->GetServerName(text))
+                               text.append(ServerInstance->Config->ServerName);
+                       text.append(" using SSL cipher '");
                        ssliohook->GetCiphersuite(text);
                        text.push_back('\'');
                        if ((cert) && (!cert->GetFingerprint().empty()))
@@ -247,10 +259,12 @@ class ModuleSSLInfo : public Module, public Whois::EventListener
                if (myclass->config->getString("requiressl") == "trusted")
                {
                        ok = (cert && cert->IsCAVerified());
+                       ServerInstance->Logs->Log("CONNECTCLASS", LOG_DEBUG, "Class requires a trusted SSL cert. Client %s one.", (ok ? "has" : "does not have"));
                }
                else if (myclass->config->getBool("requiressl"))
                {
                        ok = (cert != NULL);
+                       ServerInstance->Logs->Log("CONNECTCLASS", LOG_DEBUG, "Class requires any SSL cert. Client %s one.", (ok ? "has" : "does not have"));
                }
 
                if (!ok)