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 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/base64url.h" | 10 #include "base/base64url.h" |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
158 web_ui()->RegisterMessageCallback( | 158 web_ui()->RegisterMessageCallback( |
159 "toggleConnection", | 159 "toggleConnection", |
160 base::Bind(&ProximityAuthWebUIHandler::ToggleConnection, | 160 base::Bind(&ProximityAuthWebUIHandler::ToggleConnection, |
161 base::Unretained(this))); | 161 base::Unretained(this))); |
162 } | 162 } |
163 | 163 |
164 void ProximityAuthWebUIHandler::OnLogMessageAdded( | 164 void ProximityAuthWebUIHandler::OnLogMessageAdded( |
165 const LogBuffer::LogMessage& log_message) { | 165 const LogBuffer::LogMessage& log_message) { |
166 std::unique_ptr<base::DictionaryValue> dictionary = | 166 std::unique_ptr<base::DictionaryValue> dictionary = |
167 LogMessageToDictionary(log_message); | 167 LogMessageToDictionary(log_message); |
168 web_ui()->CallJavascriptFunction("LogBufferInterface.onLogMessageAdded", | 168 web_ui()->CallJavascriptFunctionUnsafe("LogBufferInterface.onLogMessageAdded", |
169 *dictionary); | 169 *dictionary); |
170 } | 170 } |
171 | 171 |
172 void ProximityAuthWebUIHandler::OnLogBufferCleared() { | 172 void ProximityAuthWebUIHandler::OnLogBufferCleared() { |
173 web_ui()->CallJavascriptFunction("LogBufferInterface.onLogBufferCleared"); | 173 web_ui()->CallJavascriptFunctionUnsafe( |
| 174 "LogBufferInterface.onLogBufferCleared"); |
174 } | 175 } |
175 | 176 |
176 void ProximityAuthWebUIHandler::OnEnrollmentStarted() { | 177 void ProximityAuthWebUIHandler::OnEnrollmentStarted() { |
177 web_ui()->CallJavascriptFunction( | 178 web_ui()->CallJavascriptFunctionUnsafe( |
178 "LocalStateInterface.onEnrollmentStateChanged", | 179 "LocalStateInterface.onEnrollmentStateChanged", |
179 *GetEnrollmentStateDictionary()); | 180 *GetEnrollmentStateDictionary()); |
180 } | 181 } |
181 | 182 |
182 void ProximityAuthWebUIHandler::OnEnrollmentFinished(bool success) { | 183 void ProximityAuthWebUIHandler::OnEnrollmentFinished(bool success) { |
183 std::unique_ptr<base::DictionaryValue> enrollment_state = | 184 std::unique_ptr<base::DictionaryValue> enrollment_state = |
184 GetEnrollmentStateDictionary(); | 185 GetEnrollmentStateDictionary(); |
185 PA_LOG(INFO) << "Enrollment attempt completed with success=" << success | 186 PA_LOG(INFO) << "Enrollment attempt completed with success=" << success |
186 << ":\n" << *enrollment_state; | 187 << ":\n" << *enrollment_state; |
187 web_ui()->CallJavascriptFunction( | 188 web_ui()->CallJavascriptFunctionUnsafe( |
188 "LocalStateInterface.onEnrollmentStateChanged", *enrollment_state); | 189 "LocalStateInterface.onEnrollmentStateChanged", *enrollment_state); |
189 } | 190 } |
190 | 191 |
191 void ProximityAuthWebUIHandler::OnSyncStarted() { | 192 void ProximityAuthWebUIHandler::OnSyncStarted() { |
192 web_ui()->CallJavascriptFunction( | 193 web_ui()->CallJavascriptFunctionUnsafe( |
193 "LocalStateInterface.onDeviceSyncStateChanged", | 194 "LocalStateInterface.onDeviceSyncStateChanged", |
194 *GetDeviceSyncStateDictionary()); | 195 *GetDeviceSyncStateDictionary()); |
195 } | 196 } |
196 | 197 |
197 void ProximityAuthWebUIHandler::OnSyncFinished( | 198 void ProximityAuthWebUIHandler::OnSyncFinished( |
198 CryptAuthDeviceManager::SyncResult sync_result, | 199 CryptAuthDeviceManager::SyncResult sync_result, |
199 CryptAuthDeviceManager::DeviceChangeResult device_change_result) { | 200 CryptAuthDeviceManager::DeviceChangeResult device_change_result) { |
200 std::unique_ptr<base::DictionaryValue> device_sync_state = | 201 std::unique_ptr<base::DictionaryValue> device_sync_state = |
201 GetDeviceSyncStateDictionary(); | 202 GetDeviceSyncStateDictionary(); |
202 PA_LOG(INFO) << "Device sync completed with result=" | 203 PA_LOG(INFO) << "Device sync completed with result=" |
203 << static_cast<int>(sync_result) << ":\n" << *device_sync_state; | 204 << static_cast<int>(sync_result) << ":\n" << *device_sync_state; |
204 web_ui()->CallJavascriptFunction( | 205 web_ui()->CallJavascriptFunctionUnsafe( |
205 "LocalStateInterface.onDeviceSyncStateChanged", *device_sync_state); | 206 "LocalStateInterface.onDeviceSyncStateChanged", *device_sync_state); |
206 | 207 |
207 if (device_change_result == | 208 if (device_change_result == |
208 CryptAuthDeviceManager::DeviceChangeResult::CHANGED) { | 209 CryptAuthDeviceManager::DeviceChangeResult::CHANGED) { |
209 std::unique_ptr<base::ListValue> unlock_keys = GetUnlockKeysList(); | 210 std::unique_ptr<base::ListValue> unlock_keys = GetUnlockKeysList(); |
210 PA_LOG(INFO) << "New unlock keys obtained after device sync:\n" | 211 PA_LOG(INFO) << "New unlock keys obtained after device sync:\n" |
211 << *unlock_keys; | 212 << *unlock_keys; |
212 web_ui()->CallJavascriptFunction("LocalStateInterface.onUnlockKeysChanged", | 213 web_ui()->CallJavascriptFunctionUnsafe( |
213 *unlock_keys); | 214 "LocalStateInterface.onUnlockKeysChanged", *unlock_keys); |
214 } | 215 } |
215 } | 216 } |
216 | 217 |
217 void ProximityAuthWebUIHandler::OnWebContentsInitialized( | 218 void ProximityAuthWebUIHandler::OnWebContentsInitialized( |
218 const base::ListValue* args) { | 219 const base::ListValue* args) { |
219 if (!web_contents_initialized_) { | 220 if (!web_contents_initialized_) { |
220 CryptAuthEnrollmentManager* enrollment_manager = | 221 CryptAuthEnrollmentManager* enrollment_manager = |
221 proximity_auth_client_->GetCryptAuthEnrollmentManager(); | 222 proximity_auth_client_->GetCryptAuthEnrollmentManager(); |
222 if (enrollment_manager) | 223 if (enrollment_manager) |
223 enrollment_manager->AddObserver(this); | 224 enrollment_manager->AddObserver(this); |
224 | 225 |
225 CryptAuthDeviceManager* device_manager = | 226 CryptAuthDeviceManager* device_manager = |
226 proximity_auth_client_->GetCryptAuthDeviceManager(); | 227 proximity_auth_client_->GetCryptAuthDeviceManager(); |
227 if (device_manager) | 228 if (device_manager) |
228 device_manager->AddObserver(this); | 229 device_manager->AddObserver(this); |
229 | 230 |
230 LogBuffer::GetInstance()->AddObserver(this); | 231 LogBuffer::GetInstance()->AddObserver(this); |
231 | 232 |
232 web_contents_initialized_ = true; | 233 web_contents_initialized_ = true; |
233 } | 234 } |
234 } | 235 } |
235 | 236 |
236 void ProximityAuthWebUIHandler::GetLogMessages(const base::ListValue* args) { | 237 void ProximityAuthWebUIHandler::GetLogMessages(const base::ListValue* args) { |
237 base::ListValue json_logs; | 238 base::ListValue json_logs; |
238 for (const auto& log : *LogBuffer::GetInstance()->logs()) { | 239 for (const auto& log : *LogBuffer::GetInstance()->logs()) { |
239 json_logs.Append(LogMessageToDictionary(log).release()); | 240 json_logs.Append(LogMessageToDictionary(log).release()); |
240 } | 241 } |
241 web_ui()->CallJavascriptFunction("LogBufferInterface.onGotLogMessages", | 242 web_ui()->CallJavascriptFunctionUnsafe("LogBufferInterface.onGotLogMessages", |
242 json_logs); | 243 json_logs); |
243 } | 244 } |
244 | 245 |
245 void ProximityAuthWebUIHandler::ClearLogBuffer(const base::ListValue* args) { | 246 void ProximityAuthWebUIHandler::ClearLogBuffer(const base::ListValue* args) { |
246 // The OnLogBufferCleared() observer function will be called after the buffer | 247 // The OnLogBufferCleared() observer function will be called after the buffer |
247 // is cleared. | 248 // is cleared. |
248 LogBuffer::GetInstance()->Clear(); | 249 LogBuffer::GetInstance()->Clear(); |
249 } | 250 } |
250 | 251 |
251 void ProximityAuthWebUIHandler::ToggleUnlockKey(const base::ListValue* args) { | 252 void ProximityAuthWebUIHandler::ToggleUnlockKey(const base::ListValue* args) { |
252 std::string public_key_b64, public_key; | 253 std::string public_key_b64, public_key; |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
360 } | 361 } |
361 } | 362 } |
362 | 363 |
363 PA_LOG(ERROR) << "Unlock key (" << b64_public_key << ") not found"; | 364 PA_LOG(ERROR) << "Unlock key (" << b64_public_key << ") not found"; |
364 } | 365 } |
365 | 366 |
366 void ProximityAuthWebUIHandler::OnCryptAuthClientError( | 367 void ProximityAuthWebUIHandler::OnCryptAuthClientError( |
367 const std::string& error_message) { | 368 const std::string& error_message) { |
368 PA_LOG(WARNING) << "CryptAuth request failed: " << error_message; | 369 PA_LOG(WARNING) << "CryptAuth request failed: " << error_message; |
369 base::StringValue error_string(error_message); | 370 base::StringValue error_string(error_message); |
370 web_ui()->CallJavascriptFunction("CryptAuthInterface.onError", error_string); | 371 web_ui()->CallJavascriptFunctionUnsafe("CryptAuthInterface.onError", |
| 372 error_string); |
371 } | 373 } |
372 | 374 |
373 void ProximityAuthWebUIHandler::OnEasyUnlockToggled( | 375 void ProximityAuthWebUIHandler::OnEasyUnlockToggled( |
374 const cryptauth::ToggleEasyUnlockResponse& response) { | 376 const cryptauth::ToggleEasyUnlockResponse& response) { |
375 web_ui()->CallJavascriptFunction("CryptAuthInterface.onUnlockKeyToggled"); | 377 web_ui()->CallJavascriptFunctionUnsafe( |
| 378 "CryptAuthInterface.onUnlockKeyToggled"); |
376 // TODO(tengs): Update the local state to reflect the toggle. | 379 // TODO(tengs): Update the local state to reflect the toggle. |
377 } | 380 } |
378 | 381 |
379 void ProximityAuthWebUIHandler::OnFoundEligibleUnlockDevices( | 382 void ProximityAuthWebUIHandler::OnFoundEligibleUnlockDevices( |
380 const cryptauth::FindEligibleUnlockDevicesResponse& response) { | 383 const cryptauth::FindEligibleUnlockDevicesResponse& response) { |
381 base::ListValue eligible_devices; | 384 base::ListValue eligible_devices; |
382 for (const auto& external_device : response.eligible_devices()) { | 385 for (const auto& external_device : response.eligible_devices()) { |
383 eligible_devices.Append(ExternalDeviceInfoToDictionary(external_device)); | 386 eligible_devices.Append(ExternalDeviceInfoToDictionary(external_device)); |
384 } | 387 } |
385 | 388 |
386 base::ListValue ineligible_devices; | 389 base::ListValue ineligible_devices; |
387 for (const auto& ineligible_device : response.ineligible_devices()) { | 390 for (const auto& ineligible_device : response.ineligible_devices()) { |
388 ineligible_devices.Append(IneligibleDeviceToDictionary(ineligible_device)); | 391 ineligible_devices.Append(IneligibleDeviceToDictionary(ineligible_device)); |
389 } | 392 } |
390 | 393 |
391 PA_LOG(INFO) << "Found " << eligible_devices.GetSize() | 394 PA_LOG(INFO) << "Found " << eligible_devices.GetSize() |
392 << " eligible devices and " << ineligible_devices.GetSize() | 395 << " eligible devices and " << ineligible_devices.GetSize() |
393 << " ineligible devices."; | 396 << " ineligible devices."; |
394 web_ui()->CallJavascriptFunction("CryptAuthInterface.onGotEligibleDevices", | 397 web_ui()->CallJavascriptFunctionUnsafe( |
395 eligible_devices, ineligible_devices); | 398 "CryptAuthInterface.onGotEligibleDevices", eligible_devices, |
| 399 ineligible_devices); |
396 } | 400 } |
397 | 401 |
398 void ProximityAuthWebUIHandler::OnReachablePhonesFound( | 402 void ProximityAuthWebUIHandler::OnReachablePhonesFound( |
399 const std::vector<cryptauth::ExternalDeviceInfo>& reachable_phones) { | 403 const std::vector<cryptauth::ExternalDeviceInfo>& reachable_phones) { |
400 reachable_phone_flow_.reset(); | 404 reachable_phone_flow_.reset(); |
401 base::ListValue device_list; | 405 base::ListValue device_list; |
402 for (const auto& external_device : reachable_phones) { | 406 for (const auto& external_device : reachable_phones) { |
403 device_list.Append(ExternalDeviceInfoToDictionary(external_device)); | 407 device_list.Append(ExternalDeviceInfoToDictionary(external_device)); |
404 } | 408 } |
405 web_ui()->CallJavascriptFunction("CryptAuthInterface.onGotReachableDevices", | 409 web_ui()->CallJavascriptFunctionUnsafe( |
406 device_list); | 410 "CryptAuthInterface.onGotReachableDevices", device_list); |
407 } | 411 } |
408 | 412 |
409 void ProximityAuthWebUIHandler::GetLocalState(const base::ListValue* args) { | 413 void ProximityAuthWebUIHandler::GetLocalState(const base::ListValue* args) { |
410 std::unique_ptr<base::DictionaryValue> enrollment_state = | 414 std::unique_ptr<base::DictionaryValue> enrollment_state = |
411 GetEnrollmentStateDictionary(); | 415 GetEnrollmentStateDictionary(); |
412 std::unique_ptr<base::DictionaryValue> device_sync_state = | 416 std::unique_ptr<base::DictionaryValue> device_sync_state = |
413 GetDeviceSyncStateDictionary(); | 417 GetDeviceSyncStateDictionary(); |
414 std::unique_ptr<base::ListValue> unlock_keys = GetUnlockKeysList(); | 418 std::unique_ptr<base::ListValue> unlock_keys = GetUnlockKeysList(); |
415 | 419 |
416 PA_LOG(INFO) << "==== Got Local State ====\n" | 420 PA_LOG(INFO) << "==== Got Local State ====\n" |
417 << "Enrollment State: \n" << *enrollment_state | 421 << "Enrollment State: \n" << *enrollment_state |
418 << "Device Sync State: \n" << *device_sync_state | 422 << "Device Sync State: \n" << *device_sync_state |
419 << "Unlock Keys: \n" << *unlock_keys; | 423 << "Unlock Keys: \n" << *unlock_keys; |
420 web_ui()->CallJavascriptFunction("LocalStateInterface.onGotLocalState", | 424 web_ui()->CallJavascriptFunctionUnsafe("LocalStateInterface.onGotLocalState", |
421 *enrollment_state, *device_sync_state, | 425 *enrollment_state, *device_sync_state, |
422 *unlock_keys); | 426 *unlock_keys); |
423 } | 427 } |
424 | 428 |
425 std::unique_ptr<base::DictionaryValue> | 429 std::unique_ptr<base::DictionaryValue> |
426 ProximityAuthWebUIHandler::GetEnrollmentStateDictionary() { | 430 ProximityAuthWebUIHandler::GetEnrollmentStateDictionary() { |
427 CryptAuthEnrollmentManager* enrollment_manager = | 431 CryptAuthEnrollmentManager* enrollment_manager = |
428 proximity_auth_client_->GetCryptAuthEnrollmentManager(); | 432 proximity_auth_client_->GetCryptAuthEnrollmentManager(); |
429 if (!enrollment_manager) | 433 if (!enrollment_manager) |
430 return base::WrapUnique(new base::DictionaryValue()); | 434 return base::WrapUnique(new base::DictionaryValue()); |
431 | 435 |
432 return CreateSyncStateDictionary( | 436 return CreateSyncStateDictionary( |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
561 std::move(ineligibility_reasons)); | 565 std::move(ineligibility_reasons)); |
562 return device_dictionary; | 566 return device_dictionary; |
563 } | 567 } |
564 | 568 |
565 void ProximityAuthWebUIHandler::CleanUpRemoteDeviceLifeCycle() { | 569 void ProximityAuthWebUIHandler::CleanUpRemoteDeviceLifeCycle() { |
566 PA_LOG(INFO) << "Cleaning up connection to " << selected_remote_device_.name | 570 PA_LOG(INFO) << "Cleaning up connection to " << selected_remote_device_.name |
567 << " [" << selected_remote_device_.bluetooth_address << "]"; | 571 << " [" << selected_remote_device_.bluetooth_address << "]"; |
568 life_cycle_.reset(); | 572 life_cycle_.reset(); |
569 selected_remote_device_ = RemoteDevice(); | 573 selected_remote_device_ = RemoteDevice(); |
570 last_remote_status_update_.reset(); | 574 last_remote_status_update_.reset(); |
571 web_ui()->CallJavascriptFunction("LocalStateInterface.onUnlockKeysChanged", | 575 web_ui()->CallJavascriptFunctionUnsafe( |
572 *GetUnlockKeysList()); | 576 "LocalStateInterface.onUnlockKeysChanged", *GetUnlockKeysList()); |
573 } | 577 } |
574 | 578 |
575 void ProximityAuthWebUIHandler::OnLifeCycleStateChanged( | 579 void ProximityAuthWebUIHandler::OnLifeCycleStateChanged( |
576 RemoteDeviceLifeCycle::State old_state, | 580 RemoteDeviceLifeCycle::State old_state, |
577 RemoteDeviceLifeCycle::State new_state) { | 581 RemoteDeviceLifeCycle::State new_state) { |
578 // Do not re-attempt to find a connection after the first one fails--just | 582 // Do not re-attempt to find a connection after the first one fails--just |
579 // abort. | 583 // abort. |
580 if ((old_state != RemoteDeviceLifeCycle::State::STOPPED && | 584 if ((old_state != RemoteDeviceLifeCycle::State::STOPPED && |
581 new_state == RemoteDeviceLifeCycle::State::FINDING_CONNECTION) || | 585 new_state == RemoteDeviceLifeCycle::State::FINDING_CONNECTION) || |
582 new_state == RemoteDeviceLifeCycle::State::AUTHENTICATION_FAILED) { | 586 new_state == RemoteDeviceLifeCycle::State::AUTHENTICATION_FAILED) { |
583 // Clean up the life cycle asynchronously, because we are currently in the | 587 // Clean up the life cycle asynchronously, because we are currently in the |
584 // call stack of |life_cycle_|. | 588 // call stack of |life_cycle_|. |
585 base::ThreadTaskRunnerHandle::Get()->PostTask( | 589 base::ThreadTaskRunnerHandle::Get()->PostTask( |
586 FROM_HERE, | 590 FROM_HERE, |
587 base::Bind(&ProximityAuthWebUIHandler::CleanUpRemoteDeviceLifeCycle, | 591 base::Bind(&ProximityAuthWebUIHandler::CleanUpRemoteDeviceLifeCycle, |
588 weak_ptr_factory_.GetWeakPtr())); | 592 weak_ptr_factory_.GetWeakPtr())); |
589 } else if (new_state == | 593 } else if (new_state == |
590 RemoteDeviceLifeCycle::State::SECURE_CHANNEL_ESTABLISHED) { | 594 RemoteDeviceLifeCycle::State::SECURE_CHANNEL_ESTABLISHED) { |
591 life_cycle_->GetMessenger()->AddObserver(this); | 595 life_cycle_->GetMessenger()->AddObserver(this); |
592 } | 596 } |
593 | 597 |
594 web_ui()->CallJavascriptFunction("LocalStateInterface.onUnlockKeysChanged", | 598 web_ui()->CallJavascriptFunctionUnsafe( |
595 *GetUnlockKeysList()); | 599 "LocalStateInterface.onUnlockKeysChanged", *GetUnlockKeysList()); |
596 } | 600 } |
597 | 601 |
598 void ProximityAuthWebUIHandler::OnRemoteStatusUpdate( | 602 void ProximityAuthWebUIHandler::OnRemoteStatusUpdate( |
599 const RemoteStatusUpdate& status_update) { | 603 const RemoteStatusUpdate& status_update) { |
600 PA_LOG(INFO) << "Remote status update:" | 604 PA_LOG(INFO) << "Remote status update:" |
601 << "\n user_presence: " | 605 << "\n user_presence: " |
602 << static_cast<int>(status_update.user_presence) | 606 << static_cast<int>(status_update.user_presence) |
603 << "\n secure_screen_lock_state: " | 607 << "\n secure_screen_lock_state: " |
604 << static_cast<int>(status_update.secure_screen_lock_state) | 608 << static_cast<int>(status_update.secure_screen_lock_state) |
605 << "\n trust_agent_state: " | 609 << "\n trust_agent_state: " |
606 << static_cast<int>(status_update.trust_agent_state); | 610 << static_cast<int>(status_update.trust_agent_state); |
607 | 611 |
608 last_remote_status_update_.reset(new RemoteStatusUpdate(status_update)); | 612 last_remote_status_update_.reset(new RemoteStatusUpdate(status_update)); |
609 std::unique_ptr<base::ListValue> unlock_keys = GetUnlockKeysList(); | 613 std::unique_ptr<base::ListValue> unlock_keys = GetUnlockKeysList(); |
610 web_ui()->CallJavascriptFunction("LocalStateInterface.onUnlockKeysChanged", | 614 web_ui()->CallJavascriptFunctionUnsafe( |
611 *unlock_keys); | 615 "LocalStateInterface.onUnlockKeysChanged", *unlock_keys); |
612 } | 616 } |
613 | 617 |
614 } // namespace proximity_auth | 618 } // namespace proximity_auth |
OLD | NEW |