OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #ifndef CHROMEOS_NETWORK_NETWORK_CONNECTION_HANDLER_H_ | 5 #ifndef CHROMEOS_NETWORK_NETWORK_CONNECTION_HANDLER_H_ |
6 #define CHROMEOS_NETWORK_NETWORK_CONNECTION_HANDLER_H_ | 6 #define CHROMEOS_NETWORK_NETWORK_CONNECTION_HANDLER_H_ |
7 | 7 |
8 #include <map> | 8 #include <map> |
9 #include <set> | 9 #include <set> |
10 #include <string> | 10 #include <string> |
11 | 11 |
12 #include "base/callback.h" | 12 #include "base/callback.h" |
13 #include "base/macros.h" | 13 #include "base/macros.h" |
14 #include "base/memory/weak_ptr.h" | 14 #include "base/memory/weak_ptr.h" |
15 #include "base/observer_list.h" | 15 #include "base/observer_list.h" |
16 #include "base/time/time.h" | |
17 #include "base/values.h" | 16 #include "base/values.h" |
18 #include "chromeos/cert_loader.h" | |
19 #include "chromeos/chromeos_export.h" | 17 #include "chromeos/chromeos_export.h" |
20 #include "chromeos/dbus/dbus_method_call_status.h" | |
21 #include "chromeos/login/login_state.h" | |
22 #include "chromeos/network/network_connection_observer.h" | 18 #include "chromeos/network/network_connection_observer.h" |
23 #include "chromeos/network/network_handler.h" | 19 #include "chromeos/network/network_handler.h" |
24 #include "chromeos/network/network_handler_callbacks.h" | 20 #include "chromeos/network/network_handler_callbacks.h" |
25 #include "chromeos/network/network_state_handler_observer.h" | |
26 | 21 |
27 namespace chromeos { | 22 namespace chromeos { |
28 | 23 |
29 class NetworkState; | |
30 | |
31 // The NetworkConnectionHandler class is used to manage network connection | 24 // The NetworkConnectionHandler class is used to manage network connection |
32 // requests. This is the only class that should make Shill Connect calls. | 25 // requests. This is the only class that should make Shill Connect calls. |
33 // It handles the following steps: | 26 // It handles the following steps: |
34 // 1. Determine whether or not sufficient information (e.g. passphrase) is | 27 // 1. Determine whether or not sufficient information (e.g. passphrase) is |
35 // known to be available to connect to the network. | 28 // known to be available to connect to the network. |
36 // 2. Request additional information (e.g. user data which contains certificate | 29 // 2. Request additional information (e.g. user data which contains certificate |
37 // information) and determine whether sufficient information is available. | 30 // information) and determine whether sufficient information is available. |
38 // 3. Possibly configure the network certificate info (tpm slot and pkcs11 id). | 31 // 3. Possibly configure the network certificate info (tpm slot and pkcs11 id). |
39 // 4. Send the connect request. | 32 // 4. Send the connect request. |
40 // 5. Wait for the network state to change to a non connecting state. | 33 // 5. Wait for the network state to change to a non connecting state. |
41 // 6. Invoke the appropriate callback (always) on success or failure. | 34 // 6. Invoke the appropriate callback (always) on success or failure. |
42 // | 35 // |
43 // NetworkConnectionHandler depends on NetworkStateHandler for immediately | 36 // NetworkConnectionHandler depends on NetworkStateHandler for immediately |
44 // available State information, and NetworkConfigurationHandler for any | 37 // available State information, and NetworkConfigurationHandler for any |
45 // configuration calls. | 38 // configuration calls. |
46 | 39 |
47 class CHROMEOS_EXPORT NetworkConnectionHandler | 40 class CHROMEOS_EXPORT NetworkConnectionHandler { |
48 : public LoginState::Observer, | |
49 public CertLoader::Observer, | |
50 public NetworkStateHandlerObserver, | |
51 public base::SupportsWeakPtr<NetworkConnectionHandler> { | |
52 public: | 41 public: |
53 // Constants for |error_name| from |error_callback| for Connect. | 42 // Constants for |error_name| from |error_callback| for Connect. |
54 | 43 |
55 // No network matching |service_path| is found (hidden networks must be | 44 // No network matching |service_path| is found (hidden networks must be |
56 // configured before connecting). | 45 // configured before connecting). |
57 static const char kErrorNotFound[]; | 46 static const char kErrorNotFound[]; |
58 | 47 |
59 // Already connected to the network. | 48 // Already connected to the network. |
60 static const char kErrorConnected[]; | 49 static const char kErrorConnected[]; |
61 | 50 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 // |error_callback|, passing the relevant error code declared above. | 105 // |error_callback|, passing the relevant error code declared above. |
117 virtual void ConnectToNetwork( | 106 virtual void ConnectToNetwork( |
118 const std::string& tether_network_guid, | 107 const std::string& tether_network_guid, |
119 const base::Closure& success_callback, | 108 const base::Closure& success_callback, |
120 const network_handler::StringResultCallback& error_callback) = 0; | 109 const network_handler::StringResultCallback& error_callback) = 0; |
121 | 110 |
122 protected: | 111 protected: |
123 virtual ~TetherDelegate() {} | 112 virtual ~TetherDelegate() {} |
124 }; | 113 }; |
125 | 114 |
126 ~NetworkConnectionHandler() override; | 115 virtual ~NetworkConnectionHandler(); |
127 | 116 |
128 void AddObserver(NetworkConnectionObserver* observer); | 117 void AddObserver(NetworkConnectionObserver* observer); |
129 void RemoveObserver(NetworkConnectionObserver* observer); | 118 void RemoveObserver(NetworkConnectionObserver* observer); |
130 | 119 |
| 120 // Sets the TetherDelegate to handle Tether actions. |tether_delegate| is |
| 121 // owned by the caller. |
| 122 void SetTetherDelegate(TetherDelegate* tether_delegate); |
| 123 |
131 // ConnectToNetwork() will start an asynchronous connection attempt. | 124 // ConnectToNetwork() will start an asynchronous connection attempt. |
132 // On success, |success_callback| will be called. | 125 // On success, |success_callback| will be called. |
133 // On failure, |error_callback| will be called with |error_name| one of the | 126 // On failure, |error_callback| will be called with |error_name| one of the |
134 // constants defined above. | 127 // constants defined above. |
135 // |error_message| will contain an additional error string for debugging. | 128 // |error_message| will contain an additional error string for debugging. |
136 // If |check_error_state| is true, the current state of the network is | 129 // If |check_error_state| is true, the current state of the network is |
137 // checked for errors, otherwise current state is ignored (e.g. for recently | 130 // checked for errors, otherwise current state is ignored (e.g. for recently |
138 // configured networks or repeat attempts). | 131 // configured networks or repeat attempts). |
139 void ConnectToNetwork(const std::string& service_path, | 132 virtual void ConnectToNetwork( |
140 const base::Closure& success_callback, | 133 const std::string& service_path, |
141 const network_handler::ErrorCallback& error_callback, | 134 const base::Closure& success_callback, |
142 bool check_error_state); | 135 const network_handler::ErrorCallback& error_callback, |
| 136 bool check_error_state) = 0; |
143 | 137 |
144 // DisconnectNetwork() will send a Disconnect request to Shill. | 138 // DisconnectNetwork() will send a Disconnect request to Shill. |
145 // On success, |success_callback| will be called. | 139 // On success, |success_callback| will be called. |
146 // On failure, |error_callback| will be called with |error_name| one of: | 140 // On failure, |error_callback| will be called with |error_name| one of: |
147 // kErrorNotFound if no network matching |service_path| is found. | 141 // kErrorNotFound if no network matching |service_path| is found. |
148 // kErrorNotConnected if not connected to the network. | 142 // kErrorNotConnected if not connected to the network. |
149 // kErrorDisconnectFailed if a DBus or Shill error occurred. | 143 // kErrorDisconnectFailed if a DBus or Shill error occurred. |
150 // |error_message| will contain and additional error string for debugging. | 144 // |error_message| will contain and additional error string for debugging. |
151 void DisconnectNetwork(const std::string& service_path, | 145 virtual void DisconnectNetwork( |
152 const base::Closure& success_callback, | 146 const std::string& service_path, |
153 const network_handler::ErrorCallback& error_callback); | 147 const base::Closure& success_callback, |
| 148 const network_handler::ErrorCallback& error_callback) = 0; |
154 | 149 |
155 // Returns true if ConnectToNetwork has been called with |service_path| and | 150 // Returns true if ConnectToNetwork has been called with |service_path| and |
156 // has not completed (i.e. success or error callback has been called). | 151 // has not completed (i.e. success or error callback has been called). |
157 bool HasConnectingNetwork(const std::string& service_path); | 152 virtual bool HasConnectingNetwork(const std::string& service_path) = 0; |
158 | 153 |
159 // Returns true if there are any pending connect requests. | 154 // Returns true if there are any pending connect requests. |
160 bool HasPendingConnectRequest(); | 155 virtual bool HasPendingConnectRequest() = 0; |
161 | 156 |
162 // Sets the TetherDelegate to handle Tether actions. |tether_delegate| is | 157 virtual void Init(NetworkStateHandler* network_state_handler, |
163 // owned by the caller. | 158 NetworkConfigurationHandler* network_configuration_handler, |
164 void SetTetherDelegate(TetherDelegate* tether_delegate); | 159 ManagedNetworkConfigurationHandler* |
165 | 160 managed_network_configuration_handler) = 0; |
166 // NetworkStateHandlerObserver | |
167 void NetworkListChanged() override; | |
168 void NetworkPropertiesUpdated(const NetworkState* network) override; | |
169 | |
170 // LoginState::Observer | |
171 void LoggedInStateChanged() override; | |
172 | |
173 // CertLoader::Observer | |
174 void OnCertificatesLoaded(const net::CertificateList& cert_list, | |
175 bool initial_load) override; | |
176 | 161 |
177 protected: | 162 protected: |
178 NetworkConnectionHandler(); | 163 NetworkConnectionHandler(); |
179 | 164 |
180 void InitiateTetherNetworkConnection( | |
181 const std::string& tether_network_guid, | |
182 const base::Closure& success_callback, | |
183 const network_handler::ErrorCallback& error_callback); | |
184 | |
185 private: | |
186 friend class NetworkHandler; | |
187 friend class NetworkConnectionHandlerTest; | |
188 | |
189 struct ConnectRequest; | |
190 | |
191 void Init(NetworkStateHandler* network_state_handler, | |
192 NetworkConfigurationHandler* network_configuration_handler, | |
193 ManagedNetworkConfigurationHandler* | |
194 managed_network_configuration_handler); | |
195 | |
196 ConnectRequest* GetPendingRequest(const std::string& service_path); | |
197 | |
198 // Callback from Shill.Service.GetProperties. Parses |properties| to verify | |
199 // whether or not the network appears to be configured. If configured, | |
200 // attempts a connection, otherwise invokes error_callback from | |
201 // pending_requests_[service_path]. |check_error_state| is passed from | |
202 // ConnectToNetwork(), see comment for info. | |
203 void VerifyConfiguredAndConnect(bool check_error_state, | |
204 const std::string& service_path, | |
205 const base::DictionaryValue& properties); | |
206 | |
207 bool IsNetworkProhibitedByPolicy(const std::string& type, | |
208 const std::string& guid, | |
209 const std::string& profile_path); | |
210 | |
211 // Queues a connect request until certificates have loaded. | |
212 void QueueConnectRequest(const std::string& service_path); | |
213 | |
214 // Checks to see if certificates have loaded and if not, cancels any queued | |
215 // connect request and notifies the user. | |
216 void CheckCertificatesLoaded(); | |
217 | |
218 // Handles connecting to a queued network after certificates are loaded or | |
219 // handle cert load timeout. | |
220 void ConnectToQueuedNetwork(); | |
221 | |
222 // Calls Shill.Manager.Connect asynchronously. | |
223 void CallShillConnect(const std::string& service_path); | |
224 | |
225 // Handles failure from ConfigurationHandler calls. | |
226 void HandleConfigurationFailure( | |
227 const std::string& service_path, | |
228 const std::string& error_name, | |
229 std::unique_ptr<base::DictionaryValue> error_data); | |
230 | |
231 // Handles success or failure from Shill.Service.Connect. | |
232 void HandleShillConnectSuccess(const std::string& service_path); | |
233 void HandleShillConnectFailure(const std::string& service_path, | |
234 const std::string& error_name, | |
235 const std::string& error_message); | |
236 | |
237 // Note: |service_path| is passed by value here, because in some cases | |
238 // the value may be located in the map and then it can be deleted, producing | |
239 // a reference to invalid memory. | |
240 void CheckPendingRequest(const std::string service_path); | |
241 | |
242 void CheckAllPendingRequests(); | |
243 | |
244 // Notify caller and observers that the connect request succeeded. | 165 // Notify caller and observers that the connect request succeeded. |
245 void InvokeConnectSuccessCallback(const std::string& service_path, | 166 void InvokeConnectSuccessCallback(const std::string& service_path, |
246 const base::Closure& success_callback); | 167 const base::Closure& success_callback); |
247 | 168 |
248 // Look up the ConnectRequest for |service_path| and call | |
249 // InvokeConnectErrorCallback. | |
250 void ErrorCallbackForPendingRequest(const std::string& service_path, | |
251 const std::string& error_name); | |
252 | |
253 // Notify caller and observers that the connect request failed. | 169 // Notify caller and observers that the connect request failed. |
254 // |error_name| will be one of the kError* messages defined above. | 170 // |error_name| will be one of the kError* messages defined above. |
255 void InvokeConnectErrorCallback( | 171 void InvokeConnectErrorCallback( |
256 const std::string& service_path, | 172 const std::string& service_path, |
257 const network_handler::ErrorCallback& error_callback, | 173 const network_handler::ErrorCallback& error_callback, |
258 const std::string& error_name); | 174 const std::string& error_name); |
259 | 175 |
260 // Calls Shill.Manager.Disconnect asynchronously. | 176 // Initiates a connection to a Tether network. |
261 void CallShillDisconnect( | 177 void InitiateTetherNetworkConnection( |
262 const std::string& service_path, | 178 const std::string& tether_network_guid, |
263 const base::Closure& success_callback, | 179 const base::Closure& success_callback, |
264 const network_handler::ErrorCallback& error_callback); | 180 const network_handler::ErrorCallback& error_callback); |
265 | 181 |
266 // Handle success from Shill.Service.Disconnect. | |
267 void HandleShillDisconnectSuccess(const std::string& service_path, | |
268 const base::Closure& success_callback); | |
269 | |
270 base::ObserverList<NetworkConnectionObserver, true> observers_; | 182 base::ObserverList<NetworkConnectionObserver, true> observers_; |
271 | 183 |
272 // Local references to the associated handler instances. | |
273 CertLoader* cert_loader_; | |
274 NetworkStateHandler* network_state_handler_; | |
275 NetworkConfigurationHandler* configuration_handler_; | |
276 ManagedNetworkConfigurationHandler* managed_configuration_handler_; | |
277 | |
278 // Map of pending connect requests, used to prevent repeated attempts while | |
279 // waiting for Shill and to trigger callbacks on eventual success or failure. | |
280 std::map<std::string, ConnectRequest> pending_requests_; | |
281 std::unique_ptr<ConnectRequest> queued_connect_; | |
282 | |
283 // Track certificate loading state. | |
284 bool logged_in_; | |
285 bool certificates_loaded_; | |
286 base::TimeTicks logged_in_time_; | |
287 | |
288 // Delegate used to start a connection to a tether network. | 184 // Delegate used to start a connection to a tether network. |
289 TetherDelegate* tether_delegate_; | 185 TetherDelegate* tether_delegate_; |
290 | 186 |
| 187 private: |
| 188 // Only to be used by NetworkConnectionHandler implementation (and not by |
| 189 // derived classes). |
| 190 base::WeakPtrFactory<NetworkConnectionHandler> weak_ptr_factory_; |
| 191 |
291 DISALLOW_COPY_AND_ASSIGN(NetworkConnectionHandler); | 192 DISALLOW_COPY_AND_ASSIGN(NetworkConnectionHandler); |
292 }; | 193 }; |
293 | 194 |
294 } // namespace chromeos | 195 } // namespace chromeos |
295 | 196 |
296 #endif // CHROMEOS_NETWORK_NETWORK_CONNECTION_HANDLER_H_ | 197 #endif // CHROMEOS_NETWORK_NETWORK_CONNECTION_HANDLER_H_ |
OLD | NEW |