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