Mercurial > irccd
changeset 594:0a5cb2b65621
Irccd: split transport_server into different files
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 05 Dec 2017 16:31:35 +0100 |
parents | b3b046c638cb |
children | 029667d16d12 |
files | libirccd-test/irccd/command_test.hpp libirccd/CMakeLists.txt libirccd/irccd/basic_transport_server.hpp libirccd/irccd/ip_transport_server.hpp libirccd/irccd/local_transport_server.hpp libirccd/irccd/tls_transport_server.cpp libirccd/irccd/tls_transport_server.hpp libirccd/irccd/transport_server.cpp libirccd/irccd/transport_server.hpp libirccd/irccd/transport_service.cpp |
diffstat | 10 files changed, 324 insertions(+), 150 deletions(-) [+] |
line wrap: on
line diff
--- a/libirccd-test/irccd/command_test.hpp Tue Dec 05 15:43:23 2017 +0100 +++ b/libirccd-test/irccd/command_test.hpp Tue Dec 05 16:31:35 2017 +0100 @@ -23,8 +23,9 @@ #include <irccd/logger.hpp> +#include <irccd/command_service.hpp> +#include <irccd/ip_transport_server.hpp> #include <irccd/irccd.hpp> -#include <irccd/command_service.hpp> #include <irccd/transport_service.hpp> #include <irccd/ctl/ip_connection.hpp>
--- a/libirccd/CMakeLists.txt Tue Dec 05 15:43:23 2017 +0100 +++ b/libirccd/CMakeLists.txt Tue Dec 05 16:31:35 2017 +0100 @@ -23,12 +23,15 @@ set( HEADERS ${libirccd_SOURCE_DIR}/irccd/basic_transport_client.hpp + ${libirccd_SOURCE_DIR}/irccd/basic_transport_server.hpp ${libirccd_SOURCE_DIR}/irccd/command.hpp ${libirccd_SOURCE_DIR}/irccd/command_service.hpp ${libirccd_SOURCE_DIR}/irccd/config.hpp ${libirccd_SOURCE_DIR}/irccd/dynlib_plugin.hpp + ${libirccd_SOURCE_DIR}/irccd/ip_transport_server.hpp + ${libirccd_SOURCE_DIR}/irccd/irccd.hpp ${libirccd_SOURCE_DIR}/irccd/irc.hpp - ${libirccd_SOURCE_DIR}/irccd/irccd.hpp + ${libirccd_SOURCE_DIR}/irccd/local_transport_server.hpp ${libirccd_SOURCE_DIR}/irccd/plugin.hpp ${libirccd_SOURCE_DIR}/irccd/plugin_service.hpp ${libirccd_SOURCE_DIR}/irccd/rule.hpp @@ -38,6 +41,7 @@ ${libirccd_SOURCE_DIR}/irccd/transport_client.hpp ${libirccd_SOURCE_DIR}/irccd/transport_server.hpp ${libirccd_SOURCE_DIR}/irccd/transport_service.hpp + $<$<BOOL:${HAVE_SSL}>:${libirccd_SOURCE_DIR}/irccd/tls_transport_server.hpp> ) set( @@ -46,8 +50,8 @@ ${libirccd_SOURCE_DIR}/irccd/command_service.cpp ${libirccd_SOURCE_DIR}/irccd/config.cpp ${libirccd_SOURCE_DIR}/irccd/dynlib_plugin.cpp + ${libirccd_SOURCE_DIR}/irccd/irccd.cpp ${libirccd_SOURCE_DIR}/irccd/irc.cpp - ${libirccd_SOURCE_DIR}/irccd/irccd.cpp ${libirccd_SOURCE_DIR}/irccd/plugin.cpp ${libirccd_SOURCE_DIR}/irccd/plugin_service.cpp ${libirccd_SOURCE_DIR}/irccd/rule.cpp @@ -57,6 +61,7 @@ ${libirccd_SOURCE_DIR}/irccd/transport_client.cpp ${libirccd_SOURCE_DIR}/irccd/transport_server.cpp ${libirccd_SOURCE_DIR}/irccd/transport_service.cpp + $<$<BOOL:${HAVE_SSL}>:${libirccd_SOURCE_DIR}/irccd/tls_transport_server.cpp> ) irccd_define_library(
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libirccd/irccd/basic_transport_server.hpp Tue Dec 05 16:31:35 2017 +0100 @@ -0,0 +1,97 @@ +/* + * basic_transport_server.hpp -- simple socket transport servers + * + * Copyright (c) 2013-2017 David Demelier <markand@malikania.fr> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef IRCCD_BASIC_TRANSPORT_SERVER_HPP +#define IRCCD_BASIC_TRANSPORT_SERVER_HPP + +/** + * \file basic_transport_server.hpp + * \brief Simple socket transport servers. + */ + +#include "basic_transport_client.hpp" +#include "transport_server.hpp" + +namespace irccd { + +/** + * \brief Basic implementation for IP/TCP and local sockets + * + * This class implements an accept function for: + * + * - boost::asio::ip::tcp + * - boost::asio::local::stream_protocol + */ +template <typename Protocol> +class basic_transport_server : public transport_server { +public: + /** + * Type for underlying socket. + */ + using socket_t = typename Protocol::socket; + + /** + * Type for underlying acceptor. + */ + using acceptor_t = typename Protocol::acceptor; + +protected: + /** + * The acceptor object. + */ + acceptor_t acceptor_; + +protected: + /** + * \copydoc transport_server::accept + */ + void do_accept(accept_t handler) override; + +public: + /** + * Constructor with an acceptor in parameter. + * + * \pre acceptor.is_open() + * \param acceptor the already bound acceptor + */ + basic_transport_server(acceptor_t acceptor); +}; + +template <typename Protocol> +basic_transport_server<Protocol>::basic_transport_server(acceptor_t acceptor) + : acceptor_(std::move(acceptor)) +{ + assert(acceptor_.is_open()); +} + +template <typename Protocol> +void basic_transport_server<Protocol>::do_accept(accept_t handler) +{ + auto client = std::make_shared<basic_transport_client<socket_t>>(*this, acceptor_.get_io_service()); + + acceptor_.async_accept(client->stream().socket(), [this, client, handler] (auto code) { + if (code) + handler(std::move(code), nullptr); + else + handler(std::move(code), std::move(client)); + }); +} + +} // !irccd + +#endif // !IRCCD_BASIC_TRANSPORT_SERVER_HPP
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libirccd/irccd/ip_transport_server.hpp Tue Dec 05 16:31:35 2017 +0100 @@ -0,0 +1,38 @@ +/* + * ip_transport_server.hpp -- server side transports (TCP/IP support) + * + * Copyright (c) 2013-2017 David Demelier <markand@malikania.fr> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef IRCCD_IP_TRANSPORT_SERVER_HPP +#define IRCCD_IP_TRANSPORT_SERVER_HPP + +/** + * \file ip_transport_server.hpp + * \brief Server side transports (TCP/IP support). + */ + +#include "basic_transport_server.hpp" + +namespace irccd { + +/** + * Convenient type for IP/TCP + */ +using ip_transport_server = basic_transport_server<boost::asio::ip::tcp>; + +} // !irccd + +#endif // !IRCCD_IP_TRANSPORT_SERVER_HPP
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libirccd/irccd/local_transport_server.hpp Tue Dec 05 16:31:35 2017 +0100 @@ -0,0 +1,44 @@ +/* + * local_transport_server.hpp -- server side transports (Unix support) + * + * Copyright (c) 2013-2017 David Demelier <markand@malikania.fr> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef IRCCD_LOCAL_TRANSPORT_SERVER_HPP +#define IRCCD_LOCAL_TRANSPORT_SERVER_HPP + +/** + * \file local_transport_server.hpp + * \brief Server side transports (Unix support). + */ + +#include <irccd/sysconfig.hpp> + +#if !defined(IRCCD_SYSTEM_WINDOWS) + +#include "basic_transport_server.hpp" + +namespace irccd { + +/** + * Convenient type for UNIX local sockets. + */ +using local_transport_server = basic_transport_server<boost::asio::local::stream_protocol>; + +#endif // !_WIN32 + +} // !irccd + +#endif // !IRCCD_LOCAL_TRANSPORT_SERVER_HPP
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libirccd/irccd/tls_transport_server.cpp Tue Dec 05 16:31:35 2017 +0100 @@ -0,0 +1,52 @@ +/* + * tls_transport_server.cpp -- server side transports (SSL support) + * + * Copyright (c) 2013-2017 David Demelier <markand@malikania.fr> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "tls_transport_server.hpp" + +#if defined(HAVE_SSL) + +namespace irccd { + +void tls_transport_server::do_handshake(std::shared_ptr<client_t> client, accept_t handler) +{ + client->stream().socket().async_handshake(boost::asio::ssl::stream_base::server, [client, handler] (auto code) { + handler(std::move(code), std::move(client)); + }); +} + +tls_transport_server::tls_transport_server(acceptor_t acceptor, context_t context) + : ip_transport_server(std::move(acceptor)) + , context_(std::move(context)) +{ +} + +void tls_transport_server::do_accept(accept_t handler) +{ + auto client = std::make_shared<client_t>(*this, acceptor_.get_io_service(), context_); + + acceptor_.async_accept(client->stream().socket().lowest_layer(), [this, client, handler] (auto code) { + if (code) + handler(std::move(code), nullptr); + else + do_handshake(std::move(client), std::move(handler)); + }); +} + +} // !irccd + +#endif // !HAVE_SSL
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libirccd/irccd/tls_transport_server.hpp Tue Dec 05 16:31:35 2017 +0100 @@ -0,0 +1,72 @@ +/* + * tls_transport_server.hpp -- server side transports (SSL support) + * + * Copyright (c) 2013-2017 David Demelier <markand@malikania.fr> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef IRCCD_TLS_TRANSPORT_SERVER_HPP +#define IRCCD_TLS_TRANSPORT_SERVER_HPP + +/** + * \file tls_transport_server.hpp + * \brief Server side transports (SSL support). + */ + +#include <irccd/sysconfig.hpp> + +#if defined(HAVE_SSL) + +#include <boost/asio/ssl.hpp> + +#include "ip_transport_server.hpp" + +namespace irccd { + +/** + * \brief Secure layer implementation. + */ +class tls_transport_server : public ip_transport_server { +private: + using context_t = boost::asio::ssl::context; + using client_t = basic_transport_client<boost::asio::ssl::stream<socket_t>>; + + context_t context_; + + void do_handshake(std::shared_ptr<client_t>, accept_t); + +protected: + /** + * \copydoc tcp_transport_server::do_accept + * + * This function does the same as tcp_transport_server::do_accept but it + * also perform a SSL handshake after a successful accept operation. + */ + void do_accept(accept_t handler) override; + +public: + /** + * Construct a secure layer transport server. + * + * \param acceptor the acceptor + * \param context the SSL context + */ + tls_transport_server(acceptor_t acceptor, context_t context); +}; + +} // !irccd + +#endif // !HAVE_SSL + +#endif // !IRCCD_TLS_TRANSPORT_SERVER_HPP
--- a/libirccd/irccd/transport_server.cpp Tue Dec 05 15:43:23 2017 +0100 +++ b/libirccd/irccd/transport_server.cpp Tue Dec 05 16:31:35 2017 +0100 @@ -100,33 +100,4 @@ }); } -#if defined(HAVE_SSL) - -void tls_transport_server::do_handshake(std::shared_ptr<client_t> client, accept_t handler) -{ - client->stream().socket().async_handshake(boost::asio::ssl::stream_base::server, [client, handler] (auto code) { - handler(std::move(code), std::move(client)); - }); -} - -tls_transport_server::tls_transport_server(acceptor_t acceptor, context_t context) - : ip_transport_server(std::move(acceptor)) - , context_(std::move(context)) -{ -} - -void tls_transport_server::do_accept(accept_t handler) -{ - auto client = std::make_shared<client_t>(*this, acceptor_.get_io_service(), context_); - - acceptor_.async_accept(client->stream().socket().lowest_layer(), [this, client, handler] (auto code) { - if (code) - handler(std::move(code), nullptr); - else - do_handshake(std::move(client), std::move(handler)); - }); -} - -#endif // !HAVE_SSL - } // !irccd
--- a/libirccd/irccd/transport_server.hpp Tue Dec 05 15:43:23 2017 +0100 +++ b/libirccd/irccd/transport_server.hpp Tue Dec 05 16:31:35 2017 +0100 @@ -29,11 +29,7 @@ #include <boost/asio.hpp> -#if defined(HAVE_SSL) -# include <boost/asio/ssl.hpp> -#endif - -#include "basic_transport_client.hpp" +#include "transport_client.hpp" namespace irccd { @@ -133,118 +129,6 @@ } }; -/** - * \brief Basic implementation for IP/TCP and local sockets - * - * This class implements an accept function for: - * - * - boost::asio::ip::tcp - * - boost::asio::local::stream_protocol - */ -template <typename Protocol> -class basic_transport_server : public transport_server { -public: - /** - * Type for underlying socket. - */ - using socket_t = typename Protocol::socket; - - /** - * Type for underlying acceptor. - */ - using acceptor_t = typename Protocol::acceptor; - -protected: - /** - * The acceptor object. - */ - acceptor_t acceptor_; - -protected: - /** - * \copydoc transport_server::accept - */ - void do_accept(accept_t handler) override; - -public: - /** - * Constructor with an acceptor in parameter. - * - * \pre acceptor.is_open() - * \param acceptor the already bound acceptor - */ - basic_transport_server(acceptor_t acceptor); -}; - -template <typename Protocol> -basic_transport_server<Protocol>::basic_transport_server(acceptor_t acceptor) - : acceptor_(std::move(acceptor)) -{ - assert(acceptor_.is_open()); -} - -template <typename Protocol> -void basic_transport_server<Protocol>::do_accept(accept_t handler) -{ - auto client = std::make_shared<basic_transport_client<socket_t>>(*this, acceptor_.get_io_service()); - - acceptor_.async_accept(client->stream().socket(), [this, client, handler] (auto code) { - if (code) - handler(std::move(code), nullptr); - else - handler(std::move(code), std::move(client)); - }); -} - -/** - * Convenient type for IP/TCP - */ -using ip_transport_server = basic_transport_server<boost::asio::ip::tcp>; - -#if !defined(_WIN32) - -/** - * Convenient type for UNIX local sockets. - */ -using local_transport_server = basic_transport_server<boost::asio::local::stream_protocol>; - -#endif // !_WIN32 - -#if defined(HAVE_SSL) - -/** - * \brief Secure layer implementation. - */ -class tls_transport_server : public ip_transport_server { -private: - using context_t = boost::asio::ssl::context; - using client_t = basic_transport_client<boost::asio::ssl::stream<socket_t>>; - - context_t context_; - - void do_handshake(std::shared_ptr<client_t>, accept_t); - -protected: - /** - * \copydoc tcp_transport_server::do_accept - * - * This function does the same as tcp_transport_server::do_accept but it - * also perform a SSL handshake after a successful accept operation. - */ - void do_accept(accept_t handler) override; - -public: - /** - * Construct a secure layer transport server. - * - * \param acceptor the acceptor - * \param context the SSL context - */ - tls_transport_server(acceptor_t acceptor, context_t context); -}; - -#endif // !HAVE_SSL - } // !irccd #endif // !IRCCD_TRANSPORT_SERVER_HPP
--- a/libirccd/irccd/transport_service.cpp Tue Dec 05 15:43:23 2017 +0100 +++ b/libirccd/irccd/transport_service.cpp Tue Dec 05 16:31:35 2017 +0100 @@ -16,17 +16,27 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include <irccd/sysconfig.hpp> + #include <cassert> #include <irccd/string_util.hpp> #include "command_service.hpp" #include "irccd.hpp" +#include "ip_transport_server.hpp" #include "logger.hpp" #include "transport_client.hpp" -#include "transport_server.hpp" #include "transport_service.hpp" +#if !defined(IRCCD_SYSTEM_WINDOWS) +# include "local_transport_server.hpp" +#endif + +#if defined(HAVE_SSL) +# include "tls_transport_server.hpp" +#endif + namespace irccd { namespace {