// Copyright 2021 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/ash/crosapi/identity_manager_ash.h"
#include "base/functional/callback.h"
#include "chrome/browser/ash/profiles/profile_helper.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/signin/identity_manager_factory.h"
#include "chromeos/crosapi/mojom/identity_manager.mojom.h"
#include "components/signin/public/identity_manager/account_info.h"
#include "components/signin/public/identity_manager/identity_manager.h"
#include "components/user_manager/user.h"
#include "components/user_manager/user_manager.h"
#include "google_apis/gaia/google_service_auth_error.h"
#include "ui/gfx/image/image.h"
namespace crosapi {
namespace {
signin::IdentityManager* GetIdentityManager(const std::string& gaia_id) {
user_manager::User* const user =
user_manager::UserManager::Get()->GetActiveUser();
if (!user)
return nullptr;
Profile* const profile = ash::ProfileHelper::Get()->GetProfileByUser(user);
if (!profile)
return nullptr;
return IdentityManagerFactory::GetInstance()->GetForProfileIfExists(profile);
}
AccountInfo GetAccountInfo(const std::string& gaia_id) {
signin::IdentityManager* identity_manager = GetIdentityManager(gaia_id);
if (!identity_manager)
return AccountInfo();
return identity_manager->FindExtendedAccountInfoByGaiaId(gaia_id);
}
} // namespace
IdentityManagerAsh::IdentityManagerAsh() = default;
IdentityManagerAsh::~IdentityManagerAsh() = default;
void IdentityManagerAsh::BindReceiver(
mojo::PendingReceiver<mojom::IdentityManager> receiver) {
receivers_.Add(this, std::move(receiver));
}
void IdentityManagerAsh::GetAccountFullName(
const std::string& gaia_id,
GetAccountFullNameCallback callback) {
AccountInfo account_info = GetAccountInfo(gaia_id);
if (GetAccountInfo(gaia_id).IsEmpty()) {
std::move(callback).Run("");
return;
}
std::move(callback).Run(account_info.full_name);
}
void IdentityManagerAsh::GetAccountImage(const std::string& gaia_id,
GetAccountImageCallback callback) {
AccountInfo account_info = GetAccountInfo(gaia_id);
if (account_info.IsEmpty()) {
std::move(callback).Run(gfx::ImageSkia());
return;
}
std::move(callback).Run(account_info.account_image.AsImageSkia());
}
void IdentityManagerAsh::GetAccountEmail(const std::string& gaia_id,
GetAccountEmailCallback callback) {
AccountInfo account_info = GetAccountInfo(gaia_id);
if (GetAccountInfo(gaia_id).IsEmpty()) {
std::move(callback).Run("");
return;
}
std::move(callback).Run(account_info.email);
}
void IdentityManagerAsh::HasAccountWithPersistentError(
const std::string& gaia_id,
HasAccountWithPersistentErrorCallback callback) {
signin::IdentityManager* identity_manager = GetIdentityManager(gaia_id);
AccountInfo account_info = GetAccountInfo(gaia_id);
if (!identity_manager || account_info.IsEmpty()) {
std::move(callback).Run(false);
return;
}
GoogleServiceAuthError error =
identity_manager->GetErrorStateOfRefreshTokenForAccount(
account_info.account_id);
std::move(callback).Run(error.IsPersistentError());
}
} // namespace crosapi