From ddcd0383d58364fcc52534ab02146d6f72bc4d7b Mon Sep 17 00:00:00 2001 From: Aidar Date: Fri, 9 May 2025 19:36:26 +0500 Subject: [PATCH 1/3] Correcting XML construction in BaseClient::RemoveObjects(RemoveObjectsApiArgs args) --- include/miniocpp/utils.h | 3 +++ src/baseclient.cc | 1 + src/utils.cc | 10 +++++++++- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/include/miniocpp/utils.h b/include/miniocpp/utils.h index a46ea243..114d6e32 100644 --- a/include/miniocpp/utils.h +++ b/include/miniocpp/utils.h @@ -69,6 +69,9 @@ std::string Trim(std::string_view str, char ch = ' '); // whitespaces. bool CheckNonEmptyString(std::string_view str); +// Replace all occurrences of pattern with replacement +void ReplaceAll(std::string& str, std::string_view pattern, std::string_view replacement); + // ToLower converts string to lower case. std::string ToLower(const std::string& str); diff --git a/src/baseclient.cc b/src/baseclient.cc index fce46c96..dc8288da 100644 --- a/src/baseclient.cc +++ b/src/baseclient.cc @@ -1459,6 +1459,7 @@ RemoveObjectsResponse BaseClient::RemoveObjects(RemoveObjectsApiArgs args) { if (args.quiet) ss << "true"; for (auto& object : args.objects) { ss << ""; + utils::ReplaceAll(object.name,"&","&"); ss << "" << object.name << ""; if (!object.version_id.empty()) { ss << "" << object.version_id << ""; diff --git a/src/utils.cc b/src/utils.cc index 6f16a66f..0bb4769d 100644 --- a/src/utils.cc +++ b/src/utils.cc @@ -160,7 +160,15 @@ std::string Trim(std::string_view str, char ch) { bool CheckNonEmptyString(std::string_view str) { return !str.empty() && Trim(str) == str; } - +void ReplaceAll(std::string& str, std::string_view pattern, std::string_view replacement){ + size_t start{0}; + while ((start = str.find(pattern, start)) != + std::string::npos) + { + str.replace(start, pattern.length(), replacement); + start += replacement.length(); + } +} std::string ToLower(const std::string& str) { std::string s(str); std::transform(s.begin(), s.end(), s.begin(), ::tolower); From e9edc313cf63c7129971ec1eaf2c624c6220f7ab Mon Sep 17 00:00:00 2001 From: Aidar Date: Sat, 10 May 2025 23:29:29 +0500 Subject: [PATCH 2/3] update BaseClient::RemoveObjects fix --- include/miniocpp/utils.h | 6 +++--- src/baseclient.cc | 3 +-- src/utils.cc | 19 ++++++++++--------- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/include/miniocpp/utils.h b/include/miniocpp/utils.h index 114d6e32..a354e0ab 100644 --- a/include/miniocpp/utils.h +++ b/include/miniocpp/utils.h @@ -69,9 +69,6 @@ std::string Trim(std::string_view str, char ch = ' '); // whitespaces. bool CheckNonEmptyString(std::string_view str); -// Replace all occurrences of pattern with replacement -void ReplaceAll(std::string& str, std::string_view pattern, std::string_view replacement); - // ToLower converts string to lower case. std::string ToLower(const std::string& str); @@ -98,6 +95,9 @@ std::string Join(const std::vector& values, // EncodePath does URL encoding of path. It also normalizes multiple slashes. std::string EncodePath(const std::string& path); +// XMLEncode does XML encoding of value. +std::string XMLEncode(const std::string& value); + // Sha256hash computes SHA-256 of data and return hash as hex encoded value. std::string Sha256Hash(std::string_view str); diff --git a/src/baseclient.cc b/src/baseclient.cc index dc8288da..0b46aa40 100644 --- a/src/baseclient.cc +++ b/src/baseclient.cc @@ -1459,8 +1459,7 @@ RemoveObjectsResponse BaseClient::RemoveObjects(RemoveObjectsApiArgs args) { if (args.quiet) ss << "true"; for (auto& object : args.objects) { ss << ""; - utils::ReplaceAll(object.name,"&","&"); - ss << "" << object.name << ""; + ss << "" << utils::XMLEncode(object.name) << ""; if (!object.version_id.empty()) { ss << "" << object.version_id << ""; } diff --git a/src/utils.cc b/src/utils.cc index 0bb4769d..1b6f72f7 100644 --- a/src/utils.cc +++ b/src/utils.cc @@ -62,6 +62,7 @@ #include #include #include +#include namespace minio::utils { @@ -160,15 +161,7 @@ std::string Trim(std::string_view str, char ch) { bool CheckNonEmptyString(std::string_view str) { return !str.empty() && Trim(str) == str; } -void ReplaceAll(std::string& str, std::string_view pattern, std::string_view replacement){ - size_t start{0}; - while ((start = str.find(pattern, start)) != - std::string::npos) - { - str.replace(start, pattern.length(), replacement); - start += replacement.length(); - } -} + std::string ToLower(const std::string& str) { std::string s(str); std::transform(s.begin(), s.end(), s.begin(), ::tolower); @@ -230,6 +223,14 @@ std::string EncodePath(const std::string& path) { return out; } +std::string XMLEncode(const std::string& value) { + pugi::xml_document doc; + doc.append_child(pugi::node_pcdata).set_value(value); + std::ostringstream out; + doc.print(out); + return out.str(); +} + std::string Sha256Hash(std::string_view str) { EVP_MD_CTX* ctx = EVP_MD_CTX_create(); if (ctx == nullptr) { From 6145bcab50f228be500703a1fdf3fade516e7adb Mon Sep 17 00:00:00 2001 From: Aidar Date: Sun, 11 May 2025 17:34:21 +0500 Subject: [PATCH 3/3] Update formatting --- src/utils.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.cc b/src/utils.cc index 1b6f72f7..70b62bda 100644 --- a/src/utils.cc +++ b/src/utils.cc @@ -56,13 +56,13 @@ #include #include #include +#include #include #include #include #include #include #include -#include namespace minio::utils {