#ifndef BASE_WIN_ACCESS_CONTROL_LIST_H_
#define BASE_WIN_ACCESS_CONTROL_LIST_H_
#include <stdint.h>
#include <memory>
#include <vector>
#include "base/base_export.h"
#include "base/win/sid.h"
#include "base/win/windows_types.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace base::win {
enum class SecurityAccessMode { kGrant, kSet, kDeny, kRevoke };
class BASE_EXPORT ExplicitAccessEntry {
public:
ExplicitAccessEntry(const Sid& sid,
SecurityAccessMode mode,
DWORD access_mask,
DWORD inheritance);
ExplicitAccessEntry(WellKnownSid known_sid,
SecurityAccessMode mode,
DWORD access_mask,
DWORD inheritance);
ExplicitAccessEntry(const ExplicitAccessEntry&) = delete;
ExplicitAccessEntry& operator=(const ExplicitAccessEntry&) = delete;
ExplicitAccessEntry(ExplicitAccessEntry&&);
ExplicitAccessEntry& operator=(ExplicitAccessEntry&&);
~ExplicitAccessEntry();
const Sid& sid() const { return sid_; }
SecurityAccessMode mode() const { return mode_; }
DWORD access_mask() const { return access_mask_; }
DWORD inheritance() const { return inheritance_; }
ExplicitAccessEntry Clone() const;
private:
Sid sid_;
SecurityAccessMode mode_;
DWORD access_mask_;
DWORD inheritance_;
};
class BASE_EXPORT AccessControlList {
public:
static absl::optional<AccessControlList> FromPACL(ACL* acl);
static absl::optional<AccessControlList> FromMandatoryLabel(
DWORD integrity_level,
DWORD inheritance,
DWORD mandatory_policy);
AccessControlList();
AccessControlList(const AccessControlList&) = delete;
AccessControlList& operator=(const AccessControlList&) = delete;
AccessControlList(AccessControlList&&);
AccessControlList& operator=(AccessControlList&&);
~AccessControlList();
bool SetEntries(const std::vector<ExplicitAccessEntry>& entries);
bool SetEntry(const Sid& sid,
SecurityAccessMode mode,
DWORD access_mask,
DWORD inheritance);
AccessControlList Clone() const;
void Clear();
ACL* get() const { return reinterpret_cast<ACL*>(acl_.get()); }
bool is_null() const { return !acl_; }
private:
explicit AccessControlList(const ACL* acl);
std::unique_ptr<uint8_t[]> acl_;
};
}
#endif