blob: 7ae77366b77dfca51da28ccd2a7b92923452be6e [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.
#include "chrome/browser/signin/chrome_proximity_auth_client.h"
#include "base/logging.h"
#include "base/prefs/pref_service.h"
#include "base/sys_info.h"
#include "base/version.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_window.h"
#include "chrome/browser/signin/easy_unlock_service.h"
#include "chrome/browser/signin/easy_unlock_service_regular.h"
#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
#include "chrome/browser/signin/signin_manager_factory.h"
#include "components/proximity_auth/cryptauth/cryptauth_client_impl.h"
#include "components/proximity_auth/cryptauth/cryptauth_device_manager.h"
#include "components/proximity_auth/cryptauth/cryptauth_enrollment_manager.h"
#include "components/proximity_auth/cryptauth/secure_message_delegate.h"
#include "components/proximity_auth/logging/logging.h"
#include "components/signin/core/browser/profile_oauth2_token_service.h"
#include "components/signin/core/browser/signin_manager_base.h"
#include "components/version_info/version_info.h"
#if defined(OS_CHROMEOS)
#include "chrome/browser/chromeos/login/easy_unlock/secure_message_delegate_chromeos.h"
#include "chrome/browser/signin/easy_unlock_service_signin_chromeos.h"
#endif
using proximity_auth::ScreenlockState;
ChromeProximityAuthClient::ChromeProximityAuthClient(Profile* profile)
: profile_(profile) {
}
ChromeProximityAuthClient::~ChromeProximityAuthClient() {
}
std::string ChromeProximityAuthClient::GetAuthenticatedUsername() const {
const SigninManagerBase* signin_manager =
SigninManagerFactory::GetForProfileIfExists(profile_);
// |profile_| has to be a signed-in profile with SigninManager already
// created. Otherwise, just crash to collect stack.
DCHECK(signin_manager);
return signin_manager->GetAuthenticatedAccountInfo().email;
}
void ChromeProximityAuthClient::UpdateScreenlockState(ScreenlockState state) {
EasyUnlockService* service = EasyUnlockService::Get(profile_);
if (service)
service->UpdateScreenlockState(state);
}
void ChromeProximityAuthClient::FinalizeUnlock(bool success) {
EasyUnlockService* service = EasyUnlockService::Get(profile_);
if (service)
service->FinalizeUnlock(success);
}
void ChromeProximityAuthClient::FinalizeSignin(const std::string& secret) {
EasyUnlockService* service = EasyUnlockService::Get(profile_);
if (service)
service->FinalizeSignin(secret);
}
void ChromeProximityAuthClient::GetChallengeForUserAndDevice(
const std::string& user_id,
const std::string& remote_public_key,
const std::string& channel_binding_data,
base::Callback<void(const std::string& challenge)> callback) {
#if defined(OS_CHROMEOS)
EasyUnlockService* easy_unlock_service = EasyUnlockService::Get(profile_);
if (easy_unlock_service->GetType() == EasyUnlockService::TYPE_REGULAR) {
PA_LOG(ERROR) << "Unable to get challenge when user is logged in.";
callback.Run(std::string());
return;
}
static_cast<EasyUnlockServiceSignin*>(easy_unlock_service)
->WrapChallengeForUserAndDevice(AccountId::FromUserEmail(user_id),
remote_public_key, channel_binding_data,
callback);
#else
callback.Run(std::string());
#endif
}
PrefService* ChromeProximityAuthClient::GetPrefService() {
return profile_->GetPrefs();
}
scoped_ptr<proximity_auth::SecureMessageDelegate>
ChromeProximityAuthClient::CreateSecureMessageDelegate() {
#if defined(OS_CHROMEOS)
return make_scoped_ptr(new chromeos::SecureMessageDelegateChromeOS());
#else
return nullptr;
#endif
}
scoped_ptr<proximity_auth::CryptAuthClientFactory>
ChromeProximityAuthClient::CreateCryptAuthClientFactory() {
return make_scoped_ptr(new proximity_auth::CryptAuthClientFactoryImpl(
ProfileOAuth2TokenServiceFactory::GetForProfile(profile_), GetAccountId(),
profile_->GetRequestContext(), GetDeviceClassifier()));
}
cryptauth::DeviceClassifier ChromeProximityAuthClient::GetDeviceClassifier() {
cryptauth::DeviceClassifier device_classifier;
#if defined(OS_CHROMEOS)
int32 major_version, minor_version, bugfix_version;
// TODO(tengs): base::OperatingSystemVersionNumbers only works for ChromeOS.
// We need to get different numbers for other platforms.
base::SysInfo::OperatingSystemVersionNumbers(&major_version, &minor_version,
&bugfix_version);
device_classifier.set_device_os_version_code(major_version);
device_classifier.set_device_type(cryptauth::CHROME);
#endif
const std::vector<uint32_t>& version_components =
base::Version(version_info::GetVersionNumber()).components();
if (version_components.size() > 0)
device_classifier.set_device_software_version_code(version_components[0]);
device_classifier.set_device_software_package(version_info::GetProductName());
return device_classifier;
}
std::string ChromeProximityAuthClient::GetAccountId() {
// There is no SigninManager for the login profile.
if (!SigninManagerFactory::GetForProfile(profile_))
return std::string();
return SigninManagerFactory::GetForProfile(profile_)
->GetAuthenticatedAccountId();
}
proximity_auth::CryptAuthEnrollmentManager*
ChromeProximityAuthClient::GetCryptAuthEnrollmentManager() {
EasyUnlockServiceRegular* easy_unlock_service = GetEasyUnlockServiceRegular();
if (!easy_unlock_service)
return nullptr;
return easy_unlock_service->GetCryptAuthEnrollmentManager();
}
proximity_auth::CryptAuthDeviceManager*
ChromeProximityAuthClient::GetCryptAuthDeviceManager() {
EasyUnlockServiceRegular* easy_unlock_service = GetEasyUnlockServiceRegular();
if (!easy_unlock_service)
return nullptr;
return easy_unlock_service->GetCryptAuthDeviceManager();
}
EasyUnlockServiceRegular*
ChromeProximityAuthClient::GetEasyUnlockServiceRegular() {
EasyUnlockService* easy_unlock_service = EasyUnlockService::Get(profile_);
if (easy_unlock_service->GetType() == EasyUnlockService::TYPE_REGULAR)
return static_cast<EasyUnlockServiceRegular*>(easy_unlock_service);
else
return nullptr;
}