diff --git a/appsec/src/helper/client.cpp b/appsec/src/helper/client.cpp index 545c6005bb..4e98218bb6 100644 --- a/appsec/src/helper/client.cpp +++ b/appsec/src/helper/client.cpp @@ -9,12 +9,9 @@ #include #include #include -#include #include "action.hpp" -#include "base64.h" #include "client.hpp" -#include "compression.hpp" #include "exception.hpp" #include "network/broker.hpp" #include "network/proto.hpp" diff --git a/appsec/src/helper/engine_settings.hpp b/appsec/src/helper/engine_settings.hpp index b61fc52b41..c22df8e8d0 100644 --- a/appsec/src/helper/engine_settings.hpp +++ b/appsec/src/helper/engine_settings.hpp @@ -9,7 +9,7 @@ #include "utils.hpp" #include #include -#include +#include #include namespace dds { @@ -71,21 +71,25 @@ struct engine_settings { schema_extraction.sample_rate == oth.schema_extraction.sample_rate; } +}; + +} // namespace dds - friend auto &operator<<(std::ostream &os, const engine_settings &c) +template <> struct fmt::formatter { + constexpr auto parse(format_parse_context &ctx) { return ctx.begin(); } + + template + auto format(const dds::engine_settings &c, FormatContext &ctx) const { - return os << "{rules_file=" << c.rules_file - << ", waf_timeout_us=" << c.waf_timeout_us - << ", trace_rate_limit=" << c.trace_rate_limit - << ", obfuscator_key_regex=" << c.obfuscator_key_regex - << ", obfuscator_value_regex=" << c.obfuscator_value_regex - << ", schema_extraction.enabled=" - << c.schema_extraction.enabled - << ", schema_extraction.sample_rate=" << std::fixed - << c.schema_extraction.sample_rate << "}"; + return format_to(ctx.out(), + "{{rules_file={}, waf_timeout_us={}, trace_rate_limit={}, " + "obfuscator_key_regex={}, obfuscator_value_regex={}, " + "schema_extraction.enabled={}, schema_extraction.sample_rate={}}}", + c.rules_file, c.waf_timeout_us, c.trace_rate_limit, + c.obfuscator_key_regex, c.obfuscator_value_regex, + c.schema_extraction.enabled, c.schema_extraction.sample_rate); } }; -} // namespace dds namespace std { template <> struct hash { diff --git a/appsec/src/helper/json_helper.cpp b/appsec/src/helper/json_helper.cpp index 9a785ddc7e..a9c8bc7851 100644 --- a/appsec/src/helper/json_helper.cpp +++ b/appsec/src/helper/json_helper.cpp @@ -13,6 +13,7 @@ #include #include #include +#include using namespace std::literals; @@ -176,8 +177,9 @@ json_helper::get_field_of_type(const rapidjson::Value &parent_field, } if (type != output_itr->value.GetType()) { - SPDLOG_DEBUG("Field {} is not of type {}. Instead {}", key, type, - output_itr->value.GetType()); + SPDLOG_DEBUG("Field {} is not of type {}. Instead {}", key, + fmt::underlying(type), + fmt::underlying(output_itr->value.GetType())); return std::nullopt; } diff --git a/appsec/src/helper/remote_config/config.hpp b/appsec/src/helper/remote_config/config.hpp index 05e5e226c7..d9a5707008 100644 --- a/appsec/src/helper/remote_config/config.hpp +++ b/appsec/src/helper/remote_config/config.hpp @@ -7,9 +7,9 @@ #include "../utils.hpp" #include "product.hpp" +#include #include #include -#include extern "C" { #include @@ -70,15 +70,19 @@ struct config { { return shm_path == b.shm_path && rc_path == b.rc_path; } +}; + +} // namespace dds::remote_config - friend std::ostream &operator<<(std::ostream &os, const config &c) +template <> struct fmt::formatter { + constexpr auto parse(format_parse_context &ctx) { return ctx.begin(); } + + auto format(const dds::remote_config::config &c, format_context &ctx) const { - return os << c.shm_path << ":" << c.rc_path; + return fmt::format_to(ctx.out(), "{}:{}", c.shm_path, c.rc_path); } }; -} // namespace dds::remote_config - namespace std { template <> struct hash { std::size_t operator()(const dds::remote_config::config &key) const diff --git a/appsec/src/helper/remote_config/product.hpp b/appsec/src/helper/remote_config/product.hpp index a9b70fe60f..80aeb24831 100644 --- a/appsec/src/helper/remote_config/product.hpp +++ b/appsec/src/helper/remote_config/product.hpp @@ -5,8 +5,8 @@ // (https://www.datadoghq.com/). Copyright 2021 Datadog, Inc. #pragma once -#include "../config.hpp" #include "../utils.hpp" +#include #include namespace dds::remote_config { @@ -19,11 +19,6 @@ class product { bool operator==(const product &other) const { return name_ == other.name_; } - friend std::ostream &operator<<(std::ostream &os, const product &p) - { - return os << p.name_; - } - private: std::string_view name_; }; @@ -56,6 +51,17 @@ struct known_products { }; } // namespace dds::remote_config +template <> +struct fmt::formatter + : fmt::formatter { + + auto format(const dds::remote_config::product &p, format_context &ctx) const + { + auto name = p.name(); + return formatter::format(name, ctx); + } +}; + namespace std { template <> struct hash { std::size_t operator()(const dds::remote_config::product &product) const diff --git a/appsec/src/helper/remote_config/settings.hpp b/appsec/src/helper/remote_config/settings.hpp index 43a7b8340d..5d66ff16a5 100644 --- a/appsec/src/helper/remote_config/settings.hpp +++ b/appsec/src/helper/remote_config/settings.hpp @@ -7,10 +7,9 @@ #pragma once #include "../utils.hpp" -#include -#include #include #include +#include #include namespace dds::remote_config { @@ -32,8 +31,20 @@ struct settings { MSGPACK_DEFINE_MAP(enabled, shmem_path); }; + } // namespace dds::remote_config +template <> struct fmt::formatter { + constexpr auto parse(fmt::format_parse_context &ctx) { return ctx.begin(); } + + template + auto format(const dds::remote_config::settings &s, FormatContext &ctx) const + { + return fmt::format_to(ctx.out(), "{{enabled={}, shmem_path={}}}", + s.enabled, s.shmem_path); + } +}; + namespace std { template <> struct hash { std::size_t operator()(const dds::remote_config::settings &s) const noexcept diff --git a/appsec/src/helper/service_config.hpp b/appsec/src/helper/service_config.hpp index 50f277fb45..7e2684e779 100644 --- a/appsec/src/helper/service_config.hpp +++ b/appsec/src/helper/service_config.hpp @@ -6,14 +6,37 @@ #pragma once #include -#include -#include #include -#include namespace dds { - enum class enable_asm_status : unsigned { NOT_SET = 0, ENABLED, DISABLED }; +} // namespace dds + +template <> +struct fmt::formatter> + : fmt::formatter { + auto format(const std::atomic &status, + format_context &ctx) const + { + auto val = status.load(); + std::string_view name{"UNKNOWN"}; + switch (val) { + case dds::enable_asm_status::NOT_SET: + name = "NOT_SET"; + break; + case dds::enable_asm_status::ENABLED: + name = "ENABLED"; + break; + case dds::enable_asm_status::DISABLED: + name = "DISABLED"; + break; + } + + return fmt::formatter::format(name, ctx); + } +}; + +namespace dds { inline std::string_view to_string_view(enable_asm_status status) { diff --git a/appsec/src/helper/subscriber/waf.cpp b/appsec/src/helper/subscriber/waf.cpp index 0b843f63a7..edffb4691e 100644 --- a/appsec/src/helper/subscriber/waf.cpp +++ b/appsec/src/helper/subscriber/waf.cpp @@ -218,7 +218,8 @@ void instance::listener::call(dds::parameter_view &data, event &event) parameter_to_json(parameter_view{res.events}), res.total_runtime / millis); SPDLOG_DEBUG("Waf response: code {} - actions {} - derivatives {}", - code, parameter_to_json(parameter_view{res.actions}), + fmt::underlying(code), + parameter_to_json(parameter_view{res.actions}), parameter_to_json(parameter_view{res.derivatives})); } else { diff --git a/appsec/third_party/CMakeLists.txt b/appsec/third_party/CMakeLists.txt index d925ea6a5f..5a7a5c9faa 100644 --- a/appsec/third_party/CMakeLists.txt +++ b/appsec/third_party/CMakeLists.txt @@ -45,7 +45,7 @@ endif() FetchContent_Declare( spdlog GIT_REPOSITORY https://github.com/gabime/spdlog.git - GIT_TAG eb3220622e73a4889eee355ffa37972b3cac3df5) + GIT_TAG 5fd32e1a70871e2f6a52734e36bc33cb7ac022a5) FetchContent_MakeAvailable(spdlog) set_target_properties(spdlog PROPERTIES POSITION_INDEPENDENT_CODE 1)