Fixed uninitialized rpc slots when SCGI is not used.

This commit is contained in:
Jari Sundell
2025-08-25 08:56:15 +02:00
committed by GitHub
parent bb1cdfc0e7
commit d35a8d68e6
6 changed files with 68 additions and 56 deletions
+4 -4
View File
@@ -27,7 +27,7 @@ CommandMap::insert(const key_type& key, int flags, const char* parm, const char*
throw torrent::internal_error("CommandMap::insert(...) tried to insert an already existing key.");
// TODO: This is not honoring the public_xmlrpc flags!!!
if (rpc::rpc.is_initialized() && (flags & flag_public_rpc))
if (rpc::rpc.is_handlers_initialized() && (flags & flag_public_rpc))
rpc::rpc.insert_command(key.c_str(), parm, doc);
return base_type::insert(itr, value_type(key, command_map_data_type(flags, parm, doc)));
@@ -55,10 +55,10 @@ CommandMap::create_redirect(const key_type& key_new, const key_type& key_dest, i
if (dest_itr == base_type::end())
throw torrent::input_error("Tried to redirect to a key that doesn't exist: '" + std::string(key_dest) + "'.");
if (new_itr != base_type::end())
throw torrent::input_error("Tried to create a redirect key that already exists: '" + std::string(key_new) + "'.");
if (dest_itr->second.m_flags & flag_is_redirect)
throw torrent::input_error("Tried to redirect to a key that is not marked 'flag_is_redirect': '" +
std::string(key_dest) + "'.");
@@ -68,7 +68,7 @@ CommandMap::create_redirect(const key_type& key_new, const key_type& key_dest, i
flags |= dest_itr->second.m_flags & ~(flag_has_redirects | flag_public_rpc);
// TODO: This is not honoring the public_xmlrpc flags!!!
if (rpc::rpc.is_initialized() && (flags & flag_public_rpc))
if (rpc::rpc.is_handlers_initialized() && (flags & flag_public_rpc))
rpc::rpc.insert_command(key_new.c_str(), dest_itr->second.m_parm, dest_itr->second.m_doc);
iterator itr = base_type::insert(base_type::end(),
+13 -8
View File
@@ -21,8 +21,10 @@ RpcManager::object_to_target(const torrent::Object& obj, int call_flags, rpc::ta
if (!obj.is_string()) {
throw torrent::input_error("invalid parameters: target must be a string");
}
std::string target_string = obj.as_string();
bool require_index = (call_flags & (CommandMap::flag_tracker_target | CommandMap::flag_file_target));
if (target_string.size() == 0 && !require_index) {
return;
}
@@ -37,24 +39,27 @@ RpcManager::object_to_target(const torrent::Object& obj, int call_flags, rpc::ta
std::string index;
const auto& delim_pos = target_string.find_first_of(':', 40);
if (delim_pos == target_string.npos ||
delim_pos + 2 >= target_string.size()) {
if (require_index) {
throw torrent::input_error("invalid parameters: no index");
}
hash = target_string;
} else {
hash = target_string.substr(0, delim_pos);
type = target_string[delim_pos + 1];
index = target_string.substr(delim_pos + 2);
}
core::Download* download = rpc.slot_find_download()(hash.c_str());
if (download == nullptr)
throw torrent::input_error("invalid parameters: info-hash not found");
try {
torrent::tracker::Tracker* tracker;
torrent::tracker::Tracker* tracker{};
switch (type) {
case 'd':
@@ -126,15 +131,20 @@ RpcManager::process(RPCType type, const char* in_buffer, uint32_t length, slot_r
}
void
RpcManager::initialize() {
RpcManager::initialize_handlers() {
if (m_handlers_initialized)
throw torrent::internal_error("handlers already initialized");
m_xmlrpc.initialize();
m_jsonrpc.initialize();
m_initialized = true;
m_handlers_initialized = true;
}
void
RpcManager::cleanup() {
m_handlers_initialized = false;
m_xmlrpc.cleanup();
m_jsonrpc.cleanup();
}
@@ -165,11 +175,6 @@ RpcManager::set_type_enabled(RPCType type, bool enabled) {
}
}
bool
RpcManager::is_initialized() const {
return m_initialized;
}
void
RpcManager::insert_command(const char* name, const char* parm, const char* doc) {
m_xmlrpc.insert_command(name, parm, doc);
+14 -12
View File
@@ -48,14 +48,16 @@ public:
RpcManager() = default;
~RpcManager() = default;
void initialize();
void cleanup();
bool is_initialized() const;
bool is_handlers_initialized() const { return m_handlers_initialized; }
int64_t size_limit() { return m_xmlrpc.size_limit(); };
void initialize_handlers();
void cleanup();
int64_t size_limit() { return m_xmlrpc.size_limit(); };
void set_size_limit(uint64_t size) { m_xmlrpc.set_size_limit(size); };
int dialect() { return m_xmlrpc.dialect(); }
void set_dialect(int dialect) { m_xmlrpc.set_dialect(dialect); }
int dialect() { return m_xmlrpc.dialect(); }
void set_dialect(int dialect) { m_xmlrpc.set_dialect(dialect); }
bool is_type_enabled(RPCType type) const;
void set_type_enabled(RPCType type, bool enabled);
@@ -65,9 +67,9 @@ public:
void insert_command(const char* name, const char* parm, const char* doc);
slot_download& slot_find_download() { return m_slot_find_download; }
slot_file& slot_find_file() { return m_slot_find_file; }
slot_tracker& slot_find_tracker() { return m_slot_find_tracker; }
slot_peer& slot_find_peer() { return m_slot_find_peer; }
slot_file& slot_find_file() { return m_slot_find_file; }
slot_tracker& slot_find_tracker() { return m_slot_find_tracker; }
slot_peer& slot_find_peer() { return m_slot_find_peer; }
static void object_to_target(const torrent::Object& obj, int callFlags, rpc::target_type* target, std::function<void()>* deleter);
@@ -75,9 +77,9 @@ private:
XmlRpc m_xmlrpc;
JsonRpc m_jsonrpc;
bool m_initialized = false;
bool m_is_jsonrpc_enabled = true;
bool m_is_xmlrpc_enabled = true;
bool m_handlers_initialized{};
bool m_is_jsonrpc_enabled{true};
bool m_is_xmlrpc_enabled{true};
slot_download m_slot_find_download;
slot_file m_slot_find_file;