From 95464d97cf5f2c746201368272b73176b76be287 Mon Sep 17 00:00:00 2001 From: "Jerry (Xinyu Hou)" Date: Wed, 24 Aug 2016 15:14:12 +0100 Subject: [PATCH] Conflicts: src/lib/client/Client.cpp src/lib/net/TCPSocketFactory.cpp --- src/lib/base/EventTypes.cpp | 1 + src/lib/base/EventTypes.h | 9 +++++++++ src/lib/client/Client.cpp | 17 +++++++++++----- src/lib/net/TCPSocket.cpp | 4 ++-- src/lib/net/TCPSocket.h | 12 +++++++----- src/lib/plugin/ns/SecureSocket.cpp | 31 ++++++++++++++++++++++++++++++ src/lib/plugin/ns/SecureSocket.h | 7 +++++++ 7 files changed, 69 insertions(+), 12 deletions(-) diff --git a/src/lib/base/EventTypes.cpp b/src/lib/base/EventTypes.cpp index a25bc292..2bb0db1b 100644 --- a/src/lib/base/EventTypes.cpp +++ b/src/lib/base/EventTypes.cpp @@ -82,6 +82,7 @@ REGISTER_EVENT(IpcServerProxy, messageReceived) // REGISTER_EVENT(IDataSocket, connected) +REGISTER_EVENT(IDataSocket, secureConnected) REGISTER_EVENT(IDataSocket, connectionFailed) // diff --git a/src/lib/base/EventTypes.h b/src/lib/base/EventTypes.h index d22bc729..7be8827b 100644 --- a/src/lib/base/EventTypes.h +++ b/src/lib/base/EventTypes.h @@ -230,6 +230,7 @@ class IDataSocketEvents : public EventTypes { public: IDataSocketEvents() : m_connected(Event::kUnknown), + m_secureConnected(Event::kUnknown), m_connectionFailed(Event::kUnknown) { } //! @name accessors @@ -241,6 +242,13 @@ public: event when a remote connection has been established. */ Event::Type connected(); + + //! Get secure connected event type + /*! + Returns the secure socket connected event type. A secure socket sends + this event when a remote connection has been established. + */ + Event::Type secureConnected(); //! Get connection failed event type /*! @@ -254,6 +262,7 @@ public: private: Event::Type m_connected; + Event::Type m_secureConnected; Event::Type m_connectionFailed; }; diff --git a/src/lib/client/Client.cpp b/src/lib/client/Client.cpp index 2d687ee3..5c716b46 100644 --- a/src/lib/client/Client.cpp +++ b/src/lib/client/Client.cpp @@ -435,10 +435,19 @@ Client::setupConnecting() { assert(m_stream != NULL); - m_events->adoptHandler(m_events->forIDataSocket().connected(), - m_stream->getEventTarget(), - new TMethodEventJob(this, + if (m_args.m_enableCrypto) { + m_events->adoptHandler(m_events->forIDataSocket().secureConnected(), + m_stream->getEventTarget(), + new TMethodEventJob(this, &Client::handleConnected)); + } + else { + m_events->adoptHandler(m_events->forIDataSocket().connected(), + m_stream->getEventTarget(), + new TMethodEventJob(this, + &Client::handleConnected)); + } + m_events->adoptHandler(m_events->forIDataSocket().connectionFailed(), m_stream->getEventTarget(), new TMethodEventJob(this, @@ -589,8 +598,6 @@ Client::handleConnected(const Event&, void*) m_sentClipboard[id] = false; m_timeClipboard[id] = 0; } - - m_socket->secureConnect(); } void diff --git a/src/lib/net/TCPSocket.cpp b/src/lib/net/TCPSocket.cpp index 326a63ac..e0ec92a7 100644 --- a/src/lib/net/TCPSocket.cpp +++ b/src/lib/net/TCPSocket.cpp @@ -39,9 +39,9 @@ TCPSocket::TCPSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer) : IDataSocket(events), + m_events(events), m_mutex(), m_flushed(&m_mutex, true), - m_events(events), m_socketMultiplexer(socketMultiplexer) { try { @@ -56,10 +56,10 @@ TCPSocket::TCPSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer) TCPSocket::TCPSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer, ArchSocket socket) : IDataSocket(events), + m_events(events), m_mutex(), m_socket(socket), m_flushed(&m_mutex, true), - m_events(events), m_socketMultiplexer(socketMultiplexer) { assert(m_socket != NULL); diff --git a/src/lib/net/TCPSocket.h b/src/lib/net/TCPSocket.h index 3dca4cad..a84dace0 100644 --- a/src/lib/net/TCPSocket.h +++ b/src/lib/net/TCPSocket.h @@ -58,6 +58,9 @@ public: // IDataSocket overrides virtual void connect(const NetworkAddress&); + + virtual ISocketMultiplexerJob* + newJob(); virtual void secureConnect() {} virtual void secureAccept() {} virtual void setFingerprintFilename(String& f) {} @@ -71,8 +74,7 @@ protected: virtual int secureWrite(const void*, int, int& ) { return 0; } void setJob(ISocketMultiplexerJob*); - ISocketMultiplexerJob* - newJob(); + bool isReadable() { return m_readable; } bool isWritable() { return m_writable; } @@ -99,14 +101,14 @@ private: protected: bool m_readable; bool m_writable; - + bool m_connected; + IEventQueue* m_events; + private: Mutex m_mutex; ArchSocket m_socket; StreamBuffer m_inputBuffer; StreamBuffer m_outputBuffer; CondVar m_flushed; - bool m_connected; - IEventQueue* m_events; SocketMultiplexer* m_socketMultiplexer; }; diff --git a/src/lib/plugin/ns/SecureSocket.cpp b/src/lib/plugin/ns/SecureSocket.cpp index 0e5a03ef..979e8616 100644 --- a/src/lib/plugin/ns/SecureSocket.cpp +++ b/src/lib/plugin/ns/SecureSocket.cpp @@ -18,6 +18,7 @@ #include "SecureSocket.h" #include "net/TSocketMultiplexerMethodJob.h" +#include "base/TMethodEventJob.h" #include "net/TCPSocket.h" #include "mt/Lock.h" #include "arch/XArch.h" @@ -100,6 +101,29 @@ SecureSocket::close() TCPSocket::close(); } +void +SecureSocket::connect(const NetworkAddress& addr) +{ + m_events->adoptHandler(m_events->forIDataSocket().connected(), + getEventTarget(), + new TMethodEventJob(this, + &SecureSocket::handleTCPConnected)); + + TCPSocket::connect(addr); +} + +ISocketMultiplexerJob* +SecureSocket::newJob() +{ + // after TCP connection is established, SecureSocket will pick up + // connected event and do secureConnect + if (m_connected && !m_secureReady) { + return NULL; + } + + return TCPSocket::newJob(); +} + void SecureSocket::secureConnect() { @@ -609,6 +633,7 @@ SecureSocket::serviceConnect(ISocketMultiplexerJob* job, // If status > 0, success if (status > 0) { + sendEvent(m_events->forIDataSocket().secureConnected()); return newJob(); } @@ -714,3 +739,9 @@ SecureSocket::showSecureConnectInfo() } return; } + +void +SecureSocket::handleTCPConnected(const Event& event, void*) +{ + secureConnect(); +} diff --git a/src/lib/plugin/ns/SecureSocket.h b/src/lib/plugin/ns/SecureSocket.h index ef3f6302..5be68f7d 100644 --- a/src/lib/plugin/ns/SecureSocket.h +++ b/src/lib/plugin/ns/SecureSocket.h @@ -41,6 +41,11 @@ public: // ISocket overrides void close(); + // IDataSocket overrides + virtual void connect(const NetworkAddress&); + + ISocketMultiplexerJob* + newJob(); void secureConnect(); void secureAccept(); bool isReady() const { return m_secureReady; } @@ -80,6 +85,8 @@ private: void showSecureConnectInfo(); void showSecureLibInfo(); void showSecureCipherInfo(); + + void handleTCPConnected(const Event& event, void*); private: Ssl* m_ssl;