/* * Copyright (c) 2011 Tobias Markmann * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ /* * Copyright (c) 2015-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #pragma once #include #include #include #include #include #include #include #include #include #include #include namespace Swift { class SOCKS5BytestreamRegistry; class Connection; class TimerFactory; /** * A session which has been connected to a SOCKS5 server (requester). * */ class SWIFTEN_API SOCKS5BytestreamClientSession { public: enum State { Initial, Hello, Authenticating, Ready, Writing, Reading, Finished }; public: typedef std::shared_ptr ref; public: SOCKS5BytestreamClientSession( std::shared_ptr connection, const HostAddressPort&, const std::string&, TimerFactory*); ~SOCKS5BytestreamClientSession(); void start(); void stop(); void startReceiving(std::shared_ptr); void startSending(std::shared_ptr); HostAddressPort getAddressPort() const; boost::signals2::signal onSessionReady; boost::signals2::signal)> onFinished; boost::signals2::signal onBytesSent; // boost::signals2::signal onBytesReceived; private: void process(); void hello(); void authenticate(); void handleConnectFinished(bool error); void handleDataRead(std::shared_ptr); void handleDisconnected(const boost::optional&); void handleWeFailedTimeout(); void finish(bool error); void sendData(); void closeConnection(); private: std::shared_ptr connection; HostAddressPort addressPort; std::string destination; // hexify(SHA1(sessionID + requester + target)) State state; ByteArray unprocessedData; ByteArray authenticateAddress; int chunkSize; std::shared_ptr writeBytestream; std::shared_ptr readBytestream; Timer::ref weFailedTimeout; boost::signals2::scoped_connection connectFinishedConnection; boost::signals2::scoped_connection dataWrittenConnection; boost::signals2::scoped_connection dataReadConnection; boost::signals2::scoped_connection disconnectedConnection; }; }