]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/modules/extra/m_ssl_openssl.cpp
Try this
[user/henk/code/inspircd.git] / src / modules / extra / m_ssl_openssl.cpp
index af73448c95eb4dc2535ffb0f0b2f5652baf93fe3..00c4c5fa35c3bd347c2c1f4d48a72dacc2f5b70f 100644 (file)
@@ -346,7 +346,7 @@ class ModuleSSLOpenSSL : public Module
        void Implements(char* List)
        {
                List[I_OnRawSocketConnect] = List[I_OnRawSocketAccept] = List[I_OnRawSocketClose] = List[I_OnRawSocketRead] = List[I_OnRawSocketWrite] = List[I_OnCleanup] = List[I_On005Numeric] = 1;
-               List[I_OnRequest] = List[I_OnSyncUserMetaData] = List[I_OnDecodeMetaData] = List[I_OnUnloadModule] = List[I_OnRehash] = List[I_OnWhois] = List[I_OnPostConnect] = 1;
+               List[I_OnBufferFlushed] = List[I_OnRequest] = List[I_OnSyncUserMetaData] = List[I_OnDecodeMetaData] = List[I_OnUnloadModule] = List[I_OnRehash] = List[I_OnWhois] = List[I_OnPostConnect] = 1;
        }
 
        virtual char* OnRequest(Request* request)
@@ -421,7 +421,6 @@ class ModuleSSLOpenSSL : public Module
 
        virtual void OnRawSocketConnect(int fd)
        {
-               ServerInstance->Log(DEBUG,"OnRawSocketConnect connecting");
                issl_session* session = &sessions[fd];
 
                session->fd = fd;
@@ -441,7 +440,6 @@ class ModuleSSLOpenSSL : public Module
                }
 
                Handshake(session);
-               ServerInstance->Log(DEBUG,"Exiting OnRawSocketConnect");
        }
 
        virtual void OnRawSocketClose(int fd)
