blob: 5ce03c85990b83f2896003075be4f9c20baf01f1 [file] [log] [blame]
// Copyright 2021 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CRYPTOHOME_STORAGE_CRYPTOHOME_VAULT_H_
#define CRYPTOHOME_STORAGE_CRYPTOHOME_VAULT_H_
#include <memory>
#include <string>
#include <vector>
#include <dbus/cryptohome/dbus-constants.h>
#include "cryptohome/platform.h"
#include "cryptohome/storage/encrypted_container/encrypted_container.h"
#include "cryptohome/storage/encrypted_container/filesystem_key.h"
#include "cryptohome/storage/mount_constants.h"
namespace cryptohome {
// A cryptohome vault represents the user's active encrypted containers that
// comprise the user's home directory and handles operations relating to setting
// up the user's home directory for mount and tearing down the encrypted
// containers after unmount.
//
// Note that the mount arguments passed to the vault define the setup/teardown
// functions. This is intentional: it allows use of a deterministic teardown
// function on restart from a crash.
class CryptohomeVault {
public:
struct Options {
// Forces the type of new encrypted containers set up.
EncryptedContainerType force_type = EncryptedContainerType::kUnknown;
// Checks if migration should be allowed for the current vault. Currently,
// this is only used for ecryptfs.
bool migrate = false;
// Checks if mount requests for ecryptfs mounts should be blocked without
// migration.
bool block_ecryptfs = false;
};
CryptohomeVault(
const std::string& obfuscated_username,
std::unique_ptr<EncryptedContainer> container,
std::unique_ptr<EncryptedContainer> migrating_container,
std::unique_ptr<EncryptedContainer> cache_container,
std::vector<std::unique_ptr<EncryptedContainer>> application_containers,
Platform* platform);
~CryptohomeVault();
// Sets up the cryptohome vault for mounting.
MountError Setup(const FileSystemKey& filesystem_key);
// Removes the vault.
bool Purge();
// Tears down the vault post-unmount.
bool Teardown();
// Marks the underlying containers for lazy teardown once the last reference
// to the containers has been dropped.
bool SetLazyTeardownWhenUnused();
// Get mount type for mount to use.
MountType GetMountType();
void ReportVaultEncryptionType();
EncryptedContainerType GetContainerType() {
return container_ ? container_->GetType()
: EncryptedContainerType::kUnknown;
}
base::FilePath GetContainerBackingLocation() {
return container_ ? container_->GetBackingLocation() : base::FilePath();
}
EncryptedContainerType GetMigratingContainerType() {
return migrating_container_ ? migrating_container_->GetType()
: EncryptedContainerType::kUnknown;
}
EncryptedContainerType GetCacheContainerType() {
return cache_container_ ? cache_container_->GetType()
: EncryptedContainerType::kUnknown;
}
bool PurgeCacheContainer();
private:
friend class CryptohomeVaultTest;
const std::string obfuscated_username_;
// Represents the active encrypted container for the vault.
std::unique_ptr<EncryptedContainer> container_;
// During migration, we set up the target migration container as
// |migrating_container_|.
std::unique_ptr<EncryptedContainer> migrating_container_;
// For dm-crypt based vaults, we set up an additional cache container that
// serves as the backing store for temporary data.
std::unique_ptr<EncryptedContainer> cache_container_;
// Containers that store application info.
std::vector<std::unique_ptr<EncryptedContainer>> application_containers_;
Platform* platform_;
};
} // namespace cryptohome
#endif // CRYPTOHOME_STORAGE_CRYPTOHOME_VAULT_H_