From c146034bd12497f4b44bd4570ae789cd5d0bf11a Mon Sep 17 00:00:00 2001 From: kabachuha Date: Sun, 30 Aug 2020 23:59:45 +0300 Subject: [PATCH] Added a request for addon hashes --- src/server/campaignd/server.cpp | 45 +++++++++++++++++++++++++++++++++ src/server/campaignd/server.hpp | 1 + 2 files changed, 46 insertions(+) diff --git a/src/server/campaignd/server.cpp b/src/server/campaignd/server.cpp index 77106ecf0965..2c432a816390 100644 --- a/src/server/campaignd/server.cpp +++ b/src/server/campaignd/server.cpp @@ -648,6 +648,7 @@ void server::register_handlers() { REGISTER_CAMPAIGND_HANDLER(request_campaign_list); REGISTER_CAMPAIGND_HANDLER(request_campaign); + REGISTER_CAMPAIGND_HANDLER(request_campaign_hash); REGISTER_CAMPAIGND_HANDLER(request_terms); REGISTER_CAMPAIGND_HANDLER(upload); REGISTER_CAMPAIGND_HANDLER(delete); @@ -871,6 +872,50 @@ void server::handle_request_campaign(const server::request& req) } } +void server::handle_request_campaign_hash(const server::request& req) +{ + config& campaign = get_addon(req.cfg["name"]); + + if(!campaign || campaign["hidden"].to_bool()) { + send_error("Add-on '" + req.cfg["name"].str() + "' not found.", req.sock); + return; + } + + std::string to = req.cfg["version"].str(); + if(to.empty()) { + send_error("No version of the add-on '" + req.cfg["name"].str() + "' was specified for a hash list request.", req.sock); + return; + } + + std::string filename = campaign["filename"].str(); + + auto version_map = get_version_map(campaign); + + if(version_map.empty()) { + send_error("No versions of the add-on '" + req.cfg["name"].str() + "' are available on the server.", req.sock); + return; + } else { + auto version = version_map.find(version_info(to)); + if(version != version_map.end()) { + filename += version->second["filename"].str(); + } else { + send_error("The selected version (" + to + ") of the add-on '" + req.cfg["name"].str() + "' has not been found by the server.", req.sock); + return; + } + + filename += ".hash"; + int file_size = filesystem::file_size(filename); + + if(file_size < 0) { + send_error("No pregenerated hash file for the add-on '" + req.cfg["name"].str() + "' has been found by the server.", req.sock); + return; + } + + LOG_CS << "sending the hash list of the campaign '" << req.cfg["name"] << "' to " << req.addr << " size: " << file_size / 1024 << "KiB\n"; + async_send_file(req.sock, filename, std::bind(&server::handle_new_client, this, _1), null_handler); + } +} + void server::handle_request_terms(const server::request& req) { // This usually means the client wants to upload content, so tell it diff --git a/src/server/campaignd/server.hpp b/src/server/campaignd/server.hpp index 6efdbbcb7db3..d1c9b7f7e737 100644 --- a/src/server/campaignd/server.hpp +++ b/src/server/campaignd/server.hpp @@ -174,6 +174,7 @@ class server : public server_base void handle_request_campaign_list(const request&);//#TODO: rename with 'addon' later? void handle_request_campaign(const request&); + void handle_request_campaign_hash(const request&); void handle_request_terms(const request&); void handle_upload(const request&); void handle_delete(const request&);