blob: 7d2ca90003dc79fedd29776f00996b41427d80ab [file] [log] [blame]
#ifndef THIRD_PARTY_MILOTIC_EXTERNAL_CC_AUTHZ_OVERRIDE_H_
#define THIRD_PARTY_MILOTIC_EXTERNAL_CC_AUTHZ_OVERRIDE_H_
#include <string>
#include <vector>
#include "absl/container/flat_hash_map.h"
#include "absl/strings/string_view.h"
#include "authorizer_enums.h"
#include "nlohmann/json.hpp"
#include "redfish_privileges.h"
namespace milotic::authz {
/*
This class is intended to serve as a base template for all override types.
There are currently 2 Overrides that implement this abstract class:
SubordinateOverride and ResourceUriOverride.
Each Override has two fields as seen by the Redfish Privilege Registry.
"Override": {
"Targets": [...],
"OperationMap": {
"GET": {
...
},
...
}
}
The json above is how the base privilege registry includes overrides.
Every override has a Targets list of strings that specify its override target.
Its meaning is different for each override.
For any override that matches the target, the operation map lists out the
permissions required for that specific request whose that matches the override
target.
The 2 methods IsApplicable and IsPeerAuthorized are used to check if the
override applies on a specific request and if so, if they are authorized by the
override.
IsPeerAuthorized assumes that IsApplicable is true, so if IsApplicable is not
true in the context that IsPeerAuthorized is run, then IsPeerAuthorized loses
its meaning but will return false.
*/
class Override {
public:
Override(
const std::vector<std::string>& override_targets,
const absl::flat_hash_map<ecclesia::Operation,
std::vector<RedfishPrivileges>>& operation_map)
: override_targets_(override_targets), operation_map_(operation_map) {}
virtual ~Override() = default;
/*
IsApplicable checks whether this request's rule and uri are the correct
targets for the override to apply in this context.
*/
virtual bool IsApplicable(absl::string_view uri,
ecclesia::Operation operation) const = 0;
enum Type { kSubordinateOverride = 0, kResourceUriOverride };
virtual Type GetOverrideType() const = 0;
/*
IsPeerAuthorized checks whether the current peer is authorized with the
current override mappings
*/
bool IsPeerAuthorized(absl::string_view uri, ecclesia::Operation operation,
const RedfishPrivileges& peer_privileges) const;
virtual nlohmann::json::object_t ToJson() const;
protected:
// Override targets
const std::vector<std::string> override_targets_;
// Override mappings
const absl::flat_hash_map<ecclesia::Operation, std::vector<RedfishPrivileges>>
operation_map_;
};
} // namespace milotic::authz
#endif // THIRD_PARTY_MILOTIC_EXTERNAL_CC_AUTHZ_OVERRIDE_H_