Chromium Code Reviews| 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 1afcbc9e128e45c78b357f083d75025b091eac08..77c5453db0a0ff96b76d508829600508c6fbaa5c 100644 |
| --- a/chrome/browser/signin/easy_unlock_service.cc |
| +++ b/chrome/browser/signin/easy_unlock_service.cc |
| @@ -9,11 +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/api/easy_unlock_private/easy_unlock_private_api.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_service_factory.h" |
| +#include "chrome/browser/signin/easy_unlock_service_observer.h" |
| +#include "chrome/browser/signin/easy_unlock_toggle_flow.h" |
| #include "chrome/browser/ui/extensions/application_launch.h" |
| #include "chrome/common/chrome_switches.h" |
| #include "chrome/common/pref_names.h" |
| @@ -29,6 +33,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 = |
| @@ -45,7 +58,7 @@ EasyUnlockService* EasyUnlockService::Get(Profile* profile) { |
| } |
| EasyUnlockService::EasyUnlockService(Profile* profile) |
| - : profile_(profile), weak_ptr_factory_(this) { |
| + : profile_(profile), turn_off_flow_status_(IDLE), weak_ptr_factory_(this) { |
| extensions::ExtensionSystem::Get(profile_)->ready().Post( |
| FROM_HERE, |
| base::Bind(&EasyUnlockService::Initialize, |
| @@ -105,6 +118,95 @@ bool EasyUnlockService::IsAllowed() { |
| #endif |
| } |
| +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); |
| + |
| + 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, |
|
tbarzic
2014/08/14 17:43:24
can you add a TODO for handling multiple phones (a
xiyuan
2014/08/14 22:09:19
Done.
|
| + 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( |
| @@ -148,3 +250,26 @@ void EasyUnlockService::OnPrefsChanged() { |
| else |
| UnloadApp(); |
| } |
| + |
| +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; |
| + } |
| + |
| + ClearPermitAccess(); |
|
Tim Song
2014/08/14 07:57:41
We shouldn't clear the permit access here. We are
xiyuan
2014/08/14 22:09:19
Done. And update the has_paring logic in browser_o
|
| + ClearRemoteDevices(); |
| + |
| + extensions::BrowserContextKeyedAPIFactory< |
| + extensions::api::EasyUnlockPrivateAPI>::Get(profile_) |
| + ->SendTurnOffFlowFinished(); |
| + SetTurnOffFlowStatus(IDLE); |
| +} |