1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/extensions/api/networking_private/networking_private_service_client.h" 6 7 #include "base/base64.h" 8 #include "base/bind.h" 9 #include "base/sequenced_task_runner.h" 10 #include "base/strings/string_number_conversions.h" 11 #include "base/strings/string_util.h" 12 #include "base/threading/worker_pool.h" 13 #include "chrome/browser/browser_process.h" 14 #include "chrome/browser/extensions/api/networking_private/networking_private_credentials_getter.h" 15 #include "chrome/common/extensions/api/networking_private.h" 16 #include "chrome/common/extensions/api/networking_private/networking_private_crypto.h" 17 #include "content/public/browser/browser_thread.h" 18 #include "content/public/browser/utility_process_host.h" 19 20 using content::BrowserThread; 21 using extensions::api::networking_private::VerificationProperties; 22 23 namespace extensions { 24 25 namespace { 26 27 const char kNetworkingPrivateSequenceTokenName[] = "NetworkingPrivate"; 28 29 // Implementation of Verify* methods using NetworkingPrivateCrypto. 30 // TODO(mef): Move this into NetworkingPrivateCrypto class. 31 class CryptoVerifyImpl : public NetworkingPrivateServiceClient::CryptoVerify { 32 bool VerifyDestination(const VerificationProperties& properties) { 33 std::vector<std::string> data_parts; 34 data_parts.push_back(properties.device_ssid); 35 data_parts.push_back(properties.device_serial); 36 data_parts.push_back(properties.device_bssid); 37 data_parts.push_back(properties.public_key); 38 data_parts.push_back(properties.nonce); 39 std::string unsigned_data = JoinString(data_parts, ","); 40 std::string signed_data; 41 if (!base::Base64Decode(properties.signed_data, &signed_data)) 42 return false; 43 NetworkingPrivateCrypto crypto; 44 return crypto.VerifyCredentials(properties.certificate, 45 signed_data, 46 unsigned_data, 47 properties.device_bssid); 48 } 49 50 virtual void VerifyDestination(scoped_ptr<base::ListValue> args, 51 bool* verified, 52 std::string* error) OVERRIDE { 53 using api::networking_private::VerifyDestination::Params; 54 scoped_ptr<Params> params = Params::Create(*args); 55 *verified = VerifyDestination(params->properties); 56 } 57 58 virtual void VerifyAndEncryptCredentials( 59 scoped_ptr<base::ListValue> args, 60 const VerifyAndEncryptCredentialsCallback& callback) OVERRIDE { 61 using api::networking_private::VerifyAndEncryptCredentials::Params; 62 scoped_ptr<Params> params = Params::Create(*args); 63 std::string public_key; 64 65 if (!VerifyDestination(params->properties)) { 66 callback.Run("", "VerifyError"); 67 return; 68 } 69 70 if (!base::Base64Decode(params->properties.public_key, &public_key)) { 71 callback.Run("", "DecodeError"); 72 return; 73 } 74 75 scoped_ptr<NetworkingPrivateCredentialsGetter> credentials_getter( 76 NetworkingPrivateCredentialsGetter::Create()); 77 78 // Start getting credentials. On Windows |callback| will be called 79 // asynchronously on a different thread after |credentials_getter| 80 // is deleted. 81 credentials_getter->Start(params->network_guid, public_key, callback); 82 } 83 84 virtual void VerifyAndEncryptData(scoped_ptr<base::ListValue> args, 85 std::string* base64_encoded_ciphertext, 86 std::string* error) OVERRIDE { 87 using api::networking_private::VerifyAndEncryptData::Params; 88 scoped_ptr<Params> params = Params::Create(*args); 89 90 if (!VerifyDestination(params->properties)) { 91 *error = "VerifyError"; 92 return; 93 } 94 95 std::string public_key; 96 if (!base::Base64Decode(params->properties.public_key, &public_key)) { 97 *error = "DecodeError"; 98 return; 99 } 100 101 NetworkingPrivateCrypto crypto; 102 std::vector<uint8> public_key_data(public_key.begin(), public_key.end()); 103 std::vector<uint8> ciphertext; 104 if (!crypto.EncryptByteString(public_key_data, params->data, &ciphertext)) { 105 *error = "EncryptError"; 106 return; 107 } 108 109 base::Base64Encode(std::string(ciphertext.begin(), ciphertext.end()), 110 base64_encoded_ciphertext); 111 } 112 }; 113 114 // Deletes WiFiService and CryptoVerify objects on worker thread. 115 void ShutdownServicesOnWorkerThread( 116 scoped_ptr<wifi::WiFiService> wifi_service, 117 scoped_ptr<NetworkingPrivateServiceClient::CryptoVerify> crypto_verify) { 118 DCHECK(wifi_service.get()); 119 DCHECK(crypto_verify.get()); 120 } 121 122 // Forwards call back from VerifyAndEncryptCredentials on random thread to 123 // |callback| on correct |callback_loop_proxy|. 124 void AfterVerifyAndEncryptCredentialsRelay( 125 const NetworkingPrivateServiceClient::CryptoVerify:: 126 VerifyAndEncryptCredentialsCallback& callback, 127 scoped_refptr<base::MessageLoopProxy> callback_loop_proxy, 128 const std::string& key_data, 129 const std::string& error) { 130 callback_loop_proxy->PostTask(FROM_HERE, 131 base::Bind(callback, key_data, error)); 132 } 133 134 } // namespace 135 136 NetworkingPrivateServiceClient::NetworkingPrivateServiceClient( 137 wifi::WiFiService* wifi_service, 138 CryptoVerify* crypto_verify) 139 : crypto_verify_(crypto_verify), 140 wifi_service_(wifi_service), 141 weak_factory_(this) { 142 sequence_token_ = BrowserThread::GetBlockingPool()-> 143 GetNamedSequenceToken(kNetworkingPrivateSequenceTokenName); 144 task_runner_ = BrowserThread::GetBlockingPool()-> 145 GetSequencedTaskRunnerWithShutdownBehavior( 146 sequence_token_, 147 base::SequencedWorkerPool::CONTINUE_ON_SHUTDOWN); 148 task_runner_->PostTask( 149 FROM_HERE, 150 base::Bind( 151 &WiFiService::Initialize, 152 base::Unretained(wifi_service_.get()), 153 task_runner_)); 154 task_runner_->PostTask( 155 FROM_HERE, 156 base::Bind( 157 &WiFiService::SetEventObservers, 158 base::Unretained(wifi_service_.get()), 159 base::MessageLoopProxy::current(), 160 base::Bind( 161 &NetworkingPrivateServiceClient::OnNetworksChangedEventOnUIThread, 162 weak_factory_.GetWeakPtr()), 163 base::Bind( 164 &NetworkingPrivateServiceClient:: 165 OnNetworkListChangedEventOnUIThread, 166 weak_factory_.GetWeakPtr()))); 167 net::NetworkChangeNotifier::AddNetworkChangeObserver(this); 168 } 169 170 NetworkingPrivateServiceClient::~NetworkingPrivateServiceClient() { 171 // Verify that these objects were passed to ShutdownServicesOnWorkerThread to 172 // be deleted after completion of all posted tasks. 173 DCHECK(!wifi_service_.get()); 174 DCHECK(!crypto_verify_.get()); 175 } 176 177 NetworkingPrivateServiceClient::CryptoVerify* 178 NetworkingPrivateServiceClient::CryptoVerify::Create() { 179 return new CryptoVerifyImpl(); 180 } 181 182 NetworkingPrivateServiceClient::ServiceCallbacks::ServiceCallbacks() {} 183 184 NetworkingPrivateServiceClient::ServiceCallbacks::~ServiceCallbacks() {} 185 186 void NetworkingPrivateServiceClient::Shutdown() { 187 DCHECK_CURRENTLY_ON(BrowserThread::UI); 188 net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this); 189 // Clear callbacks map to release callbacks from UI thread. 190 callbacks_map_.Clear(); 191 // Post ShutdownServicesOnWorkerThread task to delete services when all posted 192 // tasks are done. 193 task_runner_->PostTask( 194 FROM_HERE, 195 base::Bind(&ShutdownServicesOnWorkerThread, 196 base::Passed(&wifi_service_), 197 base::Passed(&crypto_verify_))); 198 } 199 200 void NetworkingPrivateServiceClient::AddObserver(Observer* observer) { 201 network_events_observers_.AddObserver(observer); 202 } 203 204 void NetworkingPrivateServiceClient::RemoveObserver(Observer* observer) { 205 network_events_observers_.RemoveObserver(observer); 206 } 207 208 void NetworkingPrivateServiceClient::OnNetworkChanged( 209 net::NetworkChangeNotifier::ConnectionType type) { 210 task_runner_->PostTask( 211 FROM_HERE, 212 base::Bind(&WiFiService::RequestConnectedNetworkUpdate, 213 base::Unretained(wifi_service_.get()))); 214 } 215 216 NetworkingPrivateServiceClient::ServiceCallbacks* 217 NetworkingPrivateServiceClient::AddServiceCallbacks() { 218 ServiceCallbacks* service_callbacks = new ServiceCallbacks(); 219 service_callbacks->id = callbacks_map_.Add(service_callbacks); 220 return service_callbacks; 221 } 222 223 void NetworkingPrivateServiceClient::RemoveServiceCallbacks( 224 ServiceCallbacksID callback_id) { 225 callbacks_map_.Remove(callback_id); 226 } 227 228 void NetworkingPrivateServiceClient::GetProperties( 229 const std::string& network_guid, 230 const DictionaryResultCallback& callback, 231 const ErrorCallback& error_callback) { 232 ServiceCallbacks* service_callbacks = AddServiceCallbacks(); 233 service_callbacks->error_callback = error_callback; 234 service_callbacks->get_properties_callback = callback; 235 236 base::DictionaryValue* properties = new base::DictionaryValue(); 237 std::string* error = new std::string; 238 239 task_runner_->PostTaskAndReply( 240 FROM_HERE, 241 base::Bind(&WiFiService::GetProperties, 242 base::Unretained(wifi_service_.get()), 243 network_guid, 244 properties, 245 error), 246 base::Bind(&NetworkingPrivateServiceClient::AfterGetProperties, 247 weak_factory_.GetWeakPtr(), 248 service_callbacks->id, 249 network_guid, 250 base::Owned(properties), 251 base::Owned(error))); 252 } 253 254 void NetworkingPrivateServiceClient::GetManagedProperties( 255 const std::string& network_guid, 256 const DictionaryResultCallback& callback, 257 const ErrorCallback& error_callback) { 258 ServiceCallbacks* service_callbacks = AddServiceCallbacks(); 259 service_callbacks->error_callback = error_callback; 260 service_callbacks->get_properties_callback = callback; 261 262 base::DictionaryValue* properties = new base::DictionaryValue(); 263 std::string* error = new std::string; 264 265 task_runner_->PostTaskAndReply( 266 FROM_HERE, 267 base::Bind(&WiFiService::GetManagedProperties, 268 base::Unretained(wifi_service_.get()), 269 network_guid, 270 properties, 271 error), 272 base::Bind(&NetworkingPrivateServiceClient::AfterGetProperties, 273 weak_factory_.GetWeakPtr(), 274 service_callbacks->id, 275 network_guid, 276 base::Owned(properties), 277 base::Owned(error))); 278 } 279 280 void NetworkingPrivateServiceClient::GetState( 281 const std::string& network_guid, 282 const DictionaryResultCallback& callback, 283 const ErrorCallback& error_callback) { 284 ServiceCallbacks* service_callbacks = AddServiceCallbacks(); 285 service_callbacks->error_callback = error_callback; 286 service_callbacks->get_properties_callback = callback; 287 288 base::DictionaryValue* properties = new base::DictionaryValue(); 289 std::string* error = new std::string; 290 291 task_runner_->PostTaskAndReply( 292 FROM_HERE, 293 base::Bind(&WiFiService::GetState, 294 base::Unretained(wifi_service_.get()), 295 network_guid, 296 properties, 297 error), 298 base::Bind(&NetworkingPrivateServiceClient::AfterGetProperties, 299 weak_factory_.GetWeakPtr(), 300 service_callbacks->id, 301 network_guid, 302 base::Owned(properties), 303 base::Owned(error))); 304 } 305 306 void NetworkingPrivateServiceClient::GetVisibleNetworks( 307 const std::string& network_type, 308 const ListResultCallback& callback) { 309 ServiceCallbacks* service_callbacks = AddServiceCallbacks(); 310 service_callbacks->get_visible_networks_callback = callback; 311 312 base::ListValue* networks = new base::ListValue(); 313 314 task_runner_->PostTaskAndReply( 315 FROM_HERE, 316 base::Bind(&WiFiService::GetVisibleNetworks, 317 base::Unretained(wifi_service_.get()), 318 network_type, 319 networks, 320 false), 321 base::Bind(&NetworkingPrivateServiceClient::AfterGetVisibleNetworks, 322 weak_factory_.GetWeakPtr(), 323 service_callbacks->id, 324 base::Owned(networks))); 325 } 326 327 void NetworkingPrivateServiceClient::RequestNetworkScan() { 328 task_runner_->PostTask( 329 FROM_HERE, 330 base::Bind(&WiFiService::RequestNetworkScan, 331 base::Unretained(wifi_service_.get()))); 332 } 333 334 void NetworkingPrivateServiceClient::SetProperties( 335 const std::string& network_guid, 336 const base::DictionaryValue& properties, 337 const base::Closure& callback, 338 const ErrorCallback& error_callback) { 339 ServiceCallbacks* service_callbacks = AddServiceCallbacks(); 340 service_callbacks->error_callback = error_callback; 341 service_callbacks->set_properties_callback = callback; 342 343 scoped_ptr<base::DictionaryValue> properties_ptr(properties.DeepCopy()); 344 std::string* error = new std::string; 345 346 task_runner_->PostTaskAndReply( 347 FROM_HERE, 348 base::Bind(&WiFiService::SetProperties, 349 base::Unretained(wifi_service_.get()), 350 network_guid, 351 base::Passed(&properties_ptr), 352 error), 353 base::Bind(&NetworkingPrivateServiceClient::AfterSetProperties, 354 weak_factory_.GetWeakPtr(), 355 service_callbacks->id, 356 base::Owned(error))); 357 } 358 359 void NetworkingPrivateServiceClient::CreateNetwork( 360 bool shared, 361 const base::DictionaryValue& properties, 362 const StringResultCallback& callback, 363 const ErrorCallback& error_callback) { 364 ServiceCallbacks* service_callbacks = AddServiceCallbacks(); 365 service_callbacks->error_callback = error_callback; 366 service_callbacks->create_network_callback = callback; 367 368 scoped_ptr<base::DictionaryValue> properties_ptr(properties.DeepCopy()); 369 std::string* network_guid = new std::string; 370 std::string* error = new std::string; 371 372 task_runner_->PostTaskAndReply( 373 FROM_HERE, 374 base::Bind(&WiFiService::CreateNetwork, 375 base::Unretained(wifi_service_.get()), 376 shared, 377 base::Passed(&properties_ptr), 378 network_guid, 379 error), 380 base::Bind(&NetworkingPrivateServiceClient::AfterCreateNetwork, 381 weak_factory_.GetWeakPtr(), 382 service_callbacks->id, 383 base::Owned(network_guid), 384 base::Owned(error))); 385 } 386 387 void NetworkingPrivateServiceClient::StartConnect( 388 const std::string& network_guid, 389 const base::Closure& callback, 390 const ErrorCallback& error_callback) { 391 ServiceCallbacks* service_callbacks = AddServiceCallbacks(); 392 service_callbacks->error_callback = error_callback; 393 service_callbacks->start_connect_callback = callback; 394 395 std::string* error = new std::string; 396 397 task_runner_->PostTaskAndReply( 398 FROM_HERE, 399 base::Bind(&WiFiService::StartConnect, 400 base::Unretained(wifi_service_.get()), 401 network_guid, 402 error), 403 base::Bind(&NetworkingPrivateServiceClient::AfterStartConnect, 404 weak_factory_.GetWeakPtr(), 405 service_callbacks->id, 406 base::Owned(error))); 407 } 408 409 void NetworkingPrivateServiceClient::StartDisconnect( 410 const std::string& network_guid, 411 const base::Closure& callback, 412 const ErrorCallback& error_callback) { 413 ServiceCallbacks* service_callbacks = AddServiceCallbacks(); 414 service_callbacks->error_callback = error_callback; 415 service_callbacks->start_disconnect_callback = callback; 416 417 std::string* error = new std::string; 418 419 task_runner_->PostTaskAndReply( 420 FROM_HERE, 421 base::Bind(&WiFiService::StartDisconnect, 422 base::Unretained(wifi_service_.get()), 423 network_guid, 424 error), 425 base::Bind(&NetworkingPrivateServiceClient::AfterStartDisconnect, 426 weak_factory_.GetWeakPtr(), 427 service_callbacks->id, 428 base::Owned(error))); 429 } 430 431 void NetworkingPrivateServiceClient::VerifyDestination( 432 scoped_ptr<base::ListValue> args, 433 const BoolResultCallback& callback, 434 const CryptoErrorCallback& error_callback) { 435 ServiceCallbacks* service_callbacks = AddServiceCallbacks(); 436 service_callbacks->crypto_error_callback = error_callback; 437 service_callbacks->verify_destination_callback = callback; 438 439 bool* result = new bool; 440 std::string* error = new std::string; 441 442 task_runner_->PostTaskAndReply( 443 FROM_HERE, 444 base::Bind(&CryptoVerify::VerifyDestination, 445 base::Unretained(crypto_verify_.get()), 446 base::Passed(&args), 447 result, 448 error), 449 base::Bind(&NetworkingPrivateServiceClient::AfterVerifyDestination, 450 weak_factory_.GetWeakPtr(), 451 service_callbacks->id, 452 base::Owned(result), 453 base::Owned(error))); 454 } 455 456 void NetworkingPrivateServiceClient::VerifyAndEncryptCredentials( 457 scoped_ptr<base::ListValue> args, 458 const StringResultCallback& callback, 459 const CryptoErrorCallback& error_callback) { 460 ServiceCallbacks* service_callbacks = AddServiceCallbacks(); 461 service_callbacks->crypto_error_callback = error_callback; 462 service_callbacks->verify_and_encrypt_credentials_callback = callback; 463 464 CryptoVerify::VerifyAndEncryptCredentialsCallback callback_relay(base::Bind( 465 &AfterVerifyAndEncryptCredentialsRelay, 466 base::Bind( 467 &NetworkingPrivateServiceClient::AfterVerifyAndEncryptCredentials, 468 weak_factory_.GetWeakPtr(), 469 service_callbacks->id), 470 base::MessageLoopProxy::current())); 471 472 task_runner_->PostTask(FROM_HERE, 473 base::Bind(&CryptoVerify::VerifyAndEncryptCredentials, 474 base::Unretained(crypto_verify_.get()), 475 base::Passed(&args), 476 callback_relay)); 477 } 478 479 void NetworkingPrivateServiceClient::VerifyAndEncryptData( 480 scoped_ptr<base::ListValue> args, 481 const StringResultCallback& callback, 482 const CryptoErrorCallback& error_callback) { 483 ServiceCallbacks* service_callbacks = AddServiceCallbacks(); 484 service_callbacks->crypto_error_callback = error_callback; 485 service_callbacks->verify_and_encrypt_data_callback = callback; 486 487 std::string* result = new std::string; 488 std::string* error = new std::string; 489 490 task_runner_->PostTaskAndReply( 491 FROM_HERE, 492 base::Bind(&CryptoVerify::VerifyAndEncryptData, 493 base::Unretained(crypto_verify_.get()), 494 base::Passed(&args), 495 result, 496 error), 497 base::Bind(&NetworkingPrivateServiceClient::AfterVerifyAndEncryptData, 498 weak_factory_.GetWeakPtr(), 499 service_callbacks->id, 500 base::Owned(result), 501 base::Owned(error))); 502 } 503 504 void NetworkingPrivateServiceClient::AfterGetProperties( 505 ServiceCallbacksID callback_id, 506 const std::string& network_guid, 507 const base::DictionaryValue* properties, 508 const std::string* error) { 509 ServiceCallbacks* service_callbacks = callbacks_map_.Lookup(callback_id); 510 DCHECK(service_callbacks); 511 if (!error->empty()) { 512 DCHECK(!service_callbacks->error_callback.is_null()); 513 service_callbacks->error_callback.Run(*error, 514 scoped_ptr<base::DictionaryValue>()); 515 } else { 516 DCHECK(!service_callbacks->get_properties_callback.is_null()); 517 service_callbacks->get_properties_callback.Run(network_guid, *properties); 518 } 519 RemoveServiceCallbacks(callback_id); 520 } 521 522 void NetworkingPrivateServiceClient::AfterGetVisibleNetworks( 523 ServiceCallbacksID callback_id, 524 const base::ListValue* networks) { 525 ServiceCallbacks* service_callbacks = callbacks_map_.Lookup(callback_id); 526 DCHECK(service_callbacks); 527 DCHECK(!service_callbacks->get_visible_networks_callback.is_null()); 528 service_callbacks->get_visible_networks_callback.Run(*networks); 529 RemoveServiceCallbacks(callback_id); 530 } 531 532 void NetworkingPrivateServiceClient::AfterSetProperties( 533 ServiceCallbacksID callback_id, 534 const std::string* error) { 535 ServiceCallbacks* service_callbacks = callbacks_map_.Lookup(callback_id); 536 DCHECK(service_callbacks); 537 if (!error->empty()) { 538 DCHECK(!service_callbacks->error_callback.is_null()); 539 service_callbacks->error_callback.Run(*error, 540 scoped_ptr<base::DictionaryValue>()); 541 } else { 542 DCHECK(!service_callbacks->set_properties_callback.is_null()); 543 service_callbacks->set_properties_callback.Run(); 544 } 545 RemoveServiceCallbacks(callback_id); 546 } 547 548 void NetworkingPrivateServiceClient::AfterCreateNetwork( 549 ServiceCallbacksID callback_id, 550 const std::string* network_guid, 551 const std::string* error) { 552 ServiceCallbacks* service_callbacks = callbacks_map_.Lookup(callback_id); 553 DCHECK(service_callbacks); 554 if (!error->empty()) { 555 DCHECK(!service_callbacks->error_callback.is_null()); 556 service_callbacks->error_callback.Run(*error, 557 scoped_ptr<base::DictionaryValue>()); 558 } else { 559 DCHECK(!service_callbacks->create_network_callback.is_null()); 560 service_callbacks->create_network_callback.Run(*network_guid); 561 } 562 RemoveServiceCallbacks(callback_id); 563 } 564 565 void NetworkingPrivateServiceClient::AfterStartConnect( 566 ServiceCallbacksID callback_id, 567 const std::string* error) { 568 ServiceCallbacks* service_callbacks = callbacks_map_.Lookup(callback_id); 569 DCHECK(service_callbacks); 570 if (!error->empty()) { 571 DCHECK(!service_callbacks->error_callback.is_null()); 572 service_callbacks->error_callback.Run(*error, 573 scoped_ptr<base::DictionaryValue>()); 574 } else { 575 DCHECK(!service_callbacks->start_connect_callback.is_null()); 576 service_callbacks->start_connect_callback.Run(); 577 } 578 RemoveServiceCallbacks(callback_id); 579 } 580 581 void NetworkingPrivateServiceClient::AfterStartDisconnect( 582 ServiceCallbacksID callback_id, 583 const std::string* error) { 584 ServiceCallbacks* service_callbacks = callbacks_map_.Lookup(callback_id); 585 DCHECK(service_callbacks); 586 if (!error->empty()) { 587 DCHECK(!service_callbacks->error_callback.is_null()); 588 service_callbacks->error_callback.Run(*error, 589 scoped_ptr<base::DictionaryValue>()); 590 } else { 591 DCHECK(!service_callbacks->start_disconnect_callback.is_null()); 592 service_callbacks->start_disconnect_callback.Run(); 593 } 594 RemoveServiceCallbacks(callback_id); 595 } 596 597 void NetworkingPrivateServiceClient::AfterVerifyDestination( 598 ServiceCallbacksID callback_id, 599 const bool* result, 600 const std::string* error) { 601 ServiceCallbacks* service_callbacks = callbacks_map_.Lookup(callback_id); 602 DCHECK(service_callbacks); 603 if (!error->empty()) { 604 DCHECK(!service_callbacks->crypto_error_callback.is_null()); 605 service_callbacks->crypto_error_callback.Run(*error, *error); 606 } else { 607 DCHECK(!service_callbacks->verify_destination_callback.is_null()); 608 service_callbacks->verify_destination_callback.Run(*result); 609 } 610 RemoveServiceCallbacks(callback_id); 611 } 612 613 void NetworkingPrivateServiceClient::AfterVerifyAndEncryptCredentials( 614 ServiceCallbacksID callback_id, 615 const std::string& encrypted_data, 616 const std::string& error) { 617 DCHECK_CURRENTLY_ON(BrowserThread::UI); 618 ServiceCallbacks* service_callbacks = callbacks_map_.Lookup(callback_id); 619 DCHECK(service_callbacks); 620 if (!error.empty()) { 621 DCHECK(!service_callbacks->crypto_error_callback.is_null()); 622 service_callbacks->crypto_error_callback.Run(error, error); 623 } else { 624 DCHECK( 625 !service_callbacks->verify_and_encrypt_credentials_callback.is_null()); 626 service_callbacks->verify_and_encrypt_credentials_callback.Run( 627 encrypted_data); 628 } 629 RemoveServiceCallbacks(callback_id); 630 } 631 632 void NetworkingPrivateServiceClient::AfterVerifyAndEncryptData( 633 ServiceCallbacksID callback_id, 634 const std::string* result, 635 const std::string* error) { 636 ServiceCallbacks* service_callbacks = callbacks_map_.Lookup(callback_id); 637 DCHECK(service_callbacks); 638 if (!error->empty()) { 639 DCHECK(!service_callbacks->crypto_error_callback.is_null()); 640 service_callbacks->crypto_error_callback.Run(*error, *error); 641 } else { 642 DCHECK(!service_callbacks->verify_and_encrypt_data_callback.is_null()); 643 service_callbacks->verify_and_encrypt_data_callback.Run(*result); 644 } 645 RemoveServiceCallbacks(callback_id); 646 } 647 648 void NetworkingPrivateServiceClient::OnNetworksChangedEventOnUIThread( 649 const std::vector<std::string>& network_guids) { 650 DCHECK_CURRENTLY_ON(BrowserThread::UI); 651 FOR_EACH_OBSERVER(Observer, 652 network_events_observers_, 653 OnNetworksChangedEvent(network_guids)); 654 } 655 656 void NetworkingPrivateServiceClient::OnNetworkListChangedEventOnUIThread( 657 const std::vector<std::string>& network_guids) { 658 DCHECK_CURRENTLY_ON(BrowserThread::UI); 659 FOR_EACH_OBSERVER(Observer, 660 network_events_observers_, 661 OnNetworkListChangedEvent(network_guids)); 662 } 663 664 } // namespace extensions 665