This is an automated email from the ASF dual-hosted git repository. szaszm pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/nifi-minifi-cpp.git
commit 04da95a7f24ea698fcb8d17bb0e08dd777aff774 Author: Martin Zink <[email protected]> AuthorDate: Thu Jan 5 19:42:18 2023 +0100 MINIFICPP-1697 Give a better error message on unsupported algorithms in HashContent Closes #1479 Signed-off-by: Marton Szasz <[email protected]> --- .../standard-processors/processors/HashContent.cpp | 35 ++++++++++------------ .../standard-processors/processors/HashContent.h | 2 +- .../tests/unit/HashContentTest.cpp | 18 +++++++---- 3 files changed, 29 insertions(+), 26 deletions(-) diff --git a/extensions/standard-processors/processors/HashContent.cpp b/extensions/standard-processors/processors/HashContent.cpp index 3c6ecfb79..3852ff542 100644 --- a/extensions/standard-processors/processors/HashContent.cpp +++ b/extensions/standard-processors/processors/HashContent.cpp @@ -32,6 +32,8 @@ #include "core/FlowFile.h" #include "core/Resource.h" +#include "range/v3/view.hpp" + namespace org::apache::nifi::minifi::processors { const core::Property HashContent::HashAttribute("Hash Attribute", "Attribute to store checksum to", "Checksum"); @@ -47,21 +49,20 @@ void HashContent::initialize() { } void HashContent::onSchedule(core::ProcessContext *context, core::ProcessSessionFactory* /*sessionFactory*/) { - std::string value; - - attrKey_ = (context->getProperty(HashAttribute.getName(), value)) ? value : "Checksum"; - algoName_ = (context->getProperty(HashAlgorithm.getName(), value)) ? value : "SHA256"; - - if (context->getProperty(FailOnEmpty.getName(), value)) { - failOnEmpty_ = utils::StringUtils::toBool(value).value_or(false); - } else { - failOnEmpty_ = false; + context->getProperty(HashAttribute.getName(), attrKey_); + context->getProperty(FailOnEmpty.getName(), failOnEmpty_); + + { + std::string algo_name; + context->getProperty(HashAlgorithm.getName(), algo_name); + std::transform(algo_name.begin(), algo_name.end(), algo_name.begin(), ::toupper); + std::erase(algo_name, '-'); + if (!HashAlgos.contains(algo_name)) { + const auto supported_algorithms = ranges::views::keys(HashAlgos) | ranges::views::join(std::string_view(", ")) | ranges::to<std::string>(); + throw Exception(PROCESS_SCHEDULE_EXCEPTION, algo_name + " is not supported, supported algorithms are: " + supported_algorithms); + } + algorithm_ = HashAlgos.at(algo_name); } - - std::transform(algoName_.begin(), algoName_.end(), algoName_.begin(), ::toupper); - - // Erase '-' to make sha-256 and sha-1 work, too - algoName_.erase(std::remove(algoName_.begin(), algoName_.end(), '-'), algoName_.end()); } void HashContent::onTrigger(core::ProcessContext *, core::ProcessSession *session) { @@ -80,11 +81,7 @@ void HashContent::onTrigger(core::ProcessContext *, core::ProcessSession *sessio logger_->log_trace("attempting read"); session->read(flowFile, [&flowFile, this](const std::shared_ptr<io::InputStream>& stream) { - // This throws in case algo is not found, but that's fine - logger_->log_trace("Searching for %s", algoName_); - auto algo = HashAlgos.at(algoName_); - - const auto& ret_val = algo(stream); + const auto& ret_val = algorithm_(stream); flowFile->setAttribute(attrKey_, ret_val.first); diff --git a/extensions/standard-processors/processors/HashContent.h b/extensions/standard-processors/processors/HashContent.h index b7818e6a4..7dbdd56c5 100644 --- a/extensions/standard-processors/processors/HashContent.h +++ b/extensions/standard-processors/processors/HashContent.h @@ -161,7 +161,7 @@ class HashContent : public core::Processor { private: std::shared_ptr<core::logging::Logger> logger_ = core::logging::LoggerFactory<HashContent>::getLogger(); - std::string algoName_; + std::function<HashReturnType(const std::shared_ptr<io::InputStream>&)> algorithm_ = SHA256Hash; std::string attrKey_; bool failOnEmpty_{}; }; diff --git a/extensions/standard-processors/tests/unit/HashContentTest.cpp b/extensions/standard-processors/tests/unit/HashContentTest.cpp index d9408a9b5..d0a1f6e4d 100644 --- a/extensions/standard-processors/tests/unit/HashContentTest.cpp +++ b/extensions/standard-processors/tests/unit/HashContentTest.cpp @@ -19,23 +19,18 @@ #ifdef OPENSSL_SUPPORT #include <array> -#include <fstream> -#include <map> #include <memory> #include <utility> #include <string> -#include <set> #include <iostream> #include "TestBase.h" #include "Catch.h" +#include "SingleProcessorTestController.h" #include "TestUtils.h" -#include "core/Core.h" #include "unit/ProvenanceTestHelper.h" -#include "core/FlowFile.h" #include "core/Processor.h" -#include "core/ProcessContext.h" #include "core/ProcessSession.h" #include "core/ProcessorNode.h" @@ -54,6 +49,8 @@ const char* MD5_CHECKSUM = "4FE8A693C64F93F65C5FAF42DC49AB23"; const char* SHA1_CHECKSUM = "03840DEB949D6CF0C0A624FA7EBA87FBDBCB7783"; const char* SHA256_CHECKSUM = "66D5B2CC06203137F8A0E9714638DC1085C57A3F1FA26C8823AE5CF89AB26488"; +namespace org::apache::nifi::minifi::processors::test { + TEST_CASE("Test Creation of HashContent", "[HashContentCreate]") { TestController testController; std::shared_ptr<core::Processor> processor = std::make_shared<org::apache::nifi::minifi::processors::HashContent>("processorname"); @@ -172,4 +169,13 @@ TEST_CASE("TestingFailOnEmptyProperty", "[HashContentPropertiesCheck]") { REQUIRE(LogTestController::getInstance().contains("Failure as flow file is empty")); } } + +TEST_CASE("Invalid hash algorithm throws in onSchedule", "[HashContent]") { + auto hash_content = std::make_shared<HashContent>("HashContent"); + minifi::test::SingleProcessorTestController controller{hash_content}; + hash_content->setProperty(HashContent::HashAlgorithm, "My-Algo"); + REQUIRE_THROWS_WITH(controller.plan->scheduleProcessor(hash_content), "Process Schedule Operation: MYALGO is not supported, supported algorithms are: MD5, SHA1, SHA256"); +} + +} // namespace org::apache::nifi::minifi::processors::test #endif // OPENSSL_SUPPORT
