blob: 830ade235c2a6f8dc48c4b505cfd11715c977ede [file] [log] [blame] [edit]
#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