11cdd7e4fSSzymon Dompke #pragma once 21cdd7e4fSSzymon Dompke 31cdd7e4fSSzymon Dompke #include <sdbusplus/message.hpp> 41cdd7e4fSSzymon Dompke 51cdd7e4fSSzymon Dompke #include <algorithm> 61cdd7e4fSSzymon Dompke #include <ranges> 71cdd7e4fSSzymon Dompke #include <string_view> 81cdd7e4fSSzymon Dompke 91cdd7e4fSSzymon Dompke namespace utils 101cdd7e4fSSzymon Dompke { 111cdd7e4fSSzymon Dompke 121cdd7e4fSSzymon Dompke namespace constants 131cdd7e4fSSzymon Dompke { 141cdd7e4fSSzymon Dompke constexpr std::string_view triggerDirStr = 151cdd7e4fSSzymon Dompke "/xyz/openbmc_project/Telemetry/Triggers/"; 161cdd7e4fSSzymon Dompke constexpr std::string_view reportDirStr = 171cdd7e4fSSzymon Dompke "/xyz/openbmc_project/Telemetry/Reports/"; 181cdd7e4fSSzymon Dompke 191cdd7e4fSSzymon Dompke constexpr std::string_view allowedCharactersInPath = 201cdd7e4fSSzymon Dompke "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_/"; 211cdd7e4fSSzymon Dompke constexpr size_t maxPrefixesInId = 1; 22*32305f14SSzymon Dompke constexpr size_t maxPrefixLength{TELEMETRY_MAX_PREFIX_LENGTH}; 23*32305f14SSzymon Dompke constexpr size_t maxIdNameLength{TELEMETRY_MAX_ID_NAME_LENGTH}; 24*32305f14SSzymon Dompke constexpr size_t maxDbusPathLength{TELEMETRY_MAX_DBUS_PATH_LENGTH}; 25*32305f14SSzymon Dompke 26*32305f14SSzymon Dompke constexpr size_t maxTriggeFullIdLength{maxDbusPathLength - 27*32305f14SSzymon Dompke triggerDirStr.length()}; 28*32305f14SSzymon Dompke constexpr size_t maxReportFullIdLength{maxDbusPathLength - 29*32305f14SSzymon Dompke reportDirStr.length()}; 30*32305f14SSzymon Dompke 31*32305f14SSzymon Dompke static_assert(maxPrefixesInId * (maxPrefixLength + 1) + maxIdNameLength <= 32*32305f14SSzymon Dompke maxTriggeFullIdLength, 33*32305f14SSzymon Dompke "Misconfigured prefix/id/name lengths."); 34*32305f14SSzymon Dompke static_assert(maxPrefixesInId * (maxPrefixLength + 1) + maxIdNameLength <= 35*32305f14SSzymon Dompke maxReportFullIdLength, 36*32305f14SSzymon Dompke "Misconfigured prefix/id/name lengths."); 371cdd7e4fSSzymon Dompke 381cdd7e4fSSzymon Dompke const sdbusplus::message::object_path triggerDirPath = 391cdd7e4fSSzymon Dompke sdbusplus::message::object_path(std::string(triggerDirStr)); 401cdd7e4fSSzymon Dompke const sdbusplus::message::object_path reportDirPath = 411cdd7e4fSSzymon Dompke sdbusplus::message::object_path(std::string(reportDirStr)); 421cdd7e4fSSzymon Dompke } // namespace constants 431cdd7e4fSSzymon Dompke 441cdd7e4fSSzymon Dompke inline bool isValidDbusPath(const std::string& path) 451cdd7e4fSSzymon Dompke { 461cdd7e4fSSzymon Dompke return (path.find_first_not_of(constants::allowedCharactersInPath) == 471cdd7e4fSSzymon Dompke std::string::npos) && 481cdd7e4fSSzymon Dompke !path.ends_with('/'); 491cdd7e4fSSzymon Dompke } 501cdd7e4fSSzymon Dompke 51*32305f14SSzymon Dompke inline void verifyIdCharacters(std::string_view id) 52*32305f14SSzymon Dompke { 53*32305f14SSzymon Dompke if (id.find_first_not_of(utils::constants::allowedCharactersInPath) != 54*32305f14SSzymon Dompke std::string::npos) 55*32305f14SSzymon Dompke { 56*32305f14SSzymon Dompke throw sdbusplus::exception::SdBusError( 57*32305f14SSzymon Dompke static_cast<int>(std::errc::invalid_argument), 58*32305f14SSzymon Dompke "Invalid character in id"); 59*32305f14SSzymon Dompke } 60*32305f14SSzymon Dompke } 61*32305f14SSzymon Dompke 621cdd7e4fSSzymon Dompke sdbusplus::message::object_path pathAppend(sdbusplus::message::object_path path, 631cdd7e4fSSzymon Dompke const std::string& appended); 641cdd7e4fSSzymon Dompke 651cdd7e4fSSzymon Dompke std::string reportPathToId(const sdbusplus::message::object_path& path); 661cdd7e4fSSzymon Dompke 67*32305f14SSzymon Dompke void verifyIdPrefixes(std::string_view id); 68*32305f14SSzymon Dompke 691cdd7e4fSSzymon Dompke } // namespace utils 70