]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/extra/m_ssl_gnutls.cpp
Convert all code to use StreamSocket::SendQueue
[user/henk/code/inspircd.git] / src / modules / extra / m_ssl_gnutls.cpp
index a2bdb76eebdfa8133cdf21db9617662df608109c..e142ead1188ae39be7b72081ba0c858f9bdb59f2 100644 (file)
@@ -968,7 +968,7 @@ info_done_dealloc:
                }
        }
 
-       int OnStreamSocketWrite(StreamSocket* user, std::string& sendq) CXX11_OVERRIDE
+       int OnStreamSocketWrite(StreamSocket* user) CXX11_OVERRIDE
        {
                // Finish handshake if needed
                int prepret = PrepareIO(user);
@@ -976,19 +976,21 @@ info_done_dealloc:
                        return prepret;
 
                // Session is ready for transferring application data
+               StreamSocket::SendQueue& sendq = user->GetSendQ();
                int ret = 0;
 
                {
-                       ret = gnutls_record_send(this->sess, sendq.data(), sendq.length());
+                       const StreamSocket::SendQueue::Element& buffer = sendq.front();
+                       ret = gnutls_record_send(this->sess, buffer.data(), buffer.length());
 
-                       if (ret == (int)sendq.length())
+                       if (ret == (int)buffer.length())
                        {
                                SocketEngine::ChangeEventMask(user, FD_WANT_NO_WRITE);
                                return 1;
                        }
                        else if (ret > 0)
                        {
-                               sendq.erase(0, ret);
+                               sendq.erase_front(ret);
                                SocketEngine::ChangeEventMask(user, FD_WANT_SINGLE_WRITE);
                                return 0;
                        }
@@ -1029,6 +1031,7 @@ info_done_dealloc:
        }
 
        GnuTLS::Profile* GetProfile() { return profile; }
+       bool IsHandshakeDone() const { return (status == ISSL_HANDSHAKEN); }
 };
 
 int GnuTLS::X509Credentials::cert_callback(gnutls_session_t sess, const gnutls_datum_t* req_ca_rdn, int nreqs, const gnutls_pk_algorithm_t* sign_algos, int sign_algos_length, cert_cb_last_param_type* st)
@@ -1204,6 +1207,18 @@ class ModuleSSLGnuTLS : public Module
                if (hook && hook->prov->creator == this)
                        static_cast<GnuTLSIOHook*>(hook)->TellCiphersAndFingerprint(user);
        }
+
+       ModResult OnCheckReady(LocalUser* user) CXX11_OVERRIDE
+       {
+               if ((user->eh.GetIOHook()) && (user->eh.GetIOHook()->prov->creator == this))
+               {
+                       GnuTLSIOHook* iohook = static_cast<GnuTLSIOHook*>(user->eh.GetIOHook());
+                       if (!iohook->IsHandshakeDone())
+                               return MOD_RES_DENY;
+               }
+
+               return MOD_RES_PASSTHRU;
+       }
 };
 
 MODULE_INIT(ModuleSSLGnuTLS)