11cdd7e4fSSzymon Dompke #pragma once
21cdd7e4fSSzymon Dompke 
3*62c08e9bSKrzysztof Grobelny #include "errors.hpp"
4*62c08e9bSKrzysztof Grobelny 
51cdd7e4fSSzymon Dompke #include <sdbusplus/message.hpp>
61cdd7e4fSSzymon Dompke 
71cdd7e4fSSzymon Dompke #include <algorithm>
81cdd7e4fSSzymon Dompke #include <ranges>
91cdd7e4fSSzymon Dompke #include <string_view>
101cdd7e4fSSzymon Dompke 
111cdd7e4fSSzymon Dompke namespace utils
121cdd7e4fSSzymon Dompke {
131cdd7e4fSSzymon Dompke 
141cdd7e4fSSzymon Dompke namespace constants
151cdd7e4fSSzymon Dompke {
161cdd7e4fSSzymon Dompke constexpr std::string_view triggerDirStr =
171cdd7e4fSSzymon Dompke     "/xyz/openbmc_project/Telemetry/Triggers/";
181cdd7e4fSSzymon Dompke constexpr std::string_view reportDirStr =
191cdd7e4fSSzymon Dompke     "/xyz/openbmc_project/Telemetry/Reports/";
201cdd7e4fSSzymon Dompke 
211cdd7e4fSSzymon Dompke constexpr std::string_view allowedCharactersInPath =
221cdd7e4fSSzymon Dompke     "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_/";
231cdd7e4fSSzymon Dompke constexpr size_t maxPrefixesInId = 1;
2432305f14SSzymon Dompke constexpr size_t maxPrefixLength{TELEMETRY_MAX_PREFIX_LENGTH};
2532305f14SSzymon Dompke constexpr size_t maxIdNameLength{TELEMETRY_MAX_ID_NAME_LENGTH};
2632305f14SSzymon Dompke constexpr size_t maxDbusPathLength{TELEMETRY_MAX_DBUS_PATH_LENGTH};
2732305f14SSzymon Dompke 
2832305f14SSzymon Dompke constexpr size_t maxTriggeFullIdLength{maxDbusPathLength -
2932305f14SSzymon Dompke                                        triggerDirStr.length()};
3032305f14SSzymon Dompke constexpr size_t maxReportFullIdLength{maxDbusPathLength -
3132305f14SSzymon Dompke                                        reportDirStr.length()};
3232305f14SSzymon Dompke 
3332305f14SSzymon Dompke static_assert(maxPrefixesInId * (maxPrefixLength + 1) + maxIdNameLength <=
3432305f14SSzymon Dompke                   maxTriggeFullIdLength,
3532305f14SSzymon Dompke               "Misconfigured prefix/id/name lengths.");
3632305f14SSzymon Dompke static_assert(maxPrefixesInId * (maxPrefixLength + 1) + maxIdNameLength <=
3732305f14SSzymon Dompke                   maxReportFullIdLength,
3832305f14SSzymon Dompke               "Misconfigured prefix/id/name lengths.");
391cdd7e4fSSzymon Dompke 
401cdd7e4fSSzymon Dompke const sdbusplus::message::object_path triggerDirPath =
411cdd7e4fSSzymon Dompke     sdbusplus::message::object_path(std::string(triggerDirStr));
421cdd7e4fSSzymon Dompke const sdbusplus::message::object_path reportDirPath =
431cdd7e4fSSzymon Dompke     sdbusplus::message::object_path(std::string(reportDirStr));
441cdd7e4fSSzymon Dompke } // namespace constants
451cdd7e4fSSzymon Dompke 
isValidDbusPath(const std::string & path)461cdd7e4fSSzymon Dompke inline bool isValidDbusPath(const std::string& path)
471cdd7e4fSSzymon Dompke {
481cdd7e4fSSzymon Dompke     return (path.find_first_not_of(constants::allowedCharactersInPath) ==
491cdd7e4fSSzymon Dompke             std::string::npos) &&
501cdd7e4fSSzymon Dompke            !path.ends_with('/');
511cdd7e4fSSzymon Dompke }
521cdd7e4fSSzymon Dompke 
verifyIdCharacters(std::string_view id)5332305f14SSzymon Dompke inline void verifyIdCharacters(std::string_view id)
5432305f14SSzymon Dompke {
5532305f14SSzymon Dompke     if (id.find_first_not_of(utils::constants::allowedCharactersInPath) !=
5632305f14SSzymon Dompke         std::string::npos)
5732305f14SSzymon Dompke     {
58*62c08e9bSKrzysztof Grobelny         throw errors::InvalidArgument("Id", "Invalid character.");
5932305f14SSzymon Dompke     }
6032305f14SSzymon Dompke }
6132305f14SSzymon 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 
6732305f14SSzymon Dompke void verifyIdPrefixes(std::string_view id);
6832305f14SSzymon Dompke 
691cdd7e4fSSzymon Dompke } // namespace utils
70