OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/signin/easy_unlock_service.h" | 5 #include "chrome/browser/signin/easy_unlock_service.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/metrics/field_trial.h" | 10 #include "base/metrics/field_trial.h" |
(...skipping 21 matching lines...) Expand all Loading... |
32 #include "device/bluetooth/bluetooth_adapter.h" | 32 #include "device/bluetooth/bluetooth_adapter.h" |
33 #include "device/bluetooth/bluetooth_adapter_factory.h" | 33 #include "device/bluetooth/bluetooth_adapter_factory.h" |
34 #include "extensions/browser/event_router.h" | 34 #include "extensions/browser/event_router.h" |
35 #include "extensions/browser/extension_registry.h" | 35 #include "extensions/browser/extension_registry.h" |
36 #include "extensions/browser/extension_system.h" | 36 #include "extensions/browser/extension_system.h" |
37 #include "extensions/common/one_shot_event.h" | 37 #include "extensions/common/one_shot_event.h" |
38 #include "grit/browser_resources.h" | 38 #include "grit/browser_resources.h" |
39 | 39 |
40 #if defined(OS_CHROMEOS) | 40 #if defined(OS_CHROMEOS) |
41 #include "chrome/browser/chromeos/login/easy_unlock/easy_unlock_key_manager.h" | 41 #include "chrome/browser/chromeos/login/easy_unlock/easy_unlock_key_manager.h" |
| 42 #include "chrome/browser/chromeos/login/easy_unlock/easy_unlock_tpm_key_manager.
h" |
| 43 #include "chrome/browser/chromeos/login/easy_unlock/easy_unlock_tpm_key_manager_
factory.h" |
42 #include "chrome/browser/chromeos/login/session/user_session_manager.h" | 44 #include "chrome/browser/chromeos/login/session/user_session_manager.h" |
43 #include "chrome/browser/chromeos/profiles/profile_helper.h" | 45 #include "chrome/browser/chromeos/profiles/profile_helper.h" |
44 #include "chromeos/dbus/dbus_thread_manager.h" | 46 #include "chromeos/dbus/dbus_thread_manager.h" |
45 #include "chromeos/dbus/power_manager_client.h" | 47 #include "chromeos/dbus/power_manager_client.h" |
| 48 #include "components/user_manager/user_manager.h" |
46 #endif | 49 #endif |
47 | 50 |
48 namespace { | 51 namespace { |
49 | 52 |
50 extensions::ComponentLoader* GetComponentLoader( | 53 extensions::ComponentLoader* GetComponentLoader( |
51 content::BrowserContext* context) { | 54 content::BrowserContext* context) { |
52 extensions::ExtensionSystem* extension_system = | 55 extensions::ExtensionSystem* extension_system = |
53 extensions::ExtensionSystem::Get(context); | 56 extensions::ExtensionSystem::Get(context); |
54 ExtensionService* extension_service = extension_system->extension_service(); | 57 ExtensionService* extension_service = extension_system->extension_service(); |
55 return extension_service->component_loader(); | 58 return extension_service->component_loader(); |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
189 base::WeakPtrFactory<PowerMonitor> weak_ptr_factory_; | 192 base::WeakPtrFactory<PowerMonitor> weak_ptr_factory_; |
190 | 193 |
191 DISALLOW_COPY_AND_ASSIGN(PowerMonitor); | 194 DISALLOW_COPY_AND_ASSIGN(PowerMonitor); |
192 }; | 195 }; |
193 #endif | 196 #endif |
194 | 197 |
195 EasyUnlockService::EasyUnlockService(Profile* profile) | 198 EasyUnlockService::EasyUnlockService(Profile* profile) |
196 : profile_(profile), | 199 : profile_(profile), |
197 bluetooth_detector_(new BluetoothDetector(this)), | 200 bluetooth_detector_(new BluetoothDetector(this)), |
198 shut_down_(false), | 201 shut_down_(false), |
| 202 tpm_key_checked_(false), |
199 weak_ptr_factory_(this) { | 203 weak_ptr_factory_(this) { |
200 extensions::ExtensionSystem::Get(profile_)->ready().Post( | 204 extensions::ExtensionSystem::Get(profile_)->ready().Post( |
201 FROM_HERE, | 205 FROM_HERE, |
202 base::Bind(&EasyUnlockService::Initialize, | 206 base::Bind(&EasyUnlockService::Initialize, |
203 weak_ptr_factory_.GetWeakPtr())); | 207 weak_ptr_factory_.GetWeakPtr())); |
204 } | 208 } |
205 | 209 |
206 EasyUnlockService::~EasyUnlockService() { | 210 EasyUnlockService::~EasyUnlockService() { |
207 } | 211 } |
208 | 212 |
(...skipping 14 matching lines...) Expand all Loading... |
223 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); | 227 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); |
224 registry->RegisterBooleanPref( | 228 registry->RegisterBooleanPref( |
225 prefs::kEasyUnlockProximityRequired, | 229 prefs::kEasyUnlockProximityRequired, |
226 false, | 230 false, |
227 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); | 231 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); |
228 } | 232 } |
229 | 233 |
230 // static | 234 // static |
231 void EasyUnlockService::RegisterPrefs(PrefRegistrySimple* registry) { | 235 void EasyUnlockService::RegisterPrefs(PrefRegistrySimple* registry) { |
232 registry->RegisterDictionaryPref(prefs::kEasyUnlockHardlockState); | 236 registry->RegisterDictionaryPref(prefs::kEasyUnlockHardlockState); |
| 237 #if defined(OS_CHROMEOS) |
| 238 EasyUnlockTpmKeyManager::RegisterLocalStatePrefs(registry); |
| 239 #endif |
233 } | 240 } |
234 | 241 |
235 // static | 242 // static |
236 void EasyUnlockService::ResetLocalStateForUser(const std::string& user_id) { | 243 void EasyUnlockService::ResetLocalStateForUser(const std::string& user_id) { |
237 DCHECK(!user_id.empty()); | 244 DCHECK(!user_id.empty()); |
238 | 245 |
239 PrefService* local_state = GetLocalState(); | 246 PrefService* local_state = GetLocalState(); |
240 if (!local_state) | 247 if (!local_state) |
241 return; | 248 return; |
242 | 249 |
243 DictionaryPrefUpdate update(local_state, prefs::kEasyUnlockHardlockState); | 250 DictionaryPrefUpdate update(local_state, prefs::kEasyUnlockHardlockState); |
244 update->RemoveWithoutPathExpansion(user_id, NULL); | 251 update->RemoveWithoutPathExpansion(user_id, NULL); |
| 252 |
| 253 #if defined(OS_CHROMEOS) |
| 254 EasyUnlockTpmKeyManager::ResetLocalStateForUser(user_id); |
| 255 #endif |
245 } | 256 } |
246 | 257 |
247 bool EasyUnlockService::IsAllowed() { | 258 bool EasyUnlockService::IsAllowed() { |
248 if (shut_down_) | 259 if (shut_down_) |
249 return false; | 260 return false; |
250 | 261 |
251 if (!IsAllowedInternal()) | 262 if (!IsAllowedInternal()) |
252 return false; | 263 return false; |
253 | 264 |
254 #if defined(OS_CHROMEOS) | 265 #if defined(OS_CHROMEOS) |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
525 return; | 536 return; |
526 extensions::ExtensionSystem* extension_system = | 537 extensions::ExtensionSystem* extension_system = |
527 extensions::ExtensionSystem::Get(profile_); | 538 extensions::ExtensionSystem::Get(profile_); |
528 extension_system->extension_service()->ReloadExtension( | 539 extension_system->extension_service()->ReloadExtension( |
529 extension_misc::kEasyUnlockAppId); | 540 extension_misc::kEasyUnlockAppId); |
530 NotifyUserUpdated(); | 541 NotifyUserUpdated(); |
531 } | 542 } |
532 | 543 |
533 void EasyUnlockService::UpdateAppState() { | 544 void EasyUnlockService::UpdateAppState() { |
534 if (IsAllowed()) { | 545 if (IsAllowed()) { |
| 546 EnsureTpmKeyPresentIfNeeded(); |
535 LoadApp(); | 547 LoadApp(); |
536 | 548 |
537 #if defined(OS_CHROMEOS) | 549 #if defined(OS_CHROMEOS) |
538 if (!power_monitor_) | 550 if (!power_monitor_) |
539 power_monitor_.reset(new PowerMonitor(this)); | 551 power_monitor_.reset(new PowerMonitor(this)); |
540 #endif | 552 #endif |
541 } else { | 553 } else { |
542 bool bluetooth_waking_up = false; | 554 bool bluetooth_waking_up = false; |
543 #if defined(OS_CHROMEOS) | 555 #if defined(OS_CHROMEOS) |
544 // If the service is not allowed due to bluetooth not being detected just | 556 // If the service is not allowed due to bluetooth not being detected just |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
662 } | 674 } |
663 #endif | 675 #endif |
664 | 676 |
665 void EasyUnlockService::PrepareForSuspend() { | 677 void EasyUnlockService::PrepareForSuspend() { |
666 DisableAppIfLoaded(); | 678 DisableAppIfLoaded(); |
667 if (screenlock_state_handler_ && screenlock_state_handler_->IsActive()) { | 679 if (screenlock_state_handler_ && screenlock_state_handler_->IsActive()) { |
668 UpdateScreenlockState( | 680 UpdateScreenlockState( |
669 EasyUnlockScreenlockStateHandler::STATE_BLUETOOTH_CONNECTING); | 681 EasyUnlockScreenlockStateHandler::STATE_BLUETOOTH_CONNECTING); |
670 } | 682 } |
671 } | 683 } |
| 684 |
| 685 void EasyUnlockService::EnsureTpmKeyPresentIfNeeded() { |
| 686 if (tpm_key_checked_ || GetType() != TYPE_REGULAR || GetUserEmail().empty()) |
| 687 return; |
| 688 |
| 689 #if defined(OS_CHROMEOS) |
| 690 // If this is called before the session is started, the chances are Chrome |
| 691 // is restarting in order to apply user flags. Don't check TPM keys in this |
| 692 // case. |
| 693 if (!user_manager::UserManager::Get() || |
| 694 !user_manager::UserManager::Get()->IsSessionStarted()) |
| 695 return; |
| 696 |
| 697 // TODO(tbarzic): Set check_private_key only if previous sign-in attempt |
| 698 // failed. |
| 699 EasyUnlockTpmKeyManagerFactory::GetInstance()->Get(profile_) |
| 700 ->PrepareTpmKey(GetUserEmail(), |
| 701 true /* check_private_key */, |
| 702 base::Closure()); |
| 703 #endif // defined(OS_CHROMEOS) |
| 704 |
| 705 tpm_key_checked_ = true; |
| 706 } |
OLD | NEW |