Strict checking of d.views push_back arguments.

This commit is contained in:
rakshasa
2025-08-01 10:08:12 +02:00
committed by Jari Sundell
parent f1a4c13c41
commit 4492715737
3 changed files with 40 additions and 7 deletions
+21 -2
View File
@@ -550,6 +550,14 @@ d_list_push_back(core::Download* download, const torrent::Object& rawArgs, const
return torrent::Object();
}
torrent::Object
d_list_push_back_string(core::Download* download, const torrent::Object& rawArgs, const char* first_key, const char* second_key) {
auto& arg = rawArgs.as_string();
download_get_variable(download, first_key, second_key).as_list().push_back(arg);
return torrent::Object();
}
torrent::Object
d_list_push_back_unique(core::Download* download, const torrent::Object& rawArgs, const char* first_key, const char* second_key) {
const torrent::Object& args = (rawArgs.is_list() && !rawArgs.as_list().empty()) ? rawArgs.as_list().front() : rawArgs;
@@ -561,6 +569,17 @@ d_list_push_back_unique(core::Download* download, const torrent::Object& rawArgs
return torrent::Object();
}
torrent::Object
d_list_push_back_unique_string(core::Download* download, const torrent::Object& rawArgs, const char* first_key, const char* second_key) {
auto& arg = rawArgs.as_string();
torrent::Object::list_type& list = download_get_variable(download, first_key, second_key).as_list();
if (std::none_of(list.begin(), list.end(), [arg](const torrent::Object& obj) { return torrent::object_equal(obj, arg); }))
list.push_back(arg);
return torrent::Object();
}
torrent::Object
d_list_has(core::Download* download, const torrent::Object& rawArgs, const char* first_key, const char* second_key) {
const torrent::Object& args = (rawArgs.is_list() && !rawArgs.as_list().empty()) ? rawArgs.as_list().front() : rawArgs;
@@ -773,8 +792,8 @@ initialize_command_download() {
CMD2_DL ("d.views", std::bind(&download_get_variable, std::placeholders::_1, "rtorrent", "views"));
CMD2_DL ("d.views.has", std::bind(&d_list_has, std::placeholders::_1, std::placeholders::_2, "rtorrent", "views"));
CMD2_DL ("d.views.remove", std::bind(&d_list_remove, std::placeholders::_1, std::placeholders::_2, "rtorrent", "views"));
CMD2_DL ("d.views.push_back", std::bind(&d_list_push_back, std::placeholders::_1, std::placeholders::_2, "rtorrent", "views"));
CMD2_DL ("d.views.push_back_unique", std::bind(&d_list_push_back_unique, std::placeholders::_1, std::placeholders::_2, "rtorrent", "views"));
CMD2_DL ("d.views.push_back", std::bind(&d_list_push_back_string, std::placeholders::_1, std::placeholders::_2, "rtorrent", "views"));
CMD2_DL ("d.views.push_back_unique", std::bind(&d_list_push_back_unique_string, std::placeholders::_1, std::placeholders::_2, "rtorrent", "views"));
// This command really needs to be improved, so we have proper
// logging support.
+19 -3
View File
@@ -11,7 +11,15 @@
CPPUNIT_TEST_SUITE_REGISTRATION(TestXmlrpc);
torrent::Object xmlrpc_cmd_test_reflect([[maybe_unused]] rpc::target_type t, const torrent::Object& obj) { return obj; }
torrent::Object
xmlrpc_cmd_test_reflect([[maybe_unused]] rpc::target_type t, const torrent::Object& obj) {
return obj;
}
torrent::Object
xmlrpc_cmd_([[maybe_unused]] rpc::target_type t, const torrent::Object& obj) {
return obj;
}
void initialize_command_dynamic();
@@ -109,9 +117,17 @@ TestXmlrpc::setUp() {
setlocale(LC_ALL, "");
control = new Control;
if (rpc::commands.find("xmlrpc_reflect") == rpc::commands.end()) {
if (rpc::commands.find("xmlrpc_reflect") == rpc::commands.end())
CMD2_ANY("xmlrpc_reflect", &xmlrpc_cmd_test_reflect);
}
// TODO: Check if rtorrent:views must be initialized.
// TODO: Add checks to d.views that only allows strings.
// CMD2_DL ("d.views", std::bind(&download_get_variable, std::placeholders::_1, "rtorrent", "views"));
// CMD2_DL ("d.views.has", std::bind(&d_list_has, std::placeholders::_1, std::placeholders::_2, "rtorrent", "views"));
// CMD2_DL ("d.views.remove", std::bind(&d_list_remove, std::placeholders::_1, std::placeholders::_2, "rtorrent", "views"));
// CMD2_DL ("d.views.push_back", std::bind(&d_list_push_back, std::placeholders::_1, std::placeholders::_2, "rtorrent", "views"));
// CMD2_DL ("d.views.push_back_unique", std::bind(&d_list_push_back_unique, std::placeholders::_1, std::placeholders::_2, "rtorrent", "views"));
}
void
-2
View File
@@ -27,6 +27,4 @@ private:
std::unique_ptr<TestMainThread> m_test_main_thread;
rpc::XmlRpc m_xmlrpc;
rpc::CommandMap m_map;
rpc::command_base m_commands[cmd_size];
};