| #ifndef THIRD_PARTY_MILOTIC_EXTERNAL_CC_AUTHZ_REDFISH_TRIE_NODE_H_ |
| #define THIRD_PARTY_MILOTIC_EXTERNAL_CC_AUTHZ_REDFISH_TRIE_NODE_H_ |
| |
| #include <memory> |
| #include <string> |
| #include <string_view> |
| #include <vector> |
| |
| #include "absl/container/flat_hash_map.h" |
| #include "absl/container/flat_hash_set.h" |
| #include "authorizer_enums.h" |
| #include "redfish_privileges.h" |
| |
| namespace milotic::authz::internal { |
| |
| // NOTE: This class is NOT thread safe, only thread aware. |
| // redfish_entity_trie ensures that there will be no data races as mutexes are |
| // always held when accessing these methods |
| |
| class RedfishSubtreePrivilegesTrieNode { |
| public: |
| // Have to create a default constructor for the root |
| RedfishSubtreePrivilegesTrieNode() = default; |
| |
| // For purposes of inserting a uri, we will need to return a modifiable |
| // RedfishEntityTrieNode pointer. This method encapsulates this as it will |
| // either get a modifiable pointer to a child that exists or create a child |
| // that doesn't exist and return its pointer to be modified when inserting |
| // uris into the Trie. |
| RedfishSubtreePrivilegesTrieNode* GetOrDefaultChild(std::string_view path); |
| |
| // For purposes of getting an entity type from the uri, we can have a separate |
| // Get method that is marked const to prevent the Trie from being modified |
| // when only querying it. |
| RedfishSubtreePrivilegesTrieNode* GetChild(std::string_view path) const; |
| |
| bool ContainsPrivilegeForSubtree(const ecclesia::Operation& operation, |
| const RedfishPrivileges& privilege) const; |
| |
| void AddPrivilegeForSubtree(const ecclesia::Operation& operation, |
| RedfishPrivileges&& privilege); |
| |
| // Returning vector here to avoid complications of copying hashset |
| std::vector<RedfishPrivileges> GetPrivilegesForSubtree( |
| const ecclesia::Operation& operation) const; |
| |
| // Clear children and subtree_privileges |
| void Clear(); |
| |
| private: |
| absl::flat_hash_map<std::string, |
| std::unique_ptr<RedfishSubtreePrivilegesTrieNode>> |
| children_; |
| // This contains a map of operation to privileges that allow access to the |
| // rest of the current node and all of its children |
| absl::flat_hash_map<ecclesia::Operation, |
| std::unique_ptr<absl::flat_hash_set<RedfishPrivileges>>> |
| subtree_privileges_; |
| }; |
| |
| } // namespace milotic::authz::internal |
| |
| #endif // THIRD_PARTY_MILOTIC_EXTERNAL_CC_AUTHZ_REDFISH_TRIE_NODE_H_ |