| 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/values.h" | 15 #include "base/values.h" |
| 15 #include "components/proximity_auth/bluetooth_connection.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" |
| 18 #include "components/proximity_auth/ble/pref_names.h" |
| 19 #include "components/proximity_auth/bluetooth_connection_finder.h" |
| 20 #include "components/proximity_auth/bluetooth_throttler_impl.h" |
| 16 #include "components/proximity_auth/bluetooth_util.h" | 21 #include "components/proximity_auth/bluetooth_util.h" |
| 17 #include "components/proximity_auth/client_impl.h" | 22 #include "components/proximity_auth/client_impl.h" |
| 18 #include "components/proximity_auth/cryptauth/base64url.h" | 23 #include "components/proximity_auth/cryptauth/base64url.h" |
| 19 #include "components/proximity_auth/cryptauth/cryptauth_enrollment_manager.h" | 24 #include "components/proximity_auth/cryptauth/cryptauth_enrollment_manager.h" |
| 20 #include "components/proximity_auth/cryptauth/cryptauth_gcm_manager_impl.h" | 25 #include "components/proximity_auth/cryptauth/cryptauth_gcm_manager_impl.h" |
| 21 #include "components/proximity_auth/cryptauth/proto/cryptauth_api.pb.h" | 26 #include "components/proximity_auth/cryptauth/proto/cryptauth_api.pb.h" |
| 22 #include "components/proximity_auth/cryptauth/secure_message_delegate.h" | 27 #include "components/proximity_auth/cryptauth/secure_message_delegate.h" |
| 23 #include "components/proximity_auth/device_to_device_authenticator.h" | 28 #include "components/proximity_auth/device_to_device_authenticator.h" |
| 24 #include "components/proximity_auth/logging/logging.h" | 29 #include "components/proximity_auth/logging/logging.h" |
| 25 #include "components/proximity_auth/remote_status_update.h" | 30 #include "components/proximity_auth/remote_status_update.h" |
| 26 #include "components/proximity_auth/secure_context.h" | 31 #include "components/proximity_auth/secure_context.h" |
| 27 #include "components/proximity_auth/webui/cryptauth_enroller_factory_impl.h" | 32 #include "components/proximity_auth/webui/cryptauth_enroller_factory_impl.h" |
| 28 #include "components/proximity_auth/webui/proximity_auth_ui_delegate.h" | 33 #include "components/proximity_auth/webui/proximity_auth_ui_delegate.h" |
| 29 #include "components/proximity_auth/webui/reachable_phone_flow.h" | 34 #include "components/proximity_auth/webui/reachable_phone_flow.h" |
| 30 #include "content/public/browser/browser_thread.h" | 35 #include "content/public/browser/browser_thread.h" |
| 31 #include "content/public/browser/web_ui.h" | 36 #include "content/public/browser/web_ui.h" |
| 32 #include "device/bluetooth/bluetooth_uuid.h" | 37 #include "device/bluetooth/bluetooth_uuid.h" |
| 33 | 38 |
| 34 namespace proximity_auth { | 39 namespace proximity_auth { |
| 35 | 40 |
| 36 namespace { | 41 namespace { |
| 37 | 42 |
| 38 // The UUID of the Smart Lock Bluetooth service. | 43 // The UUID of the Smart Lock classic Bluetooth service. |
| 39 const char kBluetoothServiceUUID[] = "704EE561-3782-405A-A14B-2D47A2DDCDDF"; | 44 const char kClassicBluetoothServiceUUID[] = |
| 45 "704EE561-3782-405A-A14B-2D47A2DDCDDF"; |
| 46 |
| 47 // The UUID of the Bluetooth Low Energy service. |
| 48 const char kBLESmartLockServiceUUID[] = "b3b7e28e-a000-3e17-bd86-6e97b9e28c11"; |
| 49 |
| 50 // The UUID of the characteristic used to send data to the peripheral. |
| 51 const char kBLEToPeripheralCharUUID[] = "977c6674-1239-4e72-993b-502369b8bb5a"; |
| 52 |
| 53 // The UUID of the characteristic used to receive data from the peripheral. |
| 54 const char kBLEFromPeripheralCharUUID[] = |
| 55 "f4b904a2-a030-43b3-98a8-221c536c03cb"; |
| 40 | 56 |
| 41 // Keys in the JSON representation of a log message. | 57 // Keys in the JSON representation of a log message. |
| 42 const char kLogMessageTextKey[] = "text"; | 58 const char kLogMessageTextKey[] = "text"; |
| 43 const char kLogMessageTimeKey[] = "time"; | 59 const char kLogMessageTimeKey[] = "time"; |
| 44 const char kLogMessageFileKey[] = "file"; | 60 const char kLogMessageFileKey[] = "file"; |
| 45 const char kLogMessageLineKey[] = "line"; | 61 const char kLogMessageLineKey[] = "line"; |
| 46 const char kLogMessageSeverityKey[] = "severity"; | 62 const char kLogMessageSeverityKey[] = "severity"; |
| 47 | 63 |
| 48 // Keys in the JSON representation of a SyncState object for enrollment or | 64 // Keys in the JSON representation of a SyncState object for enrollment or |
| 49 // device sync. | 65 // device sync. |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 sync_state->SetBoolean(kSyncStateOperationInProgress, | 114 sync_state->SetBoolean(kSyncStateOperationInProgress, |
| 99 is_enrollment_in_progress); | 115 is_enrollment_in_progress); |
| 100 return sync_state; | 116 return sync_state; |
| 101 } | 117 } |
| 102 | 118 |
| 103 } // namespace | 119 } // namespace |
| 104 | 120 |
| 105 ProximityAuthWebUIHandler::ProximityAuthWebUIHandler( | 121 ProximityAuthWebUIHandler::ProximityAuthWebUIHandler( |
| 106 ProximityAuthUIDelegate* delegate) | 122 ProximityAuthUIDelegate* delegate) |
| 107 : delegate_(delegate), | 123 : delegate_(delegate), |
| 108 web_contents_initialized_(false), | |
| 109 weak_ptr_factory_(this) { | 124 weak_ptr_factory_(this) { |
| 110 cryptauth_client_factory_ = delegate_->CreateCryptAuthClientFactory(); | 125 cryptauth_client_factory_ = delegate_->CreateCryptAuthClientFactory(); |
| 111 } | 126 } |
| 112 | 127 |
| 113 ProximityAuthWebUIHandler::~ProximityAuthWebUIHandler() { | 128 ProximityAuthWebUIHandler::~ProximityAuthWebUIHandler() { |
| 114 LogBuffer::GetInstance()->RemoveObserver(this); | 129 LogBuffer::GetInstance()->RemoveObserver(this); |
| 115 } | 130 } |
| 116 | 131 |
| 117 void ProximityAuthWebUIHandler::RegisterMessages() { | 132 void ProximityAuthWebUIHandler::RegisterMessages() { |
| 118 web_ui()->RegisterMessageCallback( | 133 web_ui()->RegisterMessageCallback( |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 306 !args->GetString(0, &b64_public_key) || | 321 !args->GetString(0, &b64_public_key) || |
| 307 !Base64UrlDecode(b64_public_key, &public_key)) { | 322 !Base64UrlDecode(b64_public_key, &public_key)) { |
| 308 return; | 323 return; |
| 309 } | 324 } |
| 310 | 325 |
| 311 Connection* connection = GetConnection(); | 326 Connection* connection = GetConnection(); |
| 312 for (const auto& unlock_key : device_manager_->unlock_keys()) { | 327 for (const auto& unlock_key : device_manager_->unlock_keys()) { |
| 313 if (unlock_key.public_key() == public_key) { | 328 if (unlock_key.public_key() == public_key) { |
| 314 // Check if there is an existing connection to disconnect from first. | 329 // Check if there is an existing connection to disconnect from first. |
| 315 if (connection && connection->IsConnected() && | 330 if (connection && connection->IsConnected() && |
| 316 connection->remote_device().public_key == public_key) { | 331 selected_remote_device_.public_key == public_key) { |
| 317 PA_LOG(INFO) << "Disconnecting from " | 332 PA_LOG(INFO) << "Disconnecting from " |
| 318 << unlock_key.friendly_device_name() << "[" | 333 << unlock_key.friendly_device_name() << "[" |
| 319 << unlock_key.bluetooth_address() << "]"; | 334 << unlock_key.bluetooth_address() << "]"; |
| 320 connection->Disconnect(); | 335 connection->Disconnect(); |
| 321 return; | 336 return; |
| 322 } | 337 } |
| 323 | 338 |
| 324 // Derive the PSK before connecting to the device. | 339 // Derive the PSK before connecting to the device. |
| 325 PA_LOG(INFO) << "Connecting to " << unlock_key.friendly_device_name() | 340 PA_LOG(INFO) << "Deriving PSK before connecting to " |
| 326 << "[" << unlock_key.bluetooth_address() << "]"; | 341 << unlock_key.friendly_device_name(); |
| 327 secure_message_delegate_ = delegate_->CreateSecureMessageDelegate(); | 342 secure_message_delegate_ = delegate_->CreateSecureMessageDelegate(); |
| 328 secure_message_delegate_->DeriveKey( | 343 secure_message_delegate_->DeriveKey( |
| 329 user_private_key_, unlock_key.public_key(), | 344 user_private_key_, unlock_key.public_key(), |
| 330 base::Bind(&ProximityAuthWebUIHandler::OnPSKDerived, | 345 base::Bind(&ProximityAuthWebUIHandler::OnPSKDerived, |
| 331 weak_ptr_factory_.GetWeakPtr(), unlock_key)); | 346 weak_ptr_factory_.GetWeakPtr(), unlock_key)); |
| 332 | 347 |
| 333 return; | 348 return; |
| 334 } | 349 } |
| 335 } | 350 } |
| 336 | 351 |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 502 return unlock_keys; | 517 return unlock_keys; |
| 503 | 518 |
| 504 for (const auto& unlock_key : device_manager_->unlock_keys()) { | 519 for (const auto& unlock_key : device_manager_->unlock_keys()) { |
| 505 unlock_keys->Append(ExternalDeviceInfoToDictionary(unlock_key)); | 520 unlock_keys->Append(ExternalDeviceInfoToDictionary(unlock_key)); |
| 506 } | 521 } |
| 507 | 522 |
| 508 return unlock_keys; | 523 return unlock_keys; |
| 509 } | 524 } |
| 510 | 525 |
| 511 Connection* ProximityAuthWebUIHandler::GetConnection() { | 526 Connection* ProximityAuthWebUIHandler::GetConnection() { |
| 512 Connection* connection = bluetooth_connection_.get(); | 527 Connection* connection = connection_.get(); |
| 513 if (client_) { | 528 if (client_) { |
| 514 DCHECK(!connection); | 529 DCHECK(!connection); |
| 515 connection = client_->connection(); | 530 connection = client_->connection(); |
| 516 } | 531 } |
| 517 return connection; | 532 return connection; |
| 518 } | 533 } |
| 519 | 534 |
| 520 void ProximityAuthWebUIHandler::OnPSKDerived( | 535 void ProximityAuthWebUIHandler::OnPSKDerived( |
| 521 const cryptauth::ExternalDeviceInfo& unlock_key, | 536 const cryptauth::ExternalDeviceInfo& unlock_key, |
| 522 const std::string& persistent_symmetric_key) { | 537 const std::string& persistent_symmetric_key) { |
| 523 if (persistent_symmetric_key.empty()) { | 538 if (persistent_symmetric_key.empty()) { |
| 524 PA_LOG(ERROR) << "Failed to derive PSK."; | 539 PA_LOG(ERROR) << "Failed to derive PSK."; |
| 525 return; | 540 return; |
| 526 } | 541 } |
| 527 | 542 |
| 528 RemoteDevice remote_device( | 543 selected_remote_device_ = |
| 529 unlock_key.friendly_device_name(), unlock_key.public_key(), | 544 RemoteDevice(unlock_key.friendly_device_name(), unlock_key.public_key(), |
| 530 unlock_key.bluetooth_address(), persistent_symmetric_key); | 545 unlock_key.bluetooth_address(), persistent_symmetric_key); |
| 531 | 546 |
| 532 bluetooth_connection_.reset(new BluetoothConnection( | 547 // TODO(tengs): We distinguish whether the unlock key uses classic Bluetooth |
| 533 remote_device, device::BluetoothUUID(kBluetoothServiceUUID))); | 548 // or BLE based on the presence of the |bluetooth_address| field. However, we |
| 534 bluetooth_connection_->AddObserver(this); | 549 // should ideally have a separate field specifying the protocol. |
| 535 | 550 if (selected_remote_device_.bluetooth_address.empty()) |
| 536 // This SeekDeviceByAddress operation is needed to connect to a device if | 551 FindBluetoothLowEnergyConnection(selected_remote_device_); |
| 537 // it is not already known to the local device. | 552 else |
| 538 bluetooth_util::SeekDeviceByAddress( | 553 FindBluetoothClassicConnection(selected_remote_device_); |
| 539 remote_device.bluetooth_address, | |
| 540 base::Bind(&ProximityAuthWebUIHandler::OnSeekedDeviceByAddress, | |
| 541 weak_ptr_factory_.GetWeakPtr()), | |
| 542 base::Bind(&ProximityAuthWebUIHandler::OnSeekedDeviceByAddressError, | |
| 543 weak_ptr_factory_.GetWeakPtr()), | |
| 544 content::BrowserThread::GetBlockingPool() | |
| 545 ->GetTaskRunnerWithShutdownBehavior( | |
| 546 base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN) | |
| 547 .get()); | |
| 548 } | 554 } |
| 549 | 555 |
| 550 void ProximityAuthWebUIHandler::OnSeekedDeviceByAddress() { | 556 void ProximityAuthWebUIHandler::FindBluetoothClassicConnection( |
| 551 PA_LOG(INFO) << "Found Bluetooth device: " | 557 const RemoteDevice& remote_device) { |
| 552 << bluetooth_connection_->remote_device().bluetooth_address; | 558 PA_LOG(INFO) << "Finding classic Bluetooth device " << remote_device.name |
| 553 bluetooth_connection_->Connect(); | 559 << " [" << remote_device.bluetooth_address << "]."; |
| 560 |
| 561 // TODO(tengs): Set a timeout to stop the connection finder eventually. |
| 562 connection_finder_.reset(new BluetoothConnectionFinder( |
| 563 remote_device, device::BluetoothUUID(kClassicBluetoothServiceUUID), |
| 564 base::TimeDelta::FromSeconds(3))); |
| 565 connection_finder_->Find( |
| 566 base::Bind(&ProximityAuthWebUIHandler::OnConnectionFound, |
| 567 weak_ptr_factory_.GetWeakPtr())); |
| 568 |
| 569 web_ui()->CallJavascriptFunction("LocalStateInterface.onUnlockKeysChanged", |
| 570 *GetUnlockKeysList()); |
| 554 } | 571 } |
| 555 | 572 |
| 556 void ProximityAuthWebUIHandler::OnSeekedDeviceByAddressError( | 573 void ProximityAuthWebUIHandler::FindBluetoothLowEnergyConnection( |
| 557 const std::string& error_message) { | 574 const RemoteDevice& remote_device) { |
| 558 PA_LOG(WARNING) << "Failed to seek device by address: " | 575 PrefService* pref_service = delegate_->GetPrefService(); |
| 559 << bluetooth_connection_->remote_device().bluetooth_address; | 576 if (!pref_service->FindPreference( |
| 577 prefs::kBluetoothLowEnergyDeviceWhitelist)) { |
| 578 PA_LOG(ERROR) << "Please enable the BLE experiment in chrome://flags."; |
| 579 return; |
| 580 } |
| 581 |
| 582 PA_LOG(INFO) << "Finding Bluetooth Low Energy device " << remote_device.name; |
| 583 if (!bluetooth_throttler_) { |
| 584 bluetooth_throttler_.reset(new BluetoothThrottlerImpl( |
| 585 make_scoped_ptr(new base::DefaultTickClock()))); |
| 586 } |
| 587 |
| 588 ble_device_whitelist_.reset( |
| 589 new BluetoothLowEnergyDeviceWhitelist(delegate_->GetPrefService())); |
| 590 |
| 591 // TODO(tengs): Set a timeout to stop the connection finder eventually. |
| 592 connection_finder_.reset(new BluetoothLowEnergyConnectionFinder( |
| 593 kBLESmartLockServiceUUID, kBLEToPeripheralCharUUID, |
| 594 kBLEFromPeripheralCharUUID, ble_device_whitelist_.get(), |
| 595 bluetooth_throttler_.get(), 3)); |
| 596 connection_finder_->Find( |
| 597 base::Bind(&ProximityAuthWebUIHandler::OnConnectionFound, |
| 598 weak_ptr_factory_.GetWeakPtr())); |
| 599 |
| 600 web_ui()->CallJavascriptFunction("LocalStateInterface.onUnlockKeysChanged", |
| 601 *GetUnlockKeysList()); |
| 560 } | 602 } |
| 561 | 603 |
| 562 void ProximityAuthWebUIHandler::OnAuthenticationResult( | 604 void ProximityAuthWebUIHandler::OnAuthenticationResult( |
| 563 Authenticator::Result result, | 605 Authenticator::Result result, |
| 564 scoped_ptr<SecureContext> secure_context) { | 606 scoped_ptr<SecureContext> secure_context) { |
| 565 secure_context_ = secure_context.Pass(); | 607 secure_context_ = secure_context.Pass(); |
| 566 | 608 |
| 567 // Create the ClientImpl asynchronously. |client_| registers itself as an | 609 // Create the ClientImpl asynchronously. |client_| registers itself as an |
| 568 // observer of |bluetooth_connection_|, so creating it synchronously would | 610 // observer of |connection_|, so creating it synchronously would |
| 569 // trigger |OnSendComplete()| as an observer call for |client_|. | 611 // trigger |OnSendComplete()| as an observer call for |client_|. |
| 570 base::ThreadTaskRunnerHandle::Get()->PostTask( | 612 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 571 FROM_HERE, | 613 FROM_HERE, |
| 572 base::Bind(&ProximityAuthWebUIHandler::CreateStatusUpdateClient, | 614 base::Bind(&ProximityAuthWebUIHandler::CreateStatusUpdateClient, |
| 573 weak_ptr_factory_.GetWeakPtr())); | 615 weak_ptr_factory_.GetWeakPtr())); |
| 574 } | 616 } |
| 575 | 617 |
| 618 void ProximityAuthWebUIHandler::OnConnectionFound( |
| 619 scoped_ptr<Connection> connection) { |
| 620 DCHECK(connection->IsConnected()); |
| 621 connection_ = connection.Pass(); |
| 622 connection_->AddObserver(this); |
| 623 |
| 624 web_ui()->CallJavascriptFunction("LocalStateInterface.onUnlockKeysChanged", |
| 625 *GetUnlockKeysList()); |
| 626 |
| 627 // TODO(tengs): Create an authenticator for BLE connections. |
| 628 if (selected_remote_device_.bluetooth_address.empty()) |
| 629 return; |
| 630 |
| 631 authenticator_.reset(new DeviceToDeviceAuthenticator( |
| 632 connection_.get(), delegate_->GetAccountId(), |
| 633 delegate_->CreateSecureMessageDelegate())); |
| 634 authenticator_->Authenticate( |
| 635 base::Bind(&ProximityAuthWebUIHandler::OnAuthenticationResult, |
| 636 weak_ptr_factory_.GetWeakPtr())); |
| 637 } |
| 638 |
| 576 void ProximityAuthWebUIHandler::CreateStatusUpdateClient() { | 639 void ProximityAuthWebUIHandler::CreateStatusUpdateClient() { |
| 577 client_.reset( | 640 client_.reset(new ClientImpl(connection_.Pass(), secure_context_.Pass())); |
| 578 new ClientImpl(bluetooth_connection_.Pass(), secure_context_.Pass())); | |
| 579 client_->AddObserver(this); | 641 client_->AddObserver(this); |
| 580 } | 642 } |
| 581 | 643 |
| 582 scoped_ptr<base::DictionaryValue> | 644 scoped_ptr<base::DictionaryValue> |
| 583 ProximityAuthWebUIHandler::ExternalDeviceInfoToDictionary( | 645 ProximityAuthWebUIHandler::ExternalDeviceInfoToDictionary( |
| 584 const cryptauth::ExternalDeviceInfo& device_info) { | 646 const cryptauth::ExternalDeviceInfo& device_info) { |
| 585 std::string base64_public_key; | 647 std::string base64_public_key; |
| 586 Base64UrlEncode(device_info.public_key(), &base64_public_key); | 648 Base64UrlEncode(device_info.public_key(), &base64_public_key); |
| 587 | 649 |
| 588 // Set the fields in the ExternalDeviceInfo proto. | 650 // Set the fields in the ExternalDeviceInfo proto. |
| (...skipping 14 matching lines...) Expand all Loading... |
| 603 // the corresponding local device data (e.g. connection status and remote | 665 // the corresponding local device data (e.g. connection status and remote |
| 604 // status updates). | 666 // status updates). |
| 605 std::string public_key = device_info.public_key(); | 667 std::string public_key = device_info.public_key(); |
| 606 auto iterator = std::find_if( | 668 auto iterator = std::find_if( |
| 607 device_manager_->unlock_keys().begin(), | 669 device_manager_->unlock_keys().begin(), |
| 608 device_manager_->unlock_keys().end(), | 670 device_manager_->unlock_keys().end(), |
| 609 [&public_key](const cryptauth::ExternalDeviceInfo& unlock_key) { | 671 [&public_key](const cryptauth::ExternalDeviceInfo& unlock_key) { |
| 610 return unlock_key.public_key() == public_key; | 672 return unlock_key.public_key() == public_key; |
| 611 }); | 673 }); |
| 612 | 674 |
| 613 if (iterator == device_manager_->unlock_keys().end()) | 675 if (iterator == device_manager_->unlock_keys().end() || |
| 676 selected_remote_device_.public_key != device_info.public_key()) |
| 614 return dictionary; | 677 return dictionary; |
| 615 | 678 |
| 616 // Fill in the current Bluetooth connection status. | 679 // Fill in the current Bluetooth connection status. |
| 680 std::string connection_status = kExternalDeviceDisconnected; |
| 617 Connection* connection = GetConnection(); | 681 Connection* connection = GetConnection(); |
| 618 if (!connection || | 682 if (connection && connection->IsConnected()) { |
| 619 connection->remote_device().public_key != device_info.public_key()) | |
| 620 return dictionary; | |
| 621 | |
| 622 std::string connection_status = kExternalDeviceDisconnected; | |
| 623 if (connection->IsConnected()) { | |
| 624 connection_status = kExternalDeviceConnected; | 683 connection_status = kExternalDeviceConnected; |
| 625 } else if (connection->status() == Connection::IN_PROGRESS) { | 684 } else if (connection_finder_) { |
| 626 connection_status = kExternalDeviceConnecting; | 685 connection_status = kExternalDeviceConnecting; |
| 627 } | 686 } |
| 628 dictionary->SetString(kExternalDeviceConnectionStatus, connection_status); | 687 dictionary->SetString(kExternalDeviceConnectionStatus, connection_status); |
| 629 | 688 |
| 630 // Fill the remote status dictionary. | 689 // Fill the remote status dictionary. |
| 631 if (last_remote_status_update_) { | 690 if (last_remote_status_update_) { |
| 632 scoped_ptr<base::DictionaryValue> status_dictionary( | 691 scoped_ptr<base::DictionaryValue> status_dictionary( |
| 633 new base::DictionaryValue()); | 692 new base::DictionaryValue()); |
| 634 status_dictionary->SetInteger("userPresent", | 693 status_dictionary->SetInteger("userPresent", |
| 635 last_remote_status_update_->user_presence); | 694 last_remote_status_update_->user_presence); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 658 ineligibility_reasons.Pass()); | 717 ineligibility_reasons.Pass()); |
| 659 return device_dictionary; | 718 return device_dictionary; |
| 660 } | 719 } |
| 661 | 720 |
| 662 void ProximityAuthWebUIHandler::OnConnectionStatusChanged( | 721 void ProximityAuthWebUIHandler::OnConnectionStatusChanged( |
| 663 Connection* connection, | 722 Connection* connection, |
| 664 Connection::Status old_status, | 723 Connection::Status old_status, |
| 665 Connection::Status new_status) { | 724 Connection::Status new_status) { |
| 666 PA_LOG(INFO) << "Connection status changed from " << old_status << " to " | 725 PA_LOG(INFO) << "Connection status changed from " << old_status << " to " |
| 667 << new_status; | 726 << new_status; |
| 668 if (new_status == Connection::CONNECTED) { | 727 |
| 669 authenticator_.reset(new DeviceToDeviceAuthenticator( | 728 if (new_status == Connection::DISCONNECTED) { |
| 670 connection, delegate_->GetAccountId(), | |
| 671 delegate_->CreateSecureMessageDelegate())); | |
| 672 authenticator_->Authenticate( | |
| 673 base::Bind(&ProximityAuthWebUIHandler::OnAuthenticationResult, | |
| 674 weak_ptr_factory_.GetWeakPtr())); | |
| 675 } else if (new_status == Connection::DISCONNECTED) { | |
| 676 last_remote_status_update_.reset(); | 729 last_remote_status_update_.reset(); |
| 730 selected_remote_device_ = RemoteDevice(); |
| 731 connection_finder_.reset(); |
| 677 } | 732 } |
| 678 | 733 |
| 679 scoped_ptr<base::ListValue> unlock_keys = GetUnlockKeysList(); | 734 scoped_ptr<base::ListValue> unlock_keys = GetUnlockKeysList(); |
| 680 web_ui()->CallJavascriptFunction("LocalStateInterface.onUnlockKeysChanged", | 735 web_ui()->CallJavascriptFunction("LocalStateInterface.onUnlockKeysChanged", |
| 681 *unlock_keys); | 736 *unlock_keys); |
| 682 } | 737 } |
| 683 | 738 |
| 684 void ProximityAuthWebUIHandler::OnMessageReceived(const Connection& connection, | 739 void ProximityAuthWebUIHandler::OnMessageReceived(const Connection& connection, |
| 685 const WireMessage& message) { | 740 const WireMessage& message) { |
| 686 std::string address = connection.remote_device().bluetooth_address; | 741 std::string address = connection.remote_device().bluetooth_address; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 697 << "\n trust_agent_state: " | 752 << "\n trust_agent_state: " |
| 698 << static_cast<int>(status_update.trust_agent_state); | 753 << static_cast<int>(status_update.trust_agent_state); |
| 699 | 754 |
| 700 last_remote_status_update_.reset(new RemoteStatusUpdate(status_update)); | 755 last_remote_status_update_.reset(new RemoteStatusUpdate(status_update)); |
| 701 scoped_ptr<base::ListValue> unlock_keys = GetUnlockKeysList(); | 756 scoped_ptr<base::ListValue> unlock_keys = GetUnlockKeysList(); |
| 702 web_ui()->CallJavascriptFunction("LocalStateInterface.onUnlockKeysChanged", | 757 web_ui()->CallJavascriptFunction("LocalStateInterface.onUnlockKeysChanged", |
| 703 *unlock_keys); | 758 *unlock_keys); |
| 704 } | 759 } |
| 705 | 760 |
| 706 } // namespace proximity_auth | 761 } // namespace proximity_auth |
| OLD | NEW |