| // Copyright 2022 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef COMPONENTS_USER_MANAGER_USER_DIRECTORY_INTEGRITY_MANAGER_H_ |
| #define COMPONENTS_USER_MANAGER_USER_DIRECTORY_INTEGRITY_MANAGER_H_ |
| |
| #include <optional> |
| |
| #include "base/memory/raw_ptr.h" |
| #include "components/account_id/account_id.h" |
| #include "components/prefs/pref_registry_simple.h" |
| #include "components/prefs/pref_service.h" |
| #include "components/user_manager/user_manager_export.h" |
| |
| namespace user_manager { |
| |
| // This class is responsible for writing to local_state before a user is |
| // created via `MountPerformer::CreateNewUser` and clearing that record from |
| // local_state when an auth factor is added, via |
| // `AuthFactorEditor::OnAddCredential` |
| // |
| // In that small window between creating a new user and adding keys, we could |
| // crash, leaving us in an inconsistent state where we have a user home |
| // directory with no keys. This class helps detect that. |
| class USER_MANAGER_EXPORT UserDirectoryIntegrityManager { |
| public: |
| static void RegisterLocalStatePrefs(PrefRegistrySimple* registry); |
| |
| // This enum values are persisted in `LocalState`, do not remove values, |
| // and only add values at the end. |
| enum class CleanupStrategy { |
| // Default value, that just removes (unusable) crytohome and |
| // all entries in LocalState related to the user. |
| kRemoveUser, |
| // For owner user, removal of cryptohome would mean the loss of |
| // private key used to sign device settings, so silent powerwash |
| // should be performed instead. |
| kSilentPowerwash, |
| kMaxValue = kSilentPowerwash |
| }; |
| |
| explicit UserDirectoryIntegrityManager(PrefService* local_state); |
| UserDirectoryIntegrityManager(const UserDirectoryIntegrityManager&) = delete; |
| UserDirectoryIntegrityManager& operator=( |
| const UserDirectoryIntegrityManager&) = delete; |
| ~UserDirectoryIntegrityManager(); |
| |
| // Mark local state that we are about to create a new user home dir. |
| // The `strategy` should be used in case user creation does not finish. |
| void RecordCreatingNewUser(const AccountId&, CleanupStrategy strategy); |
| |
| // Clears known user prefs after removal of an incomplete user. |
| void RemoveUser(const AccountId& account_id); |
| |
| // Remove the mark previously placed in local state, meaning an auth factor |
| // has been added, or an unusable user has been successfully cleaned up. |
| // This doesn't clear known user prefs. |
| void ClearPrefs(); |
| |
| // Check if a user has been incompletely created by looking for the |
| // presence of a mark associated with the user's email. |
| std::optional<AccountId> GetMisconfiguredUserAccountId(); |
| CleanupStrategy GetMisconfiguredUserCleanupStrategy(); |
| |
| bool IsUserMisconfigured(const AccountId& account_id); |
| |
| private: |
| std::optional<std::string> GetMisconfiguredUserEmail(); |
| std::optional<AccountId> GetMisconfiguredUserAccountIdLegacy(); |
| |
| const raw_ptr<PrefService> local_state_; |
| }; |
| |
| } // namespace user_manager |
| |
| #endif // COMPONENTS_USER_MANAGER_USER_DIRECTORY_INTEGRITY_MANAGER_H_ |