| #include "subordinate_override.h" |
| |
| #include "absl/strings/string_view.h" |
| #include "authorizer_enums.h" |
| #include "override.h" |
| #include "redfish_entity_trie.h" |
| |
| namespace milotic::authz { |
| |
| bool SubordinateOverride::IsApplicable(absl::string_view uri, |
| ecclesia::Operation operation) const { |
| if (!operation_map_.contains(operation)) { |
| return false; |
| } |
| |
| // Get rid of end '/' in rule if it exists |
| if (!uri.empty() && uri.back() == '/') { |
| uri.remove_suffix(1); |
| } |
| |
| // Note that SubordinateOverrideTargets are ordered in a way such that the |
| // last element of override_targets_ must be the entity type of the |
| // immediate parent of uri. The second last must be entity type of |
| // grandparent of uri and etc. |
| for (auto it = override_targets_.rbegin(); it != override_targets_.rend(); |
| ++it) { |
| // Find parent uri of current uri and see if this matches with |
| // subordinate override target. |
| uri = uri.substr(0, uri.rfind('/')); |
| |
| // If uri is empty then it is not applicable |
| if (uri.empty()) { |
| return false; |
| } |
| |
| // Some paths have / at the end of uri, some don't. Checking both |
| if (*it != |
| ResourceEntityToString(redfish_entity_trie_.GetEntityType(uri))) { |
| return false; |
| } |
| } |
| |
| return true; |
| } |
| |
| Override::Type SubordinateOverride::GetOverrideType() const { |
| return Override::kSubordinateOverride; |
| } |
| } // namespace milotic::authz |