| Index: chrome/browser/signin/easy_unlock_service.cc
|
| diff --git a/chrome/browser/signin/easy_unlock_service.cc b/chrome/browser/signin/easy_unlock_service.cc
|
| index 10dbf203b36915879209a13ae146a544f2e0008d..52d9d5c92ba4283edbe32b2a031c75dc1e449956 100644
|
| --- a/chrome/browser/signin/easy_unlock_service.cc
|
| +++ b/chrome/browser/signin/easy_unlock_service.cc
|
| @@ -9,12 +9,15 @@
|
| #include "base/logging.h"
|
| #include "base/metrics/field_trial.h"
|
| #include "base/prefs/pref_service.h"
|
| +#include "base/prefs/scoped_user_pref_update.h"
|
| #include "base/values.h"
|
| #include "chrome/browser/extensions/component_loader.h"
|
| #include "chrome/browser/extensions/extension_service.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/browser/signin/easy_unlock_screenlock_state_handler.h"
|
| #include "chrome/browser/signin/easy_unlock_service_factory.h"
|
| +#include "chrome/browser/signin/easy_unlock_service_observer.h"
|
| +#include "chrome/browser/signin/easy_unlock_toggle_flow.h"
|
| #include "chrome/browser/signin/screenlock_bridge.h"
|
| #include "chrome/browser/ui/extensions/application_launch.h"
|
| #include "chrome/common/chrome_switches.h"
|
| @@ -31,6 +34,15 @@
|
|
|
| namespace {
|
|
|
| +// Key name of the local device permit record dictonary in kEasyUnlockPairing.
|
| +const char kKeyPermitAccess[] = "permitAccess";
|
| +
|
| +// Key name of the remote device list in kEasyUnlockPairing.
|
| +const char kKeyDevices[] = "devices";
|
| +
|
| +// Key name of the phone public key in a device dictionary.
|
| +const char kKeyPhoneId[] = "permitRecord.id";
|
| +
|
| extensions::ComponentLoader* GetComponentLoader(
|
| content::BrowserContext* context) {
|
| extensions::ExtensionSystem* extension_system =
|
| @@ -48,6 +60,7 @@ EasyUnlockService* EasyUnlockService::Get(Profile* profile) {
|
|
|
| EasyUnlockService::EasyUnlockService(Profile* profile)
|
| : profile_(profile),
|
| + turn_off_flow_status_(IDLE),
|
| weak_ptr_factory_(this) {
|
| extensions::ExtensionSystem::Get(profile_)->ready().Post(
|
| FROM_HERE,
|
| @@ -108,7 +121,6 @@ bool EasyUnlockService::IsAllowed() {
|
| #endif
|
| }
|
|
|
| -
|
| EasyUnlockScreenlockStateHandler*
|
| EasyUnlockService::GetScreenlockStateHandler() {
|
| if (!IsAllowed())
|
| @@ -122,6 +134,98 @@ EasyUnlockScreenlockStateHandler*
|
| return screenlock_state_handler_.get();
|
| }
|
|
|
| +const base::DictionaryValue* EasyUnlockService::GetPermitAccess() const {
|
| + const base::DictionaryValue* pairing_dict =
|
| + profile_->GetPrefs()->GetDictionary(prefs::kEasyUnlockPairing);
|
| + const base::DictionaryValue* permit_dict = NULL;
|
| + if (pairing_dict &&
|
| + pairing_dict->GetDictionary(kKeyPermitAccess, &permit_dict)) {
|
| + return permit_dict;
|
| + }
|
| +
|
| + return NULL;
|
| +}
|
| +
|
| +void EasyUnlockService::SetPermitAccess(const base::DictionaryValue& permit) {
|
| + DictionaryPrefUpdate pairing_update(profile_->GetPrefs(),
|
| + prefs::kEasyUnlockPairing);
|
| + pairing_update->SetWithoutPathExpansion(kKeyPermitAccess, permit.DeepCopy());
|
| +}
|
| +
|
| +void EasyUnlockService::ClearPermitAccess() {
|
| + DictionaryPrefUpdate pairing_update(profile_->GetPrefs(),
|
| + prefs::kEasyUnlockPairing);
|
| + pairing_update->RemoveWithoutPathExpansion(kKeyPermitAccess, NULL);
|
| +}
|
| +
|
| +const base::ListValue* EasyUnlockService::GetRemoteDevices() const {
|
| + const base::DictionaryValue* pairing_dict =
|
| + profile_->GetPrefs()->GetDictionary(prefs::kEasyUnlockPairing);
|
| + const base::ListValue* devices = NULL;
|
| + if (pairing_dict && pairing_dict->GetList(kKeyDevices, &devices)) {
|
| + return devices;
|
| + }
|
| +
|
| + return NULL;
|
| +}
|
| +
|
| +void EasyUnlockService::SetRemoteDevices(const base::ListValue& devices) {
|
| + DictionaryPrefUpdate pairing_update(profile_->GetPrefs(),
|
| + prefs::kEasyUnlockPairing);
|
| + pairing_update->SetWithoutPathExpansion(kKeyDevices, devices.DeepCopy());
|
| +}
|
| +
|
| +void EasyUnlockService::ClearRemoteDevices() {
|
| + DictionaryPrefUpdate pairing_update(profile_->GetPrefs(),
|
| + prefs::kEasyUnlockPairing);
|
| + pairing_update->RemoveWithoutPathExpansion(kKeyDevices, NULL);
|
| +}
|
| +
|
| +void EasyUnlockService::AddObserver(EasyUnlockServiceObserver* observer) {
|
| + observers_.AddObserver(observer);
|
| +}
|
| +
|
| +void EasyUnlockService::RemoveObserver(EasyUnlockServiceObserver* observer) {
|
| + observers_.RemoveObserver(observer);
|
| +}
|
| +
|
| +void EasyUnlockService::RunTurnOffFlow() {
|
| + if (turn_off_flow_status_ == PENDING)
|
| + return;
|
| +
|
| + SetTurnOffFlowStatus(PENDING);
|
| +
|
| + // Currently there should only be one registered phone.
|
| + // TODO(xiyuan): Revisit this when server supports toggle for all or
|
| + // there are multiple phones.
|
| + const base::DictionaryValue* pairing_dict =
|
| + profile_->GetPrefs()->GetDictionary(prefs::kEasyUnlockPairing);
|
| + const base::ListValue* devices_list = NULL;
|
| + const base::DictionaryValue* first_device = NULL;
|
| + std::string phone_public_key;
|
| + if (!pairing_dict || !pairing_dict->GetList(kKeyDevices, &devices_list) ||
|
| + !devices_list || !devices_list->GetDictionary(0, &first_device) ||
|
| + !first_device ||
|
| + !first_device->GetString(kKeyPhoneId, &phone_public_key)) {
|
| + LOG(WARNING) << "Bad easy unlock pairing data, wiping out local data";
|
| + OnTurnOffFlowFinished(true);
|
| + return;
|
| + }
|
| +
|
| + turn_off_flow_.reset(new EasyUnlockToggleFlow(
|
| + profile_,
|
| + phone_public_key,
|
| + false,
|
| + base::Bind(&EasyUnlockService::OnTurnOffFlowFinished,
|
| + base::Unretained(this))));
|
| + turn_off_flow_->Start();
|
| +}
|
| +
|
| +void EasyUnlockService::ResetTurnOffFlow() {
|
| + turn_off_flow_.reset();
|
| + SetTurnOffFlowStatus(IDLE);
|
| +}
|
| +
|
| void EasyUnlockService::Initialize() {
|
| registrar_.Init(profile_->GetPrefs());
|
| registrar_.Add(
|
| @@ -169,3 +273,28 @@ void EasyUnlockService::OnPrefsChanged() {
|
| screenlock_state_handler_.reset();
|
| }
|
| }
|
| +
|
| +void EasyUnlockService::SetTurnOffFlowStatus(TurnOffFlowStatus status) {
|
| + turn_off_flow_status_ = status;
|
| + FOR_EACH_OBSERVER(
|
| + EasyUnlockServiceObserver, observers_, OnTurnOffOperationStatusChanged());
|
| +}
|
| +
|
| +void EasyUnlockService::OnTurnOffFlowFinished(bool success) {
|
| + turn_off_flow_.reset();
|
| +
|
| + if (!success) {
|
| + SetTurnOffFlowStatus(FAIL);
|
| + return;
|
| + }
|
| +
|
| + ClearRemoteDevices();
|
| + SetTurnOffFlowStatus(IDLE);
|
| +
|
| + if (GetComponentLoader(profile_)->Exists(extension_misc::kEasyUnlockAppId)) {
|
| + extensions::ExtensionSystem* extension_system =
|
| + extensions::ExtensionSystem::Get(profile_);
|
| + extension_system->extension_service()->ReloadExtension(
|
| + extension_misc::kEasyUnlockAppId);
|
| + }
|
| +}
|
|
|