blob: 245a4a33b0a949a7a34515bb912c77e6e8eb7bc1 [file] [log] [blame]
// Copyright 2015 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.
#ifndef COMPONENTS_USER_MANAGER_KNOWN_USER_H_
#define COMPONENTS_USER_MANAGER_KNOWN_USER_H_
#include <string>
#include <vector>
#include "base/gtest_prod_util.h"
#include "base/time/time.h"
#include "base/version.h"
#include "components/user_manager/user_manager_export.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
class AccountId;
enum class AccountType;
class PrefRegistrySimple;
class PrefService;
namespace base {
class DictionaryValue;
class Value;
}
namespace user_manager {
class UserManagerBase;
// Enum describing whether a user's profile requires policy. If kPolicyRequired,
// the profile initialization code will ensure that valid policy is loaded
// before session initialization completes.
enum class ProfileRequiresPolicy {
kUnknown,
kPolicyRequired,
kNoPolicyRequired
};
// Accessor for attributes of per-user properties stored in local_state.
class USER_MANAGER_EXPORT KnownUser final {
public:
// Constructing KnownUser is cheap.
// |local_state| may not be nullptr. This is different from the legacy
// accessors (user_manager::known_user::) which will return a default value if
// local_state is not available.
explicit KnownUser(PrefService* local_state);
~KnownUser();
KnownUser(const KnownUser& other) = delete;
KnownUser& operator=(const KnownUser& other) = delete;
// Performs a lookup of properties associated with |account_id|. If found,
// returns |true| and fills |out_value|. |out_value| can be NULL, if
// only existence check is required.
bool FindPrefs(const AccountId& account_id,
const base::DictionaryValue** out_value);
// Updates (or creates) properties associated with |account_id| based
// on |values|. |clear| defines if existing properties are cleared (|true|)
// or if it is just a incremental update (|false|).
void UpdatePrefs(const AccountId& account_id,
const base::DictionaryValue& values,
bool clear);
// Returns true if |account_id| preference by |path| does exist,
// fills in |out_value|. Otherwise returns false.
bool GetStringPref(const AccountId& account_id,
const std::string& path,
std::string* out_value);
// Updates user's identified by |account_id| string preference |path|.
void SetStringPref(const AccountId& account_id,
const std::string& path,
const std::string& in_value);
// Returns true if |account_id| preference by |path| does exist,
// fills in |out_value|. Otherwise returns false.
bool GetBooleanPref(const AccountId& account_id,
const std::string& path,
bool* out_value);
// Updates user's identified by |account_id| boolean preference |path|.
void SetBooleanPref(const AccountId& account_id,
const std::string& path,
const bool in_value);
// Returns true if |account_id| preference by |path| does exist,
// fills in |out_value|. Otherwise returns false.
bool GetIntegerPref(const AccountId& account_id,
const std::string& path,
int* out_value);
// Updates user's identified by |account_id| integer preference |path|.
void SetIntegerPref(const AccountId& account_id,
const std::string& path,
const int in_value);
// Returns true if |account_id| preference by |path| does exist,
// fills in |out_value|. Otherwise returns false.
bool GetPref(const AccountId& account_id,
const std::string& path,
const base::Value** out_value);
// Updates user's identified by |account_id| value preference |path|.
void SetPref(const AccountId& account_id,
const std::string& path,
base::Value in_value);
// Removes user's identified by |account_id| preference |path|.
void RemovePref(const AccountId& account_id, const std::string& path);
// Returns the list of known AccountIds.
std::vector<AccountId> GetKnownAccountIds();
// This call forms full account id of a known user by email and (optionally)
// gaia_id.
// This is a temporary call while migrating to AccountId.
AccountId GetAccountId(const std::string& user_email,
const std::string& id,
const AccountType& account_type);
// Saves |account_id| into known users. Tries to commit the change on disk.
// Use only if account_id is not yet in the known user list. Important if
// Chrome crashes shortly after starting a session. Cryptohome should be able
// to find known account_id on Chrome restart.
void SaveKnownUser(const AccountId& account_id);
// Updates |account_id.account_type_| and |account_id.GetGaiaId()| or
// |account_id.GetObjGuid()| for user with |account_id|.
void UpdateId(const AccountId& account_id);
// Find GAIA ID for user with |account_id|, fill in |out_value| and return
// true
// if GAIA ID was found or false otherwise.
// TODO(antrim): Update this once AccountId contains GAIA ID
// (crbug.com/548926).
bool FindGaiaID(const AccountId& account_id, std::string* out_value);
// Setter and getter for DeviceId known user string preference.
void SetDeviceId(const AccountId& account_id, const std::string& device_id);
std::string GetDeviceId(const AccountId& account_id);
// Setter and getter for GAPSCookie known user string preference.
void SetGAPSCookie(const AccountId& account_id,
const std::string& gaps_cookie);
std::string GetGAPSCookie(const AccountId& account_id);
// Saves whether the user authenticates using SAML.
void UpdateUsingSAML(const AccountId& account_id, const bool using_saml);
// Returns if SAML needs to be used for authentication of the user with
// |account_id|, if it is known (was set by a |UpdateUsingSaml| call).
// Otherwise
// returns false.
bool IsUsingSAML(const AccountId& account_id);
// Setter and getter for the known user preference that stores whether the
// user authenticated via SAML using the principals API.
void UpdateIsUsingSAMLPrincipalsAPI(const AccountId& account_id,
bool is_using_saml_principals_api);
bool GetIsUsingSAMLPrincipalsAPI(const AccountId& account_id);
// Returns whether the current profile requires policy or not (returns UNKNOWN
// if the profile has never been initialized and so the policy status is
// not yet known).
ProfileRequiresPolicy GetProfileRequiresPolicy(const AccountId& account_id);
// Sets whether the profile requires policy or not.
void SetProfileRequiresPolicy(const AccountId& account_id,
ProfileRequiresPolicy policy_required);
// Clears information whether profile requires policy.
void ClearProfileRequiresPolicy(const AccountId& account_id);
// Saves why the user has to go through re-auth flow.
void UpdateReauthReason(const AccountId& account_id, const int reauth_reason);
// Returns the reason why the user with |account_id| has to go through the
// re-auth flow. Returns true if such a reason was recorded or false
// otherwise.
bool FindReauthReason(const AccountId& account_id, int* out_value);
// Setter and getter for the information about challenge-response keys that
// can be used by this user to authenticate. The getter returns a null value
// when the property isn't present. For the format of the value, refer to
// ash/components/login/auth/challenge_response/known_user_pref_utils.h.
void SetChallengeResponseKeys(const AccountId& account_id, base::Value value);
base::Value GetChallengeResponseKeys(const AccountId& account_id);
void SetLastOnlineSignin(const AccountId& account_id, base::Time time);
base::Time GetLastOnlineSignin(const AccountId& account_id);
void SetOfflineSigninLimit(const AccountId& account_id,
absl::optional<base::TimeDelta> time_limit);
absl::optional<base::TimeDelta> GetOfflineSigninLimit(
const AccountId& account_id);
void SetIsEnterpriseManaged(const AccountId& account_id,
bool is_enterprise_managed);
bool GetIsEnterpriseManaged(const AccountId& account_id);
void SetAccountManager(const AccountId& account_id,
const std::string& manager);
bool GetAccountManager(const AccountId& account_id, std::string* manager);
void SetUserLastLoginInputMethodId(const AccountId& account_id,
const std::string& input_method_id);
bool GetUserLastInputMethodId(const AccountId& account_id,
std::string* input_method_id);
// Exposes the user's PIN length in local state for PIN auto submit.
void SetUserPinLength(const AccountId& account_id, int pin_length);
// Returns the user's PIN length if available, otherwise 0.
int GetUserPinLength(const AccountId& account_id);
// Whether the user needs to have their pin auto submit preferences
// backfilled.
// TODO(crbug.com/1104164) - Remove this once most users have their
// preferences backfilled.
bool PinAutosubmitIsBackfillNeeded(const AccountId& account_id);
void PinAutosubmitSetBackfillNotNeeded(const AccountId& account_id);
void PinAutosubmitSetBackfillNeededForTests(const AccountId& account_id);
// Setter and getter for password sync token used for syncing SAML passwords
// across multiple user devices.
void SetPasswordSyncToken(const AccountId& account_id,
const std::string& token);
std::string GetPasswordSyncToken(const AccountId& account_id);
// Saves the current major version as the version in which the user completed
// the onboarding flow.
void SetOnboardingCompletedVersion(
const AccountId& account_id,
const absl::optional<base::Version> version);
absl::optional<base::Version> GetOnboardingCompletedVersion(
const AccountId& account_id);
void RemoveOnboardingCompletedVersionForTests(const AccountId& account_id);
// Setter and getter for the last screen shown in the onboarding flow. This
// is used to resume the onboarding flow if it's not completed yet.
void SetPendingOnboardingScreen(const AccountId& account_id,
const std::string& screen);
void RemovePendingOnboardingScreen(const AccountId& account_id);
std::string GetPendingOnboardingScreen(const AccountId& account_id);
// Register known user prefs.
static void RegisterPrefs(PrefRegistrySimple* registry);
private:
friend class UserManagerBase;
FRIEND_TEST_ALL_PREFIXES(KnownUserTest,
CleanEphemeralUsersRemovesEphemeralAdOnly);
FRIEND_TEST_ALL_PREFIXES(KnownUserTest, CleanObsoletePrefs);
FRIEND_TEST_ALL_PREFIXES(KnownUserTest, MigrateOfflineSigninLimit);
// Removes |path| from account_id's known user dictionary.
void ClearPref(const AccountId& account_id, const std::string& path);
// Removes all user preferences associated with |account_id|.
// Not exported as code should not be calling this outside this component
void RemovePrefs(const AccountId& account_id);
// Removes all ephemeral users.
void CleanEphemeralUsers();
// Marks if user is ephemeral and should be removed on log out.
void SetIsEphemeralUser(const AccountId& account_id, bool is_ephemeral);
// Removes all obsolete prefs from all users.
void CleanObsoletePrefs();
PrefService* const local_state_;
};
// Legacy interface of KnownUsersDatabase.
// TODO(https://crbug.com/1150434): Migrate callers and remove this.
namespace known_user {
// Methods for storage/retrieval of per-user properties in Local State.
// Performs a lookup of properties associated with |account_id|. If found,
// returns |true| and fills |out_value|. |out_value| can be NULL, if
// only existence check is required.
// TODO(https://crbug.com/1150434): Deprecated, use KnownUser::FindPrefs
// instead.
bool USER_MANAGER_EXPORT FindPrefs(const AccountId& account_id,
const base::DictionaryValue** out_value);
// Updates (or creates) properties associated with |account_id| based
// on |values|. |clear| defines if existing properties are cleared (|true|)
// or if it is just a incremental update (|false|).
// TODO(https://crbug.com/1150434): Deprecated, use KnownUser:: instead.
void USER_MANAGER_EXPORT UpdatePrefs(const AccountId& account_id,
const base::DictionaryValue& values,
bool clear);
// Returns true if |account_id| preference by |path| does exist,
// fills in |out_value|. Otherwise returns false.
// TODO(https://crbug.com/1150434): Deprecated, use KnownUser::GetStringPref
// instead.
bool USER_MANAGER_EXPORT GetStringPref(const AccountId& account_id,
const std::string& path,
std::string* out_value);
// Updates user's identified by |account_id| string preference |path|.
// TODO(https://crbug.com/1150434): Deprecated, use KnownUser::SetStringPref
// instead.
void USER_MANAGER_EXPORT SetStringPref(const AccountId& account_id,
const std::string& path,
const std::string& in_value);
// Returns true if |account_id| preference by |path| does exist,
// fills in |out_value|. Otherwise returns false.
// TODO(https://crbug.com/1150434): Deprecated, use KnownUser::GetBooleanPref
// instead.
bool USER_MANAGER_EXPORT GetBooleanPref(const AccountId& account_id,
const std::string& path,
bool* out_value);
// Updates user's identified by |account_id| boolean preference |path|.
// TODO(https://crbug.com/1150434): Deprecated, use KnownUser::SetBooleanPref
// instead.
void USER_MANAGER_EXPORT SetBooleanPref(const AccountId& account_id,
const std::string& path,
const bool in_value);
// Returns true if |account_id| preference by |path| does exist,
// fills in |out_value|. Otherwise returns false.
// TODO(https://crbug.com/1150434): Deprecated, use KnownUser::GetIntegerPref
// instead.
bool USER_MANAGER_EXPORT GetIntegerPref(const AccountId& account_id,
const std::string& path,
int* out_value);
// Updates user's identified by |account_id| integer preference |path|.
// TODO(https://crbug.com/1150434): Deprecated, use KnownUser::SetIntegerPref
// instead.
void USER_MANAGER_EXPORT SetIntegerPref(const AccountId& account_id,
const std::string& path,
const int in_value);
// Returns true if |account_id| preference by |path| does exist,
// fills in |out_value|. Otherwise returns false.
// TODO(https://crbug.com/1150434): Deprecated, use KnownUser::GetPref instead.
bool USER_MANAGER_EXPORT GetPref(const AccountId& account_id,
const std::string& path,
const base::Value** out_value);
// Updates user's identified by |account_id| value preference |path|.
// TODO(https://crbug.com/1150434): Deprecated, use KnownUser::SetPref instead.
void USER_MANAGER_EXPORT SetPref(const AccountId& account_id,
const std::string& path,
base::Value in_value);
// Removes user's identified by |account_id| preference |path|.
// TODO(https://crbug.com/1150434): Deprecated, use KnownUser::RemovePref
// instead.
void USER_MANAGER_EXPORT RemovePref(const AccountId& account_id,
const std::string& path);
// Returns the list of known AccountIds.
// TODO(https://crbug.com/1150434): Deprecated, use
// KnownUser::GetKnownAccountIds instead.
std::vector<AccountId> USER_MANAGER_EXPORT GetKnownAccountIds();
// This call forms full account id of a known user by email and (optionally)
// gaia_id.
// This is a temporary call while migrating to AccountId.
// TODO(https://crbug.com/1150434): Deprecated, use KnownUser::GetAccountId
// instead.
AccountId USER_MANAGER_EXPORT GetAccountId(const std::string& user_email,
const std::string& id,
const AccountType& account_type);
// Saves |account_id| into known users. Tries to commit the change on disk. Use
// only if account_id is not yet in the known user list. Important if Chrome
// crashes shortly after starting a session. Cryptohome should be able to find
// known account_id on Chrome restart.
// TODO(https://crbug.com/1150434): Deprecated, use KnownUser::SaveKnownUser
// instead.
void USER_MANAGER_EXPORT SaveKnownUser(const AccountId& account_id);
// Updates |account_id.account_type_| and |account_id.GetGaiaId()| or
// |account_id.GetObjGuid()| for user with |account_id|.
// TODO(https://crbug.com/1150434): Deprecated, use KnownUser::UpdateId instead.
void USER_MANAGER_EXPORT UpdateId(const AccountId& account_id);
// Find GAIA ID for user with |account_id|, fill in |out_value| and return
// true
// if GAIA ID was found or false otherwise.
// TODO(antrim): Update this once AccountId contains GAIA ID
// (crbug.com/548926).
// TODO(https://crbug.com/1150434): Deprecated, use KnownUser::FindGaiaID
// instead.
bool USER_MANAGER_EXPORT FindGaiaID(const AccountId& account_id,
std::string* out_value);
// Setter and getter for DeviceId known user string preference.
// TODO(https://crbug.com/1150434): Deprecated, use KnownUser::SetDeviceId
// instead.
void USER_MANAGER_EXPORT SetDeviceId(const AccountId& account_id,
const std::string& device_id);
// TODO(https://crbug.com/1150434): Deprecated, use KnownUser::GetDeviceId
// instead.
std::string USER_MANAGER_EXPORT GetDeviceId(const AccountId& account_id);
// Setter and getter for GAPSCookie known user string preference.
// TODO(https://crbug.com/1150434): Deprecated, use KnownUser::SetGAPSCookie
// instead.
void USER_MANAGER_EXPORT SetGAPSCookie(const AccountId& account_id,
const std::string& gaps_cookie);
// TODO(https://crbug.com/1150434): Deprecated, use KnownUser::GetGAPSCookie
// instead.
std::string USER_MANAGER_EXPORT GetGAPSCookie(const AccountId& account_id);
// Saves whether the user authenticates using SAML.
// TODO(https://crbug.com/1150434): Deprecated, use KnownUser::UpdateUsingSAML
// instead.
void USER_MANAGER_EXPORT UpdateUsingSAML(const AccountId& account_id,
const bool using_saml);
// Returns if SAML needs to be used for authentication of the user with
// |account_id|, if it is known (was set by a |UpdateUsingSaml| call).
// Otherwise
// returns false.
// TODO(https://crbug.com/1150434): Deprecated, use KnownUser::IsUsingSAML
// instead.
bool USER_MANAGER_EXPORT IsUsingSAML(const AccountId& account_id);
// Setter and getter for the known user preference that stores whether the user
// authenticated via SAML using the principals API.
// TODO(https://crbug.com/1150434): Deprecated, use
// KnownUser::UpdateIsUsingSAMLPrincipalsAPI instead.
void USER_MANAGER_EXPORT
UpdateIsUsingSAMLPrincipalsAPI(const AccountId& account_id,
bool is_using_saml_principals_api);
// TODO(https://crbug.com/1150434): Deprecated, use
// KnownUser::GetIsUsingSAMLPrincipalsAPI instead.
bool USER_MANAGER_EXPORT
GetIsUsingSAMLPrincipalsAPI(const AccountId& account_id);
// Returns whether the current profile requires policy or not (returns UNKNOWN
// if the profile has never been initialized and so the policy status is
// not yet known).
// TODO(https://crbug.com/1150434): Deprecated, use
// KnownUser::GetProfileRequiresPolicy instead.
ProfileRequiresPolicy USER_MANAGER_EXPORT
GetProfileRequiresPolicy(const AccountId& account_id);
// Sets whether the profile requires policy or not.
// TODO(https://crbug.com/1150434): Deprecated, use
// KnownUser::SetProfileRequiresPolicy instead.
void USER_MANAGER_EXPORT
SetProfileRequiresPolicy(const AccountId& account_id,
ProfileRequiresPolicy policy_required);
// Clears information whether profile requires policy.
// TODO(https://crbug.com/1150434): Deprecated, use
// KnownUser::ClearProfileRequiresPolicy instead.
void USER_MANAGER_EXPORT
ClearProfileRequiresPolicy(const AccountId& account_id);
// Saves why the user has to go through re-auth flow.
// TODO(https://crbug.com/1150434): Deprecated, use
// KnownUser::UpdateReauthReason instead.
void USER_MANAGER_EXPORT UpdateReauthReason(const AccountId& account_id,
const int reauth_reason);
// Returns the reason why the user with |account_id| has to go through the
// re-auth flow. Returns true if such a reason was recorded or false
// otherwise.
// TODO(https://crbug.com/1150434): Deprecated, use KnownUser::FindReauthReason
// instead.
bool USER_MANAGER_EXPORT FindReauthReason(const AccountId& account_id,
int* out_value);
// Setter and getter for the information about challenge-response keys that can
// be used by this user to authenticate.
// The getter returns a null value when the property isn't present.
// For the format of the value, refer to
// ash/components/login/auth/challenge_response/known_user_pref_utils.h.
// TODO(https://crbug.com/1150434): Deprecated, use
// KnownUser::SetChallengeResponseKeys instead.
void USER_MANAGER_EXPORT SetChallengeResponseKeys(const AccountId& account_id,
base::Value value);
// TODO(https://crbug.com/1150434): Deprecated, use
// KnownUser::GetChallengeResponseKeys instead.
base::Value USER_MANAGER_EXPORT
GetChallengeResponseKeys(const AccountId& account_id);
// TODO(https://crbug.com/1150434): Deprecated, use
// KnownUser::SetLastOnlineSignin instead.
void USER_MANAGER_EXPORT SetLastOnlineSignin(const AccountId& account_id,
base::Time time);
// TODO(https://crbug.com/1150434): Deprecated, use
// KnownUser::GetLastOnlineSignin instead.
base::Time USER_MANAGER_EXPORT GetLastOnlineSignin(const AccountId& account_id);
// TODO(https://crbug.com/1150434): Deprecated, use
// KnownUser::SetOfflineSigninLimit instead.
void USER_MANAGER_EXPORT
SetOfflineSigninLimit(const AccountId& account_id,
absl::optional<base::TimeDelta> time_limit);
// TODO(https://crbug.com/1150434): Deprecated, use
// KnownUser::GetOfflineSigninLimit instead.
absl::optional<base::TimeDelta> USER_MANAGER_EXPORT
GetOfflineSigninLimit(const AccountId& account_id);
// TODO(https://crbug.com/1150434): Deprecated, use
// KnownUser::SetIsEnterpriseManaged instead.
void USER_MANAGER_EXPORT SetIsEnterpriseManaged(const AccountId& account_id,
bool is_enterprise_managed);
// TODO(https://crbug.com/1150434): Deprecated, use
// KnownUser::GetIsEnterpriseManaged instead.
bool USER_MANAGER_EXPORT GetIsEnterpriseManaged(const AccountId& account_id);
// TODO(https://crbug.com/1150434): Deprecated, use KnownUser::SetAccountManager
// instead.
void USER_MANAGER_EXPORT SetAccountManager(const AccountId& account_id,
const std::string& manager);
// TODO(https://crbug.com/1150434): Deprecated, use KnownUser::GetAccountManager
// instead.
bool USER_MANAGER_EXPORT GetAccountManager(const AccountId& account_id,
std::string* manager);
// TODO(https://crbug.com/1150434): Deprecated, use
// KnownUser::SetUserLastLoginInputMethodId instead.
void USER_MANAGER_EXPORT
SetUserLastLoginInputMethodId(const AccountId& account_id,
const std::string& input_method_id);
// TODO(https://crbug.com/1150434): Deprecated, use
// KnownUser::GetUserLastInputMethodId instead.
bool USER_MANAGER_EXPORT GetUserLastInputMethodId(const AccountId& account_id,
std::string* input_method_id);
// Exposes the user's PIN length in local state for PIN auto submit.
// TODO(https://crbug.com/1150434): Deprecated, use KnownUser::SetUserPinLength
// instead.
void USER_MANAGER_EXPORT SetUserPinLength(const AccountId& account_id,
int pin_length);
// Returns the user's PIN length if available, otherwise 0.
// TODO(https://crbug.com/1150434): Deprecated, use KnownUser::GetUserPinLength
// instead.
int USER_MANAGER_EXPORT GetUserPinLength(const AccountId& account_id);
// Whether the user needs to have their pin auto submit preferences backfilled.
// TODO(crbug.com/1104164) - Remove this once most users have their
// preferences backfilled.
// TODO(https://crbug.com/1150434): Deprecated, use KnownUser:: equivalents
// instead.
bool USER_MANAGER_EXPORT
PinAutosubmitIsBackfillNeeded(const AccountId& account_id);
void USER_MANAGER_EXPORT
PinAutosubmitSetBackfillNotNeeded(const AccountId& account_id);
void USER_MANAGER_EXPORT
PinAutosubmitSetBackfillNeededForTests(const AccountId& account_id);
// Setter and getter for password sync token used for syncing SAML passwords
// across multiple user devices.
// TODO(https://crbug.com/1150434): Deprecated, use
// KnownUser::SetPasswordSyncToken instead.
void USER_MANAGER_EXPORT SetPasswordSyncToken(const AccountId& account_id,
const std::string& token);
// TODO(https://crbug.com/1150434): Deprecated, use
// KnownUser::GetPasswordSyncToken instead.
std::string USER_MANAGER_EXPORT
GetPasswordSyncToken(const AccountId& account_id);
} // namespace known_user
} // namespace user_manager
#endif // COMPONENTS_USER_MANAGER_KNOWN_USER_H_