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