OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "components/proximity_auth/webui/proximity_auth_webui_handler.h" | 5 #include "components/proximity_auth/webui/proximity_auth_webui_handler.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/i18n/time_formatting.h" | 10 #include "base/i18n/time_formatting.h" |
11 #include "base/prefs/pref_service.h" | 11 #include "base/prefs/pref_service.h" |
12 #include "base/thread_task_runner_handle.h" | 12 #include "base/thread_task_runner_handle.h" |
13 #include "base/time/default_clock.h" | 13 #include "base/time/default_clock.h" |
14 #include "base/time/default_tick_clock.h" | 14 #include "base/time/default_tick_clock.h" |
15 #include "base/values.h" | 15 #include "base/values.h" |
16 #include "components/proximity_auth/ble/bluetooth_low_energy_connection_finder.h
" | 16 #include "components/proximity_auth/ble/bluetooth_low_energy_connection_finder.h
" |
17 #include "components/proximity_auth/ble/bluetooth_low_energy_device_whitelist.h" | 17 #include "components/proximity_auth/ble/bluetooth_low_energy_device_whitelist.h" |
18 #include "components/proximity_auth/ble/pref_names.h" | 18 #include "components/proximity_auth/ble/pref_names.h" |
19 #include "components/proximity_auth/bluetooth_connection_finder.h" | 19 #include "components/proximity_auth/bluetooth_connection_finder.h" |
20 #include "components/proximity_auth/bluetooth_throttler_impl.h" | 20 #include "components/proximity_auth/bluetooth_throttler_impl.h" |
21 #include "components/proximity_auth/bluetooth_util.h" | 21 #include "components/proximity_auth/bluetooth_util.h" |
22 #include "components/proximity_auth/client_impl.h" | 22 #include "components/proximity_auth/client_impl.h" |
23 #include "components/proximity_auth/cryptauth/base64url.h" | 23 #include "components/proximity_auth/cryptauth/base64url.h" |
24 #include "components/proximity_auth/cryptauth/cryptauth_enrollment_manager.h" | 24 #include "components/proximity_auth/cryptauth/cryptauth_enrollment_manager.h" |
25 #include "components/proximity_auth/cryptauth/cryptauth_gcm_manager_impl.h" | |
26 #include "components/proximity_auth/cryptauth/proto/cryptauth_api.pb.h" | 25 #include "components/proximity_auth/cryptauth/proto/cryptauth_api.pb.h" |
27 #include "components/proximity_auth/cryptauth/secure_message_delegate.h" | 26 #include "components/proximity_auth/cryptauth/secure_message_delegate.h" |
28 #include "components/proximity_auth/device_to_device_authenticator.h" | 27 #include "components/proximity_auth/device_to_device_authenticator.h" |
29 #include "components/proximity_auth/logging/logging.h" | 28 #include "components/proximity_auth/logging/logging.h" |
30 #include "components/proximity_auth/remote_status_update.h" | 29 #include "components/proximity_auth/remote_status_update.h" |
31 #include "components/proximity_auth/secure_context.h" | 30 #include "components/proximity_auth/secure_context.h" |
32 #include "components/proximity_auth/webui/cryptauth_enroller_factory_impl.h" | |
33 #include "components/proximity_auth/webui/proximity_auth_ui_delegate.h" | |
34 #include "components/proximity_auth/webui/reachable_phone_flow.h" | 31 #include "components/proximity_auth/webui/reachable_phone_flow.h" |
35 #include "content/public/browser/browser_thread.h" | 32 #include "content/public/browser/browser_thread.h" |
36 #include "content/public/browser/web_ui.h" | 33 #include "content/public/browser/web_ui.h" |
37 #include "device/bluetooth/bluetooth_uuid.h" | 34 #include "device/bluetooth/bluetooth_uuid.h" |
38 | 35 |
39 namespace proximity_auth { | 36 namespace proximity_auth { |
40 | 37 |
41 namespace { | 38 namespace { |
42 | 39 |
43 // The UUID of the Smart Lock classic Bluetooth service. | 40 // The UUID of the Smart Lock classic Bluetooth service. |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 sync_state->SetBoolean(kSyncStateRecoveringFromFailure, | 109 sync_state->SetBoolean(kSyncStateRecoveringFromFailure, |
113 is_recovering_from_failure); | 110 is_recovering_from_failure); |
114 sync_state->SetBoolean(kSyncStateOperationInProgress, | 111 sync_state->SetBoolean(kSyncStateOperationInProgress, |
115 is_enrollment_in_progress); | 112 is_enrollment_in_progress); |
116 return sync_state; | 113 return sync_state; |
117 } | 114 } |
118 | 115 |
119 } // namespace | 116 } // namespace |
120 | 117 |
121 ProximityAuthWebUIHandler::ProximityAuthWebUIHandler( | 118 ProximityAuthWebUIHandler::ProximityAuthWebUIHandler( |
122 ProximityAuthUIDelegate* delegate) | 119 ProximityAuthClient* proximity_auth_client) |
123 : delegate_(delegate), | 120 : proximity_auth_client_(proximity_auth_client), |
| 121 web_contents_initialized_(false), |
124 weak_ptr_factory_(this) { | 122 weak_ptr_factory_(this) { |
125 cryptauth_client_factory_ = delegate_->CreateCryptAuthClientFactory(); | 123 cryptauth_client_factory_ = |
| 124 proximity_auth_client_->CreateCryptAuthClientFactory(); |
126 } | 125 } |
127 | 126 |
128 ProximityAuthWebUIHandler::~ProximityAuthWebUIHandler() { | 127 ProximityAuthWebUIHandler::~ProximityAuthWebUIHandler() { |
129 LogBuffer::GetInstance()->RemoveObserver(this); | 128 LogBuffer::GetInstance()->RemoveObserver(this); |
130 } | 129 } |
131 | 130 |
132 void ProximityAuthWebUIHandler::RegisterMessages() { | 131 void ProximityAuthWebUIHandler::RegisterMessages() { |
133 web_ui()->RegisterMessageCallback( | 132 web_ui()->RegisterMessageCallback( |
134 "onWebContentsInitialized", | 133 "onWebContentsInitialized", |
135 base::Bind(&ProximityAuthWebUIHandler::OnWebContentsInitialized, | 134 base::Bind(&ProximityAuthWebUIHandler::OnWebContentsInitialized, |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 scoped_ptr<base::ListValue> unlock_keys = GetUnlockKeysList(); | 222 scoped_ptr<base::ListValue> unlock_keys = GetUnlockKeysList(); |
224 PA_LOG(INFO) << "New unlock keys obtained after device sync:\n" | 223 PA_LOG(INFO) << "New unlock keys obtained after device sync:\n" |
225 << *unlock_keys; | 224 << *unlock_keys; |
226 web_ui()->CallJavascriptFunction("LocalStateInterface.onUnlockKeysChanged", | 225 web_ui()->CallJavascriptFunction("LocalStateInterface.onUnlockKeysChanged", |
227 *unlock_keys); | 226 *unlock_keys); |
228 } | 227 } |
229 } | 228 } |
230 | 229 |
231 void ProximityAuthWebUIHandler::OnWebContentsInitialized( | 230 void ProximityAuthWebUIHandler::OnWebContentsInitialized( |
232 const base::ListValue* args) { | 231 const base::ListValue* args) { |
233 if (!gcm_manager_ || !enrollment_manager_ || !device_manager_) { | 232 if (!web_contents_initialized_) { |
234 InitGCMManager(); | 233 CryptAuthEnrollmentManager* enrollment_manager = |
235 InitEnrollmentManager(); | 234 proximity_auth_client_->GetCryptAuthEnrollmentManager(); |
236 InitDeviceManager(); | 235 if (enrollment_manager) |
| 236 enrollment_manager->AddObserver(this); |
| 237 |
| 238 CryptAuthDeviceManager* device_manager = |
| 239 proximity_auth_client_->GetCryptAuthDeviceManager(); |
| 240 if (device_manager) |
| 241 device_manager->AddObserver(this); |
| 242 |
237 LogBuffer::GetInstance()->AddObserver(this); | 243 LogBuffer::GetInstance()->AddObserver(this); |
| 244 |
| 245 web_contents_initialized_ = true; |
238 } | 246 } |
239 } | 247 } |
240 | 248 |
241 void ProximityAuthWebUIHandler::GetLogMessages(const base::ListValue* args) { | 249 void ProximityAuthWebUIHandler::GetLogMessages(const base::ListValue* args) { |
242 base::ListValue json_logs; | 250 base::ListValue json_logs; |
243 for (const auto& log : *LogBuffer::GetInstance()->logs()) { | 251 for (const auto& log : *LogBuffer::GetInstance()->logs()) { |
244 json_logs.Append(LogMessageToDictionary(log).release()); | 252 json_logs.Append(LogMessageToDictionary(log).release()); |
245 } | 253 } |
246 web_ui()->CallJavascriptFunction("LogBufferInterface.onGotLogMessages", | 254 web_ui()->CallJavascriptFunction("LogBufferInterface.onGotLogMessages", |
247 json_logs); | 255 json_logs); |
(...skipping 11 matching lines...) Expand all Loading... |
259 if (args->GetSize() != 2 || !args->GetString(0, &public_key_b64) || | 267 if (args->GetSize() != 2 || !args->GetString(0, &public_key_b64) || |
260 !args->GetBoolean(1, &make_unlock_key) || | 268 !args->GetBoolean(1, &make_unlock_key) || |
261 !Base64UrlDecode(public_key_b64, &public_key)) { | 269 !Base64UrlDecode(public_key_b64, &public_key)) { |
262 PA_LOG(ERROR) << "Invalid arguments to toggleUnlockKey"; | 270 PA_LOG(ERROR) << "Invalid arguments to toggleUnlockKey"; |
263 return; | 271 return; |
264 } | 272 } |
265 | 273 |
266 cryptauth::ToggleEasyUnlockRequest request; | 274 cryptauth::ToggleEasyUnlockRequest request; |
267 request.set_enable(make_unlock_key); | 275 request.set_enable(make_unlock_key); |
268 request.set_public_key(public_key); | 276 request.set_public_key(public_key); |
269 *(request.mutable_device_classifier()) = delegate_->GetDeviceClassifier(); | 277 *(request.mutable_device_classifier()) = |
| 278 proximity_auth_client_->GetDeviceClassifier(); |
270 | 279 |
271 PA_LOG(INFO) << "Toggling unlock key:\n" | 280 PA_LOG(INFO) << "Toggling unlock key:\n" |
272 << " public_key: " << public_key_b64 << "\n" | 281 << " public_key: " << public_key_b64 << "\n" |
273 << " make_unlock_key: " << make_unlock_key; | 282 << " make_unlock_key: " << make_unlock_key; |
274 cryptauth_client_ = cryptauth_client_factory_->CreateInstance(); | 283 cryptauth_client_ = cryptauth_client_factory_->CreateInstance(); |
275 cryptauth_client_->ToggleEasyUnlock( | 284 cryptauth_client_->ToggleEasyUnlock( |
276 request, base::Bind(&ProximityAuthWebUIHandler::OnEasyUnlockToggled, | 285 request, base::Bind(&ProximityAuthWebUIHandler::OnEasyUnlockToggled, |
277 weak_ptr_factory_.GetWeakPtr()), | 286 weak_ptr_factory_.GetWeakPtr()), |
278 base::Bind(&ProximityAuthWebUIHandler::OnCryptAuthClientError, | 287 base::Bind(&ProximityAuthWebUIHandler::OnCryptAuthClientError, |
279 weak_ptr_factory_.GetWeakPtr())); | 288 weak_ptr_factory_.GetWeakPtr())); |
280 } | 289 } |
281 | 290 |
282 void ProximityAuthWebUIHandler::FindEligibleUnlockDevices( | 291 void ProximityAuthWebUIHandler::FindEligibleUnlockDevices( |
283 const base::ListValue* args) { | 292 const base::ListValue* args) { |
284 cryptauth_client_ = cryptauth_client_factory_->CreateInstance(); | 293 cryptauth_client_ = cryptauth_client_factory_->CreateInstance(); |
285 | 294 |
286 cryptauth::FindEligibleUnlockDevicesRequest request; | 295 cryptauth::FindEligibleUnlockDevicesRequest request; |
287 *(request.mutable_device_classifier()) = delegate_->GetDeviceClassifier(); | 296 *(request.mutable_device_classifier()) = |
| 297 proximity_auth_client_->GetDeviceClassifier(); |
288 cryptauth_client_->FindEligibleUnlockDevices( | 298 cryptauth_client_->FindEligibleUnlockDevices( |
289 request, | 299 request, |
290 base::Bind(&ProximityAuthWebUIHandler::OnFoundEligibleUnlockDevices, | 300 base::Bind(&ProximityAuthWebUIHandler::OnFoundEligibleUnlockDevices, |
291 weak_ptr_factory_.GetWeakPtr()), | 301 weak_ptr_factory_.GetWeakPtr()), |
292 base::Bind(&ProximityAuthWebUIHandler::OnCryptAuthClientError, | 302 base::Bind(&ProximityAuthWebUIHandler::OnCryptAuthClientError, |
293 weak_ptr_factory_.GetWeakPtr())); | 303 weak_ptr_factory_.GetWeakPtr())); |
294 } | 304 } |
295 | 305 |
296 void ProximityAuthWebUIHandler::FindReachableDevices( | 306 void ProximityAuthWebUIHandler::FindReachableDevices( |
297 const base::ListValue* args) { | 307 const base::ListValue* args) { |
298 if (reachable_phone_flow_) { | 308 if (reachable_phone_flow_) { |
299 PA_LOG(INFO) << "Waiting for existing ReachablePhoneFlow to finish."; | 309 PA_LOG(INFO) << "Waiting for existing ReachablePhoneFlow to finish."; |
300 return; | 310 return; |
301 } | 311 } |
302 | 312 |
303 reachable_phone_flow_.reset( | 313 reachable_phone_flow_.reset( |
304 new ReachablePhoneFlow(cryptauth_client_factory_.get())); | 314 new ReachablePhoneFlow(cryptauth_client_factory_.get())); |
305 reachable_phone_flow_->Run( | 315 reachable_phone_flow_->Run( |
306 base::Bind(&ProximityAuthWebUIHandler::OnReachablePhonesFound, | 316 base::Bind(&ProximityAuthWebUIHandler::OnReachablePhonesFound, |
307 weak_ptr_factory_.GetWeakPtr())); | 317 weak_ptr_factory_.GetWeakPtr())); |
308 } | 318 } |
309 | 319 |
310 void ProximityAuthWebUIHandler::ForceEnrollment(const base::ListValue* args) { | 320 void ProximityAuthWebUIHandler::ForceEnrollment(const base::ListValue* args) { |
311 if (enrollment_manager_) { | 321 CryptAuthEnrollmentManager* enrollment_manager = |
312 enrollment_manager_->ForceEnrollmentNow( | 322 proximity_auth_client_->GetCryptAuthEnrollmentManager(); |
313 cryptauth::INVOCATION_REASON_MANUAL); | 323 if (enrollment_manager) { |
| 324 enrollment_manager->ForceEnrollmentNow(cryptauth::INVOCATION_REASON_MANUAL); |
314 } | 325 } |
315 } | 326 } |
316 | 327 |
317 void ProximityAuthWebUIHandler::ForceDeviceSync(const base::ListValue* args) { | 328 void ProximityAuthWebUIHandler::ForceDeviceSync(const base::ListValue* args) { |
318 if (device_manager_) | 329 CryptAuthDeviceManager* device_manager = |
319 device_manager_->ForceSyncNow(cryptauth::INVOCATION_REASON_MANUAL); | 330 proximity_auth_client_->GetCryptAuthDeviceManager(); |
| 331 if (device_manager) |
| 332 device_manager->ForceSyncNow(cryptauth::INVOCATION_REASON_MANUAL); |
320 } | 333 } |
321 | 334 |
322 void ProximityAuthWebUIHandler::ToggleConnection(const base::ListValue* args) { | 335 void ProximityAuthWebUIHandler::ToggleConnection(const base::ListValue* args) { |
| 336 CryptAuthEnrollmentManager* enrollment_manager = |
| 337 proximity_auth_client_->GetCryptAuthEnrollmentManager(); |
| 338 CryptAuthDeviceManager* device_manager = |
| 339 proximity_auth_client_->GetCryptAuthDeviceManager(); |
| 340 if (!enrollment_manager || !device_manager) |
| 341 return; |
| 342 |
323 std::string b64_public_key; | 343 std::string b64_public_key; |
324 std::string public_key; | 344 std::string public_key; |
325 if (!enrollment_manager_ || !device_manager_ || !args->GetSize() || | 345 if (!enrollment_manager || !device_manager || !args->GetSize() || |
326 !args->GetString(0, &b64_public_key) || | 346 !args->GetString(0, &b64_public_key) || |
327 !Base64UrlDecode(b64_public_key, &public_key)) { | 347 !Base64UrlDecode(b64_public_key, &public_key)) { |
328 return; | 348 return; |
329 } | 349 } |
330 | 350 |
331 Connection* connection = GetConnection(); | 351 Connection* connection = GetConnection(); |
332 for (const auto& unlock_key : device_manager_->unlock_keys()) { | 352 for (const auto& unlock_key : device_manager->unlock_keys()) { |
333 if (unlock_key.public_key() == public_key) { | 353 if (unlock_key.public_key() == public_key) { |
334 // Check if there is an existing connection to disconnect from first. | 354 // Check if there is an existing connection to disconnect from first. |
335 if (connection && connection->IsConnected() && | 355 if (connection && connection->IsConnected() && |
336 selected_remote_device_.public_key == public_key) { | 356 selected_remote_device_.public_key == public_key) { |
337 PA_LOG(INFO) << "Disconnecting from " | 357 PA_LOG(INFO) << "Disconnecting from " |
338 << unlock_key.friendly_device_name() << "[" | 358 << unlock_key.friendly_device_name() << "[" |
339 << unlock_key.bluetooth_address() << "]"; | 359 << unlock_key.bluetooth_address() << "]"; |
340 connection->Disconnect(); | 360 connection->Disconnect(); |
341 return; | 361 return; |
342 } | 362 } |
343 | 363 |
344 // Derive the PSK before connecting to the device. | 364 // Derive the PSK before connecting to the device. |
345 PA_LOG(INFO) << "Deriving PSK before connecting to " | 365 PA_LOG(INFO) << "Deriving PSK before connecting to " |
346 << unlock_key.friendly_device_name(); | 366 << unlock_key.friendly_device_name(); |
347 secure_message_delegate_ = delegate_->CreateSecureMessageDelegate(); | 367 secure_message_delegate_ = |
| 368 proximity_auth_client_->CreateSecureMessageDelegate(); |
348 secure_message_delegate_->DeriveKey( | 369 secure_message_delegate_->DeriveKey( |
349 enrollment_manager_->GetUserPrivateKey(), unlock_key.public_key(), | 370 enrollment_manager->GetUserPrivateKey(), unlock_key.public_key(), |
350 base::Bind(&ProximityAuthWebUIHandler::OnPSKDerived, | 371 base::Bind(&ProximityAuthWebUIHandler::OnPSKDerived, |
351 weak_ptr_factory_.GetWeakPtr(), unlock_key)); | 372 weak_ptr_factory_.GetWeakPtr(), unlock_key)); |
352 | 373 |
353 return; | 374 return; |
354 } | 375 } |
355 } | 376 } |
356 | 377 |
357 PA_LOG(ERROR) << "Unlock key (" << b64_public_key << ") not found"; | 378 PA_LOG(ERROR) << "Unlock key (" << b64_public_key << ") not found"; |
358 } | 379 } |
359 | 380 |
360 void ProximityAuthWebUIHandler::InitGCMManager() { | |
361 gcm_manager_.reset(new CryptAuthGCMManagerImpl(delegate_->GetGCMDriver(), | |
362 delegate_->GetPrefService())); | |
363 gcm_manager_->StartListening(); | |
364 } | |
365 | |
366 void ProximityAuthWebUIHandler::InitEnrollmentManager() { | |
367 #if defined(OS_CHROMEOS) | |
368 // TODO(tengs): We initialize a CryptAuthEnrollmentManager here for | |
369 // development and testing purposes until it is ready to be moved into Chrome. | |
370 // The public/private key pair has been generated and serialized in a previous | |
371 // session. | |
372 // This serialized DeviceInfo proto was previously captured from a real | |
373 // CryptAuth enrollment, and is replayed here for testing purposes. | |
374 std::string serialized_device_info; | |
375 Base64UrlDecode( | |
376 "IkoIARJGCiEAX_ZjLSq73EVcrarX-7l7No7nSP86GEC322ocSZKqUKwSIQDbEDu9KN7AgLM" | |
377 "v_lzZZNui9zSOgXCeDpLhS2tgrYVXijoEbGlua0IFZW4tVVNKSggBEkYKIQBf9mMtKrvcRV" | |
378 "ytqtf7uXs2judI_zoYQLfbahxJkqpQrBIhANsQO70o3sCAsy_-XNlk26L3NI6BcJ4OkuFLa" | |
379 "2CthVeKam9Nb3ppbGxhLzUuMCAoWDExOyBDck9TIHg4Nl82NCA3MTM0LjAuMCkgQXBwbGVX" | |
380 "ZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzQ1LjAuMjQyMi4wIFN" | |
381 "hZmFyaS81MzcuMzZwLYoBAzEuMJABAZoBIG1rYWVtaWdob2xlYmNnY2hsa2JhbmttaWhrbm" | |
382 "9qZWFrsAHDPuoBHEJLZEluZWxFZk05VG1adGV3eTRGb19RV1Vicz2AAgKyBqIBQVBBOTFiS" | |
383 "FZDdlJJNGJFSXppMmFXOTBlZ044eHFBYkhWYnJwSVFuMTk3bWltd3RWWTZYN0JEcEI4Szg3" | |
384 "RjRubkJnejdLX1BQV2xkcUtDRVhiZkFiMGwyN1VaQXgtVjBWbEE4WlFwdkhETmpHVlh4RlV" | |
385 "WRDFNY1AzNTgtYTZ3eHRpVG5LQnpMTEVIT1F6Ujdpb0lUMzRtWWY1VmNhbmhPZDh3ugYgs9" | |
386 "7-c7qNUzzLeEqVCDXb_EaJ8wC3iie_Lpid44iuAh3CPo0CCugBCiMIARACGgi5wHHa82avM" | |
387 "ioQ7y8xhiUBs7Um73ZC1vQlzzIBABLAAeCqGnWF7RwtnmdfIQJoEqXoXrH1qLw4yqUAA1TW" | |
388 "M1qxTepJOdDHrh54eiejobW0SKpHqTlZIyiK3ObHAPdfzFum1l640RFdFGZTTTksZFqfD9O" | |
389 "dftoi0pMrApob4gXj8Pv2g22ArX55BiH56TkTIcDcEE3KKnA_2G0INT1y_clZvZfDw1n0WP" | |
390 "0Xdg1PLLCOb46WfDWUhHvUk3GzUce8xyxsjOkiZUNh8yvhFXaP2wJgVKVWInf0inuofo9Za" | |
391 "7p44hIgHgKJIr_4fuVs9Ojf0KcMzxoJTbFUGg58jglUAKFfJBLKPpMBeWEyOS5pQUdTNFZ1" | |
392 "bF9JVWY4YTJDSmJNbXFqaWpYUFYzaVV5dmJXSVRrR3d1bFRaVUs3RGVZczJtT0h5ZkQ1NWR" | |
393 "HRXEtdnJTdVc4VEZ2Z1haa2xhVEZTN0dqM2xCVUktSHd5Z0h6bHZHX2NGLWtzQmw0dXdveG" | |
394 "VPWE1hRlJ3WGJHVUU1Tm9sLS1mdkRIcGVZVnJR", | |
395 &serialized_device_info); | |
396 cryptauth::GcmDeviceInfo device_info; | |
397 device_info.ParseFromString(serialized_device_info); | |
398 | |
399 enrollment_manager_.reset(new CryptAuthEnrollmentManager( | |
400 make_scoped_ptr(new base::DefaultClock()), | |
401 make_scoped_ptr(new CryptAuthEnrollerFactoryImpl(delegate_)), | |
402 delegate_->CreateSecureMessageDelegate(), device_info, gcm_manager_.get(), | |
403 delegate_->GetPrefService())); | |
404 enrollment_manager_->AddObserver(this); | |
405 enrollment_manager_->Start(); | |
406 #endif | |
407 } | |
408 | |
409 void ProximityAuthWebUIHandler::InitDeviceManager() { | |
410 // TODO(tengs): We initialize a CryptAuthDeviceManager here for | |
411 // development and testing purposes until it is ready to be moved into Chrome. | |
412 device_manager_.reset(new CryptAuthDeviceManager( | |
413 make_scoped_ptr(new base::DefaultClock()), | |
414 delegate_->CreateCryptAuthClientFactory(), gcm_manager_.get(), | |
415 delegate_->GetPrefService())); | |
416 device_manager_->AddObserver(this); | |
417 device_manager_->Start(); | |
418 } | |
419 | |
420 void ProximityAuthWebUIHandler::OnCryptAuthClientError( | 381 void ProximityAuthWebUIHandler::OnCryptAuthClientError( |
421 const std::string& error_message) { | 382 const std::string& error_message) { |
422 PA_LOG(WARNING) << "CryptAuth request failed: " << error_message; | 383 PA_LOG(WARNING) << "CryptAuth request failed: " << error_message; |
423 base::StringValue error_string(error_message); | 384 base::StringValue error_string(error_message); |
424 web_ui()->CallJavascriptFunction("CryptAuthInterface.onError", error_string); | 385 web_ui()->CallJavascriptFunction("CryptAuthInterface.onError", error_string); |
425 } | 386 } |
426 | 387 |
427 void ProximityAuthWebUIHandler::OnEasyUnlockToggled( | 388 void ProximityAuthWebUIHandler::OnEasyUnlockToggled( |
428 const cryptauth::ToggleEasyUnlockResponse& response) { | 389 const cryptauth::ToggleEasyUnlockResponse& response) { |
429 web_ui()->CallJavascriptFunction("CryptAuthInterface.onUnlockKeyToggled"); | 390 web_ui()->CallJavascriptFunction("CryptAuthInterface.onUnlockKeyToggled"); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
471 << "Enrollment State: \n" << *enrollment_state | 432 << "Enrollment State: \n" << *enrollment_state |
472 << "Device Sync State: \n" << *device_sync_state | 433 << "Device Sync State: \n" << *device_sync_state |
473 << "Unlock Keys: \n" << *unlock_keys; | 434 << "Unlock Keys: \n" << *unlock_keys; |
474 web_ui()->CallJavascriptFunction("LocalStateInterface.onGotLocalState", | 435 web_ui()->CallJavascriptFunction("LocalStateInterface.onGotLocalState", |
475 *enrollment_state, *device_sync_state, | 436 *enrollment_state, *device_sync_state, |
476 *unlock_keys); | 437 *unlock_keys); |
477 } | 438 } |
478 | 439 |
479 scoped_ptr<base::DictionaryValue> | 440 scoped_ptr<base::DictionaryValue> |
480 ProximityAuthWebUIHandler::GetEnrollmentStateDictionary() { | 441 ProximityAuthWebUIHandler::GetEnrollmentStateDictionary() { |
481 if (!enrollment_manager_) | 442 CryptAuthEnrollmentManager* enrollment_manager = |
| 443 proximity_auth_client_->GetCryptAuthEnrollmentManager(); |
| 444 if (!enrollment_manager) |
482 return make_scoped_ptr(new base::DictionaryValue()); | 445 return make_scoped_ptr(new base::DictionaryValue()); |
483 | 446 |
484 return CreateSyncStateDictionary( | 447 return CreateSyncStateDictionary( |
485 enrollment_manager_->GetLastEnrollmentTime().ToJsTime(), | 448 enrollment_manager->GetLastEnrollmentTime().ToJsTime(), |
486 enrollment_manager_->GetTimeToNextAttempt().InMillisecondsF(), | 449 enrollment_manager->GetTimeToNextAttempt().InMillisecondsF(), |
487 enrollment_manager_->IsRecoveringFromFailure(), | 450 enrollment_manager->IsRecoveringFromFailure(), |
488 enrollment_manager_->IsEnrollmentInProgress()); | 451 enrollment_manager->IsEnrollmentInProgress()); |
489 } | 452 } |
490 | 453 |
491 scoped_ptr<base::DictionaryValue> | 454 scoped_ptr<base::DictionaryValue> |
492 ProximityAuthWebUIHandler::GetDeviceSyncStateDictionary() { | 455 ProximityAuthWebUIHandler::GetDeviceSyncStateDictionary() { |
493 if (!device_manager_) | 456 CryptAuthDeviceManager* device_manager = |
| 457 proximity_auth_client_->GetCryptAuthDeviceManager(); |
| 458 if (!device_manager) |
494 return make_scoped_ptr(new base::DictionaryValue()); | 459 return make_scoped_ptr(new base::DictionaryValue()); |
495 | 460 |
496 return CreateSyncStateDictionary( | 461 return CreateSyncStateDictionary( |
497 device_manager_->GetLastSyncTime().ToJsTime(), | 462 device_manager->GetLastSyncTime().ToJsTime(), |
498 device_manager_->GetTimeToNextAttempt().InMillisecondsF(), | 463 device_manager->GetTimeToNextAttempt().InMillisecondsF(), |
499 device_manager_->IsRecoveringFromFailure(), | 464 device_manager->IsRecoveringFromFailure(), |
500 device_manager_->IsSyncInProgress()); | 465 device_manager->IsSyncInProgress()); |
501 } | 466 } |
502 | 467 |
503 scoped_ptr<base::ListValue> ProximityAuthWebUIHandler::GetUnlockKeysList() { | 468 scoped_ptr<base::ListValue> ProximityAuthWebUIHandler::GetUnlockKeysList() { |
504 scoped_ptr<base::ListValue> unlock_keys(new base::ListValue()); | 469 scoped_ptr<base::ListValue> unlock_keys(new base::ListValue()); |
505 if (!device_manager_) | 470 CryptAuthDeviceManager* device_manager = |
| 471 proximity_auth_client_->GetCryptAuthDeviceManager(); |
| 472 if (!device_manager) |
506 return unlock_keys; | 473 return unlock_keys; |
507 | 474 |
508 for (const auto& unlock_key : device_manager_->unlock_keys()) { | 475 for (const auto& unlock_key : device_manager->unlock_keys()) { |
509 unlock_keys->Append(ExternalDeviceInfoToDictionary(unlock_key)); | 476 unlock_keys->Append(ExternalDeviceInfoToDictionary(unlock_key)); |
510 } | 477 } |
511 | 478 |
512 return unlock_keys; | 479 return unlock_keys; |
513 } | 480 } |
514 | 481 |
515 Connection* ProximityAuthWebUIHandler::GetConnection() { | 482 Connection* ProximityAuthWebUIHandler::GetConnection() { |
516 Connection* connection = connection_.get(); | 483 Connection* connection = connection_.get(); |
517 if (client_) { | 484 if (client_) { |
518 DCHECK(!connection); | 485 DCHECK(!connection); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
554 connection_finder_->Find( | 521 connection_finder_->Find( |
555 base::Bind(&ProximityAuthWebUIHandler::OnConnectionFound, | 522 base::Bind(&ProximityAuthWebUIHandler::OnConnectionFound, |
556 weak_ptr_factory_.GetWeakPtr())); | 523 weak_ptr_factory_.GetWeakPtr())); |
557 | 524 |
558 web_ui()->CallJavascriptFunction("LocalStateInterface.onUnlockKeysChanged", | 525 web_ui()->CallJavascriptFunction("LocalStateInterface.onUnlockKeysChanged", |
559 *GetUnlockKeysList()); | 526 *GetUnlockKeysList()); |
560 } | 527 } |
561 | 528 |
562 void ProximityAuthWebUIHandler::FindBluetoothLowEnergyConnection( | 529 void ProximityAuthWebUIHandler::FindBluetoothLowEnergyConnection( |
563 const RemoteDevice& remote_device) { | 530 const RemoteDevice& remote_device) { |
564 PrefService* pref_service = delegate_->GetPrefService(); | 531 PrefService* pref_service = proximity_auth_client_->GetPrefService(); |
565 if (!pref_service->FindPreference( | 532 if (!pref_service->FindPreference( |
566 prefs::kBluetoothLowEnergyDeviceWhitelist)) { | 533 prefs::kBluetoothLowEnergyDeviceWhitelist)) { |
567 PA_LOG(ERROR) << "Please enable the BLE experiment in chrome://flags."; | 534 PA_LOG(ERROR) << "Please enable the BLE experiment in chrome://flags."; |
568 return; | 535 return; |
569 } | 536 } |
570 | 537 |
571 PA_LOG(INFO) << "Finding Bluetooth Low Energy device " << remote_device.name; | 538 PA_LOG(INFO) << "Finding Bluetooth Low Energy device " << remote_device.name; |
572 if (!bluetooth_throttler_) { | 539 if (!bluetooth_throttler_) { |
573 bluetooth_throttler_.reset(new BluetoothThrottlerImpl( | 540 bluetooth_throttler_.reset(new BluetoothThrottlerImpl( |
574 make_scoped_ptr(new base::DefaultTickClock()))); | 541 make_scoped_ptr(new base::DefaultTickClock()))); |
575 } | 542 } |
576 | 543 |
577 ble_device_whitelist_.reset( | 544 ble_device_whitelist_.reset(new BluetoothLowEnergyDeviceWhitelist( |
578 new BluetoothLowEnergyDeviceWhitelist(delegate_->GetPrefService())); | 545 proximity_auth_client_->GetPrefService())); |
579 | 546 |
580 // TODO(tengs): Set a timeout to stop the connection finder eventually. | 547 // TODO(tengs): Set a timeout to stop the connection finder eventually. |
581 connection_finder_.reset(new BluetoothLowEnergyConnectionFinder( | 548 connection_finder_.reset(new BluetoothLowEnergyConnectionFinder( |
582 kBLESmartLockServiceUUID, kBLEToPeripheralCharUUID, | 549 kBLESmartLockServiceUUID, kBLEToPeripheralCharUUID, |
583 kBLEFromPeripheralCharUUID, ble_device_whitelist_.get(), | 550 kBLEFromPeripheralCharUUID, ble_device_whitelist_.get(), |
584 bluetooth_throttler_.get(), 3)); | 551 bluetooth_throttler_.get(), 3)); |
585 connection_finder_->Find( | 552 connection_finder_->Find( |
586 base::Bind(&ProximityAuthWebUIHandler::OnConnectionFound, | 553 base::Bind(&ProximityAuthWebUIHandler::OnConnectionFound, |
587 weak_ptr_factory_.GetWeakPtr())); | 554 weak_ptr_factory_.GetWeakPtr())); |
588 | 555 |
(...skipping 22 matching lines...) Expand all Loading... |
611 connection_->AddObserver(this); | 578 connection_->AddObserver(this); |
612 | 579 |
613 web_ui()->CallJavascriptFunction("LocalStateInterface.onUnlockKeysChanged", | 580 web_ui()->CallJavascriptFunction("LocalStateInterface.onUnlockKeysChanged", |
614 *GetUnlockKeysList()); | 581 *GetUnlockKeysList()); |
615 | 582 |
616 // TODO(tengs): Create an authenticator for BLE connections. | 583 // TODO(tengs): Create an authenticator for BLE connections. |
617 if (selected_remote_device_.bluetooth_address.empty()) | 584 if (selected_remote_device_.bluetooth_address.empty()) |
618 return; | 585 return; |
619 | 586 |
620 authenticator_.reset(new DeviceToDeviceAuthenticator( | 587 authenticator_.reset(new DeviceToDeviceAuthenticator( |
621 connection_.get(), delegate_->GetAccountId(), | 588 connection_.get(), proximity_auth_client_->GetAccountId(), |
622 delegate_->CreateSecureMessageDelegate())); | 589 proximity_auth_client_->CreateSecureMessageDelegate())); |
623 authenticator_->Authenticate( | 590 authenticator_->Authenticate( |
624 base::Bind(&ProximityAuthWebUIHandler::OnAuthenticationResult, | 591 base::Bind(&ProximityAuthWebUIHandler::OnAuthenticationResult, |
625 weak_ptr_factory_.GetWeakPtr())); | 592 weak_ptr_factory_.GetWeakPtr())); |
626 } | 593 } |
627 | 594 |
628 void ProximityAuthWebUIHandler::CreateStatusUpdateClient() { | 595 void ProximityAuthWebUIHandler::CreateStatusUpdateClient() { |
629 client_.reset(new ClientImpl(connection_.Pass(), secure_context_.Pass())); | 596 client_.reset(new ClientImpl(connection_.Pass(), secure_context_.Pass())); |
630 client_->AddObserver(this); | 597 client_->AddObserver(this); |
631 } | 598 } |
632 | 599 |
633 scoped_ptr<base::DictionaryValue> | 600 scoped_ptr<base::DictionaryValue> |
634 ProximityAuthWebUIHandler::ExternalDeviceInfoToDictionary( | 601 ProximityAuthWebUIHandler::ExternalDeviceInfoToDictionary( |
635 const cryptauth::ExternalDeviceInfo& device_info) { | 602 const cryptauth::ExternalDeviceInfo& device_info) { |
636 std::string base64_public_key; | 603 std::string base64_public_key; |
637 Base64UrlEncode(device_info.public_key(), &base64_public_key); | 604 Base64UrlEncode(device_info.public_key(), &base64_public_key); |
638 | 605 |
639 // Set the fields in the ExternalDeviceInfo proto. | 606 // Set the fields in the ExternalDeviceInfo proto. |
640 scoped_ptr<base::DictionaryValue> dictionary(new base::DictionaryValue()); | 607 scoped_ptr<base::DictionaryValue> dictionary(new base::DictionaryValue()); |
641 dictionary->SetString(kExternalDevicePublicKey, base64_public_key); | 608 dictionary->SetString(kExternalDevicePublicKey, base64_public_key); |
642 dictionary->SetString(kExternalDeviceFriendlyName, | 609 dictionary->SetString(kExternalDeviceFriendlyName, |
643 device_info.friendly_device_name()); | 610 device_info.friendly_device_name()); |
644 dictionary->SetString(kExternalDeviceBluetoothAddress, | 611 dictionary->SetString(kExternalDeviceBluetoothAddress, |
645 device_info.bluetooth_address()); | 612 device_info.bluetooth_address()); |
646 dictionary->SetBoolean(kExternalDeviceUnlockKey, device_info.unlock_key()); | 613 dictionary->SetBoolean(kExternalDeviceUnlockKey, device_info.unlock_key()); |
647 dictionary->SetString(kExternalDeviceConnectionStatus, | 614 dictionary->SetString(kExternalDeviceConnectionStatus, |
648 kExternalDeviceDisconnected); | 615 kExternalDeviceDisconnected); |
649 | 616 |
650 if (!device_manager_) | 617 CryptAuthDeviceManager* device_manager = |
| 618 proximity_auth_client_->GetCryptAuthDeviceManager(); |
| 619 if (!device_manager) |
651 return dictionary; | 620 return dictionary; |
652 | 621 |
653 // If |device_info| is a known unlock key, then combine the proto data with | 622 // If |device_info| is a known unlock key, then combine the proto data with |
654 // the corresponding local device data (e.g. connection status and remote | 623 // the corresponding local device data (e.g. connection status and remote |
655 // status updates). | 624 // status updates). |
656 std::string public_key = device_info.public_key(); | 625 std::string public_key = device_info.public_key(); |
657 auto iterator = std::find_if( | 626 auto iterator = std::find_if( |
658 device_manager_->unlock_keys().begin(), | 627 device_manager->unlock_keys().begin(), |
659 device_manager_->unlock_keys().end(), | 628 device_manager->unlock_keys().end(), |
660 [&public_key](const cryptauth::ExternalDeviceInfo& unlock_key) { | 629 [&public_key](const cryptauth::ExternalDeviceInfo& unlock_key) { |
661 return unlock_key.public_key() == public_key; | 630 return unlock_key.public_key() == public_key; |
662 }); | 631 }); |
663 | 632 |
664 if (iterator == device_manager_->unlock_keys().end() || | 633 if (iterator == device_manager->unlock_keys().end() || |
665 selected_remote_device_.public_key != device_info.public_key()) | 634 selected_remote_device_.public_key != device_info.public_key()) |
666 return dictionary; | 635 return dictionary; |
667 | 636 |
668 // Fill in the current Bluetooth connection status. | 637 // Fill in the current Bluetooth connection status. |
669 std::string connection_status = kExternalDeviceDisconnected; | 638 std::string connection_status = kExternalDeviceDisconnected; |
670 Connection* connection = GetConnection(); | 639 Connection* connection = GetConnection(); |
671 if (connection && connection->IsConnected()) { | 640 if (connection && connection->IsConnected()) { |
672 connection_status = kExternalDeviceConnected; | 641 connection_status = kExternalDeviceConnected; |
673 } else if (connection_finder_) { | 642 } else if (connection_finder_) { |
674 connection_status = kExternalDeviceConnecting; | 643 connection_status = kExternalDeviceConnecting; |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
741 << "\n trust_agent_state: " | 710 << "\n trust_agent_state: " |
742 << static_cast<int>(status_update.trust_agent_state); | 711 << static_cast<int>(status_update.trust_agent_state); |
743 | 712 |
744 last_remote_status_update_.reset(new RemoteStatusUpdate(status_update)); | 713 last_remote_status_update_.reset(new RemoteStatusUpdate(status_update)); |
745 scoped_ptr<base::ListValue> unlock_keys = GetUnlockKeysList(); | 714 scoped_ptr<base::ListValue> unlock_keys = GetUnlockKeysList(); |
746 web_ui()->CallJavascriptFunction("LocalStateInterface.onUnlockKeysChanged", | 715 web_ui()->CallJavascriptFunction("LocalStateInterface.onUnlockKeysChanged", |
747 *unlock_keys); | 716 *unlock_keys); |
748 } | 717 } |
749 | 718 |
750 } // namespace proximity_auth | 719 } // namespace proximity_auth |
OLD | NEW |