@@ -463,11 +461,8 @@ class ModuleSSLOpenSSL : public Module
        {
                issl_session* session = &sessions[fd];
 
-               ServerInstance->Log(DEBUG,"OnRawSocketRead");
-
                if (!session->sess)
                {
-                       ServerInstance->Log(DEBUG,"OnRawSocketRead has no session");
                        readresult = 0;
                        CloseSession(session);
                        return 1;
@@ -477,11 +472,9 @@ class ModuleSSLOpenSSL : public Module
                {
                        if (session->rstat == ISSL_READ || session->wstat == ISSL_READ)
                        {
-                               ServerInstance->Log(DEBUG,"Resume handshake in read");
                                // The handshake isn't finished and it wants to read, try to finish it.
                                if (!Handshake(session))
                                {
-                                       ServerInstance->Log(DEBUG,"Cant resume handshake in read");
                                        // Couldn't resume handshake.
                                        return -1;
                                }
@@ -507,6 +500,10 @@ class ModuleSSLOpenSSL : public Module
                        {
                                int ret = DoRead(session);
 
+                               ServerInstance->Log(DEBUG, "<***> DoRead count: " + ConvToStr(count));
+                               ServerInstance->Log(DEBUG, "<***> DoRead ret: " + ConvToStr(ret));
+                               ServerInstance->Log(DEBUG, "<***> DoRead session->inbufoffset: " + ConvToStr(session->inbufoffset));
+
                                if (ret > 0)
                                {
                                        if (count <= session->inbufoffset)
@@ -547,19 +544,18 @@ class ModuleSSLOpenSSL : public Module
 
                if (!session->sess)
                {
-                       ServerInstance->Log(DEBUG,"Close session missing sess");
                        CloseSession(session);
                        return -1;
                }
 
                session->outbuf.append(buffer, count);
+               MakePollWrite(session);
 
                if (session->status == ISSL_HANDSHAKING)
                {
                        // The handshake isn't finished, try to finish it.
                        if (session->rstat == ISSL_WRITE || session->wstat == ISSL_WRITE)
                        {
-                               ServerInstance->Log(DEBUG,"Handshake resume");
                                Handshake(session);
                        }
                }
@@ -568,13 +564,11 @@ class ModuleSSLOpenSSL : public Module
                {
                        if (session->rstat == ISSL_WRITE)
                        {
-                               ServerInstance->Log(DEBUG,"DoRead");
                                DoRead(session);
                        }
 
                        if (session->wstat == ISSL_WRITE)
                        {
-                               ServerInstance->Log(DEBUG,"DoWrite");
                                return DoWrite(session);
                        }
                }
@@ -591,7 +585,6 @@ class ModuleSSLOpenSSL : public Module
 
                if (ret == 0)
                {
-                       ServerInstance->Log(DEBUG,"Oops, got 0 from SSL_write");
                        CloseSession(session);
                        return 0;
                }
@@ -602,7 +595,6 @@ class ModuleSSLOpenSSL : public Module
                        if (err == SSL_ERROR_WANT_WRITE)
                        {
                                session->wstat = ISSL_WRITE;
-                               MakePollWrite(session);
                                return -1;
                        }
                        else if (err == SSL_ERROR_WANT_READ)
@@ -612,7 +604,6 @@ class ModuleSSLOpenSSL : public Module
                        }
                        else
                        {
-                               ServerInstance->Log(DEBUG,"Close due to returned -1 in SSL_Write");
                                CloseSession(session);
                                return 0;
                        }
@@ -629,14 +620,11 @@ class ModuleSSLOpenSSL : public Module
                // Is this right? Not sure if the unencrypted data is garaunteed to be the same length.
                // Read into the inbuffer, offset from the beginning by the amount of data we have that insp hasn't taken yet.
                
-               ServerInstance->Log(DEBUG,"DoRead");
-
                int ret = SSL_read(session->sess, session->inbuf + session->inbufoffset, inbufsize - session->inbufoffset);
 
                if (ret == 0)
                {
                        // Client closed connection.
-                       ServerInstance->Log(DEBUG,"Oops, got 0 from SSL_read");
                        CloseSession(session);
                        return 0;
                }
@@ -647,19 +635,16 @@ class ModuleSSLOpenSSL : public Module
                        if (err == SSL_ERROR_WANT_READ)
                        {
                                session->rstat = ISSL_READ;
-                               ServerInstance->Log(DEBUG,"Setting want_read");
                                return -1;
                        }
                        else if (err == SSL_ERROR_WANT_WRITE)
                        {
                                session->rstat = ISSL_WRITE;
                                MakePollWrite(session);
-                               ServerInstance->Log(DEBUG,"Setting want_write");
                                return -1;
                        }
                        else
                        {
-                               ServerInstance->Log(DEBUG,"Closed due to returned -1 in SSL_Read");
                                CloseSession(session);
                                return 0;
                        }
@@ -720,12 +705,10 @@ class ModuleSSLOpenSSL : public Module
 
        bool Handshake(issl_session* session)
        {
-               ServerInstance->Log(DEBUG,"Handshake");
                int ret;
 
                if (session->outbound)
                {
-                       ServerInstance->Log(DEBUG,"SSL_connect");
                        ret = SSL_connect(session->sess);
                }
                else
@@ -737,14 +720,12 @@ class ModuleSSLOpenSSL : public Module
 
                        if (err == SSL_ERROR_WANT_READ)
                        {
-                               ServerInstance->Log(DEBUG,"Want read, handshaking");
                                session->rstat = ISSL_READ;
                                session->status = ISSL_HANDSHAKING;
                                return true;
                        }
                        else if (err == SSL_ERROR_WANT_WRITE)
                        {
-                               ServerInstance->Log(DEBUG,"Want write, handshaking");
                                session->wstat = ISSL_WRITE;
                                session->status = ISSL_HANDSHAKING;
                                MakePollWrite(session);
@@ -752,7 +733,6 @@ class ModuleSSLOpenSSL : public Module
                        }
                        else
                        {
-                               ServerInstance->Log(DEBUG,"Handshake failed");
                                CloseSession(session);
                        }
 
@@ -818,6 +798,17 @@ class ModuleSSLOpenSSL : public Module
                        ServerInstance->SE->WantWrite(eh);
        }
 
+       virtual void OnBufferFlushed(userrec* user)
+       {
+               if (user->GetExt("ssl"))
+               {
+                       ServerInstance->Log(DEBUG,"OnBufferFlushed for ssl user");
+                       issl_session* session = &sessions[user->GetFd()];
+                       if (session && session->outbuf.size())
+                               OnRawSocketWrite(user->GetFd(), NULL, 0);
+               }
+       }
+
        void CloseSession(issl_session* session)
        {
                if (session->sess)