]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/modules/ssl.h
Merge tag 'v2.0.26' into master.
[user/henk/code/inspircd.git] / include / modules / ssl.h
index 67bfc7b2ec30efea403e9888e333b01110aea24a..930cb6dc605a73373bc2ea52561e5a953671c4f3 100644 (file)
@@ -112,9 +112,21 @@ class ssl_cert : public refcountbase
                return revoked;
        }
 
+       /** Get certificate usability
+       * @return True if the certificate is not expired nor revoked
+       */
+       bool IsUsable()
+       {
+               return !invalid && !revoked && error.empty();
+       }
+
+       /** Get CA trust status
+       * @return True if the certificate is issued by a CA
+       * and valid.
+       */
        bool IsCAVerified()
        {
-               return trusted && !invalid && !revoked && !unknownsigner && error.empty();
+               return IsUsable() && trusted && !unknownsigner;
        }
 
        std::string GetMetaLine()
@@ -164,6 +176,14 @@ class SSLIOHook : public IOHook
        }
 
  public:
+       static SSLIOHook* IsSSL(StreamSocket* sock)
+       {
+               IOHook* const iohook = sock->GetIOHook();
+               if ((iohook) && ((iohook->prov->type == IOHookProvider::IOH_SSL)))
+                       return static_cast<SSLIOHook*>(iohook);
+               return NULL;
+       }
+
        SSLIOHook(IOHookProvider* hookprov)
                : IOHook(hookprov)
        {
@@ -175,7 +195,9 @@ class SSLIOHook : public IOHook
         */
        ssl_cert* GetCertificate() const
        {
-               return certificate;
+               if (certificate && certificate->IsUsable())
+                       return certificate;
+               return NULL;
        }
 
        /**
@@ -190,6 +212,19 @@ class SSLIOHook : public IOHook
                        return cert->GetFingerprint();
                return "";
        }
+
+       /**
+        * Get the ciphersuite negotiated with the peer
+        * @param out String where the ciphersuite string will be appended to
+        */
+       virtual void GetCiphersuite(std::string& out) const = 0;
+
+
+       /** Retrieves the name of the SSL connection which is sent via SNI.
+        * @param out String that the server name will be appended to.
+        * returns True if the server name was retrieved; otherwise, false.
+        */
+       virtual bool GetServerName(std::string& out) const = 0;
 };
 
 /** Helper functions for obtaining SSL client certificates and key fingerprints
@@ -205,11 +240,10 @@ class SSLClientCert
         */
        static ssl_cert* GetCertificate(StreamSocket* sock)
        {
-               IOHook* iohook = sock->GetIOHook();
-               if ((!iohook) || (iohook->prov->type != IOHookProvider::IOH_SSL))
+               SSLIOHook* ssliohook = SSLIOHook::IsSSL(sock);
+               if (!ssliohook)
                        return NULL;
 
-               SSLIOHook* ssliohook = static_cast<SSLIOHook*>(iohook);
                return ssliohook->GetCertificate();
        }