33 #include <boost/asio/io_service.hpp> 34 #include <boost/asio/ip/tcp.hpp> 36 #include <boost/asio/posix/stream_descriptor.hpp> 38 #include <boost/asio/signal_set.hpp> 39 #include <boost/asio/streambuf.hpp> 40 #include <boost/asio/ssl.hpp> 41 #include <boost/asio/spawn.hpp> 42 #include <boost/shared_array.hpp> 50 typedef std::shared_ptr<boost::asio::ip::tcp::socket>
socket_ptr;
51 typedef std::shared_ptr<boost::asio::ssl::stream<socket_ptr::element_type>>
tls_socket_ptr;
56 boost::system::error_code
ec;
81 template<
class SocketPtr>
void send_doc_queued(SocketPtr socket, std::unique_ptr<simple_wml::document>& doc_ptr, boost::asio::yield_context yield);
94 template<
class SocketPtr>
void coro_send_doc(SocketPtr socket,
simple_wml::document& doc, boost::asio::yield_context yield);
101 void coro_send_file(
socket_ptr socket,
const std::string& filename, boost::asio::yield_context yield);
102 void coro_send_file(
tls_socket_ptr socket,
const std::string& filename, boost::asio::yield_context yield);
109 template<
class SocketPtr> std::unique_ptr<simple_wml::document> coro_receive_doc(SocketPtr socket, boost::asio::yield_context yield);
119 template<
class SocketPtr>
void async_send_doc_queued(SocketPtr socket,
simple_wml::document& doc);
122 template<
class SocketPtr>
void async_send_error(SocketPtr socket,
const std::string&
msg,
const char* error_code =
"",
const info_table&
info = {});
123 template<
class SocketPtr>
void async_send_warning(SocketPtr socket,
const std::string& msg,
const char* warning_code =
"",
const info_table&
info = {});
132 std::string create_unsecure_nonce(
int length = 8);
139 std::string create_secure_nonce();
148 std::string hash_password(
const std::string& pw,
const std::string& salt,
const std::string& username);
154 boost::asio::ssl::context tls_context_ { boost::asio::ssl::context::sslv23 };
155 bool tls_enabled_ {
false };
159 void load_tls_config(
const config& cfg);
162 void serve(boost::asio::yield_context yield, boost::asio::ip::tcp::acceptor& acceptor, boost::asio::ip::tcp::endpoint endpoint);
166 virtual void handle_new_client(
socket_ptr socket) = 0;
170 virtual std::string
is_ip_banned(
const std::string&) {
return std::string(); }
174 boost::asio::posix::stream_descriptor
input_;
176 void read_from_fifo();
177 virtual void handle_read_from_fifo(
const boost::system::error_code&
error, std::size_t bytes_transferred) = 0;
181 virtual void handle_sighup(
const boost::system::error_code&
error,
int signal_number) = 0;
184 void handle_termination(
const boost::system::error_code&
error,
int signal_number);
187 template<
class SocketPtr> std::string
client_address(SocketPtr socket);
189 template<
class SocketPtr>
bool check_error(
const boost::system::error_code&
error, SocketPtr socket);
boost::asio::ip::tcp::acceptor acceptor_v4_
boost::asio::signal_set sighup_
boost::system::error_code ec
static void msg(const char *act, debug_info &i, const char *to="", const char *result="")
server_shutdown(const std::string &msg, boost::system::error_code ec={})
Base class for implementing servers that use gzipped-WML network protocol.
std::string client_address(SocketPtr socket)
utils::variant< socket_ptr, tls_socket_ptr > any_socket_ptr
boost::asio::streambuf admin_cmd_
std::string log_address(SocketPtr socket)
boost::asio::io_service io_service_
boost::asio::ip::tcp::acceptor acceptor_v6_
virtual bool accepting_connections() const
constexpr bool decayed_is_same
Equivalent to as std::is_same_v except both types are passed through std::decay first.
virtual bool ip_exceeds_connection_limit(const std::string &) const
uint32_t handshake_response_
bool check_error(const boost::system::error_code &error, SocketPtr socket)
std::map< std::string, std::string > info_table
virtual std::string is_ip_banned(const std::string &)
boost::asio::posix::stream_descriptor input_
Base class for all the errors encountered by the engine.
std::shared_ptr< boost::asio::ssl::stream< socket_ptr::element_type > > tls_socket_ptr
std::shared_ptr< boost::asio::ip::tcp::socket > socket_ptr
MacOS doesn't support std::visit when targing MacOS < 10.14 (currently we target 10.11).
A config object defines a single node in a WML file, with access to child nodes.
boost::asio::signal_set sigs_