#ifndef BASE_WIN_SID_H_
#define BASE_WIN_SID_H_
#include <string>
#include <vector>
#include "base/base_export.h"
#include "base/win/windows_types.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace base::win {
enum class WellKnownCapability {
kInternetClient,
kInternetClientServer,
kPrivateNetworkClientServer,
kPicturesLibrary,
kVideosLibrary,
kMusicLibrary,
kDocumentsLibrary,
kEnterpriseAuthentication,
kSharedUserCertificates,
kRemovableStorage,
kAppointments,
kContacts
};
enum class WellKnownSid {
kNull,
kWorld,
kCreatorOwner,
kNetwork,
kBatch,
kInteractive,
kService,
kAnonymous,
kSelf,
kAuthenticatedUser,
kRestricted,
kLocalSystem,
kLocalService,
kNetworkService,
kBuiltinAdministrators,
kBuiltinUsers,
kBuiltinGuests,
kUntrustedLabel,
kLowLabel,
kMediumLabel,
kHighLabel,
kSystemLabel,
kWriteRestricted,
kCreatorOwnerRights,
kAllApplicationPackages,
kAllRestrictedApplicationPackages
};
class BASE_EXPORT Sid {
public:
static Sid FromNamedCapability(const std::wstring& capability_name);
static Sid FromKnownCapability(WellKnownCapability capability);
static Sid FromKnownSid(WellKnownSid type);
static absl::optional<Sid> FromSddlString(const std::wstring& sddl_sid);
static absl::optional<Sid> FromPSID(const PSID sid);
static Sid GenerateRandomSid();
static Sid FromIntegrityLevel(DWORD integrity_level);
static absl::optional<std::vector<Sid>> FromSddlStringVector(
const std::vector<std::wstring>& sddl_sids);
static std::vector<Sid> FromNamedCapabilityVector(
const std::vector<std::wstring>& capability_names);
static std::vector<Sid> FromKnownCapabilityVector(
const std::vector<WellKnownCapability>& capabilities);
static std::vector<Sid> FromKnownSidVector(
const std::vector<WellKnownSid>& known_sids);
explicit Sid(WellKnownSid known_sid);
explicit Sid(WellKnownCapability known_capability);
Sid(const Sid&) = delete;
Sid& operator=(const Sid&) = delete;
Sid(Sid&& sid);
Sid& operator=(Sid&&);
~Sid();
PSID GetPSID() const;
absl::optional<std::wstring> ToSddlString() const;
Sid Clone() const;
bool Equal(PSID sid) const;
bool operator==(const Sid& sid) const;
bool operator!=(const Sid& sid) const;
private:
Sid(const void* sid, size_t length);
std::vector<char> sid_;
};
}
#endif