OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/chromeos/cros/network_library_impl_stub.h" | |
6 | |
7 #include "base/bind.h" | |
8 #include "base/command_line.h" | |
9 #include "base/stl_util.h" | |
10 #include "chrome/browser/chromeos/cros/native_network_constants.h" | |
11 #include "chromeos/chromeos_switches.h" | |
12 #include "content/public/browser/browser_thread.h" | |
13 #include "third_party/cros_system_api/dbus/service_constants.h" | |
14 | |
15 using content::BrowserThread; | |
16 | |
17 namespace { | |
18 | |
19 bool IsEthernetEnabled() { | |
20 return !CommandLine::ForCurrentProcess()->HasSwitch( | |
21 chromeos::switches::kDisableStubEthernet); | |
22 } | |
23 | |
24 bool IsInteractive() { | |
25 return CommandLine::ForCurrentProcess()->HasSwitch( | |
26 chromeos::switches::kEnableStubInteractive); | |
27 } | |
28 | |
29 } // namespace | |
30 | |
31 namespace chromeos { | |
32 | |
33 NetworkLibraryImplStub::NetworkLibraryImplStub() | |
34 : ip_address_("1.1.1.1"), | |
35 hardware_address_("01:23:45:67:89:ab"), | |
36 pin_(""), | |
37 pin_required_(false), | |
38 pin_entered_(false), | |
39 network_priority_order_(0), | |
40 weak_pointer_factory_(this) { | |
41 } | |
42 | |
43 NetworkLibraryImplStub::~NetworkLibraryImplStub() { | |
44 disabled_wifi_networks_.clear(); | |
45 disabled_cellular_networks_.clear(); | |
46 disabled_wimax_networks_.clear(); | |
47 STLDeleteValues(&service_configurations_); | |
48 } | |
49 | |
50 void NetworkLibraryImplStub::Init() { | |
51 is_locked_ = false; | |
52 | |
53 // Enable only Cellular initially | |
54 int devices = (1 << TYPE_WIFI) | (1 << TYPE_CELLULAR) | (1 << TYPE_WIMAX); | |
55 if (IsEthernetEnabled()) | |
56 devices |= 1 << TYPE_ETHERNET; | |
57 available_devices_ = devices; | |
58 uninitialized_devices_ = (1 << TYPE_CELLULAR); | |
59 enabled_devices_ = (available_devices_ & (1 << TYPE_ETHERNET)); | |
60 | |
61 if (IsInteractive()) { | |
62 const int kWifiInitDelaySeconds = 5; | |
63 const int kCellularInitDelaySeconds = 10; | |
64 const int kCellularActivateDelaySeconds = 15; | |
65 BrowserThread::PostDelayedTask( | |
66 BrowserThread::UI, FROM_HERE, | |
67 base::Bind(&NetworkLibraryImplStub::CompleteWifiInit, | |
68 weak_pointer_factory_.GetWeakPtr()), | |
69 base::TimeDelta::FromSeconds(kWifiInitDelaySeconds)); | |
70 BrowserThread::PostDelayedTask( | |
71 BrowserThread::UI, FROM_HERE, | |
72 base::Bind(&NetworkLibraryImplStub::CompleteCellularInit, | |
73 weak_pointer_factory_.GetWeakPtr()), | |
74 base::TimeDelta::FromSeconds(kCellularInitDelaySeconds)); | |
75 BrowserThread::PostDelayedTask( | |
76 BrowserThread::UI, FROM_HERE, | |
77 base::Bind(&NetworkLibraryImplStub::CompleteCellularActivate, | |
78 weak_pointer_factory_.GetWeakPtr()), | |
79 base::TimeDelta::FromSeconds(kCellularActivateDelaySeconds)); | |
80 } else { | |
81 CompleteWifiInit(); | |
82 CompleteCellularInit(); | |
83 } | |
84 } | |
85 | |
86 bool NetworkLibraryImplStub::IsCros() const { | |
87 return false; | |
88 } | |
89 | |
90 //////////////////////////////////////////////////////////////////////////// | |
91 // NetworkLibraryImplStub private methods. | |
92 | |
93 void NetworkLibraryImplStub::CompleteWifiInit() { | |
94 VLOG(1) << "CompleteWifiInit()"; | |
95 | |
96 uninitialized_devices_ &= ~(1 << TYPE_WIFI); | |
97 enabled_devices_ |= (available_devices_ & (1 << TYPE_WIFI)); | |
98 | |
99 // Profiles | |
100 AddProfile("default", PROFILE_SHARED); | |
101 AddProfile("user", PROFILE_USER); | |
102 | |
103 // Networks | |
104 // If these change, the expectations in network_library_unittest and | |
105 // network_menu_icon_unittest need to be changed also. | |
106 | |
107 if (IsEthernetEnabled()) { | |
108 Network* ethernet = new EthernetNetwork("eth1"); | |
109 ethernet->set_name("Fake Ethernet"); | |
110 ethernet->set_connected(); | |
111 AddStubNetwork(ethernet, PROFILE_SHARED); | |
112 ethernet->set_is_active(ethernet->connected()); | |
113 } | |
114 | |
115 WifiNetwork* wifi1 = new WifiNetwork("wifi1"); | |
116 wifi1->set_name("Fake WiFi1"); | |
117 wifi1->set_strength(100); | |
118 wifi1->set_connected(); | |
119 wifi1->set_encryption(SECURITY_NONE); | |
120 AddStubNetwork(wifi1, PROFILE_SHARED); | |
121 | |
122 WifiNetwork* wifi2 = new WifiNetwork("wifi2"); | |
123 wifi2->set_name("Fake WiFi2"); | |
124 wifi2->set_strength(70); | |
125 wifi2->set_encryption(SECURITY_NONE); | |
126 AddStubNetwork(wifi2, PROFILE_SHARED); | |
127 | |
128 WifiNetwork* wifi3 = new WifiNetwork("wifi3"); | |
129 wifi3->set_name("Fake WiFi3 Encrypted with a long name"); | |
130 wifi3->set_strength(60); | |
131 wifi3->set_encryption(SECURITY_WEP); | |
132 wifi3->set_passphrase_required(true); | |
133 AddStubNetwork(wifi3, PROFILE_USER); | |
134 | |
135 CertificatePattern pattern; | |
136 IssuerSubjectPattern issuer; | |
137 issuer.set_organization("Google, Inc."); | |
138 pattern.set_issuer(issuer); | |
139 std::vector<std::string> enrollment_uris; | |
140 enrollment_uris.push_back("http://youtu.be/dQw4w9WgXcQ"); | |
141 enrollment_uris.push_back("chrome-extension://abc/keygen-cert.html"); | |
142 pattern.set_enrollment_uri_list(enrollment_uris); | |
143 | |
144 WifiNetwork* wifi_cert_pattern = new WifiNetwork("wifi_cert_pattern"); | |
145 wifi_cert_pattern->set_name("Fake WiFi CertPattern 802.1x"); | |
146 wifi_cert_pattern->set_strength(50); | |
147 wifi_cert_pattern->set_connectable(false); | |
148 wifi_cert_pattern->set_encryption(SECURITY_8021X); | |
149 wifi_cert_pattern->SetEAPMethod(EAP_METHOD_TLS); | |
150 wifi_cert_pattern->SetEAPUseSystemCAs(true); | |
151 wifi_cert_pattern->SetEAPIdentity("user@example.com"); | |
152 wifi_cert_pattern->SetEAPPhase2Auth(EAP_PHASE_2_AUTH_AUTO); | |
153 wifi_cert_pattern->set_client_cert_type(CLIENT_CERT_TYPE_PATTERN); | |
154 wifi_cert_pattern->set_client_cert_pattern(pattern); | |
155 wifi_cert_pattern->set_eap_save_credentials(true); | |
156 | |
157 AddStubNetwork(wifi_cert_pattern, PROFILE_USER); | |
158 | |
159 WifiNetwork* wifi4 = new WifiNetwork("wifi4"); | |
160 wifi4->set_name("Fake WiFi4 802.1x"); | |
161 wifi4->set_strength(50); | |
162 wifi4->set_connectable(false); | |
163 wifi4->set_encryption(SECURITY_8021X); | |
164 wifi4->SetEAPMethod(EAP_METHOD_PEAP); | |
165 wifi4->SetEAPIdentity("nobody@google.com"); | |
166 wifi4->SetEAPPassphrase("password"); | |
167 AddStubNetwork(wifi4, PROFILE_NONE); | |
168 | |
169 WifiNetwork* wifi5 = new WifiNetwork("wifi5"); | |
170 wifi5->set_name("Fake WiFi5 UTF-8 SSID "); | |
171 wifi5->SetSsid("Fake WiFi5 UTF-8 SSID \u3042\u3044\u3046"); | |
172 wifi5->set_strength(25); | |
173 AddStubNetwork(wifi5, PROFILE_NONE); | |
174 | |
175 WifiNetwork* wifi6 = new WifiNetwork("wifi6"); | |
176 wifi6->set_name("Fake WiFi6 latin-1 SSID "); | |
177 wifi6->SetSsid("Fake WiFi6 latin-1 SSID \xc0\xcb\xcc\xd6\xfb"); | |
178 wifi6->set_strength(20); | |
179 AddStubNetwork(wifi6, PROFILE_NONE); | |
180 | |
181 WifiNetwork* wifi7 = new WifiNetwork("wifi7"); | |
182 wifi7->set_name("Fake Wifi7 (policy-managed)"); | |
183 wifi7->set_strength(100); | |
184 wifi7->set_connectable(false); | |
185 wifi7->set_passphrase_required(true); | |
186 wifi7->set_encryption(SECURITY_8021X); | |
187 wifi7->SetEAPMethod(EAP_METHOD_PEAP); | |
188 wifi7->SetEAPIdentity("enterprise@example.com"); | |
189 wifi7->SetEAPPassphrase("password"); | |
190 NetworkUIData wifi7_ui_data; | |
191 wifi7_ui_data.set_onc_source(onc::ONC_SOURCE_DEVICE_POLICY); | |
192 wifi7->set_ui_data(wifi7_ui_data); | |
193 AddStubNetwork(wifi7, PROFILE_USER); | |
194 | |
195 VirtualNetwork* vpn1 = new VirtualNetwork("vpn1"); | |
196 vpn1->set_name("Fake VPN1"); | |
197 vpn1->set_server_hostname("vpn1server.fake.com"); | |
198 vpn1->set_provider_type(PROVIDER_TYPE_L2TP_IPSEC_PSK); | |
199 vpn1->set_username("VPN User 1"); | |
200 AddStubNetwork(vpn1, PROFILE_USER); | |
201 | |
202 VirtualNetwork* vpn2 = new VirtualNetwork("vpn2"); | |
203 vpn2->set_name("Fake VPN2"); | |
204 vpn2->set_server_hostname("vpn2server.fake.com"); | |
205 vpn2->set_provider_type(PROVIDER_TYPE_L2TP_IPSEC_USER_CERT); | |
206 vpn2->set_username("VPN User 2"); | |
207 AddStubNetwork(vpn2, PROFILE_USER); | |
208 | |
209 VirtualNetwork* vpn3 = new VirtualNetwork("vpn3"); | |
210 vpn3->set_name("Fake VPN3"); | |
211 vpn3->set_server_hostname("vpn3server.fake.com"); | |
212 vpn3->set_provider_type(PROVIDER_TYPE_OPEN_VPN); | |
213 AddStubNetwork(vpn3, PROFILE_USER); | |
214 | |
215 VirtualNetwork* vpn4 = new VirtualNetwork("vpn4"); | |
216 vpn4->set_name("Fake VPN4 (policy-managed)"); | |
217 vpn4->set_server_hostname("vpn4server.fake.com"); | |
218 vpn4->set_provider_type(PROVIDER_TYPE_OPEN_VPN); | |
219 NetworkUIData vpn4_ui_data; | |
220 vpn4_ui_data.set_onc_source(onc::ONC_SOURCE_DEVICE_POLICY); | |
221 vpn4->set_ui_data(vpn4_ui_data); | |
222 AddStubNetwork(vpn4, PROFILE_USER); | |
223 | |
224 VirtualNetwork* vpn_cert_pattern = new VirtualNetwork("vpn_cert_pattern"); | |
225 vpn_cert_pattern->set_name("Fake VPN CertPattern"); | |
226 vpn_cert_pattern->set_server_hostname("vpn4server.fake.com"); | |
227 vpn_cert_pattern->set_provider_type(PROVIDER_TYPE_OPEN_VPN); | |
228 vpn_cert_pattern->set_client_cert_type(CLIENT_CERT_TYPE_PATTERN); | |
229 vpn_cert_pattern->set_client_cert_pattern(pattern); | |
230 | |
231 AddStubNetwork(vpn_cert_pattern, PROFILE_USER); | |
232 | |
233 wifi_scanning_ = false; | |
234 | |
235 // Ensure our active network is connected and vice versa, otherwise our | |
236 // autotest browser_tests sometimes conclude the device is offline. | |
237 CHECK(active_network()->connected()) | |
238 << "Active: " << active_network()->name(); | |
239 CHECK(connected_network()->is_active()); | |
240 | |
241 std::string test_blob( | |
242 "{" | |
243 " \"NetworkConfigurations\": [" | |
244 " {" | |
245 " \"GUID\": \"guid\"," | |
246 " \"Type\": \"VPN\"," | |
247 " \"Name\": \"VPNtest\"," | |
248 " \"VPN\": {" | |
249 " \"Host\": \"172.22.12.98\"," | |
250 " \"Type\": \"L2TP-IPsec\"," | |
251 " \"IPsec\": {" | |
252 " \"AuthenticationType\": \"PSK\"," | |
253 " \"IKEVersion\": 2," | |
254 " \"PSK\": \"chromeos\"," | |
255 " }," | |
256 " \"L2TP\": {" | |
257 " \"Username\": \"vpntest\"," | |
258 " }" | |
259 " }" | |
260 " }" | |
261 " ]," | |
262 " \"Certificates\": []" | |
263 "}"); | |
264 // LoadOncNetworks(test_blob, "", onc::ONC_SOURCE_USER_IMPORT, NULL); | |
265 | |
266 SignalNetworkManagerObservers(); | |
267 } | |
268 | |
269 void NetworkLibraryImplStub::CompleteCellularInit() { | |
270 VLOG(1) << "CompleteCellularInit()"; | |
271 | |
272 uninitialized_devices_ &= ~(1 << TYPE_CELLULAR); | |
273 uninitialized_devices_ &= ~(1 << TYPE_WIMAX); | |
274 enabled_devices_ |= (available_devices_ & (1 << TYPE_CELLULAR)); | |
275 enabled_devices_ |= (available_devices_ & (1 << TYPE_WIMAX)); | |
276 | |
277 base::ListValue supported_carriers; | |
278 supported_carriers.Append(new StringValue("Generic CDMA Carrier 1")); | |
279 supported_carriers.Append(new StringValue("Generic UMTS")); | |
280 supported_carriers.Append(new StringValue("Generic CDMA Carrier 2")); | |
281 supported_carriers.Append(new StringValue("Generic CDMA Carrier 3")); | |
282 | |
283 NetworkDevice* cellular = new NetworkDevice("cellular"); | |
284 cellular->type_ = TYPE_CELLULAR; | |
285 cellular->set_technology_family(TECHNOLOGY_FAMILY_CDMA); | |
286 cellular->set_carrier("Generic CDMA Carrier 2"); | |
287 cellular->imsi_ = "123456789012345"; | |
288 cellular->set_supported_carriers(supported_carriers); | |
289 device_map_["cellular"] = cellular; | |
290 | |
291 CellularApn apn; | |
292 apn.apn = "apn"; | |
293 apn.network_id = "network_id"; | |
294 apn.username = "username"; | |
295 apn.password = "password"; | |
296 apn.name = "name"; | |
297 apn.localized_name = "localized_name"; | |
298 apn.language = "language"; | |
299 | |
300 CellularApnList apn_list; | |
301 apn_list.push_back(apn); | |
302 | |
303 NetworkDevice* cellular_gsm = new NetworkDevice("cellular_gsm"); | |
304 cellular_gsm->type_ = TYPE_CELLULAR; | |
305 cellular_gsm->set_technology_family(TECHNOLOGY_FAMILY_GSM); | |
306 cellular_gsm->imsi_ = "123456789012345"; | |
307 cellular_gsm->set_sim_pin_required(SIM_PIN_REQUIRED); | |
308 cellular_gsm->set_provider_apn_list(apn_list); | |
309 cellular_gsm->set_supported_carriers(supported_carriers); | |
310 device_map_["cellular_gsm"] = cellular_gsm; | |
311 | |
312 CellularNetwork* cellular1 = new CellularNetwork("cellular1"); | |
313 cellular1->set_name("Fake Cellular 1"); | |
314 cellular1->set_device_path(cellular->device_path()); | |
315 cellular1->set_strength(100); | |
316 cellular1->set_connected(); | |
317 cellular1->set_activation_state(ACTIVATION_STATE_ACTIVATED); | |
318 cellular1->set_payment_url(std::string("http://www.google.com")); | |
319 cellular1->set_usage_url(std::string("http://www.google.com")); | |
320 cellular1->set_network_technology(NETWORK_TECHNOLOGY_EVDO); | |
321 AddStubNetwork(cellular1, PROFILE_NONE); | |
322 | |
323 CellularNetwork* cellular2 = new CellularNetwork("cellular2"); | |
324 cellular2->set_name("Fake Cellular 2"); | |
325 cellular2->set_device_path(cellular->device_path()); | |
326 cellular2->set_strength(50); | |
327 cellular2->set_activation_state(ACTIVATION_STATE_ACTIVATING); | |
328 cellular2->set_network_technology(NETWORK_TECHNOLOGY_UMTS); | |
329 cellular2->set_roaming_state(ROAMING_STATE_ROAMING); | |
330 cellular2->set_payment_url(std::string("http://www.google.com")); | |
331 cellular2->set_usage_url(std::string("http://www.google.com")); | |
332 AddStubNetwork(cellular2, PROFILE_NONE); | |
333 | |
334 CellularNetwork* cellular3 = new CellularNetwork("cellular3"); | |
335 cellular3->set_name("Fake Cellular 3 (policy-managed)"); | |
336 cellular3->set_device_path(cellular->device_path()); | |
337 cellular3->set_activation_state(ACTIVATION_STATE_ACTIVATED); | |
338 cellular3->set_network_technology(NETWORK_TECHNOLOGY_EVDO); | |
339 NetworkUIData cellular3_ui_data; | |
340 cellular3_ui_data.set_onc_source(onc::ONC_SOURCE_USER_POLICY); | |
341 cellular3->set_ui_data(cellular3_ui_data); | |
342 AddStubNetwork(cellular3, PROFILE_NONE); | |
343 | |
344 CellularNetwork* cellular4 = new CellularNetwork("cellular4"); | |
345 cellular4->set_name("Fake Cellular 4 (policy-managed)"); | |
346 cellular4->set_device_path(cellular_gsm->device_path()); | |
347 cellular4->set_activation_state(ACTIVATION_STATE_ACTIVATED); | |
348 cellular4->set_network_technology(NETWORK_TECHNOLOGY_GSM); | |
349 NetworkUIData cellular4_ui_data; | |
350 cellular4_ui_data.set_onc_source(onc::ONC_SOURCE_USER_POLICY); | |
351 cellular4->set_ui_data(cellular4_ui_data); | |
352 AddStubNetwork(cellular4, PROFILE_NONE); | |
353 | |
354 WimaxNetwork* wimax1 = new WimaxNetwork("wimax1"); | |
355 wimax1->set_name("Fake WiMAX Protected"); | |
356 wimax1->set_strength(75); | |
357 wimax1->set_connectable(true); | |
358 wimax1->set_eap_identity("WiMAX User 1"); | |
359 wimax1->set_passphrase_required(true); | |
360 AddStubNetwork(wimax1, PROFILE_NONE); | |
361 | |
362 WimaxNetwork* wimax2 = new WimaxNetwork("wimax2"); | |
363 wimax2->set_name("Fake WiMAX Open"); | |
364 wimax2->set_strength(50); | |
365 wimax2->set_connected(); | |
366 wimax2->set_passphrase_required(false); | |
367 AddStubNetwork(wimax2, PROFILE_NONE); | |
368 | |
369 SignalNetworkManagerObservers(); | |
370 } | |
371 | |
372 void NetworkLibraryImplStub::CompleteCellularActivate() { | |
373 VLOG(1) << "CompleteCellularActivate()"; | |
374 CellularNetwork* cellular2 = FindCellularNetworkByPath("cellular2"); | |
375 cellular2->set_activation_state(ACTIVATION_STATE_ACTIVATED); | |
376 SignalNetworkManagerObservers(); | |
377 } | |
378 | |
379 void NetworkLibraryImplStub::AddStubNetwork( | |
380 Network* network, NetworkProfileType profile_type) { | |
381 // Currently we don't prioritize networks in Shill so don't do so in the stub. | |
382 // network->priority_order_ = network_priority_order_++; | |
383 network->CalculateUniqueId(); | |
384 if (!network->unique_id().empty()) | |
385 network_unique_id_map_[network->unique_id()] = network; | |
386 AddNetwork(network); | |
387 UpdateActiveNetwork(network); | |
388 SetProfileType(network, profile_type); | |
389 AddStubRememberedNetwork(network); | |
390 } | |
391 | |
392 // Add a remembered network to the appropriate profile if specified. | |
393 void NetworkLibraryImplStub::AddStubRememberedNetwork(Network* network) { | |
394 if (network->profile_type() == PROFILE_NONE) | |
395 return; | |
396 | |
397 Network* remembered = FindRememberedFromNetwork(network); | |
398 if (remembered) { | |
399 // This network is already in the rememebred list. Check to see if the | |
400 // type has changed. | |
401 if (remembered->profile_type() == network->profile_type()) | |
402 return; // Same type, nothing to do. | |
403 // Delete the existing remembered network from the previous profile. | |
404 DeleteRememberedNetwork(remembered->service_path()); | |
405 remembered = NULL; | |
406 } | |
407 | |
408 NetworkProfile* profile = GetProfileForType(network->profile_type()); | |
409 if (profile) { | |
410 profile->services.insert(network->service_path()); | |
411 } else { | |
412 LOG(ERROR) << "No profile type: " << network->profile_type(); | |
413 return; | |
414 } | |
415 | |
416 if (network->type() == TYPE_WIFI) { | |
417 WifiNetwork* remembered_wifi = new WifiNetwork(network->service_path()); | |
418 remembered_wifi->set_encryption(remembered_wifi->encryption()); | |
419 NetworkUIData wifi_ui_data; | |
420 wifi_ui_data.set_onc_source(network->ui_data().onc_source()); | |
421 remembered_wifi->set_ui_data(wifi_ui_data); | |
422 remembered = remembered_wifi; | |
423 } else if (network->type() == TYPE_VPN) { | |
424 VirtualNetwork* remembered_vpn = | |
425 new VirtualNetwork(network->service_path()); | |
426 remembered_vpn->set_server_hostname("vpnserver.fake.com"); | |
427 remembered_vpn->set_provider_type(PROVIDER_TYPE_L2TP_IPSEC_USER_CERT); | |
428 NetworkUIData vpn_ui_data; | |
429 vpn_ui_data.set_onc_source(network->ui_data().onc_source()); | |
430 remembered_vpn->set_ui_data(vpn_ui_data); | |
431 remembered = remembered_vpn; | |
432 } | |
433 if (remembered) { | |
434 remembered->set_name(network->name()); | |
435 remembered->set_unique_id(network->unique_id()); | |
436 // ValidateAndAddRememberedNetwork will insert the network into the right | |
437 // remembered_*_networks_ list and the remembered_network_map_. | |
438 if (!ValidateAndAddRememberedNetwork(remembered)) | |
439 NOTREACHED(); | |
440 remembered->set_profile_path(profile->path); | |
441 remembered->set_profile_type(profile->type); | |
442 } | |
443 } | |
444 | |
445 void NetworkLibraryImplStub::ConnectToNetwork(Network* network) { | |
446 std::string passphrase; | |
447 if (network->type() == TYPE_WIFI) { | |
448 WifiNetwork* wifi = static_cast<WifiNetwork*>(network); | |
449 if (wifi->passphrase_required()) | |
450 passphrase = wifi->passphrase(); | |
451 } else if (network->type() == TYPE_WIMAX) { | |
452 WimaxNetwork* wimax = static_cast<WimaxNetwork*>(network); | |
453 if (wimax->passphrase_required()) | |
454 passphrase = wimax->eap_passphrase(); | |
455 } | |
456 if (!passphrase.empty()) { | |
457 if (passphrase.find("bad") == 0) { | |
458 NetworkConnectCompleted(network, CONNECT_BAD_PASSPHRASE); | |
459 return; | |
460 } else if (passphrase.find("error") == 0) { | |
461 NetworkConnectCompleted(network, CONNECT_FAILED); | |
462 return; | |
463 } | |
464 } | |
465 | |
466 // Disconnect ethernet when connecting to a new network (for UI testing). | |
467 if (IsEthernetEnabled() && network->type() != TYPE_VPN) { | |
468 ethernet_->set_is_active(false); | |
469 ethernet_->set_disconnected(); | |
470 } | |
471 | |
472 // Set connected state. | |
473 network->set_connected(); | |
474 network->set_user_connect_state(USER_CONNECT_CONNECTED); | |
475 | |
476 // Make the connected network the highest priority network. | |
477 // Set all other networks of the same type to disconnected + inactive; | |
478 int old_priority_order = network->priority_order_; | |
479 network->priority_order_ = 0; | |
480 for (NetworkMap::iterator iter = network_map_.begin(); | |
481 iter != network_map_.end(); ++iter) { | |
482 Network* other = iter->second; | |
483 if (other == network) | |
484 continue; | |
485 if (other->priority_order_ < old_priority_order) | |
486 other->priority_order_++; | |
487 if (other->type() == network->type()) { | |
488 other->set_is_active(false); | |
489 other->set_disconnected(); | |
490 } | |
491 } | |
492 | |
493 // Remember connected network. | |
494 if (network->profile_type() == PROFILE_NONE) { | |
495 NetworkProfileType profile_type = PROFILE_USER; | |
496 if (network->type() == TYPE_WIFI) { | |
497 WifiNetwork* wifi = static_cast<WifiNetwork*>(network); | |
498 if (!wifi->encrypted()) | |
499 profile_type = PROFILE_SHARED; | |
500 } | |
501 SetProfileType(network, profile_type); | |
502 } | |
503 AddStubRememberedNetwork(network); | |
504 | |
505 // Call Completed and signal observers. | |
506 NetworkConnectCompleted(network, CONNECT_SUCCESS); | |
507 } | |
508 | |
509 void NetworkLibraryImplStub::ScanCompleted() { | |
510 wifi_scanning_ = false; | |
511 SignalNetworkManagerObservers(); | |
512 } | |
513 | |
514 ////////////////////////////////////////////////////////////////////////////// | |
515 // NetworkLibraryImplBase implementation. | |
516 | |
517 void NetworkLibraryImplStub::MonitorNetworkStart( | |
518 const std::string& service_path) {} | |
519 | |
520 void NetworkLibraryImplStub::MonitorNetworkStop( | |
521 const std::string& service_path) {} | |
522 | |
523 void NetworkLibraryImplStub::MonitorNetworkDeviceStart( | |
524 const std::string& device_path) {} | |
525 | |
526 void NetworkLibraryImplStub::MonitorNetworkDeviceStop( | |
527 const std::string& device_path) {} | |
528 | |
529 void NetworkLibraryImplStub::CallConfigureService( | |
530 const std::string& identifier, | |
531 const DictionaryValue* info) { | |
532 DictionaryValue*& config_entry = service_configurations_[identifier]; | |
533 delete config_entry; | |
534 config_entry = info->DeepCopy(); | |
535 } | |
536 | |
537 void NetworkLibraryImplStub::CallConnectToNetwork(Network* network) { | |
538 // Immediately set the network to active to mimic shill's behavior. | |
539 SetActiveNetwork(network->type(), network->service_path()); | |
540 // If a delay has been set (i.e. we are interactive), delay the call to | |
541 // ConnectToNetwork (but signal observers since we changed connecting state). | |
542 if (IsInteractive()) { | |
543 const int kConnectDelayMs = 4 * 1000; | |
544 BrowserThread::PostDelayedTask( | |
545 BrowserThread::UI, FROM_HERE, | |
546 base::Bind(&NetworkLibraryImplStub::ConnectToNetwork, | |
547 weak_pointer_factory_.GetWeakPtr(), network), | |
548 base::TimeDelta::FromMilliseconds(kConnectDelayMs)); | |
549 SignalNetworkManagerObservers(); | |
550 NotifyNetworkChanged(network); | |
551 } else { | |
552 ConnectToNetwork(network); | |
553 } | |
554 } | |
555 | |
556 void NetworkLibraryImplStub::CallRequestWifiNetworkAndConnect( | |
557 const std::string& ssid, ConnectionSecurity security) { | |
558 WifiNetwork* wifi = new WifiNetwork(ssid); | |
559 wifi->set_name(ssid); | |
560 wifi->set_encryption(security); | |
561 AddNetwork(wifi); | |
562 ConnectToWifiNetworkUsingConnectData(wifi); | |
563 SignalNetworkManagerObservers(); | |
564 } | |
565 | |
566 void NetworkLibraryImplStub::CallRequestVirtualNetworkAndConnect( | |
567 const std::string& service_name, | |
568 const std::string& server_hostname, | |
569 ProviderType provider_type) { | |
570 VirtualNetwork* vpn = new VirtualNetwork(service_name); | |
571 vpn->set_name(service_name); | |
572 vpn->set_server_hostname(server_hostname); | |
573 vpn->set_provider_type(provider_type); | |
574 AddNetwork(vpn); | |
575 ConnectToVirtualNetworkUsingConnectData(vpn); | |
576 SignalNetworkManagerObservers(); | |
577 } | |
578 | |
579 void NetworkLibraryImplStub::CallDeleteRememberedNetwork( | |
580 const std::string& profile_path, | |
581 const std::string& service_path) {} | |
582 | |
583 void NetworkLibraryImplStub::CallEnableNetworkDeviceType( | |
584 ConnectionType device, bool enable) { | |
585 if (enable) { | |
586 if (device == TYPE_WIFI && !wifi_enabled()) { | |
587 wifi_networks_.swap(disabled_wifi_networks_); | |
588 disabled_wifi_networks_.clear(); | |
589 RequestNetworkScan(); | |
590 } else if (device == TYPE_WIMAX && !wimax_enabled()) { | |
591 wimax_networks_.swap(disabled_wimax_networks_); | |
592 disabled_wimax_networks_.clear(); | |
593 } else if (device == TYPE_CELLULAR && !cellular_enabled()) { | |
594 cellular_networks_.swap(disabled_cellular_networks_); | |
595 disabled_cellular_networks_.clear(); | |
596 } | |
597 enabled_devices_ |= (1 << device); | |
598 } else { | |
599 if (device == TYPE_WIFI && wifi_enabled()) { | |
600 wifi_networks_.swap(disabled_wifi_networks_); | |
601 wifi_networks_.clear(); | |
602 if (active_wifi_) | |
603 DisconnectFromNetwork(active_wifi_); | |
604 } else if (device == TYPE_WIMAX && wimax_enabled()) { | |
605 wimax_networks_.swap(disabled_wimax_networks_); | |
606 wimax_networks_.clear(); | |
607 if (active_wimax_) | |
608 DisconnectFromNetwork(active_wimax_); | |
609 } else if (device == TYPE_CELLULAR && cellular_enabled()) { | |
610 cellular_networks_.swap(disabled_cellular_networks_); | |
611 cellular_networks_.clear(); | |
612 if (active_cellular_) | |
613 DisconnectFromNetwork(active_cellular_); | |
614 } | |
615 enabled_devices_ &= ~(1 << device); | |
616 } | |
617 SignalNetworkManagerObservers(); | |
618 } | |
619 | |
620 void NetworkLibraryImplStub::CallRemoveNetwork(const Network* network) {} | |
621 | |
622 ///////////////////////////////////////////////////////////////////////////// | |
623 // NetworkLibrary implementation. | |
624 | |
625 void NetworkLibraryImplStub::ChangePin(const std::string& old_pin, | |
626 const std::string& new_pin) { | |
627 sim_operation_ = SIM_OPERATION_CHANGE_PIN; | |
628 if (!pin_required_ || old_pin == pin_) { | |
629 pin_ = new_pin; | |
630 NotifyPinOperationCompleted(PIN_ERROR_NONE); | |
631 } else { | |
632 NotifyPinOperationCompleted(PIN_ERROR_INCORRECT_CODE); | |
633 } | |
634 } | |
635 | |
636 void NetworkLibraryImplStub::ChangeRequirePin(bool require_pin, | |
637 const std::string& pin) { | |
638 sim_operation_ = SIM_OPERATION_CHANGE_REQUIRE_PIN; | |
639 if (!pin_required_ || pin == pin_) { | |
640 pin_required_ = require_pin; | |
641 NotifyPinOperationCompleted(PIN_ERROR_NONE); | |
642 } else { | |
643 NotifyPinOperationCompleted(PIN_ERROR_INCORRECT_CODE); | |
644 } | |
645 } | |
646 | |
647 void NetworkLibraryImplStub::EnterPin(const std::string& pin) { | |
648 sim_operation_ = SIM_OPERATION_ENTER_PIN; | |
649 if (!pin_required_ || pin == pin_) { | |
650 pin_entered_ = true; | |
651 NotifyPinOperationCompleted(PIN_ERROR_NONE); | |
652 } else { | |
653 NotifyPinOperationCompleted(PIN_ERROR_INCORRECT_CODE); | |
654 } | |
655 } | |
656 | |
657 void NetworkLibraryImplStub::UnblockPin(const std::string& puk, | |
658 const std::string& new_pin) { | |
659 sim_operation_ = SIM_OPERATION_UNBLOCK_PIN; | |
660 // TODO(stevenjb): something? | |
661 NotifyPinOperationCompleted(PIN_ERROR_NONE); | |
662 } | |
663 | |
664 void NetworkLibraryImplStub::RequestCellularScan() {} | |
665 | |
666 void NetworkLibraryImplStub::RequestCellularRegister( | |
667 const std::string& network_id) {} | |
668 | |
669 void NetworkLibraryImplStub::SetCellularDataRoamingAllowed(bool new_value) {} | |
670 | |
671 void NetworkLibraryImplStub::SetCarrier( | |
672 const std::string& carrier, | |
673 const NetworkOperationCallback& completed) { | |
674 // Call the completed callback with a 10s delay if we're interactive. | |
675 int delay_ms = IsInteractive() ? 10000 : 100; | |
676 BrowserThread::PostDelayedTask( | |
677 BrowserThread::UI, | |
678 FROM_HERE, | |
679 base::Bind(completed, "", NETWORK_METHOD_ERROR_NONE,""), | |
680 base::TimeDelta::FromMilliseconds(delay_ms)); | |
681 } | |
682 | |
683 bool NetworkLibraryImplStub::IsCellularAlwaysInRoaming() { | |
684 return false; | |
685 } | |
686 | |
687 void NetworkLibraryImplStub::RequestNetworkScan() { | |
688 // This is triggered by user interaction, so set a network connect delay. | |
689 int scan_delay_ms = IsInteractive() ? 2 * 1000 : 100; | |
690 wifi_scanning_ = true; | |
691 BrowserThread::PostDelayedTask( | |
692 BrowserThread::UI, FROM_HERE, | |
693 base::Bind(&NetworkLibraryImplStub::ScanCompleted, | |
694 weak_pointer_factory_.GetWeakPtr()), | |
695 base::TimeDelta::FromMilliseconds(scan_delay_ms)); | |
696 } | |
697 | |
698 void NetworkLibraryImplStub::DisconnectFromNetwork(const Network* network) { | |
699 // Update the network state here since no network manager in stub impl. | |
700 Network* modify_network = const_cast<Network*>(network); | |
701 modify_network->set_is_active(false); | |
702 modify_network->set_disconnected(); | |
703 if (network == active_wifi_) | |
704 active_wifi_ = NULL; | |
705 else if (network == active_cellular_) | |
706 active_cellular_ = NULL; | |
707 else if (network == active_virtual_) | |
708 active_virtual_ = NULL; | |
709 SignalNetworkManagerObservers(); | |
710 NotifyNetworkChanged(network); | |
711 } | |
712 | |
713 void NetworkLibraryImplStub::GetIPConfigs( | |
714 const std::string& device_path, | |
715 HardwareAddressFormat format, | |
716 const NetworkGetIPConfigsCallback& callback) { | |
717 callback.Run(ip_configs_, hardware_address_); | |
718 } | |
719 | |
720 void NetworkLibraryImplStub::SetIPParameters(const std::string& service_path, | |
721 const std::string& address, | |
722 const std::string& netmask, | |
723 const std::string& gateway, | |
724 const std::string& name_servers, | |
725 int dhcp_usage_mask) { | |
726 VLOG(1) << "Setting IP parameters:" | |
727 << "\n address: " << address | |
728 << (dhcp_usage_mask & USE_DHCP_ADDRESS ? | |
729 " (ignored)" : " (in use)") | |
730 << "\n netmask: " << netmask | |
731 << (dhcp_usage_mask & USE_DHCP_NETMASK ? | |
732 " (ignored)" : " (in use)") | |
733 << "\n gateway: " << gateway | |
734 << (dhcp_usage_mask & USE_DHCP_GATEWAY ? | |
735 " (ignored)" : " (in use)") | |
736 << "\n name_servers: " << name_servers | |
737 << (dhcp_usage_mask & USE_DHCP_NAME_SERVERS ? | |
738 " (ignored)" : " (in use)"); | |
739 | |
740 Network* network = FindNetworkByPath(service_path); | |
741 if (network) | |
742 ip_configs_.push_back(NetworkIPConfig(network->device_path(), | |
743 IPCONFIG_TYPE_IPV4, | |
744 address, | |
745 netmask, | |
746 gateway, | |
747 name_servers)); | |
748 } | |
749 | |
750 void NetworkLibraryImplStub::RequestNetworkServiceProperties( | |
751 const std::string& service_path, | |
752 const NetworkServicePropertiesCallback& callback) { | |
753 BrowserThread::PostDelayedTask( | |
754 BrowserThread::UI, | |
755 FROM_HERE, | |
756 base::Bind(&NetworkLibraryImplStub::SendNetworkServiceProperties, | |
757 weak_pointer_factory_.GetWeakPtr(), | |
758 service_path, callback), | |
759 base::TimeDelta::FromMilliseconds(100)); | |
760 } | |
761 | |
762 void NetworkLibraryImplStub::SendNetworkServiceProperties( | |
763 const std::string& service_path, | |
764 const NetworkServicePropertiesCallback& callback) { | |
765 scoped_ptr<base::DictionaryValue> dictionary(new base::DictionaryValue()); | |
766 Network* network = FindNetworkByPath(service_path); | |
767 if (network) { | |
768 // Populate a few common properties. | |
769 dictionary->SetString(flimflam::kTypeProperty, | |
770 ConnectionTypeToString(network->type())); | |
771 dictionary->SetString(flimflam::kNameProperty, network->name()); | |
772 dictionary->SetString(flimflam::kGuidProperty, network->unique_id()); | |
773 dictionary->SetString(flimflam::kStateProperty, | |
774 ConnectionStateToString(network->state())); | |
775 } | |
776 callback.Run(service_path, dictionary.get()); | |
777 } | |
778 | |
779 const std::map<std::string, base::DictionaryValue*>& | |
780 NetworkLibraryImplStub::GetConfigurations() { | |
781 return service_configurations_; | |
782 } | |
783 | |
784 } // namespace chromeos | |
OLD | NEW |