blob: e780f6e3688552846f4f864c3c0a6e8d79f1e2bf [file] [log] [blame]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/signin/chrome_device_id_helper.h"
#include <string>
#include "build/chromeos_buildflags.h"
#include "chrome/browser/profiles/profile.h"
#include "components/signin/public/base/device_id_helper.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "base/command_line.h"
#include "base/logging.h"
#include "base/no_destructor.h"
#include "base/uuid.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/signin/signin_features.h"
#include "components/prefs/pref_service.h"
#include "components/signin/public/base/signin_pref_names.h"
#include "components/signin/public/base/signin_switches.h"
#include "components/user_manager/known_user.h"
#include "components/user_manager/user_manager.h"
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
namespace {
#if BUILDFLAG(IS_CHROMEOS_ASH)
constexpr char kEphemeralUserDeviceIDPrefix[] = "t_";
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
} // namespace
std::string GetSigninScopedDeviceIdForProfile(Profile* profile) {
#if BUILDFLAG(IS_CHROMEOS_ASH)
// UserManager may not exist in unit_tests.
if (!user_manager::UserManager::IsInitialized())
return std::string();
const user_manager::User* user =
ash::ProfileHelper::Get()->GetUserByProfile(profile);
if (!user)
return std::string();
user_manager::KnownUser known_user(g_browser_process->local_state());
const std::string signin_scoped_device_id =
known_user.GetDeviceId(user->GetAccountId());
LOG_IF(ERROR, signin_scoped_device_id.empty())
<< "Device ID is not set for user.";
return signin_scoped_device_id;
#else
return signin::GetSigninScopedDeviceId(profile->GetPrefs());
#endif
}
#if BUILDFLAG(IS_CHROMEOS_ASH)
std::string GenerateSigninScopedDeviceId(bool for_ephemeral) {
static base::NoDestructor<std::string> cached_device_id;
if (for_ephemeral) {
// Always generate a new identifier for ephemeral users.
return kEphemeralUserDeviceIDPrefix +
base::Uuid::GenerateRandomV4().AsLowercaseString();
}
if (!base::FeatureList::IsEnabled(kStableDeviceId)) {
// Do not cache identifiers if the feature is not enabled yet.
return base::Uuid::GenerateRandomV4().AsLowercaseString();
}
// Return cached values for non ephemeral users.
if (cached_device_id->empty()) {
*cached_device_id = base::Uuid::GenerateRandomV4().AsLowercaseString();
}
return *cached_device_id;
}
void MigrateSigninScopedDeviceId(Profile* profile) {
// UserManager may not exist in unit_tests.
if (!user_manager::UserManager::IsInitialized())
return;
const user_manager::User* user =
ash::ProfileHelper::Get()->GetUserByProfile(profile);
if (!user)
return;
user_manager::KnownUser known_user(g_browser_process->local_state());
const AccountId account_id = user->GetAccountId();
if (known_user.GetDeviceId(account_id).empty()) {
const std::string legacy_device_id = profile->GetPrefs()->GetString(
prefs::kGoogleServicesSigninScopedDeviceId);
if (!legacy_device_id.empty()) {
// Need to move device ID from the old location to the new one, if it has
// not been done yet.
known_user.SetDeviceId(account_id, legacy_device_id);
} else {
known_user.SetDeviceId(
account_id, GenerateSigninScopedDeviceId(
user_manager::UserManager::Get()
->IsUserNonCryptohomeDataEphemeral(account_id)));
}
}
profile->GetPrefs()->SetString(prefs::kGoogleServicesSigninScopedDeviceId,
std::string());
}
#endif