]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/m_sslinfo.cpp
m_spanningtree Replace manual string building of outgoing commands with CmdBuilder...
[user/henk/code/inspircd.git] / src / modules / m_sslinfo.cpp
index 8cdaa1cde0c0cad53ae194ae71af5b13edfcef13..656a9a432e7dd6bad5333c453f83fa82d69d151e 100644 (file)
@@ -20,8 +20,6 @@
 #include "inspircd.h"
 #include "modules/ssl.h"
 
-/* $ModDesc: Provides SSL metadata, including /WHOIS information and /SSLINFO command */
-
 class SSLCertExt : public ExtensionItem {
  public:
        SSLCertExt(Module* parent) : ExtensionItem("ssl_cert", parent) {}
@@ -93,7 +91,7 @@ class CommandSSLInfo : public Command
 
                if ((!target) || (target->registered != REG_ALL))
                {
-                       user->WriteNumeric(ERR_NOSUCHNICK, "%s %s :No such nickname", user->nick.c_str(), parameters[0].c_str());
+                       user->WriteNumeric(ERR_NOSUCHNICK, "%s :No such nickname", parameters[0].c_str());
                        return CMD_FAILURE;
                }
                bool operonlyfp = ServerInstance->Config->ConfValue("sslinfo")->getBool("operonly");
@@ -121,23 +119,31 @@ class CommandSSLInfo : public Command
        }
 };
 
-class ModuleSSLInfo : public Module
+class UserCertificateAPIImpl : public UserCertificateAPIBase
 {
-       CommandSSLInfo cmd;
+       SSLCertExt& ext;
 
  public:
-       ModuleSSLInfo() : cmd(this)
+       UserCertificateAPIImpl(Module* mod, SSLCertExt& certext)
+               : UserCertificateAPIBase(mod), ext(certext)
        {
        }
 
-       void init() CXX11_OVERRIDE
-       {
-               ServerInstance->Modules->AddService(cmd);
+       ssl_cert* GetCertificate(User* user) CXX11_OVERRIDE
+       {
+               return ext.get(user);
+       }
+};
 
-               ServerInstance->Modules->AddService(cmd.CertExt);
+class ModuleSSLInfo : public Module
+{
+       CommandSSLInfo cmd;
+       UserCertificateAPIImpl APIImpl;
 
-               Implementation eventlist[] = { I_OnWhois, I_OnPreCommand, I_OnSetConnectClass, I_OnUserConnect, I_OnPostConnect };
-               ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation));
+ public:
+       ModuleSSLInfo()
+               : cmd(this), APIImpl(this, cmd.CertExt)
+       {
        }
 
        Version GetVersion() CXX11_OVERRIDE
@@ -150,11 +156,11 @@ class ModuleSSLInfo : public Module
                ssl_cert* cert = cmd.CertExt.get(dest);
                if (cert)
                {
-                       ServerInstance->SendWhoisLine(source, dest, 671, "%s %s :is using a secure connection", source->nick.c_str(), dest->nick.c_str());
+                       ServerInstance->SendWhoisLine(source, dest, 671, "%s :is using a secure connection", dest->nick.c_str());
                        bool operonlyfp = ServerInstance->Config->ConfValue("sslinfo")->getBool("operonly");
                        if ((!operonlyfp || source == dest || source->IsOper()) && !cert->fingerprint.empty())
-                               ServerInstance->SendWhoisLine(source, dest, 276, "%s %s :has client certificate fingerprint %s",
-                                       source->nick.c_str(), dest->nick.c_str(), cert->fingerprint.c_str());
+                               ServerInstance->SendWhoisLine(source, dest, 276, "%s :has client certificate fingerprint %s",
+                                       dest->nick.c_str(), cert->fingerprint.c_str());
                }
        }
 
@@ -170,7 +176,7 @@ class ModuleSSLInfo : public Module
 
                                if (ifo->oper_block->getBool("sslonly") && !cert)
                                {
-                                       user->WriteNumeric(491, "%s :This oper login requires an SSL connection.", user->nick.c_str());
+                                       user->WriteNumeric(491, ":This oper login requires an SSL connection.");
                                        user->CommandFloodPenalty += 10000;
                                        return MOD_RES_DENY;
                                }
@@ -178,7 +184,7 @@ class ModuleSSLInfo : public Module
                                std::string fingerprint;
                                if (ifo->oper_block->readString("fingerprint", fingerprint) && (!cert || cert->GetFingerprint() != fingerprint))
                                {
-                                       user->WriteNumeric(491, "%s :This oper login requires a matching SSL fingerprint.",user->nick.c_str());
+                                       user->WriteNumeric(491, ":This oper login requires a matching SSL fingerprint.");
                                        user->CommandFloodPenalty += 10000;
                                        return MOD_RES_DENY;
                                }
@@ -191,10 +197,9 @@ class ModuleSSLInfo : public Module
 
        void OnUserConnect(LocalUser* user) CXX11_OVERRIDE
        {
-               SocketCertificateRequest req(&user->eh, this);
-               if (!req.cert)
-                       return;
-               cmd.CertExt.set(user, req.cert);
+               ssl_cert* cert = SSLClientCert::GetCertificate(&user->eh);
+               if (cert)
+                       cmd.CertExt.set(user, cert);
        }
 
        void OnPostConnect(User* user) CXX11_OVERRIDE
@@ -214,30 +219,21 @@ class ModuleSSLInfo : public Module
 
        ModResult OnSetConnectClass(LocalUser* user, ConnectClass* myclass) CXX11_OVERRIDE
        {
-               SocketCertificateRequest req(&user->eh, this);
+               ssl_cert* cert = SSLClientCert::GetCertificate(&user->eh);
                bool ok = true;
                if (myclass->config->getString("requiressl") == "trusted")
                {
-                       ok = (req.cert && req.cert->IsCAVerified());
+                       ok = (cert && cert->IsCAVerified());
                }
                else if (myclass->config->getBool("requiressl"))
                {
-                       ok = (req.cert != NULL);
+                       ok = (cert != NULL);
                }
 
                if (!ok)
                        return MOD_RES_DENY;
                return MOD_RES_PASSTHRU;
        }
-
-       void OnRequest(Request& request) CXX11_OVERRIDE
-       {
-               if (strcmp("GET_USER_CERT", request.id) == 0)
-               {
-                       UserCertificateRequest& req = static_cast<UserCertificateRequest&>(request);
-                       req.cert = cmd.CertExt.get(req.user);
-               }
-       }
 };
 
 MODULE_INIT(ModuleSSLInfo)