Line data Source code
1 : /* 2 : * Copyright (c) 2015 Juniper Networks, Inc. All rights reserved. 3 : * Copyright Contributors to the OpenSDN project 4 : */ 5 : 6 : #ifndef SRC_IO_SSL_SERVER_H_ 7 : #define SRC_IO_SSL_SERVER_H_ 8 : 9 : #include <boost/asio/ssl.hpp> 10 : 11 : #include "io/tcp_server.h" 12 : 13 : class SslSession; 14 : 15 : class SslServer : public TcpServer { 16 : public: 17 : typedef boost::asio::ssl::stream<boost::asio::ip::tcp::socket> SslSocket; 18 : 19 : explicit SslServer(EventManager *evm, boost::asio::ssl::context::method m, 20 : bool ssl_enabled = true, 21 : bool ssl_handshake_delayed = false); 22 : virtual ~SslServer(); 23 : 24 : protected: 25 : // given SSL socket, Create a session object. 26 : virtual SslSession *AllocSession(SslSocket *socket) = 0; 27 : 28 : // boost ssl context accessor to setup ssl context variables. 29 : boost::asio::ssl::context *context(); 30 : 31 : private: 32 : friend class SslSession; 33 : 34 : static void AcceptHandShakeHandler(TcpServerPtr server, 35 : TcpSessionPtr session, 36 : const boost::system::error_code& error); 37 : static void ConnectHandShakeHandler(TcpServerPtr server, 38 : TcpSessionPtr session, 39 : const boost::system::error_code& error); 40 : 41 : // suppress AllocSession method using tcp socket, not valid for 42 : // ssl server. 43 0 : TcpSession *AllocSession(Socket *socket) { return NULL; } 44 : 45 : TcpSession *AllocSession(bool server_session); 46 : 47 : // override accept complete handler to trigger handshake 48 : virtual void AcceptHandlerComplete(TcpSessionPtr session); 49 : 50 : // override connect complete handler to trigger handshake 51 : void ConnectHandlerComplete(TcpSessionPtr session); 52 : 53 : Socket *accept_socket() const; 54 : void set_accept_socket(); 55 : 56 : boost::asio::ssl::context context_; 57 : std::unique_ptr<SslSocket> so_ssl_accept_; // SSL socket used in async_accept 58 : bool ssl_enabled_; 59 : bool ssl_handshake_delayed_; 60 : DISALLOW_COPY_AND_ASSIGN(SslServer); 61 : }; 62 : 63 : #endif // SRC_IO_SSL_SERVER_H_