fgerlits commented on code in PR #2069:
URL: https://github.com/apache/nifi-minifi-cpp/pull/2069#discussion_r2607472834
##########
libminifi/src/utils/ChecksumCalculator.cpp:
##########
@@ -21,59 +21,66 @@
#include <fstream>
#include "sodium/crypto_hash_sha256.h"
-#include "utils/file/FileUtils.h"
#include "utils/StringUtils.h"
#include "properties/Configuration.h"
namespace {
const std::string AGENT_IDENTIFIER_KEY =
std::string(org::apache::nifi::minifi::Configuration::nifi_c2_agent_identifier)
+ "=";
+namespace utils = org::apache::nifi::minifi::utils;
+
+void addFileToChecksum(const std::filesystem::path& file_path,
crypto_hash_sha256_state& state) {
+ std::ifstream input_file{file_path, std::ios::in | std::ios::binary};
+ if (!input_file.is_open()) {
+ throw std::runtime_error(utils::string::join_pack("Could not open config
file '", file_path.string(), "' to compute the checksum: ",
std::strerror(errno)));
+ }
+
+ std::string line;
+ while (std::getline(input_file, line)) {
+ // skip lines containing the agent identifier, so agents in the same class
will have the same checksum
+ if (line.starts_with(AGENT_IDENTIFIER_KEY)) {
+ continue;
+ }
+ if (!input_file.eof()) { // eof() means we have just read the last line,
which was not terminated by a newline
+ line.append("\n");
+ }
+ crypto_hash_sha256_update(&state, reinterpret_cast<const unsigned
char*>(line.data()), line.size());
+ }
+ if (input_file.bad()) {
+ throw std::runtime_error(utils::string::join_pack("Error reading config
file '", file_path.string(), "' while computing the checksum: ",
std::strerror(errno)));
+ }
+}
+
} // namespace
namespace org::apache::nifi::minifi::utils {
-void ChecksumCalculator::setFileLocation(const std::filesystem::path&
file_location) {
- file_location_ = file_location;
- file_name_ = file_location.filename();
+void ChecksumCalculator::setFileLocations(std::vector<std::filesystem::path>
file_locations) {
+ gsl_Expects(!file_locations.empty());
+ file_locations_ = std::move(file_locations);
invalidateChecksum();
}
std::filesystem::path ChecksumCalculator::getFileName() const {
- gsl_Expects(file_name_);
- return *file_name_;
+ gsl_Expects(!file_locations_.empty());
+ return file_locations_.front().filename();
Review Comment:
It is still used when we serialize the checksum into the heartbeat. I agree
that e.g. using a "checksum name" passed to the constructor would be nicer, but
it would add a lot of extra code. Instead, I have renamed the function to
`getFileNameOfFirstFileLocation()` in d06d435ef603a218c95586c8de88a1efb70e3b88.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]