aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorreemuru <rimuru@hiahatf.org>2022-03-12 17:00:25 -0500
committerreemuru <rimuru@hiahatf.org>2022-03-13 11:30:48 -0400
commitd1f1947995fa6e773cd782ea9b1294b7a4f32d07 (patch)
treeb3c8cde416b7dc5d931b0bc83202205f79ba692b
parentMerge pull request #8161 (diff)
downloadmonero-d1f1947995fa6e773cd782ea9b1294b7a4f32d07.tar.xz
wallet_rpc_server: support regex for get_accounts tag
This commit adds a 'regexp' boolean field to the get_accounts request. The flag is set to false by default and maintains backwards compatibility. When set to true the user can search tags by regular expression filters. An additional error message was added for failed regular expression searches. Bump minor version to 25.
-rw-r--r--src/wallet/wallet_rpc_server.cpp12
-rw-r--r--src/wallet/wallet_rpc_server_commands_defs.h4
2 files changed, 13 insertions, 3 deletions
diff --git a/src/wallet/wallet_rpc_server.cpp b/src/wallet/wallet_rpc_server.cpp
index a173b5a50..6e126a8f7 100644
--- a/src/wallet/wallet_rpc_server.cpp
+++ b/src/wallet/wallet_rpc_server.cpp
@@ -622,7 +622,7 @@ namespace tools
res.total_unlocked_balance = 0;
cryptonote::subaddress_index subaddr_index = {0,0};
const std::pair<std::map<std::string, std::string>, std::vector<std::string>> account_tags = m_wallet->get_account_tags();
- if (!req.tag.empty() && account_tags.first.count(req.tag) == 0)
+ if (!req.tag.empty() && account_tags.first.count(req.tag) == 0 && !req.regexp)
{
er.code = WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR;
er.message = (boost::format(tr("Tag %s is unregistered.")) % req.tag).str();
@@ -630,7 +630,9 @@ namespace tools
}
for (; subaddr_index.major < m_wallet->get_num_subaddress_accounts(); ++subaddr_index.major)
{
- if (!req.tag.empty() && req.tag != account_tags.second[subaddr_index.major])
+ bool no_match = !req.regexp ? (!req.tag.empty() && req.tag != account_tags.second[subaddr_index.major])
+ : (!req.tag.empty() && !boost::regex_match(account_tags.second[subaddr_index.major], boost::regex(req.tag)));
+ if (no_match)
continue;
wallet_rpc::COMMAND_RPC_GET_ACCOUNTS::subaddress_account_info info;
info.account_index = subaddr_index.major;
@@ -643,6 +645,12 @@ namespace tools
res.total_balance += info.balance;
res.total_unlocked_balance += info.unlocked_balance;
}
+ if (res.subaddress_accounts.size() == 0 && req.regexp)
+ {
+ er.code = WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR;
+ er.message = (boost::format(tr("No matches for regex filter %s .")) % req.tag).str();
+ return false;
+ }
}
catch (const std::exception& e)
{
diff --git a/src/wallet/wallet_rpc_server_commands_defs.h b/src/wallet/wallet_rpc_server_commands_defs.h
index 867ea54bd..2cefe3331 100644
--- a/src/wallet/wallet_rpc_server_commands_defs.h
+++ b/src/wallet/wallet_rpc_server_commands_defs.h
@@ -47,7 +47,7 @@
// advance which version they will stop working with
// Don't go over 32767 for any of these
#define WALLET_RPC_VERSION_MAJOR 1
-#define WALLET_RPC_VERSION_MINOR 24
+#define WALLET_RPC_VERSION_MINOR 25
#define MAKE_WALLET_RPC_VERSION(major,minor) (((major)<<16)|(minor))
#define WALLET_RPC_VERSION MAKE_WALLET_RPC_VERSION(WALLET_RPC_VERSION_MAJOR, WALLET_RPC_VERSION_MINOR)
namespace tools
@@ -243,10 +243,12 @@ namespace wallet_rpc
{
std::string tag; // all accounts if empty, otherwise those accounts with this tag
bool strict_balances;
+ bool regexp; // allow regular expression filters if set to true
BEGIN_KV_SERIALIZE_MAP()
KV_SERIALIZE(tag)
KV_SERIALIZE_OPT(strict_balances, false)
+ KV_SERIALIZE_OPT(regexp, false)
END_KV_SERIALIZE_MAP()
};
typedef epee::misc_utils::struct_init<request_t> request;