blob: 5a1dbf6c5c33cb3db850289434023916b6401781 [file] [log] [blame]
#include "redfish_subtree_privileges_trie_node.h"
#include <memory>
#include <string_view>
#include <utility>
#include <vector>
#include "absl/container/flat_hash_set.h"
#include "authorizer_enums.h"
#include "redfish_privileges.h"
namespace milotic::authz::internal {
RedfishSubtreePrivilegesTrieNode*
RedfishSubtreePrivilegesTrieNode::GetOrDefaultChild(std::string_view path) {
std::unique_ptr<RedfishSubtreePrivilegesTrieNode>& node = children_[path];
if (node == nullptr) {
node = std::make_unique<RedfishSubtreePrivilegesTrieNode>();
return node.get();
}
return node.get();
}
RedfishSubtreePrivilegesTrieNode* RedfishSubtreePrivilegesTrieNode::GetChild(
std::string_view path) const {
auto it = children_.find(path);
if (it == children_.end()) {
return nullptr;
}
return it->second.get();
}
bool RedfishSubtreePrivilegesTrieNode::ContainsPrivilegeForSubtree(
const ecclesia::Operation& operation,
const RedfishPrivileges& privilege) const {
auto it = subtree_privileges_.find(operation);
if (it == subtree_privileges_.end()) {
return false;
}
return it->second->contains(privilege);
}
void RedfishSubtreePrivilegesTrieNode::AddPrivilegeForSubtree(
const ecclesia::Operation& operation, RedfishPrivileges&& privilege) {
std::unique_ptr<absl::flat_hash_set<RedfishPrivileges>>& privileges =
subtree_privileges_[operation];
if (privileges == nullptr) {
privileges = std::make_unique<absl::flat_hash_set<RedfishPrivileges>>();
}
privileges->insert(std::move(privilege));
}
std::vector<RedfishPrivileges>
RedfishSubtreePrivilegesTrieNode::GetPrivilegesForSubtree(
const ecclesia::Operation& operation) const {
auto it = subtree_privileges_.find(operation);
if (it == subtree_privileges_.end()) {
return std::vector<RedfishPrivileges>();
}
return std::vector<RedfishPrivileges>(it->second->begin(), it->second->end());
}
void RedfishSubtreePrivilegesTrieNode::Clear() {
subtree_privileges_.clear();
for (auto it = children_.begin(); it != children_.end(); ++it) {
it->second->Clear();
}
children_.clear();
}
} // namespace milotic::authz::internal