| #include "utils/dbus_path_utils.hpp" |
| |
| namespace utils |
| { |
| sdbusplus::message::object_path pathAppend(sdbusplus::message::object_path path, |
| const std::string& appended) |
| { |
| if (appended.starts_with('/') || !isValidDbusPath(appended)) |
| { |
| throw sdbusplus::exception::SdBusError( |
| static_cast<int>(std::errc::invalid_argument), |
| "Invalid appended string"); |
| } |
| |
| size_t pos_start = 0; |
| size_t pos_end = 0; |
| while ((pos_end = appended.find('/', pos_start)) != std::string::npos) |
| { |
| if (pos_start == pos_end) |
| { |
| throw sdbusplus::exception::SdBusError( |
| static_cast<int>(std::errc::invalid_argument), |
| "Invalid appended string"); |
| } |
| path /= std::string_view(appended.begin() + pos_start, |
| appended.begin() + pos_end); |
| pos_start = pos_end + 1; |
| } |
| path /= std::string_view(appended.begin() + pos_start, appended.end()); |
| return path; |
| } |
| |
| std::string reportPathToId(const sdbusplus::message::object_path& path) |
| { |
| if (path.str.starts_with(constants::reportDirStr)) |
| { |
| auto id = path.str.substr(constants::reportDirStr.length()); |
| verifyIdPrefixes(id); |
| return id; |
| } |
| throw sdbusplus::exception::SdBusError( |
| static_cast<int>(std::errc::invalid_argument), "Invalid path prefix"); |
| } |
| |
| void verifyIdPrefixes(std::string_view id) |
| { |
| size_t pos_start = 0; |
| size_t pos_end = 0; |
| size_t prefix_cnt = 0; |
| while ((pos_end = id.find('/', pos_start)) != std::string::npos) |
| { |
| if (pos_start == pos_end) |
| { |
| throw sdbusplus::exception::SdBusError( |
| static_cast<int>(std::errc::invalid_argument), |
| "Invalid prefixes in id"); |
| } |
| |
| if (++prefix_cnt > constants::maxPrefixesInId) |
| { |
| throw sdbusplus::exception::SdBusError( |
| static_cast<int>(std::errc::invalid_argument), |
| "Too many prefixes"); |
| } |
| |
| if (pos_end - pos_start > constants::maxPrefixLength) |
| { |
| throw sdbusplus::exception::SdBusError( |
| static_cast<int>(std::errc::invalid_argument), |
| "Prefix too long"); |
| } |
| |
| pos_start = pos_end + 1; |
| } |
| |
| if (id.length() - pos_start > constants::maxIdNameLength) |
| { |
| throw sdbusplus::exception::SdBusError( |
| static_cast<int>(std::errc::invalid_argument), "Id too long"); |
| } |
| } |
| } // namespace utils |