xref: /openbmc/telemetry/src/utils/dbus_path_utils.hpp (revision 32305f14d8a7560980735c04fbb2067d633e08d8)
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