Legacy add-ons server. More...
#include <server.hpp>
Classes | |
struct | request |
Client request information object. More... | |
Public Member Functions | |
server (const std::string &cfg_file, unsigned short port=0) | |
server (const config &server)=delete | |
~server () | |
server & | operator= (const config &server)=delete |
Public Member Functions inherited from server_base | |
server_base (unsigned short port, bool keep_alive) | |
virtual | ~server_base () |
int | run () |
template<class SocketPtr > | |
void | coro_send_doc (SocketPtr socket, simple_wml::document &doc, const boost::asio::yield_context &yield) |
Send a WML document from within a coroutine. More... | |
void | coro_send_file (const socket_ptr &socket, const std::string &filename, const boost::asio::yield_context &yield) |
Send contents of entire file directly to socket from within a coroutine. More... | |
void | coro_send_file (tls_socket_ptr socket, const std::string &filename, const boost::asio::yield_context &yield) |
template<class SocketPtr > | |
std::unique_ptr< simple_wml::document > | coro_receive_doc (SocketPtr socket, const boost::asio::yield_context &yield) |
Receive WML document from a coroutine. More... | |
template<class SocketPtr > | |
void | async_send_doc_queued (SocketPtr socket, simple_wml::document &doc) |
High level wrapper for sending a WML document. More... | |
template<class SocketPtr > | |
void | async_send_error (SocketPtr socket, const std::string &msg, const char *error_code="", const info_table &info={}) |
template<class SocketPtr > | |
void | async_send_warning (SocketPtr socket, const std::string &msg, const char *warning_code="", const info_table &info={}) |
std::string | hash_password (const std::string &pw, const std::string &salt, const std::string &username) |
Handles hashing the password provided by the player before comparing it to the hashed password in the forum database. More... | |
Private Types | |
typedef std::function< void(server *, const request &req)> | request_handler |
typedef std::map< std::string, request_handler > | request_handlers_table |
Private Member Functions | |
void | handle_new_client (socket_ptr socket) |
void | handle_new_client (tls_socket_ptr socket) |
template<class Socket > | |
void | serve_requests (Socket socket, boost::asio::yield_context yield) |
void | handle_read_from_fifo (const boost::system::error_code &error, std::size_t bytes_transferred) |
void | handle_sighup (const boost::system::error_code &error, int signal_number) |
void | flush_cfg () |
Starts timer to write config to disk every ten minutes. More... | |
void | handle_flush (const boost::system::error_code &error) |
void | load_config () |
Reads the server configuration from WML. More... | |
void | write_config () |
Writes the server configuration WML back to disk. More... | |
void | load_blacklist () |
Reads the add-ons upload blacklist from WML. More... | |
void | fire (const std::string &hook, const std::string &addon) |
Fires a hook script. More... | |
optional_config | get_addon (const std::string &id) |
Retrieves an addon by id if found, or a null config otherwise. More... | |
void | delete_addon (const std::string &id) |
void | mark_dirty (const std::string &addon) |
ADDON_CHECK_STATUS | validate_addon (const server::request &req, config *&existing_addon, std::string &error_data) |
Performs validation on an incoming add-on. More... | |
const config & | server_info () const |
Retrieves the contents of the [server_info] WML node. More... | |
bool | ignore_address_stats (const std::string &addr) const |
Checks if the specified address should never bump download counts. More... | |
void | register_handlers () |
Registers client request handlers. More... | |
void | handle_server_id (const request &req) |
void | handle_request_campaign_list (const request &req) |
void | handle_request_campaign (const request &req) |
void | handle_request_campaign_hash (const request &req) |
void | handle_request_terms (const request &req) |
void | handle_upload (const request &req) |
void | handle_delete (const request &req) |
void | handle_change_passphrase (const request &req) |
void | handle_list_hidden (const server::request &req) |
void | handle_hide_addon (const request &req) |
void | handle_unhide_addon (const request &req) |
void | handle_addon_downloads_by_version (const request &req) |
void | handle_forum_auth_usage (const request &req) |
void | handle_admins_list (const request &req) |
void | send_message (const std::string &msg, const any_socket_ptr &sock) |
Send a client an informational message. More... | |
void | send_error (const std::string &msg, const any_socket_ptr &sock) |
Send a client an error message. More... | |
void | send_error (const std::string &msg, const std::string &extra_data, unsigned int status_code, const any_socket_ptr &sock) |
Send a client an error message. More... | |
bool | authenticate_forum (const config &addon, const std::string &passphrase, bool is_delete) |
Check whether the provided passphrase matches the add-on and its author by checked against the forum database. More... | |
bool | authenticate_admin (const std::string &username, const std::string &passphrase) |
Private Attributes | |
std::unique_ptr< user_handler > | user_handler_ |
std::set< std::string > | capabilities_ |
std::unordered_map< std::string, config > | addons_ |
The hash map of addons metadata. More... | |
std::unordered_set< std::string > | dirty_addons_ |
The set of unique addon names with pending metadata updates. More... | |
config | cfg_ |
Server config. More... | |
const std::string | cfg_file_ |
bool | read_only_ |
int | compress_level_ |
Used for add-on archives. More... | |
std::chrono::seconds | update_pack_lifespan_ |
bool | strict_versions_ |
std::map< std::string, std::string > | hooks_ |
request_handlers_table | handlers_ |
std::string | server_id_ |
std::string | feedback_url_format_ |
std::string | web_url_ |
std::string | license_notice_ |
blacklist | blacklist_ |
std::string | blacklist_file_ |
std::vector< std::string > | stats_exempt_ips_ |
boost::asio::basic_waitable_timer< std::chrono::steady_clock > | flush_timer_ |
Static Private Attributes | |
static const std::size_t | default_document_size_limit = 100 * 1024 * 1024 |
Default upload size limit in bytes. More... | |
Friends | |
std::ostream & | operator<< (std::ostream &o, const request &r) |
Additional Inherited Members | |
Public Types inherited from server_base | |
typedef std::map< std::string, std::string > | info_table |
Protected Member Functions inherited from server_base | |
void | load_tls_config (const config &cfg) |
void | start_server () |
void | serve (const boost::asio::yield_context &yield, boost::asio::ip::tcp::acceptor &acceptor, const boost::asio::ip::tcp::endpoint &endpoint) |
virtual bool | accepting_connections () const |
virtual bool | ip_exceeds_connection_limit (const std::string &) const |
virtual utils::optional< login_ban_info > | is_ip_banned (const std::string &) |
void | read_from_fifo () |
Protected Attributes inherited from server_base | |
unsigned short | port_ |
bool | keep_alive_ |
boost::asio::io_context | io_service_ |
boost::asio::ssl::context | tls_context_ { boost::asio::ssl::context::sslv23 } |
bool | tls_enabled_ { false } |
boost::asio::ip::tcp::acceptor | acceptor_v6_ |
boost::asio::ip::tcp::acceptor | acceptor_v4_ |
uint32_t | handshake_response_ |
boost::asio::posix::stream_descriptor | input_ |
std::string | fifo_path_ |
boost::asio::streambuf | admin_cmd_ |
boost::asio::signal_set | sighup_ |
Legacy add-ons server.
Definition at line 39 of file server.hpp.
|
private |
Definition at line 102 of file server.hpp.
|
private |
Definition at line 103 of file server.hpp.
|
explicit |
Definition at line 277 of file server.cpp.
References addons_, flush_cfg(), load_config(), LOG_CS, game_config::path, server_base::port_, register_handlers(), and server_base::start_server().
|
delete |
campaignd::server::~server | ( | ) |
Definition at line 326 of file server.cpp.
References write_config().
|
private |
username | The username to check the passphrase against. |
passphrase | The passphrase to use for authentication. |
Definition at line 2125 of file server.cpp.
References server_base::hash_password(), and user_handler_.
Referenced by handle_delete(), handle_hide_addon(), handle_list_hidden(), and handle_unhide_addon().
|
private |
Check whether the provided passphrase matches the add-on and its author by checked against the forum database.
addon | The add-on uploaded, which contains the username to use. |
passphrase | The passphrase to use for authentication. |
is_delete | Whether the authentication is being requested for an add-on upload or an add-on deletion. |
Definition at line 2100 of file server.cpp.
References server_base::hash_password(), server_id_, and user_handler_.
Referenced by handle_delete(), and validate_addon().
|
private |
Definition at line 902 of file server.cpp.
References addons_, filesystem::delete_directory(), ERR_CS, fire(), get_addon(), LOG_CS, server_id_, user_handler_, and write_config().
Referenced by handle_delete(), and handle_read_from_fifo().
|
private |
Fires a hook script.
Definition at line 799 of file server.cpp.
References ERR_CS, hooks_, and PLAIN_LOG.
Referenced by delete_addon(), and handle_upload().
|
private |
Starts timer to write config to disk every ten minutes.
Definition at line 740 of file server.cpp.
References flush_timer_, and handle_flush().
Referenced by handle_flush(), and server().
|
private |
Retrieves an addon by id if found, or a null config otherwise.
Definition at line 892 of file server.cpp.
References addons_.
Referenced by delete_addon(), handle_change_passphrase(), handle_delete(), handle_hide_addon(), handle_read_from_fifo(), handle_request_campaign(), handle_request_campaign_hash(), handle_unhide_addon(), load_config(), and write_config().
|
private |
Definition at line 2046 of file server.cpp.
References server_base::async_send_doc_queued(), campaignd::server::request::cfg, simple_wml::document::compress(), simple_wml::INIT_STATIC, server_id_, campaignd::server::request::sock, user_handler_, and write().
|
private |
Definition at line 2082 of file server.cpp.
References server_base::async_send_doc_queued(), simple_wml::document::compress(), simple_wml::INIT_STATIC, campaignd::server::request::sock, user_handler_, and write().
|
private |
Definition at line 1931 of file server.cpp.
References campaignd::server::request::cfg, dirty_addons_, get_addon(), LOG_CS, read_only_, send_error(), send_message(), campaignd::server::request::sock, and write_config().
|
private |
Definition at line 1875 of file server.cpp.
References authenticate_admin(), authenticate_forum(), campaignd::server::request::cfg, delete_addon(), config_attribute_value::empty(), utf8::erase(), get_addon(), LOG_CS, read_only_, send_error(), send_message(), campaignd::server::request::sock, and config_attribute_value::str().
|
private |
Definition at line 746 of file server.cpp.
References ERR_CS, flush_cfg(), and write_config().
Referenced by flush_cfg().
|
private |
Definition at line 2064 of file server.cpp.
References server_base::async_send_doc_queued(), simple_wml::document::compress(), simple_wml::INIT_STATIC, server_id_, campaignd::server::request::sock, user_handler_, and write().
|
private |
Definition at line 1963 of file server.cpp.
References authenticate_admin(), campaignd::server::request::cfg, ERR_CS, get_addon(), LOG_CS, mark_dirty(), send_error(), send_message(), campaignd::server::request::sock, and write_config().
|
private |
Definition at line 2018 of file server.cpp.
References config::add_child(), addons_, server_base::async_send_doc_queued(), authenticate_admin(), campaignd::server::request::cfg, simple_wml::document::compress(), simple_wml::INIT_STATIC, send_error(), campaignd::server::request::sock, and write().
|
privatevirtual |
Implements server_base.
Definition at line 492 of file server.cpp.
References e, server_base::io_service_, and serve_requests().
|
privatevirtual |
Implements server_base.
|
privatevirtual |
Implements server_base.
Definition at line 548 of file server.cpp.
References server_base::admin_cmd_, campaignd::control_line::args_count(), cfg_, campaignd::control_line::cmd(), lg::debug(), delete_addon(), lg::err(), ERR_CS, campaignd::control_line::full(), get_addon(), lg::logger::get_severity(), i, lg::info(), lg::LG_NONE, load_blacklist(), load_config(), LOG_CS, mark_dirty(), lg::precise_timestamps(), server_base::read_from_fifo(), read_only_, lg::set_log_domain_severity(), utils::split(), utils::string_bool(), lg::warn(), and write_config().
|
private |
Definition at line 1088 of file server.cpp.
References campaignd::server::request::addr, config::append(), campaignd::server::request::cfg, config::child_range(), simple_wml::document::compress(), server_base::coro_send_doc(), server_base::coro_send_file(), config::empty(), ERR_CS, filesystem::file_size(), get_addon(), campaignd::get_version_map(), ignore_address_stats(), in, simple_wml::INIT_STATIC, filesystem::istream_file(), LOG_CS, mark_dirty(), read_gz(), send_error(), server_id_, campaignd::server::request::sock, user_handler_, write(), and campaignd::server::request::yield.
|
private |
Definition at line 1232 of file server.cpp.
References campaignd::server::request::cfg, server_base::coro_send_file(), filesystem::file_size(), get_addon(), campaignd::get_version_map(), LOG_CS, game_config::path, send_error(), campaignd::server::request::sock, and campaignd::server::request::yield.
|
private |
Definition at line 976 of file server.cpp.
References config::add_child(), addons_, server_base::async_send_doc_queued(), campaignd::server::request::cfg, config::child_or_empty(), config::child_range(), simple_wml::document::compress(), config::empty(), feedback_url_format_, campaignd::format_addon_feedback_url(), i, simple_wml::INIT_STATIC, LOG_CS, chrono::parse_timestamp(), chrono::serialize_timestamp(), campaignd::server::request::sock, and write().
|
private |
Definition at line 1278 of file server.cpp.
References license_notice_, LOG_CS, read_only_, send_error(), send_message(), and campaignd::server::request::sock.
|
private |
Definition at line 956 of file server.cpp.
References server_base::async_send_doc_queued(), capabilities_, simple_wml::document::compress(), DBG_CS, simple_wml::INIT_STATIC, utils::join(), license_notice_, game_config::revision, server_id_, campaignd::server::request::sock, web_url_, and write().
|
privatevirtual |
Implements server_base.
Definition at line 727 of file server.cpp.
References load_config(), LOG_CS, and server_base::sighup_.
|
private |
Definition at line 1991 of file server.cpp.
References authenticate_admin(), campaignd::server::request::cfg, ERR_CS, get_addon(), LOG_CS, mark_dirty(), send_error(), send_message(), campaignd::server::request::sock, and write_config().
|
private |
Definition at line 1507 of file server.cpp.
References config::add_child(), campaignd::add_license(), addon_check_status_desc(), addons_, campaignd::server::request::addr, campaignd::server::request::cfg, config::child_range(), config::clear(), config::clear_children(), compress_level_, config::copy_or_remove_attributes(), campaignd::data_apply_addlist(), campaignd::data_apply_removelist(), filesystem::delete_file(), ERR_CS, filesystem::file_size(), campaignd::find_translations(), fire(), campaignd::get_version_map(), in, filesystem::istream_file(), LOG_CS, make_updatepack(), mark_dirty(), wfl::msg(), config::optional_child(), p, chrono::parse_timestamp(), read_gz(), config::remove_children(), send_error(), send_message(), chrono::serialize_timestamp(), SERVER_DELTA_NO_VERSIONS, server_id_, SERVER_UNSPECIFIED, campaignd::server::request::sock, utils::split(), version_info::str(), SUCCESS, update_pack_lifespan_, user_handler_, validate_addon(), write_config(), and write_hashlist().
|
private |
Checks if the specified address should never bump download counts.
Definition at line 838 of file server.cpp.
References stats_exempt_ips_, and utils::wildcard_string_match().
Referenced by handle_request_campaign().
|
private |
Reads the add-ons upload blacklist from WML.
Definition at line 756 of file server.cpp.
References blacklist_, blacklist_file_, campaignd::blacklist::clear(), ERR_CS, in, filesystem::istream_file(), LOG_CS, read(), and campaignd::blacklist::read().
Referenced by handle_read_from_fifo(), and load_config().
|
private |
Reads the server configuration from WML.
Definition at line 331 of file server.cpp.
References addons_, blacklist_file_, cfg_, cfg_file_, config::child_count(), config::child_range(), config::clear_children(), filesystem::atomic_commit::commit(), compress_level_, data, default_campaignd_port, default_document_size_limit, filesystem::delete_file(), simple_wml::document::document_size_limit, config::empty(), ERR_CS, feedback_url_format_, server_base::fifo_path_, utils::find(), get_addon(), filesystem::get_files_in_dir(), config::has_child(), hooks_, in, server_base::input_, filesystem::istream_file(), license_notice_, load_blacklist(), server_base::load_tls_config(), LOG_CS, config::mandatory_child(), mark_dirty(), filesystem::normalize_path(), config::optional_child(), filesystem::atomic_commit::ostream(), chrono::parse_duration(), game_config::path, server_base::port_, read(), server_base::read_from_fifo(), read_gz(), read_only_, server_id_, server_info(), utils::split(), stats_exempt_ips_, strict_versions_, update_pack_lifespan_, user_handler_, web_url_, config_writer::write(), write_config(), write_hashlist(), and WRN_CS.
Referenced by handle_read_from_fifo(), handle_sighup(), and server().
|
inlineprivate |
Definition at line 185 of file server.hpp.
References dirty_addons_.
Referenced by handle_hide_addon(), handle_read_from_fifo(), handle_request_campaign(), handle_unhide_addon(), handle_upload(), and load_config().
|
private |
Registers client request handlers.
This is called by the class constructor. Individual handlers must be methods of this class that take a single parameter of type request and they are registered using the register_handler method.
When adding new handlers, make sure to update the implementation of this method accordingly so they are recognized and invoked at runtime.
Definition at line 938 of file server.cpp.
References REGISTER_CAMPAIGND_HANDLER.
Referenced by server().
|
private |
Send a client an error message.
The WML sent consists of a document containing a single [error] child with a message attribute holding the value of msg. In addition to sending the error to the client, a line with the client IP and message is recorded to the server log.
Definition at line 862 of file server.cpp.
References simple_wml::node::add_child(), server_base::async_send_doc_queued(), campaignd::client_address(), ERR_CS, wfl::msg(), simple_wml::document::root(), and simple_wml::node::set_attr_dup().
Referenced by handle_change_passphrase(), handle_delete(), handle_hide_addon(), handle_list_hidden(), handle_request_campaign(), handle_request_campaign_hash(), handle_request_terms(), handle_unhide_addon(), handle_upload(), and serve_requests().
|
private |
Send a client an error message.
The WML sent consists of a document containing a single [error] child with a message attribute holding the value of msg, an extra_data attribute holding the value of extra_data, and a status_code attribute holding the value of status_code. In addition to sending the error to the client, a line with the client IP and message is recorded to the server log.
Definition at line 871 of file server.cpp.
References simple_wml::node::add_child(), server_base::async_send_doc_queued(), campaignd::client_address(), ERR_CS, wfl::msg(), simple_wml::document::root(), and simple_wml::node::set_attr_dup().
|
private |
Send a client an informational message.
The WML sent consists of a document containing a single [message] child with a message attribute holding the value of msg.
Definition at line 850 of file server.cpp.
References simple_wml::node::add_child(), server_base::async_send_doc_queued(), wfl::msg(), simple_wml::document::root(), and simple_wml::node::set_attr_dup().
Referenced by handle_change_passphrase(), handle_delete(), handle_hide_addon(), handle_request_terms(), handle_unhide_addon(), and handle_upload().
|
private |
Definition at line 513 of file server.cpp.
References c, server_base::coro_receive_doc(), data, handlers_, i, read(), and send_error().
Referenced by handle_new_client().
|
inlineprivate |
Retrieves the contents of the [server_info] WML node.
Definition at line 210 of file server.hpp.
References cfg_, and config::child_or_empty().
Referenced by load_config().
|
private |
Performs validation on an incoming add-on.
req | Server request info, containing either a full WML pack, or a delta update pack. |
existing_addon | Used to store a pointer to the existing add-on WML on the server if the add-on already exists. nullptr is stored otherwise. |
error_data | Used to store extra error data for status codes other than ADDON_CHECK_STATUS::SUCCESS. Cleared otherwise. |
Definition at line 1292 of file server.cpp.
References addon_icon_too_large(), addon_name_legal(), ADDON_UNKNOWN, addons_, campaignd::server::request::addr, AUTH_TYPE_MISMATCH, authenticate_forum(), BAD_FEEDBACK_TOPIC_ID, BAD_NAME, BAD_TYPE, blacklist_, c, campaignd::server::request::cfg, config::clear(), data, DENIED, EMPTY_PACK, ERR_CS, FEEDBACK_TOPIC_ID_NOT_FOUND, FILENAME_CASE_CONFLICT, get_addon_type(), ICON_TOO_LARGE, ILLEGAL_FILENAME, INVALID_UTF8_ATTRIBUTE, INVALID_UTF8_NAME, campaignd::blacklist::is_blacklisted(), campaignd::is_text_markup_char(), utils::join(), LOG_CS, utf8::lowercase(), NAME_HAS_MARKUP, NO_AUTHOR, NO_DESCRIPTION, NO_EMAIL, NO_PASSPHRASE, NO_TITLE, NO_VERSION, config::optional_child(), read_only_, SERVER_ADDONS_LIST, SERVER_FORUM_AUTH_DISABLED, SERVER_READ_ONLY, utils::split(), utils::stoi(), version_info::str(), strict_versions_, SUCCESS, TITLE_HAS_MARKUP, UNAUTHORIZED, UNEXPECTED_DELTA, USER_DOES_NOT_EXIST, user_handler_, and VERSION_NOT_INCREMENTED.
Referenced by handle_upload().
|
private |
Writes the server configuration WML back to disk.
Definition at line 779 of file server.cpp.
References cfg_, cfg_file_, filesystem::atomic_commit::commit(), DBG_CS, dirty_addons_, get_addon(), filesystem::normalize_path(), filesystem::atomic_commit::ostream(), and write().
Referenced by delete_addon(), handle_change_passphrase(), handle_flush(), handle_hide_addon(), handle_read_from_fifo(), handle_unhide_addon(), handle_upload(), load_config(), and ~server().
|
friend |
Definition at line 486 of file server.cpp.
|
private |
The hash map of addons metadata.
Definition at line 108 of file server.hpp.
Referenced by delete_addon(), get_addon(), handle_list_hidden(), handle_request_campaign_list(), handle_upload(), load_config(), server(), and validate_addon().
|
private |
Definition at line 135 of file server.hpp.
Referenced by load_blacklist(), and validate_addon().
|
private |
Definition at line 136 of file server.hpp.
Referenced by load_blacklist(), and load_config().
|
private |
Definition at line 105 of file server.hpp.
Referenced by handle_server_id().
|
private |
Server config.
Definition at line 113 of file server.hpp.
Referenced by handle_read_from_fifo(), load_config(), server_info(), and write_config().
|
private |
Definition at line 114 of file server.hpp.
Referenced by load_config(), and write_config().
|
private |
Used for add-on archives.
Definition at line 117 of file server.hpp.
Referenced by handle_upload(), and load_config().
|
staticprivate |
Default upload size limit in bytes.
Definition at line 123 of file server.hpp.
Referenced by load_config().
|
private |
The set of unique addon names with pending metadata updates.
Definition at line 110 of file server.hpp.
Referenced by handle_change_passphrase(), mark_dirty(), and write_config().
|
private |
Definition at line 130 of file server.hpp.
Referenced by handle_request_campaign_list(), and load_config().
|
private |
Definition at line 140 of file server.hpp.
Referenced by flush_cfg().
|
private |
Definition at line 126 of file server.hpp.
Referenced by serve_requests().
|
private |
Definition at line 125 of file server.hpp.
Referenced by fire(), and load_config().
|
private |
Definition at line 133 of file server.hpp.
Referenced by handle_request_terms(), handle_server_id(), and load_config().
|
private |
Definition at line 116 of file server.hpp.
Referenced by handle_change_passphrase(), handle_delete(), handle_read_from_fifo(), handle_request_terms(), load_config(), and validate_addon().
|
private |
Definition at line 128 of file server.hpp.
Referenced by authenticate_forum(), delete_addon(), handle_addon_downloads_by_version(), handle_forum_auth_usage(), handle_request_campaign(), handle_server_id(), handle_upload(), and load_config().
|
private |
Definition at line 138 of file server.hpp.
Referenced by ignore_address_stats(), and load_config().
|
private |
Definition at line 120 of file server.hpp.
Referenced by load_config(), and validate_addon().
|
private |
Definition at line 118 of file server.hpp.
Referenced by handle_upload(), and load_config().
|
private |
Definition at line 101 of file server.hpp.
Referenced by authenticate_admin(), authenticate_forum(), delete_addon(), handle_addon_downloads_by_version(), handle_admins_list(), handle_forum_auth_usage(), handle_request_campaign(), handle_upload(), load_config(), and validate_addon().
|
private |
Definition at line 132 of file server.hpp.
Referenced by handle_server_id(), and load_config().