Home | History | Annotate | Download | only in cros
      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 (at) 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 (at) 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 (at) 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
    785