#ifndef SANDBOX_WIN_SRC_APP_CONTAINER_BASE_H_
#define SANDBOX_WIN_SRC_APP_CONTAINER_BASE_H_
#include <memory>
#include <optional>
#include <string>
#include <vector>
#include "base/files/file_path.h"
#include "base/win/access_token.h"
#include "base/win/security_descriptor.h"
#include "base/win/sid.h"
#include "base/win/windows_types.h"
#include "sandbox/win/src/app_container.h"
#include "sandbox/win/src/sandbox_types.h"
namespace sandbox {
class AppContainerBase final : public AppContainer {
public:
AppContainerBase(const wchar_t* package_name,
base::win::Sid package_sid,
AppContainerType type);
AppContainerBase(const AppContainerBase&) = delete;
AppContainerBase& operator=(const AppContainerBase&) = delete;
~AppContainerBase();
bool AccessCheck(const wchar_t* object_name,
base::win::SecurityObjectType object_type,
DWORD desired_access,
DWORD* granted_access,
BOOL* access_status) override;
void AddCapability(const wchar_t* capability_name) override;
void AddCapability(base::win::WellKnownCapability capability) override;
bool AddCapabilitySddl(const wchar_t* sddl_sid) override;
void AddImpersonationCapability(const wchar_t* capability_name) override;
void AddImpersonationCapability(
base::win::WellKnownCapability capability) override;
bool AddImpersonationCapabilitySddl(const wchar_t* sddl_sid) override;
void SetEnableLowPrivilegeAppContainer(bool enable) override;
bool GetEnableLowPrivilegeAppContainer() override;
AppContainerType GetAppContainerType() override;
const std::vector<base::win::Sid>& GetCapabilities() override;
const std::vector<base::win::Sid>& GetImpersonationCapabilities() override;
std::unique_ptr<SecurityCapabilities> GetSecurityCapabilities() override;
const base::win::Sid& GetPackageSid() const;
const wchar_t* GetPackageName() const;
static std::unique_ptr<AppContainerBase> CreateProfile(
const wchar_t* package_name,
const wchar_t* display_name);
static std::unique_ptr<AppContainerBase> Open(const wchar_t* package_name);
static std::unique_ptr<AppContainerBase> CreateLowbox(const wchar_t* sid);
static bool ProfileExists(const wchar_t* package_name);
static bool Delete(const wchar_t* package_name);
std::optional<base::win::AccessToken> BuildImpersonationToken(
const base::win::AccessToken& token);
std::optional<base::win::AccessToken> BuildPrimaryToken(
const base::win::AccessToken& token);
private:
bool AddCapability(const std::optional<base::win::Sid>& capability_sid,
bool impersonation_only);
std::wstring package_name_;
base::win::Sid package_sid_;
bool enable_low_privilege_app_container_;
std::vector<base::win::Sid> capabilities_;
std::vector<base::win::Sid> impersonation_capabilities_;
AppContainerType type_;
};
}
#endif