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 8cb945b10e314f3927d15921265aa0a345fddcea Author: Gabor Gyimesi <[email protected]> AuthorDate: Fri Oct 17 17:01:17 2025 +0200 MINIFICPP-2232 Remove option to load SSL context from flow config Closes #1986 Signed-off-by: Marton Szasz <[email protected]> --- C2.md | 3 - CONFIGURE.md | 11 +- OPS.md | 8 +- conf/minifi-log.properties.in | 1 - conf/minifi.properties.in | 2 - controller/MiNiFiController.cpp | 49 +------- controller/tests/ControllerTests.cpp | 75 +------------ core-framework/include/http/BaseHTTPClient.h | 31 +++++- core-framework/src/http/BaseHTTPClient.cpp | 7 +- core-framework/src/http/HTTPClient.cpp | 10 +- .../cluster/containers/MinifiContainer.py | 1 - .../integration/features/minifi_c2_server.feature | 8 -- docker/test/integration/features/steps/steps.py | 12 -- encrypt-config/tests/ConfigFileEncryptorTests.cpp | 2 +- encrypt-config/tests/ConfigFileTests.cpp | 8 +- encrypt-config/tests/resources/minifi.properties | 1 - ...th-additional-sensitive-props.minifi.properties | 1 - .../aws/tests/MultipartUploadStateStorageTest.cpp | 2 +- extensions/civetweb/tests/ListenHTTPTests.cpp | 124 ++++++++++----------- extensions/elasticsearch/PostElasticsearch.cpp | 2 +- extensions/grafana-loki/PushGrafanaLokiREST.cpp | 2 +- .../tests/SmbConnectionControllerServiceTests.cpp | 1 - extensions/splunk/SplunkHECProcessor.cpp | 2 +- .../standard-processors/processors/InvokeHTTP.cpp | 2 +- .../standard-processors/processors/InvokeHTTP.h | 2 +- .../tests/unit/HttpClientStoreTests.cpp | 12 +- libminifi/include/c2/ControllerSocketProtocol.h | 4 +- .../include/core/logging/LoggerConfiguration.h | 2 +- libminifi/include/core/logging/alert/AlertSink.h | 5 +- libminifi/src/Configuration.cpp | 3 - libminifi/src/FlowController.cpp | 4 +- libminifi/src/RemoteProcessGroupPort.cpp | 8 +- libminifi/src/c2/ControllerSocketProtocol.cpp | 30 ++--- libminifi/src/c2/protocols/RESTSender.cpp | 23 ++-- libminifi/src/core/logging/LoggerConfiguration.cpp | 10 +- libminifi/src/core/logging/alert/AlertSink.cpp | 27 +---- libminifi/src/sitetosite/HttpSiteToSiteClient.cpp | 12 +- libminifi/test/integration/AlertTests.cpp | 9 +- libminifi/test/integration/HTTPClientTests.cpp | 12 +- libminifi/test/libtest/unit/TestBase.h | 1 + .../test/resources/encrypted.minifi.properties | 1 - libminifi/test/unit/ArrayUtilsTests.cpp | 8 +- .../EnvironmentVariableParameterProviderTest.cpp | 12 +- libminifi/test/unit/GeneralUtilsTest.cpp | 60 +++++----- libminifi/test/unit/ParameterTokenParserTest.cpp | 16 +-- .../include/minifi-cpp/properties/Configuration.h | 3 - 46 files changed, 237 insertions(+), 392 deletions(-) diff --git a/C2.md b/C2.md index 2b5a8b2cc..8ec0c9562 100644 --- a/C2.md +++ b/C2.md @@ -106,9 +106,6 @@ be requested via C2 DESCRIBE manifest command. # c2 agent class -- must be defined to run agent nifi.c2.agent.class=<your agent class> - # configure SSL Context service for REST Protocol - #nifi.c2.rest.ssl.context.service - # specify encoding strategy for c2 requests (gzip, none) #nifi.c2.rest.request.encoding=none diff --git a/CONFIGURE.md b/CONFIGURE.md index 886e47939..5773ee47d 100644 --- a/CONFIGURE.md +++ b/CONFIGURE.md @@ -1071,7 +1071,16 @@ Here's an example of an alert appender with its available properties: appender.alert1.batch.size=100 KB appender.alert1.buffer.limit=1 MB appender.alert1.level=TRACE - appender.alert1.ssl.context.service=<Name of the SSLContextService> + +If you want to use SSL connection for the alert appender, you can set up the certificate configuration properties in the minifi.properties file: + + # setup the client certificate and private key PEM files + nifi.security.client.certificate=./conf/client.pem + nifi.security.client.private.key=./conf/client.pem + # setup the client private key passphrase file + nifi.security.client.pass.phrase=./conf/password + # setup the client CA certificate file + nifi.security.client.ca.certificate=./conf/nifi-cert.pem ### Log levels After the appenders are defined you can set the log level and logging target for each of them. Appenders can be set to log everything on a specific log level, but you can also define some appenders to only write logs from specific namespaces or classes with different log levels. The log level can be set to one of the following values: OFF, TRACE, DEBUG, INFO, WARN, ERROR, CRITICAL. The log levels can be set in the following way: diff --git a/OPS.md b/OPS.md index 32c8c1583..c5a780c8f 100644 --- a/OPS.md +++ b/OPS.md @@ -69,13 +69,9 @@ The executable is stored in the bin directory and is titled minifi-controller. A ### SSL -To use secure connection for the C2 commands, both the MiNiFi C++ agent and the controller have to be started with either of the following configurations. +To use secure connection for the C2 commands, both the MiNiFi C++ agent and the controller have to be started with the following configurations. -To retrieve the SSL configuration properties from the flow config, set the following property to the name of the SSL context service holding the information: - - $ controller.ssl.context.service=SSLContextService - -Otherwise if you prefer to retrieve the SSL configuration properties from the minifi.properties file set the nifi.remote.input.secure property value to true and configure the security properties in the minifi.properties file. +To retrieve the SSL configuration properties from the minifi.properties file set the nifi.remote.input.secure property value to true and configure the security properties in the minifi.properties file. $ nifi.remote.input.secure=true $ nifi.security.client.certificate=/path/to/cert/mycert.crt diff --git a/conf/minifi-log.properties.in b/conf/minifi-log.properties.in index dc6ac9397..9d9946715 100644 --- a/conf/minifi-log.properties.in +++ b/conf/minifi-log.properties.in @@ -47,7 +47,6 @@ appender.rolling.max_file_size=20 MB #appender.alert1.batch.size=100 KB #appender.alert1.buffer.limit=1 MB #appender.alert1.level=TRACE -#appender.alert1.ssl.context.service=<Name of the SSLContextService> # Uncomment if you do not want to include the UUID of the component at the end of log lines #logger.include.uuid=false diff --git a/conf/minifi.properties.in b/conf/minifi.properties.in index 01441816c..7eceafc60 100644 --- a/conf/minifi.properties.in +++ b/conf/minifi.properties.in @@ -93,7 +93,6 @@ nifi.content.repository.class.name=DatabaseContentRepository #nifi.c2.rest.path.base= #nifi.c2.rest.url= #nifi.c2.rest.url.ack= -#nifi.c2.rest.ssl.context.service= nifi.c2.root.classes=DeviceInfoNode,AgentInformation,FlowInformation,AssetInformation ## Minimize heartbeat payload size by excluding agent manifest from the heartbeat nifi.c2.full.heartbeat=false @@ -129,7 +128,6 @@ nifi.c2.full.heartbeat=false #controller.socket.host=localhost #controller.socket.port=9998 #controller.socket.local.any.interface=false -#controller.ssl.context.service=SSLContextService ## specify the destination of c2 directed assets nifi.asset.directory=@MINIFI_PATH_ASSET_DIR@ diff --git a/controller/MiNiFiController.cpp b/controller/MiNiFiController.cpp index 3b52599be..619415c25 100644 --- a/controller/MiNiFiController.cpp +++ b/controller/MiNiFiController.cpp @@ -38,55 +38,14 @@ namespace minifi = org::apache::nifi::minifi; -std::shared_ptr<minifi::core::controller::ControllerService> getControllerService(const std::shared_ptr<minifi::Configure> &configuration, - const std::string &service_name) { - std::string nifi_configuration_class_name = "adaptiveconfiguration"; - - minifi::core::extension::ExtensionManagerImpl::get().initialize(configuration); - - configuration->get(minifi::Configure::nifi_configuration_class_name, nifi_configuration_class_name); - auto flow_configuration = minifi::core::createFlowConfiguration( - minifi::core::ConfigurationContext{ - .flow_file_repo = nullptr, - .content_repo = nullptr, - .configuration = configuration, - .path = configuration->get(minifi::Configure::nifi_flow_configuration_file)}, - nifi_configuration_class_name); - - auto root = flow_configuration->getRoot(); - if (!root) { - return nullptr; - } - auto controller = root->findControllerService(service_name); - if (!controller) { - return nullptr; - } - return controller->getControllerServiceImplementation(); -} - std::shared_ptr<minifi::controllers::SSLContextServiceInterface> getSSLContextService(const std::shared_ptr<minifi::Configure>& configuration) { std::shared_ptr<minifi::controllers::SSLContextServiceInterface> secure_context; - std::string context_name; - // if the user wishes to use a controller service we need to instantiate the flow - if (configuration->get(minifi::Configure::controller_ssl_context_service, context_name) && !context_name.empty()) { - const auto service = getControllerService(configuration, context_name); - if (nullptr != service) { - secure_context = std::dynamic_pointer_cast<minifi::controllers::SSLContextServiceInterface>(service); - } - if (secure_context == nullptr) { - throw minifi::Exception(minifi::GENERAL_EXCEPTION, "SSL Context was set, but the context name '" + context_name + "' could not be found"); - } - } - - if (nullptr == secure_context) { - std::string secureStr; - if (configuration->get(minifi::Configure::nifi_remote_input_secure, secureStr) && minifi::utils::string::toBool(secureStr).value_or(false)) { - secure_context = std::make_shared<minifi::controllers::SSLContextService>("ControllerSocketProtocolSSL", configuration); - secure_context->onEnable(); - } - } else { + std::string secure_str; + if (configuration->get(minifi::Configure::nifi_remote_input_secure, secure_str) && minifi::utils::string::toBool(secure_str).value_or(false)) { + secure_context = std::make_shared<minifi::controllers::SSLContextService>("ControllerSocketProtocolSSL", configuration); secure_context->onEnable(); } + return secure_context; } diff --git a/controller/tests/ControllerTests.cpp b/controller/tests/ControllerTests.cpp index 38f405f9c..778062d42 100644 --- a/controller/tests/ControllerTests.cpp +++ b/controller/tests/ControllerTests.cpp @@ -212,40 +212,10 @@ class TestControllerSocketReporter : public c2::ControllerSocketReporter { } }; -class TestControllerServiceProvider : public core::controller::ControllerServiceProviderImpl { - public: - explicit TestControllerServiceProvider(std::shared_ptr<controllers::SSLContextServiceInterface> ssl_context_service) - : core::controller::ControllerServiceProviderImpl("TestControllerServiceProvider"), - ssl_context_service_(std::move(ssl_context_service)) { - } - std::shared_ptr<core::controller::ControllerService> getControllerService(const std::string&) const override { - return is_ssl_ ? ssl_context_service_ : nullptr; - } - - std::shared_ptr<core::controller::ControllerServiceNode> createControllerService(const std::string&, const std::string&) override { - return nullptr; - } - void clearControllerServices() override { - } - void enableAllControllerServices() override { - } - void disableAllControllerServices() override { - } - - void setSsl() { - is_ssl_ = true; - } - - private: - bool is_ssl_{}; - std::shared_ptr<controllers::SSLContextServiceInterface> ssl_context_service_; -}; - class ControllerTestFixture { public: enum class ConnectionType { UNSECURE, - SSL_FROM_SERVICE_PROVIDER, SSL_FROM_CONFIGURATION }; @@ -259,10 +229,8 @@ class ControllerTestFixture { configuration_->set(minifi::Configure::nifi_security_client_private_key, (minifi::utils::file::FileUtils::get_executable_dir() / "resources" / "minifi-cpp-flow.key").string()); configuration_->set(minifi::Configure::nifi_security_client_pass_phrase, "abcdefgh"); configuration_->set(minifi::Configure::nifi_security_client_ca_certificate, (minifi::utils::file::FileUtils::get_executable_dir() / "resources" / "root-ca.pem").string()); - configuration_->set(minifi::Configure::controller_ssl_context_service, "SSLContextService"); ssl_context_service_ = std::make_shared<controllers::SSLContextService>("SSLContextService", configuration_); ssl_context_service_->onEnable(); - controller_service_provider_ = std::make_unique<TestControllerServiceProvider>(ssl_context_service_); controller_socket_data_.host = "localhost"; controller_socket_data_.port = 9997; } @@ -271,10 +239,7 @@ class ControllerTestFixture { if (connection_type_ == ConnectionType::SSL_FROM_CONFIGURATION) { configuration_->set(minifi::Configure::nifi_remote_input_secure, "true"); } - controller_socket_protocol_ = std::make_unique<minifi::c2::ControllerSocketProtocol>(*controller_service_provider_, *update_sink_, configuration_, reporter); - if (connection_type_ == ConnectionType::SSL_FROM_SERVICE_PROVIDER) { - controller_service_provider_->setSsl(); - } + controller_socket_protocol_ = std::make_unique<minifi::c2::ControllerSocketProtocol>(*update_sink_, configuration_, reporter); controller_socket_protocol_->initialize(); } @@ -294,15 +259,11 @@ class ControllerTestFixture { std::unique_ptr<TestUpdateSink> update_sink_; std::unique_ptr<minifi::c2::ControllerSocketProtocol> controller_socket_protocol_; std::shared_ptr<controllers::SSLContextServiceInterface> ssl_context_service_; - std::unique_ptr<TestControllerServiceProvider> controller_service_provider_; + minifi::utils::net::SocketData controller_socket_data_; }; TEST_CASE_METHOD(ControllerTestFixture, "Test listComponents", "[controllerTests]") { - SECTION("With SSL from service provider") { - setConnectionType(ControllerTestFixture::ConnectionType::SSL_FROM_SERVICE_PROVIDER); - } - SECTION("With SSL from properties") { setConnectionType(ControllerTestFixture::ConnectionType::SSL_FROM_CONFIGURATION); } @@ -329,10 +290,6 @@ TEST_CASE_METHOD(ControllerTestFixture, "Test listComponents", "[controllerTests } TEST_CASE_METHOD(ControllerTestFixture, "TestClear", "[controllerTests]") { - SECTION("With SSL from service provider") { - setConnectionType(ControllerTestFixture::ConnectionType::SSL_FROM_SERVICE_PROVIDER); - } - SECTION("With SSL from properties") { setConnectionType(ControllerTestFixture::ConnectionType::SSL_FROM_CONFIGURATION); } @@ -356,10 +313,6 @@ TEST_CASE_METHOD(ControllerTestFixture, "TestClear", "[controllerTests]") { } TEST_CASE_METHOD(ControllerTestFixture, "TestUpdate", "[controllerTests]") { - SECTION("With SSL from service provider") { - setConnectionType(ControllerTestFixture::ConnectionType::SSL_FROM_SERVICE_PROVIDER); - } - SECTION("With SSL from properties") { setConnectionType(ControllerTestFixture::ConnectionType::SSL_FROM_CONFIGURATION); } @@ -382,10 +335,6 @@ TEST_CASE_METHOD(ControllerTestFixture, "TestUpdate", "[controllerTests]") { } TEST_CASE_METHOD(ControllerTestFixture, "Test connection getters on empty flow", "[controllerTests]") { - SECTION("With SSL from service provider") { - setConnectionType(ControllerTestFixture::ConnectionType::SSL_FROM_SERVICE_PROVIDER); - } - SECTION("With SSL from properties") { setConnectionType(ControllerTestFixture::ConnectionType::SSL_FROM_CONFIGURATION); } @@ -422,10 +371,6 @@ TEST_CASE_METHOD(ControllerTestFixture, "Test connection getters on empty flow", } TEST_CASE_METHOD(ControllerTestFixture, "Test connection getters", "[controllerTests]") { - SECTION("With SSL from service provider") { - setConnectionType(ControllerTestFixture::ConnectionType::SSL_FROM_SERVICE_PROVIDER); - } - SECTION("With SSL from properties") { setConnectionType(ControllerTestFixture::ConnectionType::SSL_FROM_CONFIGURATION); } @@ -476,10 +421,6 @@ TEST_CASE_METHOD(ControllerTestFixture, "Test connection getters", "[controllerT } TEST_CASE_METHOD(ControllerTestFixture, "Test manifest getter", "[controllerTests]") { - SECTION("With SSL from service provider") { - setConnectionType(ControllerTestFixture::ConnectionType::SSL_FROM_SERVICE_PROVIDER); - } - SECTION("With SSL from properties") { setConnectionType(ControllerTestFixture::ConnectionType::SSL_FROM_CONFIGURATION); } @@ -499,10 +440,6 @@ TEST_CASE_METHOD(ControllerTestFixture, "Test manifest getter", "[controllerTest } TEST_CASE_METHOD(ControllerTestFixture, "Test jstack getter", "[controllerTests]") { - SECTION("With SSL from service provider") { - setConnectionType(ControllerTestFixture::ConnectionType::SSL_FROM_SERVICE_PROVIDER); - } - SECTION("With SSL from properties") { setConnectionType(ControllerTestFixture::ConnectionType::SSL_FROM_CONFIGURATION); } @@ -527,10 +464,6 @@ TEST_CASE_METHOD(ControllerTestFixture, "Test jstack getter", "[controllerTests] } TEST_CASE_METHOD(ControllerTestFixture, "Test debug bundle getter", "[controllerTests]") { - SECTION("With SSL from service provider") { - setConnectionType(ControllerTestFixture::ConnectionType::SSL_FROM_SERVICE_PROVIDER); - } - SECTION("With SSL from properties") { setConnectionType(ControllerTestFixture::ConnectionType::SSL_FROM_CONFIGURATION); } @@ -581,10 +514,6 @@ TEST_CASE_METHOD(ControllerTestFixture, "Debug bundle retrieval fails if target } TEST_CASE_METHOD(ControllerTestFixture, "Test flow status getter", "[controllerTests]") { - SECTION("With SSL from service provider") { - setConnectionType(ControllerTestFixture::ConnectionType::SSL_FROM_SERVICE_PROVIDER); - } - SECTION("With SSL from properties") { setConnectionType(ControllerTestFixture::ConnectionType::SSL_FROM_CONFIGURATION); } diff --git a/core-framework/include/http/BaseHTTPClient.h b/core-framework/include/http/BaseHTTPClient.h index a3389571a..ad22ce950 100644 --- a/core-framework/include/http/BaseHTTPClient.h +++ b/core-framework/include/http/BaseHTTPClient.h @@ -29,6 +29,31 @@ #include "utils/ByteArrayCallback.h" #include "utils/gsl.h" +namespace org::apache::nifi::minifi::http { +enum class HttpRequestMethod { + Get, Post, Put, Patch, Delete, Connect, Head, Options, Trace +}; +} // namespace org::apache::nifi::minifi::http + +namespace magic_enum::customize { +using HttpRequestMethod = org::apache::nifi::minifi::http::HttpRequestMethod; +template<> +constexpr customize_t enum_name<HttpRequestMethod>(HttpRequestMethod type) noexcept { + switch (type) { + case HttpRequestMethod::Get: return "GET"; + case HttpRequestMethod::Post: return "POST"; + case HttpRequestMethod::Put: return "PUT"; + case HttpRequestMethod::Patch: return "PATCH"; + case HttpRequestMethod::Delete: return "DELETE"; + case HttpRequestMethod::Connect: return "CONNECT"; + case HttpRequestMethod::Head: return "HEAD"; + case HttpRequestMethod::Options: return "OPTIONS"; + case HttpRequestMethod::Trace: return "TRACE"; + } + return invalid_tag; +} +} // namespace magic_enum::customize + namespace org::apache::nifi::minifi::http { struct HTTPProxy { @@ -177,12 +202,6 @@ namespace HTTPRequestResponse { int seek_callback(void *p, int64_t offset, int); } -#undef DELETE // this is a macro in winnt.h - -enum class HttpRequestMethod { - GET, POST, PUT, PATCH, DELETE, CONNECT, HEAD, OPTIONS, TRACE -}; - class BaseHTTPClient { public: BaseHTTPClient() = default; diff --git a/core-framework/src/http/BaseHTTPClient.cpp b/core-framework/src/http/BaseHTTPClient.cpp index 10b55fb50..b0ce9d382 100644 --- a/core-framework/src/http/BaseHTTPClient.cpp +++ b/core-framework/src/http/BaseHTTPClient.cpp @@ -66,7 +66,7 @@ std::string get_token(BaseHTTPClient* client, const std::string& username, const client->setContentType("application/x-www-form-urlencoded"); - client->set_request_method(HttpRequestMethod::POST); + client->set_request_method(HttpRequestMethod::Post); std::string payload = "username=" + username + "&" + "password=" + password; @@ -110,7 +110,7 @@ URL::URL(const std::string& url_input) { std::string::const_iterator end_of_port = std::find_first_of(current_pos, url_input.end(), std::begin(PORT_TERMINATORS), std::end(PORT_TERMINATORS)); const auto port_number = parsePortNumber(std::string{current_pos, end_of_port}); if (port_number) { - port_ = *port_number; + port_ = port_number; } else { logger_->log_error("Could not parse the port number in URL '{}'", url_input); return; @@ -226,8 +226,7 @@ size_t HTTPUploadByteArrayInputCallback::getDataChunk(char *data, size_t size) { if (ptr == nullptr) { return 0; } - if (len > size) - len = size; + len = std::min(len, size); memcpy(data, ptr, len); pos += len; seek(pos); diff --git a/core-framework/src/http/HTTPClient.cpp b/core-framework/src/http/HTTPClient.cpp index a689d8e3d..cc879f58a 100644 --- a/core-framework/src/http/HTTPClient.cpp +++ b/core-framework/src/http/HTTPClient.cpp @@ -255,7 +255,7 @@ void HTTPClient::setReadCallback(std::unique_ptr<HTTPReadCallback> callback) { void HTTPClient::setUploadCallback(std::unique_ptr<HTTPUploadCallback> callback) { logger_->log_debug("Setting callback for {}", url_); write_callback_ = std::move(callback); - if (method_ == http::HttpRequestMethod::PUT) { + if (method_ == http::HttpRequestMethod::Put) { curl_easy_setopt(http_session_.get(), CURLOPT_INFILESIZE_LARGE, (curl_off_t) write_callback_->size()); } curl_easy_setopt(http_session_.get(), CURLOPT_READFUNCTION, &HTTPRequestResponse::send_write); @@ -412,19 +412,19 @@ void HTTPClient::set_request_method(http::HttpRequestMethod method) { return; method_ = method; switch (*method_) { - case http::HttpRequestMethod::POST: + case http::HttpRequestMethod::Post: curl_easy_setopt(http_session_.get(), CURLOPT_POST, 1L); curl_easy_setopt(http_session_.get(), CURLOPT_CUSTOMREQUEST, nullptr); break; - case http::HttpRequestMethod::HEAD: + case http::HttpRequestMethod::Head: curl_easy_setopt(http_session_.get(), CURLOPT_NOBODY, 1L); curl_easy_setopt(http_session_.get(), CURLOPT_CUSTOMREQUEST, nullptr); break; - case http::HttpRequestMethod::GET: + case http::HttpRequestMethod::Get: curl_easy_setopt(http_session_.get(), CURLOPT_HTTPGET, 1L); curl_easy_setopt(http_session_.get(), CURLOPT_CUSTOMREQUEST, nullptr); break; - case http::HttpRequestMethod::PUT: + case http::HttpRequestMethod::Put: curl_easy_setopt(http_session_.get(), CURLOPT_UPLOAD, 1L); curl_easy_setopt(http_session_.get(), CURLOPT_CUSTOMREQUEST, nullptr); break; diff --git a/docker/test/integration/cluster/containers/MinifiContainer.py b/docker/test/integration/cluster/containers/MinifiContainer.py index dbbdc2143..387a3bd0d 100644 --- a/docker/test/integration/cluster/containers/MinifiContainer.py +++ b/docker/test/integration/cluster/containers/MinifiContainer.py @@ -149,7 +149,6 @@ class MinifiContainer(FlowContainer): f.write("nifi.c2.enable=true\n") f.write(f"nifi.c2.rest.url=https://minifi-c2-server-{self.feature_context.id}:10090/c2/config/heartbeat\n") f.write(f"nifi.c2.rest.url.ack=https://minifi-c2-server-{self.feature_context.id}:10090/c2/config/acknowledge\n") - f.write("nifi.c2.rest.ssl.context.service=SSLContextService\n") f.write(f"nifi.c2.flow.base.url=https://minifi-c2-server-{self.feature_context.id}:10090/c2/config/\n") f.write("nifi.c2.root.classes=DeviceInfoNode,AgentInformation,FlowInformation,AssetInformation\n") f.write("nifi.c2.full.heartbeat=false\n") diff --git a/docker/test/integration/features/minifi_c2_server.feature b/docker/test/integration/features/minifi_c2_server.feature index ff6640deb..2bbffc9f4 100644 --- a/docker/test/integration/features/minifi_c2_server.feature +++ b/docker/test/integration/features/minifi_c2_server.feature @@ -29,14 +29,6 @@ Feature: MiNiFi can communicate with Apache NiFi MiNiFi C2 server And a flowfile with the content "test" is placed in the monitored directory in less than 10 seconds And the Minifi logs do not contain the following message: "Failed to parse json response: The document is empty. at 0" after 0 seconds - Scenario: MiNiFi flow config is updated from MiNiFi C2 server through SSL with SSL controller service - Given a file with the content "test" is present in "/tmp/input" - And a ssl context service is set up for MiNiFi C2 server - And a MiNiFi C2 server is set up with SSL - When all instances start up - Then the MiNiFi C2 SSL server logs contain the following message: "acknowledged with a state of FULLY_APPLIED(DONE)" in less than 60 seconds - And a flowfile with the content "test" is placed in the monitored directory in less than 10 seconds - Scenario: MiNiFi can get flow config from C2 server through flow url when it is not available at start Given flow configuration path is set up in flow url property And C2 is enabled in MiNiFi diff --git a/docker/test/integration/features/steps/steps.py b/docker/test/integration/features/steps/steps.py index a0b1b532f..129d8df57 100644 --- a/docker/test/integration/features/steps/steps.py +++ b/docker/test/integration/features/steps/steps.py @@ -1009,18 +1009,6 @@ def step_impl(context, doc_id, index, value, field): # MiNiFi C2 Server -@given("a ssl context service is set up for MiNiFi C2 server") -def step_impl(context): - minifi_crt_file = '/tmp/resources/minifi_client.crt' - minifi_key_file = '/tmp/resources/minifi_client.key' - root_ca_crt_file = '/tmp/resources/root_ca.crt' - ssl_context_service = SSLContextService(cert=minifi_crt_file, ca_cert=root_ca_crt_file, key=minifi_key_file) - ssl_context_service.name = "SSLContextService" - container = context.test.acquire_container(context=context, name="minifi-cpp-flow") - container.add_controller(ssl_context_service) - context.test.enable_c2_with_ssl_in_minifi() - - @given("ssl properties are set up for MiNiFi C2 server") def step_impl(context): context.test.enable_c2_with_ssl_in_minifi() diff --git a/encrypt-config/tests/ConfigFileEncryptorTests.cpp b/encrypt-config/tests/ConfigFileEncryptorTests.cpp index f0bd32e0b..4cdebb0bb 100644 --- a/encrypt-config/tests/ConfigFileEncryptorTests.cpp +++ b/encrypt-config/tests/ConfigFileEncryptorTests.cpp @@ -77,7 +77,7 @@ TEST_CASE("ConfigFileEncryptor can encrypt the sensitive properties", "[encrypt- uint32_t initial_num_properties_encrypted = encryptSensitivePropertiesInFile(test_file, KEY); REQUIRE(initial_num_properties_encrypted == 1); - REQUIRE(test_file.size() == 110); + REQUIRE(test_file.size() == 109); REQUIRE(check_encryption(test_file, Configuration::nifi_rest_api_password, original_password.length())); SECTION("calling encryptSensitiveValuesInMinifiProperties a second time does nothing") { diff --git a/encrypt-config/tests/ConfigFileTests.cpp b/encrypt-config/tests/ConfigFileTests.cpp index 4f1c5f1f2..9df4b5762 100644 --- a/encrypt-config/tests/ConfigFileTests.cpp +++ b/encrypt-config/tests/ConfigFileTests.cpp @@ -90,7 +90,7 @@ TEST_CASE("ConfigFile creates an empty object from a nonexistent file", "[encryp TEST_CASE("ConfigFile can parse a simple config file", "[encrypt-config][constructor]") { ConfigFile test_file{std::ifstream{"resources/minifi.properties"}}; - REQUIRE(test_file.size() == 109); + REQUIRE(test_file.size() == 108); } TEST_CASE("ConfigFile can test whether a key is present", "[encrypt-config][hasValue]") { @@ -102,7 +102,7 @@ TEST_CASE("ConfigFile can test whether a key is present", "[encrypt-config][hasV TEST_CASE("ConfigFile can read empty properties correctly", "[encrypt-config][constructor]") { ConfigFile test_file{std::ifstream{"resources/with-additional-sensitive-props.minifi.properties"}}; - REQUIRE(test_file.size() == 105); + REQUIRE(test_file.size() == 104); auto empty_property = test_file.getValue(Configuration::nifi_security_need_ClientAuth); REQUIRE(empty_property); @@ -143,7 +143,7 @@ TEST_CASE("ConfigFile can add a new setting after an existing setting", "[encryp SECTION("valid key") { test_file.insertAfter(Configuration::nifi_rest_api_password, "nifi.rest.api.password.protected", "my-cipher-name"); - REQUIRE(test_file.size() == 110); + REQUIRE(test_file.size() == 109); REQUIRE(test_file.getValue("nifi.rest.api.password.protected") == "my-cipher-name"); } @@ -158,7 +158,7 @@ TEST_CASE("ConfigFile can add a new setting at the end", "[encrypt-config][appen const std::string KEY = "nifi.bootstrap.sensitive.key"; const std::string VALUE = "aa411f289c91685ef9d5a9e5a4fad9393ff4c7a78ab978484323488caed7a9ab"; test_file.append(KEY, VALUE); - REQUIRE(test_file.size() == 110); + REQUIRE(test_file.size() == 109); REQUIRE(test_file.getValue(KEY) == std::make_optional(VALUE)); } diff --git a/encrypt-config/tests/resources/minifi.properties b/encrypt-config/tests/resources/minifi.properties index 898f23435..107aee455 100644 --- a/encrypt-config/tests/resources/minifi.properties +++ b/encrypt-config/tests/resources/minifi.properties @@ -81,7 +81,6 @@ nifi.c2.agent.identifier=EncryptConfigTester-001 #controller.socket.host=localhost #controller.socket.port=9998 #controller.socket.local.any.interface=false -#controller.ssl.context.service=SSLContextService ## specify the destination of c2 directed assets #nifi.asset.directory=${MINIFI_HOME}/asset diff --git a/encrypt-config/tests/resources/with-additional-sensitive-props.minifi.properties b/encrypt-config/tests/resources/with-additional-sensitive-props.minifi.properties index 8f468b2c8..c270aef68 100644 --- a/encrypt-config/tests/resources/with-additional-sensitive-props.minifi.properties +++ b/encrypt-config/tests/resources/with-additional-sensitive-props.minifi.properties @@ -83,7 +83,6 @@ nifi.c2.agent.identifier=EncryptConfigTester-001 #controller.socket.host=localhost #controller.socket.port=9998 #controller.socket.local.any.interface=false -#controller.ssl.context.service=SSLContextService # must be comma separated nifi.c2.flow.id= diff --git a/extensions/aws/tests/MultipartUploadStateStorageTest.cpp b/extensions/aws/tests/MultipartUploadStateStorageTest.cpp index 348e42a59..9e15f63e3 100644 --- a/extensions/aws/tests/MultipartUploadStateStorageTest.cpp +++ b/extensions/aws/tests/MultipartUploadStateStorageTest.cpp @@ -32,7 +32,7 @@ class MultipartUploadStateStorageTestFixture { MultipartUploadStateStorageTestFixture() { LogTestController::getInstance().setDebug<minifi::aws::s3::MultipartUploadStateStorage>(); state_storage_ = std::make_unique<minifi::controllers::VolatileMapStateStorage>("KeyValueStateStorage"); - state_manager_ = std::make_unique<minifi::controllers::KeyValueStateManager>(utils::IdGenerator::getIdGenerator()->generate(), gsl::make_not_null(state_storage_.get())); + state_manager_ = std::make_unique<minifi::controllers::KeyValueStateManager>(minifi::utils::IdGenerator::getIdGenerator()->generate(), gsl::make_not_null(state_storage_.get())); upload_storage_ = std::make_unique<minifi::aws::s3::MultipartUploadStateStorage>(gsl::make_not_null(state_manager_.get())); } diff --git a/extensions/civetweb/tests/ListenHTTPTests.cpp b/extensions/civetweb/tests/ListenHTTPTests.cpp index 0e0b439d2..0f4f80ec8 100644 --- a/extensions/civetweb/tests/ListenHTTPTests.cpp +++ b/extensions/civetweb/tests/ListenHTTPTests.cpp @@ -165,7 +165,7 @@ class ListenHTTPTestsFixture { } void check_response_body(minifi::http::HTTPClient& client) { - if (client.getMethod() != HttpRequestMethod::GET && client.getMethod() != HttpRequestMethod::POST) { + if (client.getMethod() != HttpRequestMethod::Get && client.getMethod() != HttpRequestMethod::Post) { return; } @@ -230,7 +230,7 @@ class ListenHTTPTestsFixture { thread.join(); } - if (expected_committed_requests > 0 && (method == HttpRequestMethod::GET || method == HttpRequestMethod::POST)) { + if (expected_committed_requests > 0 && (method == HttpRequestMethod::Get || method == HttpRequestMethod::Post)) { REQUIRE(LogTestController::getInstance().contains("Size:" + std::to_string(payload.size()) + " Offset:0")); } REQUIRE(LogTestController::getInstance().contains("Logged " + std::to_string(expected_committed_requests) + " flow files")); @@ -243,7 +243,7 @@ class ListenHTTPTestsFixture { for (const auto &header : headers) { client->setRequestHeader(header.first, header.second); } - if (method == HttpRequestMethod::POST) { + if (method == HttpRequestMethod::Post) { client->setPostFields(payload); } return client; @@ -259,7 +259,7 @@ class ListenHTTPTestsFixture { core::Processor* log_attribute = nullptr; std::shared_ptr<minifi::controllers::SSLContextServiceInterface> ssl_context_service; - HttpRequestMethod method = HttpRequestMethod::GET; + HttpRequestMethod method = HttpRequestMethod::Get; std::map<std::string, std::string> headers; std::string payload; std::string endpoint = "test"; @@ -283,7 +283,7 @@ TEST_CASE_METHOD(ListenHTTPTestsFixture, "HTTP GET", "[basic]") { TEST_CASE_METHOD(ListenHTTPTestsFixture, "HTTP POST", "[basic]") { run_server(); - method = HttpRequestMethod::POST; + method = HttpRequestMethod::Post; payload = "Test payload"; test_connect(); @@ -292,7 +292,7 @@ TEST_CASE_METHOD(ListenHTTPTestsFixture, "HTTP POST", "[basic]") { TEST_CASE_METHOD(ListenHTTPTestsFixture, "HTTP PUT", "[basic]") { run_server(); - method = HttpRequestMethod::PUT; + method = HttpRequestMethod::Put; test_connect({HttpResponseExpectations{true, 405}}, 0); } @@ -300,7 +300,7 @@ TEST_CASE_METHOD(ListenHTTPTestsFixture, "HTTP PUT", "[basic]") { TEST_CASE_METHOD(ListenHTTPTestsFixture, "HTTP DELETE", "[basic]") { run_server(); - method = HttpRequestMethod::DELETE; + method = HttpRequestMethod::Delete; test_connect({HttpResponseExpectations{true, 405}}, 0); } @@ -308,7 +308,7 @@ TEST_CASE_METHOD(ListenHTTPTestsFixture, "HTTP DELETE", "[basic]") { TEST_CASE_METHOD(ListenHTTPTestsFixture, "HTTP HEAD", "[basic]") { run_server(); - method = HttpRequestMethod::HEAD; + method = HttpRequestMethod::Head; test_connect({HttpResponseExpectations{}}, 0); } @@ -318,18 +318,18 @@ TEST_CASE_METHOD(ListenHTTPTestsFixture, "HTTP no body", "[basic]") { SECTION("GET") { - method = HttpRequestMethod::GET; + method = HttpRequestMethod::Get; } SECTION("POST") { - method = HttpRequestMethod::POST; + method = HttpRequestMethod::Post; payload = "Test payload"; } SECTION("HEAD") { - method = HttpRequestMethod::HEAD; + method = HttpRequestMethod::Head; } run_server(); - const std::size_t expected_committed_requests = (method == HttpRequestMethod::POST || method == HttpRequestMethod::GET) ? 1 : 0; + const std::size_t expected_committed_requests = (method == HttpRequestMethod::Post || method == HttpRequestMethod::Get) ? 1 : 0; test_connect({HttpResponseExpectations{}}, expected_committed_requests); } @@ -337,18 +337,18 @@ TEST_CASE_METHOD(ListenHTTPTestsFixture, "HTTP body with different mime type", " plan->setDynamicProperty(update_attribute, "mime.type", "text/plain"); SECTION("GET") { - method = HttpRequestMethod::GET; + method = HttpRequestMethod::Get; } SECTION("POST") { - method = HttpRequestMethod::POST; + method = HttpRequestMethod::Post; payload = "Test payload"; } SECTION("HEAD") { - method = HttpRequestMethod::HEAD; + method = HttpRequestMethod::Head; } run_server(); - const std::size_t expected_committed_requests = (method == HttpRequestMethod::POST || method == HttpRequestMethod::GET) ? 1 : 0; + const std::size_t expected_committed_requests = (method == HttpRequestMethod::Post || method == HttpRequestMethod::Get) ? 1 : 0; test_connect({HttpResponseExpectations{}}, expected_committed_requests); } @@ -359,10 +359,10 @@ TEST_CASE_METHOD(ListenHTTPTestsFixture, "HTTP all headers", "[basic][headers]") {"bar", "2"}}; SECTION("GET") { - method = HttpRequestMethod::GET; + method = HttpRequestMethod::Get; } SECTION("POST") { - method = HttpRequestMethod::POST; + method = HttpRequestMethod::Post; payload = "Test payload"; } @@ -380,10 +380,10 @@ TEST_CASE_METHOD(ListenHTTPTestsFixture, "HTTP filtered headers", "[headers]") { {"bar", "2"}}; SECTION("GET") { - method = HttpRequestMethod::GET; + method = HttpRequestMethod::Get; } SECTION("POST") { - method = HttpRequestMethod::POST; + method = HttpRequestMethod::Post; payload = "Test payload"; } @@ -412,10 +412,10 @@ TEST_CASE_METHOD(ListenHTTPTestsFixture, "HTTP Batch tests", "[batch]") { expected_processed_request_count = 5; SECTION("GET") { - method = HttpRequestMethod::GET; + method = HttpRequestMethod::Get; } SECTION("POST") { - method = HttpRequestMethod::POST; + method = HttpRequestMethod::Post; payload = "Test payload"; } } @@ -426,10 +426,10 @@ TEST_CASE_METHOD(ListenHTTPTestsFixture, "HTTP Batch tests", "[batch]") { expected_processed_request_count = 4; SECTION("GET") { - method = HttpRequestMethod::GET; + method = HttpRequestMethod::Get; } SECTION("POST") { - method = HttpRequestMethod::POST; + method = HttpRequestMethod::Post; payload = "Test payload"; } } @@ -441,10 +441,10 @@ TEST_CASE_METHOD(ListenHTTPTestsFixture, "HTTP Batch tests", "[batch]") { expected_processed_request_count = 3; SECTION("GET") { - method = HttpRequestMethod::GET; + method = HttpRequestMethod::Get; } SECTION("POST") { - method = HttpRequestMethod::POST; + method = HttpRequestMethod::Post; payload = "Test payload"; } } @@ -459,18 +459,18 @@ TEST_CASE_METHOD(ListenHTTPTestsFixture, "HTTPS without CA", "[basic][https]") { create_ssl_context_service("goodCA.crt", nullptr); SECTION("GET") { - method = HttpRequestMethod::GET; + method = HttpRequestMethod::Get; } SECTION("POST") { - method = HttpRequestMethod::POST; + method = HttpRequestMethod::Post; payload = "Test payload"; } SECTION("HEAD") { - method = HttpRequestMethod::HEAD; + method = HttpRequestMethod::Head; } run_server(); - const std::size_t expected_committed_requests = (method == HttpRequestMethod::POST || method == HttpRequestMethod::GET) ? 1 : 0; + const std::size_t expected_committed_requests = (method == HttpRequestMethod::Post || method == HttpRequestMethod::Get) ? 1 : 0; test_connect({HttpResponseExpectations{}}, expected_committed_requests); } @@ -482,18 +482,18 @@ TEST_CASE_METHOD(ListenHTTPTestsFixture, "HTTPS without client cert", "[basic][h create_ssl_context_service("goodCA.crt", nullptr); SECTION("GET") { - method = HttpRequestMethod::GET; + method = HttpRequestMethod::Get; } SECTION("POST") { - method = HttpRequestMethod::POST; + method = HttpRequestMethod::Post; payload = "Test payload"; } SECTION("HEAD") { - method = HttpRequestMethod::HEAD; + method = HttpRequestMethod::Head; } run_server(); - const std::size_t expected_committed_requests = (method == HttpRequestMethod::POST || method == HttpRequestMethod::GET) ? 1 : 0; + const std::size_t expected_committed_requests = (method == HttpRequestMethod::Post || method == HttpRequestMethod::Get) ? 1 : 0; test_connect({HttpResponseExpectations{}}, expected_committed_requests); } @@ -506,18 +506,18 @@ TEST_CASE_METHOD(ListenHTTPTestsFixture, "HTTPS with client cert from good CA", create_ssl_context_service("goodCA.crt", "goodCA_goodClient.pem"); SECTION("GET") { - method = HttpRequestMethod::GET; + method = HttpRequestMethod::Get; } SECTION("POST") { - method = HttpRequestMethod::POST; + method = HttpRequestMethod::Post; payload = "Test payload"; } SECTION("HEAD") { - method = HttpRequestMethod::HEAD; + method = HttpRequestMethod::Head; } run_server(); - const std::size_t expected_committed_requests = (method == HttpRequestMethod::POST || method == HttpRequestMethod::GET) ? 1 : 0; + const std::size_t expected_committed_requests = (method == HttpRequestMethod::Post || method == HttpRequestMethod::Get) ? 1 : 0; test_connect({HttpResponseExpectations{}}, expected_committed_requests); } @@ -530,18 +530,18 @@ TEST_CASE_METHOD(ListenHTTPTestsFixture, "HTTPS with PKCS12 client cert from goo create_ssl_context_service("goodCA.crt", "goodCA_goodClient.p12"); SECTION("GET") { - method = HttpRequestMethod::GET; + method = HttpRequestMethod::Get; } SECTION("POST") { - method = HttpRequestMethod::POST; + method = HttpRequestMethod::Post; payload = "Test payload"; } SECTION("HEAD") { - method = HttpRequestMethod::HEAD; + method = HttpRequestMethod::Head; } run_server(); - const std::size_t expected_committed_requests = (method == HttpRequestMethod::POST || method == HttpRequestMethod::GET) ? 1 : 0; + const std::size_t expected_committed_requests = (method == HttpRequestMethod::Post || method == HttpRequestMethod::Get) ? 1 : 0; test_connect({HttpResponseExpectations{}}, expected_committed_requests); } @@ -558,14 +558,14 @@ TEST_CASE_METHOD(ListenHTTPTestsFixture, "HTTPS with client cert from bad CA", " plan->setProperty(listen_http, minifi::processors::ListenHTTP::SSLVerifyPeer, "yes"); SECTION("GET") { - method = HttpRequestMethod::GET; + method = HttpRequestMethod::Get; } SECTION("POST") { - method = HttpRequestMethod::POST; + method = HttpRequestMethod::Post; payload = "Test payload"; } SECTION("HEAD") { - method = HttpRequestMethod::HEAD; + method = HttpRequestMethod::Head; } } SECTION("do not verify peer") { @@ -573,16 +573,16 @@ TEST_CASE_METHOD(ListenHTTPTestsFixture, "HTTPS with client cert from bad CA", " response_code = 200; SECTION("GET") { - method = HttpRequestMethod::GET; + method = HttpRequestMethod::Get; expected_committed_requests = 1; } SECTION("POST") { - method = HttpRequestMethod::POST; + method = HttpRequestMethod::Post; payload = "Test payload"; expected_committed_requests = 1; } SECTION("HEAD") { - method = HttpRequestMethod::HEAD; + method = HttpRequestMethod::Head; } } @@ -602,18 +602,18 @@ TEST_CASE_METHOD(ListenHTTPTestsFixture, "HTTPS with client cert with matching D create_ssl_context_service("goodCA.crt", "goodCA_goodClient.pem"); SECTION("GET") { - method = HttpRequestMethod::GET; + method = HttpRequestMethod::Get; } SECTION("POST") { - method = HttpRequestMethod::POST; + method = HttpRequestMethod::Post; payload = "Test payload"; } SECTION("HEAD") { - method = HttpRequestMethod::HEAD; + method = HttpRequestMethod::Head; } run_server(); - const std::size_t expected_committed_requests = (method == HttpRequestMethod::POST || method == HttpRequestMethod::GET) ? 1 : 0; + const std::size_t expected_committed_requests = (method == HttpRequestMethod::Post || method == HttpRequestMethod::Get) ? 1 : 0; test_connect({HttpResponseExpectations{}}, expected_committed_requests); } @@ -630,30 +630,30 @@ TEST_CASE_METHOD(ListenHTTPTestsFixture, "HTTPS with client cert with non-matchi response_code = 403; SECTION("GET") { - method = HttpRequestMethod::GET; + method = HttpRequestMethod::Get; } SECTION("POST") { - method = HttpRequestMethod::POST; + method = HttpRequestMethod::Post; payload = "Test payload"; } SECTION("HEAD") { - method = HttpRequestMethod::HEAD; + method = HttpRequestMethod::Head; } } SECTION("do not verify peer") { response_code = 200; SECTION("GET") { - method = HttpRequestMethod::GET; + method = HttpRequestMethod::Get; expected_committed_requests = 1; } SECTION("POST") { - method = HttpRequestMethod::POST; + method = HttpRequestMethod::Post; payload = "Test payload"; expected_committed_requests = 1; } SECTION("HEAD") { - method = HttpRequestMethod::HEAD; + method = HttpRequestMethod::Head; } } @@ -669,14 +669,14 @@ TEST_CASE_METHOD(ListenHTTPTestsFixture, "HTTPS minimum SSL version", "[https]") plan->setProperty(listen_http, minifi::processors::ListenHTTP::SSLCertificateAuthority, (executable_dir / "resources" / "goodCA.crt").string()); SECTION("GET") { - method = HttpRequestMethod::GET; + method = HttpRequestMethod::Get; } SECTION("POST") { - method = HttpRequestMethod::POST; + method = HttpRequestMethod::Post; payload = "Test payload"; } SECTION("HEAD") { - method = HttpRequestMethod::HEAD; + method = HttpRequestMethod::Head; } create_ssl_context_service("goodCA.crt", "goodCA_goodClient.pem"); @@ -686,7 +686,7 @@ TEST_CASE_METHOD(ListenHTTPTestsFixture, "HTTPS minimum SSL version", "[https]") auto client = std::make_unique<minifi::http::HTTPClient>(); client->setVerbose(false); client->initialize(method, url, ssl_context_service); - if (method == HttpRequestMethod::POST) { + if (method == HttpRequestMethod::Post) { client->setPostFields(payload); } REQUIRE(client->setSpecificSSLVersion(minifi::http::SSLVersion::TLSv1_1)); diff --git a/extensions/elasticsearch/PostElasticsearch.cpp b/extensions/elasticsearch/PostElasticsearch.cpp index ca6e1c747..8424ba35a 100644 --- a/extensions/elasticsearch/PostElasticsearch.cpp +++ b/extensions/elasticsearch/PostElasticsearch.cpp @@ -56,7 +56,7 @@ void PostElasticsearch::onSchedule(core::ProcessContext& context, core::ProcessS throw Exception(PROCESS_SCHEDULE_EXCEPTION, "Missing Elasticsearch credentials service"); auto ssl_context_service = utils::parseOptionalControllerService<minifi::controllers::SSLContextServiceInterface>(context, PostElasticsearch::SSLContext, getUUID()); - client_.initialize(http::HttpRequestMethod::POST, host_url_ + "/_bulk", ssl_context_service); + client_.initialize(http::HttpRequestMethod::Post, host_url_ + "/_bulk", ssl_context_service); client_.setContentType("application/json"); credentials_service_->authenticateClient(client_); } diff --git a/extensions/grafana-loki/PushGrafanaLokiREST.cpp b/extensions/grafana-loki/PushGrafanaLokiREST.cpp index 1feb11d9c..8b421dbb7 100644 --- a/extensions/grafana-loki/PushGrafanaLokiREST.cpp +++ b/extensions/grafana-loki/PushGrafanaLokiREST.cpp @@ -83,7 +83,7 @@ void PushGrafanaLokiREST::initializeHttpClient(core::ProcessContext& context) { } logger_->log_debug("PushGrafanaLokiREST push url is set to: {}", url); auto ssl_context_service = utils::parseOptionalControllerService<minifi::controllers::SSLContextServiceInterface>(context, PushGrafanaLoki::SSLContextService, getUUID()); - client_.initialize(http::HttpRequestMethod::POST, url, ssl_context_service); + client_.initialize(http::HttpRequestMethod::Post, url, ssl_context_service); } void PushGrafanaLokiREST::onSchedule(core::ProcessContext& context, core::ProcessSessionFactory& session_factory) { diff --git a/extensions/smb/tests/SmbConnectionControllerServiceTests.cpp b/extensions/smb/tests/SmbConnectionControllerServiceTests.cpp index 217122fa3..557810e6c 100644 --- a/extensions/smb/tests/SmbConnectionControllerServiceTests.cpp +++ b/extensions/smb/tests/SmbConnectionControllerServiceTests.cpp @@ -15,7 +15,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - #include "unit/TestBase.h" #include "unit/Catch.h" #include "SmbConnectionControllerService.h" diff --git a/extensions/splunk/SplunkHECProcessor.cpp b/extensions/splunk/SplunkHECProcessor.cpp index eae24f31b..4427668aa 100644 --- a/extensions/splunk/SplunkHECProcessor.cpp +++ b/extensions/splunk/SplunkHECProcessor.cpp @@ -41,7 +41,7 @@ std::string SplunkHECProcessor::getNetworkLocation() const { } void SplunkHECProcessor::initializeClient(http::HTTPClient& client, const std::string &url, std::shared_ptr<minifi::controllers::SSLContextServiceInterface> ssl_context_service) const { - client.initialize(http::HttpRequestMethod::POST, url, std::move(ssl_context_service)); + client.initialize(http::HttpRequestMethod::Post, url, std::move(ssl_context_service)); client.setRequestHeader("Authorization", token_); client.setRequestHeader("X-Splunk-Request-Channel", request_channel_); } diff --git a/extensions/standard-processors/processors/InvokeHTTP.cpp b/extensions/standard-processors/processors/InvokeHTTP.cpp index 7ca018fd4..1e037730d 100644 --- a/extensions/standard-processors/processors/InvokeHTTP.cpp +++ b/extensions/standard-processors/processors/InvokeHTTP.cpp @@ -200,7 +200,7 @@ void InvokeHTTP::onSchedule(core::ProcessContext& context, core::ProcessSessionF } bool InvokeHTTP::shouldEmitFlowFile() const { - return (http::HttpRequestMethod::POST == method_ || http::HttpRequestMethod::PUT == method_ || http::HttpRequestMethod::PATCH == method_); + return (http::HttpRequestMethod::Post == method_ || http::HttpRequestMethod::Put == method_ || http::HttpRequestMethod::Patch == method_); } /** diff --git a/extensions/standard-processors/processors/InvokeHTTP.h b/extensions/standard-processors/processors/InvokeHTTP.h index 744f9781f..cec9a2fd3 100644 --- a/extensions/standard-processors/processors/InvokeHTTP.h +++ b/extensions/standard-processors/processors/InvokeHTTP.h @@ -139,7 +139,7 @@ class InvokeHTTP : public core::ProcessorImpl { EXTENSIONAPI static constexpr auto Method = core::PropertyDefinitionBuilder<magic_enum::enum_count<http::HttpRequestMethod>()>::createProperty("HTTP Method") .withDescription("HTTP request method. Methods other than POST, PUT and PATCH will be sent without a message body.") .withAllowedValues(magic_enum::enum_names<http::HttpRequestMethod>()) - .withDefaultValue(magic_enum::enum_name(http::HttpRequestMethod::GET)) + .withDefaultValue(magic_enum::enum_name(http::HttpRequestMethod::Get)) .build(); EXTENSIONAPI static constexpr auto URL = core::PropertyDefinitionBuilder<>::createProperty("Remote URL") .withDescription("Remote URL which will be connected to, including scheme, host, port, path.") diff --git a/extensions/standard-processors/tests/unit/HttpClientStoreTests.cpp b/extensions/standard-processors/tests/unit/HttpClientStoreTests.cpp index c3bc7f985..7ecb0433c 100644 --- a/extensions/standard-processors/tests/unit/HttpClientStoreTests.cpp +++ b/extensions/standard-processors/tests/unit/HttpClientStoreTests.cpp @@ -44,7 +44,7 @@ class HttpClientStoreTestAccessor { TEST_CASE("HttpClientStore can create new client for a url and is returned after it's not used anymore") { minifi::processors::invoke_http::HttpClientStore store(2, [](const std::string& url) { auto client = std::make_unique<minifi::http::HTTPClient>(); - client->initialize(minifi::http::HttpRequestMethod::GET, url, nullptr); + client->initialize(minifi::http::HttpRequestMethod::Get, url, nullptr); return gsl::make_not_null(std::move(client)); }); REQUIRE(HttpClientStoreTestAccessor::getMaxSize(store) == 2); @@ -65,7 +65,7 @@ TEST_CASE("HttpClientStore can create new client for a url and is returned after TEST_CASE("A http client can be reused") { minifi::processors::invoke_http::HttpClientStore store(2, [](const std::string& url) { auto client = std::make_unique<minifi::http::HTTPClient>(); - client->initialize(minifi::http::HttpRequestMethod::GET, url, nullptr); + client->initialize(minifi::http::HttpRequestMethod::Get, url, nullptr); return gsl::make_not_null(std::move(client)); }); minifi::http::HTTPClient* client_ptr = nullptr; @@ -89,7 +89,7 @@ TEST_CASE("A http client can be reused") { TEST_CASE("A new url always creates a new client") { minifi::processors::invoke_http::HttpClientStore store(3, [](const std::string& url) { auto client = std::make_unique<minifi::http::HTTPClient>(); - client->initialize(minifi::http::HttpRequestMethod::GET, url, nullptr); + client->initialize(minifi::http::HttpRequestMethod::Get, url, nullptr); return gsl::make_not_null(std::move(client)); }); const auto& used_clients = HttpClientStoreTestAccessor::getUsedClients(store); @@ -114,7 +114,7 @@ TEST_CASE("A new url always creates a new client") { TEST_CASE("If a store is full, the first unused client is replaced by the newly requested one") { minifi::processors::invoke_http::HttpClientStore store(3, [](const std::string& url) { auto client = std::make_unique<minifi::http::HTTPClient>(); - client->initialize(minifi::http::HttpRequestMethod::GET, url, nullptr); + client->initialize(minifi::http::HttpRequestMethod::Get, url, nullptr); return gsl::make_not_null(std::move(client)); }); const auto& used_clients = HttpClientStoreTestAccessor::getUsedClients(store); @@ -148,7 +148,7 @@ TEST_CASE("If a store is full, the first unused client is replaced by the newly TEST_CASE("Multiple unused clients are present the oldest one is replaced") { minifi::processors::invoke_http::HttpClientStore store(4, [](const std::string& url) { auto client = std::make_unique<minifi::http::HTTPClient>(); - client->initialize(minifi::http::HttpRequestMethod::GET, url, nullptr); + client->initialize(minifi::http::HttpRequestMethod::Get, url, nullptr); return gsl::make_not_null(std::move(client)); }); const auto& used_clients = HttpClientStoreTestAccessor::getUsedClients(store); @@ -185,7 +185,7 @@ TEST_CASE("Multiple unused clients are present the oldest one is replaced") { TEST_CASE("If all clients are in use, the call will block until a client is returned") { minifi::processors::invoke_http::HttpClientStore store(2, [](const std::string& url) { auto client = std::make_unique<minifi::http::HTTPClient>(); - client->initialize(minifi::http::HttpRequestMethod::GET, url, nullptr); + client->initialize(minifi::http::HttpRequestMethod::Get, url, nullptr); return gsl::make_not_null(std::move(client)); }); bool client2_created{false}; diff --git a/libminifi/include/c2/ControllerSocketProtocol.h b/libminifi/include/c2/ControllerSocketProtocol.h index a1644d380..abb15cb31 100644 --- a/libminifi/include/c2/ControllerSocketProtocol.h +++ b/libminifi/include/c2/ControllerSocketProtocol.h @@ -42,8 +42,7 @@ namespace org::apache::nifi::minifi::c2 { */ class ControllerSocketProtocol { public: - ControllerSocketProtocol(core::controller::ControllerServiceProvider& controller, state::StateMonitor& update_sink, - std::shared_ptr<Configure> configuration, const std::shared_ptr<ControllerSocketReporter>& controller_socket_reporter); + ControllerSocketProtocol(state::StateMonitor& update_sink, std::shared_ptr<Configure> configuration, const std::shared_ptr<ControllerSocketReporter>& controller_socket_reporter); ~ControllerSocketProtocol(); void initialize(); void setRoot(core::ProcessGroup* root); @@ -70,7 +69,6 @@ class ControllerSocketProtocol { asio::awaitable<void> startAcceptSsl(std::shared_ptr<minifi::controllers::SSLContextServiceInterface> ssl_context_service); void stopListener(); - core::controller::ControllerServiceProvider& controller_; state::StateMonitor& update_sink_; asio::io_context io_context_; diff --git a/libminifi/include/core/logging/LoggerConfiguration.h b/libminifi/include/core/logging/LoggerConfiguration.h index ffe5b64ea..4b4d6eb63 100644 --- a/libminifi/include/core/logging/LoggerConfiguration.h +++ b/libminifi/include/core/logging/LoggerConfiguration.h @@ -100,7 +100,7 @@ class LoggerConfiguration { return getCompressedLogs(std::chrono::milliseconds{0}); } - void initializeAlertSinks(core::controller::ControllerServiceProvider* controller, const std::shared_ptr<AgentIdentificationProvider>& agent_id); + void initializeAlertSinks(const std::shared_ptr<Configure>& config); template<class Rep, class Period> static std::vector<std::unique_ptr<io::InputStream>> getCompressedLogs(const std::chrono::duration<Rep, Period>& time) { diff --git a/libminifi/include/core/logging/alert/AlertSink.h b/libminifi/include/core/logging/alert/AlertSink.h index 909574089..9487a61e3 100644 --- a/libminifi/include/core/logging/alert/AlertSink.h +++ b/libminifi/include/core/logging/alert/AlertSink.h @@ -25,13 +25,13 @@ #include <string> #include <memory> -#include "core/controller/ControllerServiceProvider.h" #include "core/logging/LoggerProperties.h" #include "utils/ThreadPool.h" #include "utils/StagingQueue.h" #include "utils/RegexUtils.h" #include "properties/Configure.h" #include "spdlog/sinks/base_sink.h" +#include "minifi-cpp/controllers/SSLContextServiceInterface.h" namespace org::apache::nifi::minifi::controllers { class SSLContextServiceInterface; @@ -48,14 +48,13 @@ class AlertSink : public spdlog::sinks::base_sink<std::mutex> { static std::shared_ptr<AlertSink> create(const std::string& prop_name_prefix, const std::shared_ptr<LoggerProperties>& logger_properties, std::shared_ptr<Logger> logger); - void initialize(core::controller::ControllerServiceProvider* controller, std::shared_ptr<AgentIdentificationProvider> agent_id); + void initialize(std::shared_ptr<AgentIdentificationProvider> agent_id, std::shared_ptr<controllers::SSLContextServiceInterface> ssl_service); ~AlertSink() override; private: struct Config { std::string url; - std::optional<std::string> ssl_service_name; int batch_size; std::chrono::milliseconds flush_period; std::chrono::milliseconds rate_limit; diff --git a/libminifi/src/Configuration.cpp b/libminifi/src/Configuration.cpp index d16401719..b8881c0b0 100644 --- a/libminifi/src/Configuration.cpp +++ b/libminifi/src/Configuration.cpp @@ -96,7 +96,6 @@ const std::unordered_map<std::string_view, gsl::not_null<const core::PropertyVal {Configuration::nifi_c2_rest_path_base, gsl::make_not_null(&core::StandardPropertyValidators::ALWAYS_VALID_VALIDATOR)}, {Configuration::nifi_c2_rest_url, gsl::make_not_null(&core::StandardPropertyValidators::ALWAYS_VALID_VALIDATOR)}, {Configuration::nifi_c2_rest_url_ack, gsl::make_not_null(&core::StandardPropertyValidators::ALWAYS_VALID_VALIDATOR)}, - {Configuration::nifi_c2_rest_ssl_context_service, gsl::make_not_null(&core::StandardPropertyValidators::ALWAYS_VALID_VALIDATOR)}, {Configuration::nifi_c2_rest_request_encoding, gsl::make_not_null(&core::StandardPropertyValidators::ALWAYS_VALID_VALIDATOR)}, {Configuration::nifi_c2_rest_heartbeat_minimize_updates, gsl::make_not_null(&core::StandardPropertyValidators::BOOLEAN_VALIDATOR)}, {Configuration::nifi_c2_flow_info_processor_bulletin_limit, gsl::make_not_null(&core::StandardPropertyValidators::UNSIGNED_INTEGER_VALIDATOR)}, @@ -130,7 +129,6 @@ const std::unordered_map<std::string_view, gsl::not_null<const core::PropertyVal {Configuration::nifi_log_compression_compressed_log_max_size, gsl::make_not_null(&core::StandardPropertyValidators::DATA_SIZE_VALIDATOR)}, {Configuration::nifi_log_max_log_entry_length, gsl::make_not_null(&core::StandardPropertyValidators::ALWAYS_VALID_VALIDATOR)}, {Configuration::nifi_log_alert_url, gsl::make_not_null(&core::StandardPropertyValidators::ALWAYS_VALID_VALIDATOR)}, - {Configuration::nifi_log_alert_ssl_context_service, gsl::make_not_null(&core::StandardPropertyValidators::ALWAYS_VALID_VALIDATOR)}, {Configuration::nifi_log_alert_batch_size, gsl::make_not_null(&core::StandardPropertyValidators::ALWAYS_VALID_VALIDATOR)}, {Configuration::nifi_log_alert_flush_period, gsl::make_not_null(&core::StandardPropertyValidators::TIME_PERIOD_VALIDATOR)}, {Configuration::nifi_log_alert_filter, gsl::make_not_null(&core::StandardPropertyValidators::ALWAYS_VALID_VALIDATOR)}, @@ -152,7 +150,6 @@ const std::unordered_map<std::string_view, gsl::not_null<const core::PropertyVal {Configuration::controller_socket_local_any_interface, gsl::make_not_null(&core::StandardPropertyValidators::BOOLEAN_VALIDATOR)}, {Configuration::controller_socket_host, gsl::make_not_null(&core::StandardPropertyValidators::ALWAYS_VALID_VALIDATOR)}, {Configuration::controller_socket_port, gsl::make_not_null(&core::StandardPropertyValidators::PORT_VALIDATOR)}, - {Configuration::controller_ssl_context_service, gsl::make_not_null(&core::StandardPropertyValidators::ALWAYS_VALID_VALIDATOR)}, {Configuration::nifi_flow_file_repository_check_health, gsl::make_not_null(&core::StandardPropertyValidators::BOOLEAN_VALIDATOR)}, {Configuration::nifi_python_virtualenv_directory, gsl::make_not_null(&core::StandardPropertyValidators::ALWAYS_VALID_VALIDATOR)}, {Configuration::nifi_python_env_setup_binary, gsl::make_not_null(&core::StandardPropertyValidators::ALWAYS_VALID_VALIDATOR)}, diff --git a/libminifi/src/FlowController.cpp b/libminifi/src/FlowController.cpp index 7bb67caf1..ac875ff19 100644 --- a/libminifi/src/FlowController.cpp +++ b/libminifi/src/FlowController.cpp @@ -92,7 +92,7 @@ FlowController::FlowController(std::shared_ptr<core::Repository> provenance_repo controller_socket_metrics_publisher = std::dynamic_pointer_cast<c2::ControllerSocketMetricsPublisher>(publisher); controller_socket_metrics_publisher->setFlowStatusDependencies(bulletin_store, flow_file_repo_->getDirectory(), content_repo_->getStoragePath()); } - controller_socket_protocol_ = std::make_unique<c2::ControllerSocketProtocol>(*this, *this, configuration_, controller_socket_metrics_publisher); + controller_socket_protocol_ = std::make_unique<c2::ControllerSocketProtocol>(*this, configuration_, controller_socket_metrics_publisher); root_wrapper_.setControllerSocketProtocol(controller_socket_protocol_.get()); } } @@ -345,7 +345,7 @@ int16_t FlowController::start() { start_time_ = std::chrono::steady_clock::now(); } - core::logging::LoggerConfiguration::getConfiguration().initializeAlertSinks(this, configuration_); + core::logging::LoggerConfiguration::getConfiguration().initializeAlertSinks(configuration_); running_ = true; content_repo_->start(); provenance_repo_->start(); diff --git a/libminifi/src/RemoteProcessGroupPort.cpp b/libminifi/src/RemoteProcessGroupPort.cpp index 98fdc08cd..73443412d 100644 --- a/libminifi/src/RemoteProcessGroupPort.cpp +++ b/libminifi/src/RemoteProcessGroupPort.cpp @@ -94,7 +94,7 @@ std::unique_ptr<sitetosite::SiteToSiteClient> RemoteProcessGroupPort::getNextPro auto& peer_status = peers_[peer_index_]; sitetosite::SiteToSiteClientConfiguration config(peer_status.getPortId(), peer_status.getHost(), peer_status.getPort(), local_network_interface_, client_type_); peer_index_++; - if (peer_index_ >= static_cast<int>(peers_.size())) { + if (peer_index_ >= gsl::narrow<int>(peers_.size())) { peer_index_ = 0; } next_protocol = initializeProtocol(config); @@ -161,7 +161,7 @@ void RemoteProcessGroupPort::onSchedule(core::ProcessContext& context, core::Pro auto peer_status = peers_[peer_index_]; sitetosite::SiteToSiteClientConfiguration config(peer_status.getPortId(), peer_status.getHost(), peer_status.getPort(), local_network_interface_, client_type_); peer_index_++; - if (peer_index_ >= static_cast<int>(peers_.size())) { + if (peer_index_ >= gsl::narrow<int>(peers_.size())) { peer_index_ = 0; } logger_->log_trace("Creating client"); @@ -235,7 +235,7 @@ std::optional<std::string> RemoteProcessGroupPort::getRestApiToken(const RPG& ni return std::nullopt; } auto client = std::unique_ptr<http::BaseHTTPClient>(dynamic_cast<http::BaseHTTPClient*>(client_ptr)); - client->initialize(http::HttpRequestMethod::GET, login_url.str(), ssl_service_); + client->initialize(http::HttpRequestMethod::Get, login_url.str(), ssl_service_); // use a connection timeout. if this times out we will simply attempt re-connection // so no need for configuration parameter that isn't already defined in Processor client->setConnectionTimeout(10s); @@ -296,7 +296,7 @@ std::optional<std::pair<std::string, uint16_t>> RemoteProcessGroupPort::tryRefre auto client = std::unique_ptr<http::BaseHTTPClient>(dynamic_cast<http::BaseHTTPClient*>(client_ptr)); auto full_url = buildFullSiteToSiteUrl(nifi); - client->initialize(http::HttpRequestMethod::GET, full_url, ssl_service_); + client->initialize(http::HttpRequestMethod::Get, full_url, ssl_service_); // use a connection timeout. if this times out we will simply attempt re-connection // so no need for configuration parameter that isn't already defined in Processor client->setConnectionTimeout(10s); diff --git a/libminifi/src/c2/ControllerSocketProtocol.cpp b/libminifi/src/c2/ControllerSocketProtocol.cpp index 7068af38e..d5bb7074d 100644 --- a/libminifi/src/c2/ControllerSocketProtocol.cpp +++ b/libminifi/src/c2/ControllerSocketProtocol.cpp @@ -69,13 +69,12 @@ ControllerSocketProtocol::SocketRestartCommandProcessor::~SocketRestartCommandPr } } -ControllerSocketProtocol::ControllerSocketProtocol(core::controller::ControllerServiceProvider& controller, state::StateMonitor& update_sink, - std::shared_ptr<Configure> configuration, const std::shared_ptr<ControllerSocketReporter>& controller_socket_reporter) - : controller_(controller), - update_sink_(update_sink), - controller_socket_reporter_(controller_socket_reporter), - configuration_(std::move(configuration)), - socket_restart_processor_(update_sink_, logger_) { +ControllerSocketProtocol::ControllerSocketProtocol(state::StateMonitor& update_sink, std::shared_ptr<Configure> configuration, + const std::shared_ptr<ControllerSocketReporter>& controller_socket_reporter) + : update_sink_(update_sink), + controller_socket_reporter_(controller_socket_reporter), + configuration_(std::move(configuration)), + socket_restart_processor_(update_sink_, logger_) { gsl_Expects(configuration_); } @@ -145,19 +144,10 @@ asio::awaitable<void> ControllerSocketProtocol::startAcceptSsl(std::shared_ptr<m void ControllerSocketProtocol::initialize() { std::unique_lock<std::mutex> lock(initialization_mutex_); std::shared_ptr<minifi::controllers::SSLContextServiceInterface> secure_context; - std::string context_name; - if (configuration_->get(Configure::controller_ssl_context_service, context_name)) { - std::shared_ptr<core::controller::ControllerService> service = controller_.getControllerService(context_name); - if (nullptr != service) { - secure_context = std::dynamic_pointer_cast<minifi::controllers::SSLContextServiceInterface>(service); - } - } - if (nullptr == secure_context) { - std::string secure_str; - if (configuration_->get(Configure::nifi_remote_input_secure, secure_str) && org::apache::nifi::minifi::utils::string::toBool(secure_str).value_or(false)) { - secure_context = std::make_shared<minifi::controllers::SSLContextService>("ControllerSocketProtocolSSL", configuration_); - secure_context->onEnable(); - } + std::string secure_str; + if (configuration_->get(Configure::nifi_remote_input_secure, secure_str) && org::apache::nifi::minifi::utils::string::toBool(secure_str).value_or(false)) { + secure_context = std::make_shared<minifi::controllers::SSLContextService>("ControllerSocketProtocolSSL", configuration_); + secure_context->onEnable(); } std::string limit_str; diff --git a/libminifi/src/c2/protocols/RESTSender.cpp b/libminifi/src/c2/protocols/RESTSender.cpp index 56da8b607..a9835663e 100644 --- a/libminifi/src/c2/protocols/RESTSender.cpp +++ b/libminifi/src/c2/protocols/RESTSender.cpp @@ -44,8 +44,6 @@ void RESTSender::initialize(core::controller::ControllerServiceProvider* control // base URL when one is not specified. if (nullptr != configure) { std::optional<std::string> rest_base_path = configure->get(Configuration::nifi_c2_rest_path_base); - std::string update_str; - std::string ssl_context_service_str; configure->get(Configuration::nifi_c2_rest_url, "c2.rest.url", rest_uri_); configure->get(Configuration::nifi_c2_rest_url_ack, "c2.rest.url.ack", ack_uri_); if (rest_uri_.starts_with("/")) { @@ -60,17 +58,10 @@ void RESTSender::initialize(core::controller::ControllerServiceProvider* control } ack_uri_ = rest_base_path.value() + ack_uri_; } - if (controller && configure->get(Configuration::nifi_c2_rest_ssl_context_service, "c2.rest.ssl.context.service", ssl_context_service_str)) { - if (auto service = controller->getControllerService(ssl_context_service_str)) { - ssl_context_service_ = std::dynamic_pointer_cast<minifi::controllers::SSLContextServiceInterface>(service); - } - } - if (nullptr == ssl_context_service_) { - std::string ssl_context_str; - if (configure->get(Configure::nifi_remote_input_secure, ssl_context_str) && org::apache::nifi::minifi::utils::string::toBool(ssl_context_str).value_or(false)) { - ssl_context_service_ = std::make_shared<minifi::controllers::SSLContextService>("RESTSenderSSL", configure); - ssl_context_service_->onEnable(); - } + std::string ssl_context_str; + if (configure->get(Configure::nifi_remote_input_secure, ssl_context_str) && org::apache::nifi::minifi::utils::string::toBool(ssl_context_str).value_or(false)) { + ssl_context_service_ = std::make_shared<minifi::controllers::SSLContextService>("RESTSenderSSL", configure); + ssl_context_service_->onEnable(); } if (auto req_encoding_str = configure->get(Configuration::nifi_c2_rest_request_encoding)) { if (auto req_encoding = magic_enum::enum_cast<RequestEncoding>(*req_encoding_str, magic_enum::case_insensitive)) { @@ -128,7 +119,7 @@ C2Payload RESTSender::sendPayload(const std::string& url, const Direction direct auto setUpHttpRequest = [&](http::HttpRequestMethod http_method) { client.set_request_method(http_method); - if (url.find("https://") == 0) { + if (url.starts_with("https://")) { if (!ssl_context_service_) { setSecurityContext(client, http_method, url); } else { @@ -137,7 +128,7 @@ C2Payload RESTSender::sendPayload(const std::string& url, const Direction direct } }; if (direction == Direction::TRANSMIT) { - setUpHttpRequest(http::HttpRequestMethod::POST); + setUpHttpRequest(http::HttpRequestMethod::Post); if (payload.getOperation() == Operation::transfer) { // treat nested payloads as files for (const auto& file : payload.getNestedPayloads()) { @@ -178,7 +169,7 @@ C2Payload RESTSender::sendPayload(const std::string& url, const Direction direct } else { // we do not need to set the upload callback // since we are not uploading anything on a get - setUpHttpRequest(http::HttpRequestMethod::GET); + setUpHttpRequest(http::HttpRequestMethod::Get); } if (payload.getOperation() == Operation::transfer) { diff --git a/libminifi/src/core/logging/LoggerConfiguration.cpp b/libminifi/src/core/logging/LoggerConfiguration.cpp index 6a9e7428a..cb3a74c0a 100644 --- a/libminifi/src/core/logging/LoggerConfiguration.cpp +++ b/libminifi/src/core/logging/LoggerConfiguration.cpp @@ -38,6 +38,7 @@ #include "utils/Literals.h" #include "core/TypedValues.h" #include "core/logging/Utils.h" +#include "controllers/SSLContextService.h" #include "spdlog/spdlog.h" #include "spdlog/sinks/stdout_sinks.h" @@ -346,10 +347,15 @@ void LoggerConfiguration::initializeCompression(const std::lock_guard<std::mutex } } -void LoggerConfiguration::initializeAlertSinks(core::controller::ControllerServiceProvider* controller, const std::shared_ptr<AgentIdentificationProvider>& agent_id) { +void LoggerConfiguration::initializeAlertSinks(const std::shared_ptr<Configure>& config) { + auto ssl_service = std::make_shared<controllers::SSLContextService>("AlertSinkSSLContextService", config); + ssl_service->onEnable(); + if (ssl_service->getCertificateFile().empty()) { + ssl_service.reset(); + } std::lock_guard guard(mutex_); for (auto& sink : alert_sinks_) { - sink->initialize(controller, agent_id); + sink->initialize(config, ssl_service); } } diff --git a/libminifi/src/core/logging/alert/AlertSink.cpp b/libminifi/src/core/logging/alert/AlertSink.cpp index 86745e88e..e728ff970 100644 --- a/libminifi/src/core/logging/alert/AlertSink.cpp +++ b/libminifi/src/core/logging/alert/AlertSink.cpp @@ -21,7 +21,6 @@ #include "http/BaseHTTPClient.h" #include "utils/Hash.h" #include "core/logging/Utils.h" -#include "minifi-cpp/controllers/SSLContextServiceInterface.h" #include "rapidjson/rapidjson.h" #include "rapidjson/document.h" @@ -87,33 +86,15 @@ std::shared_ptr<AlertSink> AlertSink::create(const std::string& prop_name_prefix config.rate_limit = readPropertyOr(".rate.limit", TimePeriodValue::fromString, "10 min").getMilliseconds(); config.buffer_limit = readPropertyOr(".buffer.limit", datasize_parser, "1 MB"); config.level = readPropertyOr(".level", utils::parse_log_level, "trace"); - config.ssl_service_name = logger_properties->getString(prop_name_prefix + ".ssl.context.service"); return std::shared_ptr<AlertSink>(new AlertSink(std::move(config), std::move(logger))); } -void AlertSink::initialize(core::controller::ControllerServiceProvider* controller, std::shared_ptr<AgentIdentificationProvider> agent_id) { +void AlertSink::initialize(std::shared_ptr<AgentIdentificationProvider> agent_id, std::shared_ptr<controllers::SSLContextServiceInterface> ssl_service) { auto services = std::make_unique<Services>(); services->agent_id = std::move(agent_id); - - if (config_.ssl_service_name) { - if (!controller) { - logger_->log_error("Could not find service '{}': no service provider", config_.ssl_service_name.value()); - return; - } - if (auto service = controller->getControllerService(config_.ssl_service_name.value())) { - if (auto ssl_service = std::dynamic_pointer_cast<controllers::SSLContextServiceInterface>(service)) { - services->ssl_service = ssl_service; - } else { - logger_->log_error("Service '{}' is not an SSLContextService", config_.ssl_service_name.value()); - return; - } - } else { - logger_->log_error("Could not find service '{}'", config_.ssl_service_name.value()); - return; - } - } + services->ssl_service = std::move(ssl_service); services.reset(services_.exchange(services.release())); } @@ -170,7 +151,7 @@ void AlertSink::run() { Services* expected{nullptr}; // only restore the services pointer if no initialize set it to something else meanwhile if (services_.compare_exchange_strong(expected, services.get())) { - (void)services.release(); + std::ignore = services.release(); } } } @@ -199,7 +180,7 @@ void AlertSink::send(Services& services) { logger_->log_error("Could not instantiate a HTTPClient object"); return; } - client->initialize(http::HttpRequestMethod::PUT, config_.url, services.ssl_service); + client->initialize(http::HttpRequestMethod::Put, config_.url, services.ssl_service); rapidjson::Document doc(rapidjson::kObjectType); std::string agent_id = services.agent_id->getAgentIdentifier(); diff --git a/libminifi/src/sitetosite/HttpSiteToSiteClient.cpp b/libminifi/src/sitetosite/HttpSiteToSiteClient.cpp index b8fcbaf86..9cdbd8b08 100644 --- a/libminifi/src/sitetosite/HttpSiteToSiteClient.cpp +++ b/libminifi/src/sitetosite/HttpSiteToSiteClient.cpp @@ -35,8 +35,6 @@ #include "rapidjson/document.h" #include "rapidjson/error/en.h" -#undef DELETE // macro on windows - namespace org::apache::nifi::minifi::sitetosite { namespace { @@ -97,7 +95,7 @@ std::shared_ptr<Transaction> HttpSiteToSiteClient::createTransaction(TransferDir std::string dir_str = direction == TransferDirection::SEND ? "input-ports" : "output-ports"; std::stringstream uri; uri << getBaseURI() << "data-transfer/" << dir_str << "/" << getPortId().to_string() << "/transactions"; - auto client = createHttpClient(uri.str(), http::HttpRequestMethod::POST); + auto client = createHttpClient(uri.str(), http::HttpRequestMethod::Post); setSiteToSiteHeaders(*client); client->setConnectionTimeout(std::chrono::milliseconds(5000)); client->setContentType("application/json"); @@ -241,7 +239,7 @@ std::optional<std::vector<PeerStatus>> HttpSiteToSiteClient::getPeerList() { std::stringstream uri; uri << getBaseURI() << "site-to-site/peers"; - auto client = createHttpClient(uri.str(), http::HttpRequestMethod::GET); + auto client = createHttpClient(uri.str(), http::HttpRequestMethod::Get); setSiteToSiteHeaders(*client); @@ -256,7 +254,7 @@ std::optional<std::vector<PeerStatus>> HttpSiteToSiteClient::getPeerList() { std::shared_ptr<minifi::http::HTTPClient> HttpSiteToSiteClient::openConnectionForSending(const std::shared_ptr<HttpTransaction> &transaction) { std::stringstream uri; uri << transaction->getTransactionUrl() << "/flow-files"; - std::shared_ptr<minifi::http::HTTPClient> client = createHttpClient(uri.str(), http::HttpRequestMethod::POST); + std::shared_ptr<minifi::http::HTTPClient> client = createHttpClient(uri.str(), http::HttpRequestMethod::Post); client->setContentType("application/octet-stream"); client->setRequestHeader("Accept", "text/plain"); client->setRequestHeader("Transfer-Encoding", "chunked"); @@ -266,7 +264,7 @@ std::shared_ptr<minifi::http::HTTPClient> HttpSiteToSiteClient::openConnectionFo std::shared_ptr<minifi::http::HTTPClient> HttpSiteToSiteClient::openConnectionForReceive(const std::shared_ptr<HttpTransaction> &transaction) { std::stringstream uri; uri << transaction->getTransactionUrl() << "/flow-files"; - return createHttpClient(uri.str(), http::HttpRequestMethod::GET); + return createHttpClient(uri.str(), http::HttpRequestMethod::Get); } std::string HttpSiteToSiteClient::getBaseURI() { @@ -346,7 +344,7 @@ void HttpSiteToSiteClient::closeTransaction(const utils::Identifier &transaction uri << "&checksum=" << transaction->getCRC(); } - auto client = createHttpClient(uri.str(), http::HttpRequestMethod::DELETE); + auto client = createHttpClient(uri.str(), http::HttpRequestMethod::Delete); setSiteToSiteHeaders(*client); client->setConnectionTimeout(std::chrono::milliseconds(5000)); client->setRequestHeader("Accept", "application/json"); diff --git a/libminifi/test/integration/AlertTests.cpp b/libminifi/test/integration/AlertTests.cpp index 73fa202d1..49d59dacc 100644 --- a/libminifi/test/integration/AlertTests.cpp +++ b/libminifi/test/integration/AlertTests.cpp @@ -79,7 +79,14 @@ TEST_CASE("Alert system forwards logs") { std::string agent_id = "test-agent-1"; VerifyAlerts harness(flow_config_file.string(), dir.getPath()); AlertHandler handler(agent_id); - harness.setUrl("http://localhost:0/api/alerts", &handler); + + SECTION("Secure") { + harness.setKeyDir(TEST_RESOURCES); + harness.setUrl("https://localhost:0/api/alerts", &handler); + } + SECTION("Unsecure") { + harness.setUrl("http://localhost:0/api/alerts", &handler); + } harness.getConfiguration()->set(minifi::Configuration::nifi_c2_agent_identifier, agent_id); auto log_props = std::make_shared<logging::LoggerProperties>(dir.getPath() / "logs"); diff --git a/libminifi/test/integration/HTTPClientTests.cpp b/libminifi/test/integration/HTTPClientTests.cpp index 688beb734..05d309e6a 100644 --- a/libminifi/test/integration/HTTPClientTests.cpp +++ b/libminifi/test/integration/HTTPClientTests.cpp @@ -82,7 +82,7 @@ TEST_CASE("HTTPClientTestChunkedResponse", "[basic]") { const std::string port = std::to_string(vec.at(0)); HTTPClient client; - client.initialize(http::HttpRequestMethod::GET, "http://localhost:" + port + "/testytesttest", nullptr); + client.initialize(http::HttpRequestMethod::Get, "http://localhost:" + port + "/testytesttest", nullptr); REQUIRE(client.submit()); @@ -126,15 +126,15 @@ TEST_CASE("HTTPClient should be reusable", "[basic]") { HTTPClient client; client.setKeepAliveProbe(KeepAliveProbeData{2s, 2s}); - client.initialize(http::HttpRequestMethod::GET, "http://localhost:" + keep_alive_server_.getPort() + "/method", nullptr); + client.initialize(http::HttpRequestMethod::Get, "http://localhost:" + keep_alive_server_.getPort() + "/method", nullptr); std::vector<http::HttpRequestMethod> methods = { - http::HttpRequestMethod::GET, http::HttpRequestMethod::GET, http::HttpRequestMethod::PUT, http::HttpRequestMethod::GET, - http::HttpRequestMethod::GET, http::HttpRequestMethod::POST, http::HttpRequestMethod::POST, http::HttpRequestMethod::PUT }; + http::HttpRequestMethod::Get, http::HttpRequestMethod::Get, http::HttpRequestMethod::Put, http::HttpRequestMethod::Get, + http::HttpRequestMethod::Get, http::HttpRequestMethod::Post, http::HttpRequestMethod::Post, http::HttpRequestMethod::Put }; uint64_t request_number = 0; for (const auto& method: methods) { client.set_request_method(method); - if (method != http::HttpRequestMethod::GET) { + if (method != http::HttpRequestMethod::Get) { auto callback = std::make_unique<org::apache::nifi::minifi::http::HTTPUploadByteArrayInputCallback>(); std::string content = R"({ "content": "a" })"; callback->write(content); @@ -162,7 +162,7 @@ TEST_CASE("HTTPClient should be reusable", "[basic]") { #ifdef __linux__ TEST_CASE("SSL without SSLContextService", "[HTTPClient]") { HTTPClient client; - client.initialize(http::HttpRequestMethod::GET, "https://apache.org", nullptr); + client.initialize(http::HttpRequestMethod::Get, "https://apache.org", nullptr); REQUIRE(client.submit()); } #endif diff --git a/libminifi/test/libtest/unit/TestBase.h b/libminifi/test/libtest/unit/TestBase.h index b410f9fae..d87178ec0 100644 --- a/libminifi/test/libtest/unit/TestBase.h +++ b/libminifi/test/libtest/unit/TestBase.h @@ -41,6 +41,7 @@ #include "utils/file/FileUtils.h" #include "properties/Configuration.h" #include "core/Processor.h" +#include "core/ProcessGroup.h" namespace minifi = org::apache::nifi::minifi; namespace utils = minifi::utils; diff --git a/libminifi/test/resources/encrypted.minifi.properties b/libminifi/test/resources/encrypted.minifi.properties index dc1bf5272..79d5a550a 100644 --- a/libminifi/test/resources/encrypted.minifi.properties +++ b/libminifi/test/resources/encrypted.minifi.properties @@ -84,7 +84,6 @@ c2.agent.identifier.protected=xsalsa20poly1305 #controller.socket.host=localhost #controller.socket.port=9998 #controller.socket.local.any.interface=false -#controller.ssl.context.service=SSLContextService # must be comma separated diff --git a/libminifi/test/unit/ArrayUtilsTests.cpp b/libminifi/test/unit/ArrayUtilsTests.cpp index 481e1d945..e56fb58f4 100644 --- a/libminifi/test/unit/ArrayUtilsTests.cpp +++ b/libminifi/test/unit/ArrayUtilsTests.cpp @@ -45,8 +45,8 @@ TEST_CASE("getKeys() works correctly and is constexpr") { inline constexpr std::array<std::pair<int, int>, 3> global_mapping{{ {1, 1}, {2, 4}, {3, 27} }}; template<int> struct is_usable_as_constant_expression {}; -template<int key> concept does_compile = requires { is_usable_as_constant_expression<utils::at(global_mapping, key)>(); }; -template<int key> concept does_not_compile = !does_compile<key>; +template<int key> concept compiles_as_a_constant_expression = requires { is_usable_as_constant_expression<utils::at(global_mapping, key)>(); }; +template<int key> concept does_not_compile_as_a_constant_expression = !compiles_as_a_constant_expression<key>; TEST_CASE("at() works correctly and is constexpr") { static constexpr std::array<std::pair<int, std::string_view>, 3> mapping{{ {1, "one"}, {2, "two"}, {3, "three"} }}; @@ -56,8 +56,8 @@ TEST_CASE("at() works correctly and is constexpr") { int one = 1; CHECK(utils::at(mapping, one) == "one"); // non-constexpr argument is OK, but the result is not constexpr - static_assert(does_compile<3>); - static_assert(does_not_compile<4>); + static_assert(compiles_as_a_constant_expression<3>); + static_assert(does_not_compile_as_a_constant_expression<4>); CHECK_THROWS(utils::at(mapping, 4)); } diff --git a/libminifi/test/unit/EnvironmentVariableParameterProviderTest.cpp b/libminifi/test/unit/EnvironmentVariableParameterProviderTest.cpp index 39036f5ff..45f5a70a6 100644 --- a/libminifi/test/unit/EnvironmentVariableParameterProviderTest.cpp +++ b/libminifi/test/unit/EnvironmentVariableParameterProviderTest.cpp @@ -23,7 +23,7 @@ namespace org::apache::nifi::minifi::test { TEST_CASE("Parameter Group Name is required", "[parameterProviders]") { - utils::Environment::setEnvironmentVariable("MINIFI_DATA", "minifi_data_value"); + minifi::utils::Environment::setEnvironmentVariable("MINIFI_DATA", "minifi_data_value"); parameter_providers::EnvironmentVariableParameterProvider provider("EnvironmentVariableParameterProvider"); provider.initialize(); REQUIRE(provider.setProperty(parameter_providers::EnvironmentVariableParameterProvider::ParameterGroupName.name, "")); @@ -31,7 +31,7 @@ TEST_CASE("Parameter Group Name is required", "[parameterProviders]") { } TEST_CASE("Test EnvironmentVariableParameterProvider with default options", "[parameterProviders]") { - utils::Environment::setEnvironmentVariable("MINIFI_DATA", "minifi_data_value"); + minifi::utils::Environment::setEnvironmentVariable("MINIFI_DATA", "minifi_data_value"); parameter_providers::EnvironmentVariableParameterProvider provider("EnvironmentVariableParameterProvider"); provider.initialize(); REQUIRE(provider.setProperty(parameter_providers::EnvironmentVariableParameterProvider::ParameterGroupName.name, "environment-variable-parameter-context")); @@ -45,8 +45,8 @@ TEST_CASE("Test EnvironmentVariableParameterProvider with default options", "[pa } TEST_CASE("Create parameter context with selected environment variables", "[parameterProviders]") { - utils::Environment::setEnvironmentVariable("MINIFI_DATA", "minifi_data_value"); - utils::Environment::setEnvironmentVariable("MINIFI_NEW_DATA", "minifi_new_data_value"); + minifi::utils::Environment::setEnvironmentVariable("MINIFI_DATA", "minifi_data_value"); + minifi::utils::Environment::setEnvironmentVariable("MINIFI_NEW_DATA", "minifi_new_data_value"); parameter_providers::EnvironmentVariableParameterProvider provider("EnvironmentVariableParameterProvider"); provider.initialize(); REQUIRE(provider.setProperty(parameter_providers::EnvironmentVariableParameterProvider::ParameterGroupName.name, "environment-variable-parameter-context")); @@ -73,8 +73,8 @@ TEST_CASE("Environment variable list must be defined if Comma-Separated inclusio } TEST_CASE("Create parameter context with regex matching environment variables", "[parameterProviders]") { - utils::Environment::setEnvironmentVariable("MINIFI_DATA_1", "minifi_data_value"); - utils::Environment::setEnvironmentVariable("MINIFI_NEW_DATA", "minifi_new_data_value"); + minifi::utils::Environment::setEnvironmentVariable("MINIFI_DATA_1", "minifi_data_value"); + minifi::utils::Environment::setEnvironmentVariable("MINIFI_NEW_DATA", "minifi_new_data_value"); parameter_providers::EnvironmentVariableParameterProvider provider("EnvironmentVariableParameterProvider"); provider.initialize(); REQUIRE(provider.setProperty(parameter_providers::EnvironmentVariableParameterProvider::ParameterGroupName.name, "environment-variable-parameter-context")); diff --git a/libminifi/test/unit/GeneralUtilsTest.cpp b/libminifi/test/unit/GeneralUtilsTest.cpp index 3adf57d82..e1ac2f544 100644 --- a/libminifi/test/unit/GeneralUtilsTest.cpp +++ b/libminifi/test/unit/GeneralUtilsTest.cpp @@ -27,55 +27,55 @@ namespace org::apache::nifi::minifi::test { // intdiv_ceil -static_assert(0 == utils::intdiv_ceil(0, 1)); -static_assert(0 == utils::intdiv_ceil(0, 2)); -static_assert(1 == utils::intdiv_ceil(1, 2)); -static_assert(1 == utils::intdiv_ceil(1, 3)); -static_assert(1 == utils::intdiv_ceil(3, 3)); -static_assert(2 == utils::intdiv_ceil(4, 3)); -static_assert(2 == utils::intdiv_ceil(5, 3)); -static_assert(0 == utils::intdiv_ceil(-1, 3)); -static_assert(-1 == utils::intdiv_ceil(-3, 3)); -static_assert(-1 == utils::intdiv_ceil(-4, 3)); -static_assert(2 == utils::intdiv_ceil(-4, -3)); -static_assert(2 == utils::intdiv_ceil(-5, -3)); -static_assert(0 == utils::intdiv_ceil(1, -3)); -static_assert(-1 == utils::intdiv_ceil(5, -3)); -static_assert(3 == utils::intdiv_ceil(6, 2)); -static_assert(-3 == utils::intdiv_ceil(-6, 2)); -static_assert(-3 == utils::intdiv_ceil(6, -2)); -static_assert(3 == utils::intdiv_ceil(-6, -2)); -static_assert(0 == utils::intdiv_ceil(0, -10)); +static_assert(0 == minifi::utils::intdiv_ceil(0, 1)); +static_assert(0 == minifi::utils::intdiv_ceil(0, 2)); +static_assert(1 == minifi::utils::intdiv_ceil(1, 2)); +static_assert(1 == minifi::utils::intdiv_ceil(1, 3)); +static_assert(1 == minifi::utils::intdiv_ceil(3, 3)); +static_assert(2 == minifi::utils::intdiv_ceil(4, 3)); +static_assert(2 == minifi::utils::intdiv_ceil(5, 3)); +static_assert(0 == minifi::utils::intdiv_ceil(-1, 3)); +static_assert(-1 == minifi::utils::intdiv_ceil(-3, 3)); +static_assert(-1 == minifi::utils::intdiv_ceil(-4, 3)); +static_assert(2 == minifi::utils::intdiv_ceil(-4, -3)); +static_assert(2 == minifi::utils::intdiv_ceil(-5, -3)); +static_assert(0 == minifi::utils::intdiv_ceil(1, -3)); +static_assert(-1 == minifi::utils::intdiv_ceil(5, -3)); +static_assert(3 == minifi::utils::intdiv_ceil(6, 2)); +static_assert(-3 == minifi::utils::intdiv_ceil(-6, 2)); +static_assert(-3 == minifi::utils::intdiv_ceil(6, -2)); +static_assert(3 == minifi::utils::intdiv_ceil(-6, -2)); +static_assert(0 == minifi::utils::intdiv_ceil(0, -10)); template<int N, int D, typename = void> -struct does_compile : std::false_type {}; +struct compiles_as_a_constant_expression : std::false_type {}; template<int N, int D> -struct does_compile<N, D, +struct compiles_as_a_constant_expression<N, D, // we must force evaluation so decltype won't do - typename std::enable_if<(utils::intdiv_ceil(N, D), true)>::type> : std::true_type {}; + std::enable_if_t<(minifi::utils::intdiv_ceil(N, D), true)>> : std::true_type {}; -static_assert(does_compile<2, 3>::value, "does_compile should work"); -static_assert(!does_compile<1, 0>::value, "constexpr division by zero shouldn't compile"); +static_assert(compiles_as_a_constant_expression<2, 3>::value, "compiles_as_a_constant_expression should work"); +static_assert(!compiles_as_a_constant_expression<1, 0>::value, "constexpr division by zero shouldn't compile"); TEST_CASE("GeneralUtils::dereference", "[dereference]") { const int a = 42; const auto pa = gsl::make_not_null(&a); - REQUIRE(42 == utils::dereference(pa)); - REQUIRE(&a == &utils::dereference(pa)); + REQUIRE(42 == minifi::utils::dereference(pa)); + REQUIRE(&a == &minifi::utils::dereference(pa)); const auto uniq_a = gsl::make_not_null(std::make_unique<int>(99)); - REQUIRE(99 == utils::dereference(uniq_a)); + REQUIRE(99 == minifi::utils::dereference(uniq_a)); } TEST_CASE("GeneralUtils::unsafe_dereference", "[unsafe_dereference]") { const int a = 42; const int* const pa = &a; - REQUIRE(42 == utils::unsafe_dereference(pa)); - REQUIRE(&a == &utils::unsafe_dereference(pa)); + REQUIRE(42 == minifi::utils::unsafe_dereference(pa)); + REQUIRE(&a == &minifi::utils::unsafe_dereference(pa)); const auto uniq_a = std::make_unique<int>(99); - REQUIRE(99 == utils::unsafe_dereference(uniq_a)); + REQUIRE(99 == minifi::utils::unsafe_dereference(uniq_a)); } } // namespace org::apache::nifi::minifi::test diff --git a/libminifi/test/unit/ParameterTokenParserTest.cpp b/libminifi/test/unit/ParameterTokenParserTest.cpp index 8f21a2cb2..92dd87821 100644 --- a/libminifi/test/unit/ParameterTokenParserTest.cpp +++ b/libminifi/test/unit/ParameterTokenParserTest.cpp @@ -124,8 +124,8 @@ TEST_CASE("Test replacement with missing token in context") { } TEST_CASE("Sensitive property parameter replacement is not supported") { - utils::crypto::Bytes secret_key = utils::string::from_hex("cb76fe6fe4cbfdc3770c0cb0afc910f81ced4d436b11f691395fc2a9dbea27ca"); - utils::crypto::EncryptionProvider encryption_provider{secret_key}; + minifi::utils::crypto::Bytes secret_key = minifi::utils::string::from_hex("cb76fe6fe4cbfdc3770c0cb0afc910f81ced4d436b11f691395fc2a9dbea27ca"); + minifi::utils::crypto::EncryptionProvider encryption_provider{secret_key}; core::SensitiveParameterTokenParser parser("What is #{what}, baby don't hurt #{who}, don't hurt #{who}, no more", encryption_provider); core::ParameterContext context("test_context"); context.addParameter(core::Parameter{"what", "", false, false, "love"}); @@ -141,19 +141,19 @@ TEST_CASE("Parameter context is not provided when parameter is referenced") { TEST_CASE("Replace only escaped tokens") { core::NonSensitiveParameterTokenParser non_sensitive_parser("No ##{parameters} are ####{present}"); REQUIRE(non_sensitive_parser.replaceParameters(nullptr) == "No #{parameters} are ##{present}"); - utils::crypto::Bytes secret_key = utils::string::from_hex("cb76fe6fe4cbfdc3770c0cb0afc910f81ced4d436b11f691395fc2a9dbea27ca"); - utils::crypto::EncryptionProvider encryption_provider{secret_key}; + minifi::utils::crypto::Bytes secret_key = minifi::utils::string::from_hex("cb76fe6fe4cbfdc3770c0cb0afc910f81ced4d436b11f691395fc2a9dbea27ca"); + minifi::utils::crypto::EncryptionProvider encryption_provider{secret_key}; core::SensitiveParameterTokenParser sensitive_parser("No ##{parameters} are ####{present}", encryption_provider); REQUIRE(sensitive_parser.replaceParameters(nullptr) == "No #{parameters} are ##{present}"); } TEST_CASE("Test sensitive token replacement") { core::ParameterContext context("test_context"); - utils::crypto::Bytes secret_key = utils::string::from_hex("cb76fe6fe4cbfdc3770c0cb0afc910f81ced4d436b11f691395fc2a9dbea27ca"); - utils::crypto::EncryptionProvider encryption_provider{secret_key}; + minifi::utils::crypto::Bytes secret_key = minifi::utils::string::from_hex("cb76fe6fe4cbfdc3770c0cb0afc910f81ced4d436b11f691395fc2a9dbea27ca"); + minifi::utils::crypto::EncryptionProvider encryption_provider{secret_key}; core::SensitiveParameterTokenParser parser("What is #{what}, baby don't hurt #{who}, don't hurt #{who}, no more", encryption_provider); - auto value1 = utils::crypto::property_encryption::encrypt("love", encryption_provider); - auto value2 = utils::crypto::property_encryption::encrypt("me", encryption_provider); + auto value1 = minifi::utils::crypto::property_encryption::encrypt("love", encryption_provider); + auto value2 = minifi::utils::crypto::property_encryption::encrypt("me", encryption_provider); context.addParameter(core::Parameter{"what", "", true, false, value1}); context.addParameter(core::Parameter{"who", "", true, false, value2}); REQUIRE(parser.replaceParameters(&context) == "What is love, baby don't hurt me, don't hurt me, no more"); diff --git a/minifi-api/include/minifi-cpp/properties/Configuration.h b/minifi-api/include/minifi-cpp/properties/Configuration.h index 373ea9772..a5872be6f 100644 --- a/minifi-api/include/minifi-cpp/properties/Configuration.h +++ b/minifi-api/include/minifi-cpp/properties/Configuration.h @@ -124,7 +124,6 @@ class Configuration : public virtual Properties { static constexpr const char *nifi_c2_rest_path_base = "nifi.c2.rest.path.base"; static constexpr const char *nifi_c2_rest_url = "nifi.c2.rest.url"; static constexpr const char *nifi_c2_rest_url_ack = "nifi.c2.rest.url.ack"; - static constexpr const char *nifi_c2_rest_ssl_context_service = "nifi.c2.rest.ssl.context.service"; static constexpr const char *nifi_c2_rest_heartbeat_minimize_updates = "nifi.c2.rest.heartbeat.minimize.updates"; static constexpr const char *nifi_c2_rest_request_encoding = "nifi.c2.rest.request.encoding"; static constexpr const char *nifi_c2_flow_info_processor_bulletin_limit = "nifi.c2.flow.info.processor.bulletin.limit"; @@ -166,7 +165,6 @@ class Configuration : public virtual Properties { // alert options static constexpr const char *nifi_log_alert_url = "nifi.log.alert.url"; - static constexpr const char *nifi_log_alert_ssl_context_service = "nifi.log.alert.ssl.context.service"; static constexpr const char *nifi_log_alert_batch_size = "nifi.log.alert.batch.size"; static constexpr const char *nifi_log_alert_flush_period = "nifi.log.alert.flush.period"; static constexpr const char *nifi_log_alert_filter = "nifi.log.alert.filter"; @@ -193,7 +191,6 @@ class Configuration : public virtual Properties { static constexpr const char *controller_socket_local_any_interface = "controller.socket.local.any.interface"; static constexpr const char *controller_socket_host = "controller.socket.host"; static constexpr const char *controller_socket_port = "controller.socket.port"; - static constexpr const char *controller_ssl_context_service = "controller.ssl.context.service"; static constexpr const char *nifi_flow_file_repository_check_health = "nifi.flowfile.repository.check.health"; static constexpr const char *nifi_python_virtualenv_directory = "nifi.python.virtualenv.directory";
