blob: 35fb4efdf57109cb2021b6d6f45a98db4cfee52b [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <windows.h>
#include <accctrl.h>
#include <memory>
#include <vector>
#include "base/files/file_path.h"
#include "base/memory/ref_counted.h"
#include "base/win/scoped_handle.h"
#include "sandbox/win/src/app_container_profile.h"
#include "sandbox/win/src/security_capabilities.h"
#include "sandbox/win/src/sid.h"
namespace sandbox {
class AppContainerProfileBase final : public AppContainerProfile {
void AddRef() override;
void Release() override;
bool GetRegistryLocation(REGSAM desired_access,
base::win::ScopedHandle* key) override;
bool GetFolderPath(base::FilePath* file_path) override;
bool GetPipePath(const wchar_t* pipe_name,
base::FilePath* pipe_path) override;
bool AccessCheck(const wchar_t* object_name,
SE_OBJECT_TYPE object_type,
DWORD desired_access,
DWORD* granted_access,
BOOL* access_status) override;
bool AddCapability(const wchar_t* capability_name) override;
bool AddCapability(WellKnownCapabilities capability) override;
bool AddCapabilitySddl(const wchar_t* sddl_sid) override;
bool AddImpersonationCapability(const wchar_t* capability_name) override;
bool AddImpersonationCapability(WellKnownCapabilities capability) override;
bool AddImpersonationCapabilitySddl(const wchar_t* sddl_sid) override;
void SetEnableLowPrivilegeAppContainer(bool enable) override;
bool GetEnableLowPrivilegeAppContainer() override;
// Get the package SID for this AC.
Sid GetPackageSid() const;
// Get an allocated SecurityCapabilities object for this App Container.
std::unique_ptr<SecurityCapabilities> GetSecurityCapabilities();
// Get a vector of capabilities.
const std::vector<Sid>& GetCapabilities();
// Get a vector of impersonation only capabilities. Used if the process needs
// a more privileged token to start.
const std::vector<Sid>& GetImpersonationCapabilities();
// Creates a new AppContainerProfile object. This will create a new profile
// if it doesn't already exist. The profile must be deleted manually using
// the Delete method if it's no longer required.
static AppContainerProfileBase* Create(const wchar_t* package_name,
const wchar_t* display_name,
const wchar_t* description);
// Opens an AppContainerProfile object. No checks will be made on
// whether the package exists or not.
static AppContainerProfileBase* Open(const wchar_t* package_name);
// Delete a profile based on name. Returns true if successful, or if the
// package doesn't already exist.
static bool Delete(const wchar_t* package_name);
AppContainerProfileBase(const Sid& package_sid);
bool BuildLowBoxToken(base::win::ScopedHandle* token);
bool AddCapability(const Sid& capability_sid, bool impersonation_only);
// Standard object-lifetime reference counter.
volatile LONG ref_count_;
Sid package_sid_;
bool enable_low_privilege_app_container_;
std::vector<Sid> capabilities_;
std::vector<Sid> impersonation_capabilities_;
} // namespace sandbox