Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / api / networking_private / networking_private_service_client.h
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 #ifndef CHROME_BROWSER_EXTENSIONS_API_NETWORKING_PRIVATE_NETWORKING_PRIVATE_SERVICE_CLIENT_H_
6 #define CHROME_BROWSER_EXTENSIONS_API_NETWORKING_PRIVATE_NETWORKING_PRIVATE_SERVICE_CLIENT_H_
7
8 #include <string>
9 #include <vector>
10
11 #include "base/basictypes.h"
12 #include "base/compiler_specific.h"
13 #include "base/id_map.h"
14 #include "base/memory/weak_ptr.h"
15 #include "base/observer_list.h"
16 #include "base/strings/string16.h"
17 #include "base/supports_user_data.h"
18 #include "base/threading/sequenced_worker_pool.h"
19 #include "base/values.h"
20 #include "chrome/browser/extensions/api/networking_private/networking_private_delegate.h"
21 #include "components/keyed_service/core/keyed_service.h"
22 #include "components/wifi/wifi_service.h"
23 #include "content/public/browser/utility_process_host.h"
24 #include "content/public/browser/utility_process_host_client.h"
25 #include "net/base/network_change_notifier.h"
26
27 namespace base {
28 class SequencedTaskRunner;
29 }
30
31 namespace wifi {
32 class WiFiService;
33 }
34
35 namespace extensions {
36
37 using wifi::WiFiService;
38
39 // Windows / Mac NetworkingPrivateApi implementation. This implements
40 // WiFiService and CryptoVerify interfaces and invokes them on the worker
41 // thread. Observes |OnNetworkChanged| notifications and posts them to
42 // WiFiService on the worker thread to |UpdateConnectedNetwork|. Created and
43 // called from the UI thread.
44 class NetworkingPrivateServiceClient
45     : public KeyedService,
46       public NetworkingPrivateDelegate,
47       net::NetworkChangeNotifier::NetworkChangeObserver {
48  public:
49   // Interface for Verify* methods implementation.
50   class CryptoVerify {
51    public:
52     typedef base::Callback<
53         void(const std::string& key_data, const std::string& error)>
54         VerifyAndEncryptCredentialsCallback;
55
56     // TODO(stevenjb): Remove this when addressing crbug.com/394481
57     struct Credentials {
58       Credentials();
59       ~Credentials();
60       std::string certificate;
61       std::string signed_data;
62       std::string unsigned_data;
63       std::string device_bssid;
64       std::string public_key;
65     };
66
67     CryptoVerify();
68     virtual ~CryptoVerify();
69
70     // Must be provided by the implementation. May return NULL if certificate
71     // verification is unavailable, see NetworkingPrivateServiceClient().
72     static CryptoVerify* Create();
73
74     virtual void VerifyDestination(const Credentials& credentials,
75                                    bool* verified,
76                                    std::string* error) = 0;
77
78     virtual void VerifyAndEncryptCredentials(
79         const std::string& network_guid,
80         const Credentials& credentials,
81         const VerifyAndEncryptCredentialsCallback& callback) = 0;
82
83     virtual void VerifyAndEncryptData(const Credentials& credentials,
84                                       const std::string& data,
85                                       std::string* base64_encoded_ciphertext,
86                                       std::string* error) = 0;
87
88    private:
89     DISALLOW_COPY_AND_ASSIGN(CryptoVerify);
90   };
91
92   // Interface for observing Network Events.
93   class Observer {
94    public:
95     Observer() {}
96     virtual ~Observer() {}
97
98     virtual void OnNetworksChangedEvent(
99         const std::vector<std::string>& network_guids) = 0;
100     virtual void OnNetworkListChangedEvent(
101         const std::vector<std::string>& network_guids) = 0;
102
103    private:
104     DISALLOW_COPY_AND_ASSIGN(Observer);
105   };
106
107   // Takes ownership of |wifi_service| and |crypto_verify|. They are accessed
108   // and deleted on the worker thread. The deletion task is posted during the
109   // NetworkingPrivateServiceClient shutdown. |crypto_verify| may be NULL in
110   // which case Verify* will return a 'not implemented' error.
111   NetworkingPrivateServiceClient(wifi::WiFiService* wifi_service,
112                                  CryptoVerify* crypto_verify);
113
114   // KeyedService
115   virtual void Shutdown() OVERRIDE;
116
117   // NetworkingPrivateDelegate
118   virtual void GetProperties(const std::string& guid,
119                              const DictionaryCallback& success_callback,
120                              const FailureCallback& failure_callback) OVERRIDE;
121   virtual void GetManagedProperties(
122       const std::string& guid,
123       const DictionaryCallback& success_callback,
124       const FailureCallback& failure_callback) OVERRIDE;
125   virtual void GetState(const std::string& guid,
126                         const DictionaryCallback& success_callback,
127                         const FailureCallback& failure_callback) OVERRIDE;
128   virtual void SetProperties(const std::string& guid,
129                              scoped_ptr<base::DictionaryValue> properties_dict,
130                              const VoidCallback& success_callback,
131                              const FailureCallback& failure_callback) OVERRIDE;
132   virtual void CreateNetwork(bool shared,
133                              scoped_ptr<base::DictionaryValue> properties_dict,
134                              const StringCallback& success_callback,
135                              const FailureCallback& failure_callback) OVERRIDE;
136   virtual void GetNetworks(const std::string& network_type,
137                            bool configured_only,
138                            bool visible_only,
139                            int limit,
140                            const NetworkListCallback& success_callback,
141                            const FailureCallback& failure_callback) OVERRIDE;
142   virtual void StartConnect(const std::string& guid,
143                             const VoidCallback& success_callback,
144                             const FailureCallback& failure_callback) OVERRIDE;
145   virtual void StartDisconnect(
146       const std::string& guid,
147       const VoidCallback& success_callback,
148       const FailureCallback& failure_callback) OVERRIDE;
149   virtual void VerifyDestination(
150       const VerificationProperties& verification_properties,
151       const BoolCallback& success_callback,
152       const FailureCallback& failure_callback) OVERRIDE;
153   virtual void VerifyAndEncryptCredentials(
154       const std::string& guid,
155       const VerificationProperties& verification_properties,
156       const StringCallback& success_callback,
157       const FailureCallback& failure_callback) OVERRIDE;
158   virtual void VerifyAndEncryptData(
159       const VerificationProperties& verification_properties,
160       const std::string& data,
161       const StringCallback& success_callback,
162       const FailureCallback& failure_callback) OVERRIDE;
163   virtual void SetWifiTDLSEnabledState(
164       const std::string& ip_or_mac_address,
165       bool enabled,
166       const StringCallback& success_callback,
167       const FailureCallback& failure_callback) OVERRIDE;
168   virtual void GetWifiTDLSStatus(
169       const std::string& ip_or_mac_address,
170       const StringCallback& success_callback,
171       const FailureCallback& failure_callback) OVERRIDE;
172   virtual void GetCaptivePortalStatus(
173       const std::string& guid,
174       const StringCallback& success_callback,
175       const FailureCallback& failure_callback) OVERRIDE;
176   virtual scoped_ptr<base::ListValue> GetEnabledNetworkTypes() OVERRIDE;
177   virtual bool EnableNetworkType(const std::string& type) OVERRIDE;
178   virtual bool DisableNetworkType(const std::string& type) OVERRIDE;
179   virtual bool RequestScan() OVERRIDE;
180
181   // Adds observer to network events.
182   void AddObserver(Observer* network_events_observer);
183
184   // Removes observer to network events. If there is no observers,
185   // then process can be shut down when there are no more calls pending return.
186   void RemoveObserver(Observer* network_events_observer);
187
188   // NetworkChangeNotifier::NetworkChangeObserver implementation.
189   virtual void OnNetworkChanged(
190       net::NetworkChangeNotifier::ConnectionType type) OVERRIDE;
191
192  private:
193   // Callbacks to extension api function objects. Keep reference to API object
194   // and are released in ShutdownOnUIThread. Run when WiFiService calls back
195   // into NetworkingPrivateServiceClient's callback wrappers.
196   typedef int32 ServiceCallbacksID;
197   struct ServiceCallbacks {
198     ServiceCallbacks();
199     ~ServiceCallbacks();
200
201     DictionaryCallback get_properties_callback;
202     VoidCallback start_connect_callback;
203     VoidCallback start_disconnect_callback;
204     VoidCallback set_properties_callback;
205     StringCallback create_network_callback;
206     NetworkListCallback get_visible_networks_callback;
207     FailureCallback failure_callback;
208
209     BoolCallback verify_destination_callback;
210     StringCallback verify_and_encrypt_data_callback;
211     StringCallback verify_and_encrypt_credentials_callback;
212
213     ServiceCallbacksID id;
214   };
215   typedef IDMap<ServiceCallbacks, IDMapOwnPointer> ServiceCallbacksMap;
216
217   virtual ~NetworkingPrivateServiceClient();
218
219   // Callback wrappers.
220   void AfterGetProperties(ServiceCallbacksID callback_id,
221                           const std::string& network_guid,
222                           scoped_ptr<base::DictionaryValue> properties,
223                           const std::string* error);
224   void AfterSetProperties(ServiceCallbacksID callback_id,
225                           const std::string* error);
226   void AfterCreateNetwork(ServiceCallbacksID callback_id,
227                           const std::string* network_guid,
228                           const std::string* error);
229   void AfterGetVisibleNetworks(ServiceCallbacksID callback_id,
230                                scoped_ptr<base::ListValue> networks);
231   void AfterStartConnect(ServiceCallbacksID callback_id,
232                          const std::string* error);
233   void AfterStartDisconnect(ServiceCallbacksID callback_id,
234                             const std::string* error);
235   void AfterVerifyDestination(ServiceCallbacksID callback_id,
236                               const bool* result,
237                               const std::string* error);
238   void AfterVerifyAndEncryptData(ServiceCallbacksID callback_id,
239                                  const std::string* result,
240                                  const std::string* error);
241   void AfterVerifyAndEncryptCredentials(ServiceCallbacksID callback_id,
242                                         const std::string& encrypted_data,
243                                         const std::string& error);
244
245   void OnNetworksChangedEventOnUIThread(
246       const WiFiService::NetworkGuidList& network_guid_list);
247   void OnNetworkListChangedEventOnUIThread(
248       const WiFiService::NetworkGuidList& network_guid_list);
249
250   // Add new |ServiceCallbacks| to |callbacks_map_|.
251   ServiceCallbacks* AddServiceCallbacks();
252   // Removes ServiceCallbacks for |callback_id| from |callbacks_map_|.
253   void RemoveServiceCallbacks(ServiceCallbacksID callback_id);
254
255   // Callbacks to run when callback is called from WiFiService.
256   ServiceCallbacksMap callbacks_map_;
257   // Observers to Network Events.
258   ObserverList<Observer> network_events_observers_;
259   // Interface for Verify* methods. Used and deleted on the worker thread.
260   // May be NULL.
261   scoped_ptr<CryptoVerify> crypto_verify_;
262   // Interface to WiFiService. Used and deleted on the worker thread.
263   scoped_ptr<wifi::WiFiService> wifi_service_;
264   // Sequence token associated with wifi tasks.
265   base::SequencedWorkerPool::SequenceToken sequence_token_;
266   // Task runner for worker tasks.
267   scoped_refptr<base::SequencedTaskRunner> task_runner_;
268   // Use WeakPtrs for callbacks from |wifi_service_| and |crypto_verify_|.
269   base::WeakPtrFactory<NetworkingPrivateServiceClient> weak_factory_;
270
271   DISALLOW_COPY_AND_ASSIGN(NetworkingPrivateServiceClient);
272 };
273
274 }  // namespace extensions
275
276 #endif  // CHROME_BROWSER_EXTENSIONS_API_NETWORKING_PRIVATE_NETWORKING_PRIVATE_SERVICE_CLIENT_H_