Home | History | Annotate | Download | only in networking_private
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/extensions/api/networking_private/networking_private_api.h"
      6 
      7 #include "base/bind.h"
      8 #include "base/bind_helpers.h"
      9 #include "base/callback.h"
     10 #include "base/command_line.h"
     11 #include "base/json/json_reader.h"
     12 #include "chrome/browser/browser_process.h"
     13 #include "chrome/browser/extensions/event_names.h"
     14 #include "chrome/browser/extensions/event_router.h"
     15 #include "chrome/browser/extensions/extension_function_registry.h"
     16 #include "chrome/browser/extensions/extension_system.h"
     17 #include "chrome/browser/profiles/profile.h"
     18 #include "chrome/common/chrome_switches.h"
     19 #include "chrome/common/extensions/api/networking_private.h"
     20 
     21 using extensions::event_names::kOnNetworkListChanged;
     22 using extensions::event_names::kOnNetworksChanged;
     23 using extensions::EventRouter;
     24 using extensions::ExtensionSystem;
     25 namespace api = extensions::api::networking_private;
     26 
     27 ////////////////////////////////////////////////////////////////////////////////
     28 // NetworkingPrivateGetPropertiesFunction
     29 
     30 
     31 const char kNetworkingPrivateProperties[] = "NetworkingPrivateProperties";
     32 
     33 struct NetworkingPrivatePropertiesData : base::SupportsUserData::Data {
     34   explicit NetworkingPrivatePropertiesData(const base::DictionaryValue* prop) :
     35     properties_(prop->DeepCopy()) { }
     36   scoped_ptr<base::DictionaryValue> properties_;
     37 };
     38 
     39 NetworkingPrivateGetPropertiesFunction::
     40   ~NetworkingPrivateGetPropertiesFunction() {
     41 }
     42 
     43 bool NetworkingPrivateGetPropertiesFunction::RunImpl() {
     44   scoped_ptr<api::GetProperties::Params> params =
     45       api::GetProperties::Params::Create(*args_);
     46   EXTENSION_FUNCTION_VALIDATE(params);
     47 
     48   // If there are properties set by SetProperties function, use those.
     49   NetworkingPrivatePropertiesData* stored_properties =
     50     static_cast<NetworkingPrivatePropertiesData*> (
     51         profile()->GetUserData(kNetworkingPrivateProperties));
     52   if (stored_properties != NULL) {
     53     SetResult(stored_properties->properties_.release());
     54     SendResponse(true);
     55     return true;
     56   }
     57 
     58   const std::string network_properties =
     59     "{\"ConnectionState\":\"NotConnected\","
     60      "\"GUID\":\"stub_wifi2\","
     61      "\"Name\":\"wifi2_PSK\","
     62      "\"Type\":\"WiFi\","
     63      "\"WiFi\":{"
     64        "\"Frequency\":5000,"
     65        "\"FrequencyList\":[2400,5000],"
     66        "\"SSID\":\"stub_wifi2\","
     67        "\"Security\":\"WPA-PSK\","
     68        "\"SignalStrength\":80}}";
     69 
     70   if (params->network_guid == "nonexistent_path") {
     71     error_ = "Error.DBusFailed";
     72     SendResponse(false);
     73   } else {
     74     SetResult(base::JSONReader::Read(network_properties));
     75     SendResponse(true);
     76   }
     77   return true;
     78 }
     79 
     80 ////////////////////////////////////////////////////////////////////////////////
     81 // NetworkingPrivateGetManagedPropertiesFunction
     82 
     83 NetworkingPrivateGetManagedPropertiesFunction::
     84   ~NetworkingPrivateGetManagedPropertiesFunction() {
     85 }
     86 
     87 bool NetworkingPrivateGetManagedPropertiesFunction::RunImpl() {
     88   scoped_ptr<api::GetManagedProperties::Params> params =
     89       api::GetManagedProperties::Params::Create(*args_);
     90   EXTENSION_FUNCTION_VALIDATE(params);
     91   const std::string network_properties =
     92       "{"
     93       "  \"ConnectionState\": {"
     94       "    \"Active\": \"NotConnected\","
     95       "    \"Effective\": \"Unmanaged\""
     96       "  },"
     97       "  \"GUID\": \"stub_wifi2\","
     98       "  \"Name\": {"
     99       "    \"Active\": \"wifi2_PSK\","
    100       "    \"Effective\": \"UserPolicy\","
    101       "    \"UserPolicy\": \"My WiFi Network\""
    102       "  },"
    103       "  \"Type\": {"
    104       "    \"Active\": \"WiFi\","
    105       "    \"Effective\": \"UserPolicy\","
    106       "    \"UserPolicy\": \"WiFi\""
    107       "  },"
    108       "  \"WiFi\": {"
    109       "    \"AutoConnect\": {"
    110       "      \"Active\": false,"
    111       "      \"UserEditable\": true"
    112       "    },"
    113       "    \"Frequency\" : {"
    114       "      \"Active\": 5000,"
    115       "      \"Effective\": \"Unmanaged\""
    116       "    },"
    117       "    \"FrequencyList\" : {"
    118       "      \"Active\": [2400, 5000],"
    119       "      \"Effective\": \"Unmanaged\""
    120       "    },"
    121       "    \"Passphrase\": {"
    122       "      \"Effective\": \"UserSetting\","
    123       "      \"UserEditable\": true,"
    124       "      \"UserSetting\": \"FAKE_CREDENTIAL_VPaJDV9x\""
    125       "    },"
    126       "    \"SSID\": {"
    127       "      \"Active\": \"stub_wifi2\","
    128       "      \"Effective\": \"UserPolicy\","
    129       "      \"UserPolicy\": \"stub_wifi2\""
    130       "    },"
    131       "    \"Security\": {"
    132       "      \"Active\": \"WPA-PSK\","
    133       "      \"Effective\": \"UserPolicy\","
    134       "      \"UserPolicy\": \"WPA-PSK\""
    135       "    },"
    136       "    \"SignalStrength\": {"
    137       "      \"Active\": 80,"
    138       "      \"Effective\": \"Unmanaged\""
    139       "    }"
    140       "  }"
    141       "}";
    142 
    143   SetResult(base::JSONReader::Read(network_properties));
    144   SendResponse(true);
    145   return true;
    146 }
    147 
    148 ////////////////////////////////////////////////////////////////////////////////
    149 // NetworkingPrivateGetStateFunction
    150 
    151 NetworkingPrivateGetStateFunction::
    152   ~NetworkingPrivateGetStateFunction() {
    153 }
    154 
    155 bool NetworkingPrivateGetStateFunction::RunImpl() {
    156   scoped_ptr<api::GetState::Params> params =
    157       api::GetState::Params::Create(*args_);
    158   EXTENSION_FUNCTION_VALIDATE(params);
    159   const std::string network_state =
    160       "{"
    161       "  \"ConnectionState\": \"NotConnected\","
    162       "  \"GUID\": \"stub_wifi2\","
    163       "  \"Name\": \"wifi2_PSK\","
    164       "  \"Type\": \"WiFi\","
    165       "  \"WiFi\": {"
    166       "    \"AutoConnect\": false,"
    167       "    \"Security\": \"WPA-PSK\","
    168       "    \"SignalStrength\": 80"
    169       "  }"
    170       "}";
    171   SetResult(base::JSONReader::Read(network_state));
    172   SendResponse(true);
    173   return true;
    174 }
    175 
    176 
    177 ////////////////////////////////////////////////////////////////////////////////
    178 // NetworkingPrivateSetPropertiesFunction
    179 
    180 NetworkingPrivateSetPropertiesFunction::
    181   ~NetworkingPrivateSetPropertiesFunction() {
    182 }
    183 
    184 bool NetworkingPrivateSetPropertiesFunction::RunImpl() {
    185   scoped_ptr<api::SetProperties::Params> params =
    186       api::SetProperties::Params::Create(*args_);
    187   EXTENSION_FUNCTION_VALIDATE(params);
    188   scoped_ptr<base::DictionaryValue> properties_dict(
    189       params->properties.ToValue());
    190 
    191   // Store properties_dict in profile to return from GetProperties.
    192   profile()->SetUserData(kNetworkingPrivateProperties,
    193     new NetworkingPrivatePropertiesData(properties_dict.get()));
    194   SendResponse(true);
    195   return true;
    196 }
    197 
    198 ////////////////////////////////////////////////////////////////////////////////
    199 // NetworkingPrivateGetVisibleNetworksFunction
    200 
    201 NetworkingPrivateGetVisibleNetworksFunction::
    202   ~NetworkingPrivateGetVisibleNetworksFunction() {
    203 }
    204 
    205 bool NetworkingPrivateGetVisibleNetworksFunction::RunImpl() {
    206   scoped_ptr<api::GetVisibleNetworks::Params> params =
    207       api::GetVisibleNetworks::Params::Create(*args_);
    208   EXTENSION_FUNCTION_VALIDATE(params);
    209   const std::string networks_json =
    210       "[{"
    211       "    \"ConnectionState\": \"Connected\","
    212       "    \"GUID\": \"stub_ethernet\","
    213       "    \"Name\": \"eth0\","
    214       "    \"Type\": \"Ethernet\""
    215       "  },"
    216       "  {"
    217       "    \"ConnectionState\": \"Connected\","
    218       "    \"GUID\": \"stub_wifi1\","
    219       "    \"Name\": \"wifi1\","
    220       "    \"Type\": \"WiFi\","
    221       "    \"WiFi\": {"
    222       "      \"AutoConnect\": false,"
    223       "      \"Security\": \"WEP-PSK\","
    224       "      \"SignalStrength\": 0"
    225       "    }"
    226       "  },"
    227       "  {"
    228       "    \"ConnectionState\": \"Connected\","
    229       "    \"GUID\": \"stub_vpn1\","
    230       "    \"Name\": \"vpn1\","
    231       "    \"Type\": \"VPN\","
    232       "    \"VPN\": {"
    233       "      \"AutoConnect\": false"
    234       "    }"
    235       "  },"
    236       "  {"
    237       "    \"ConnectionState\": \"NotConnected\","
    238       "    \"GUID\": \"stub_wifi2\","
    239       "    \"Name\": \"wifi2_PSK\","
    240       "    \"Type\": \"WiFi\","
    241       "    \"WiFi\": {"
    242       "      \"AutoConnect\": false,"
    243       "      \"Security\": \"WPA-PSK\","
    244       "      \"SignalStrength\": 80"
    245       "    }"
    246       "  },"
    247       "  {"
    248       "    \"Cellular\": {"
    249       "      \"ActivateOverNonCellularNetwork\": false,"
    250       "      \"ActivationState\": \"not-activated\","
    251       "      \"NetworkTechnology\": \"GSM\","
    252       "      \"RoamingState\": \"home\""
    253       "    },"
    254       "    \"ConnectionState\": \"NotConnected\","
    255       "    \"GUID\": \"stub_cellular1\","
    256       "    \"Name\": \"cellular1\","
    257       "    \"Type\": \"Cellular\""
    258       "  }]";
    259   ListValue* visible_networks =
    260       static_cast<ListValue*>(base::JSONReader::Read(networks_json));
    261   // If caller only needs WiFi networks, then remove all other networks.
    262   if (params->type == api::GetVisibleNetworks::Params::TYPE_WIFI) {
    263     visible_networks->Remove(4, NULL);
    264     visible_networks->Remove(2, NULL);
    265     visible_networks->Remove(0, NULL);
    266   }
    267 
    268   SetResult(visible_networks);
    269   SendResponse(true);
    270   return true;
    271 }
    272 
    273 ////////////////////////////////////////////////////////////////////////////////
    274 // NetworkingPrivateRequestNetworkScanFunction
    275 
    276 NetworkingPrivateRequestNetworkScanFunction::
    277   ~NetworkingPrivateRequestNetworkScanFunction() {
    278 }
    279 
    280 bool NetworkingPrivateRequestNetworkScanFunction::RunImpl() {
    281   // Generate onNetworkListChanged event.
    282   std::vector<std::string> changes;
    283   changes.push_back("stub_ethernet");
    284   changes.push_back("stub_wifi1");
    285   changes.push_back("stub_vpn1");
    286   changes.push_back("stub_wifi2");
    287   changes.push_back("stub_cellular1");
    288 
    289   EventRouter* event_router = ExtensionSystem::Get(profile_)->event_router();
    290   scoped_ptr<base::ListValue> args(api::OnNetworkListChanged::Create(changes));
    291   scoped_ptr<extensions::Event> extension_event(new extensions::Event(
    292       kOnNetworkListChanged, args.Pass()));
    293   event_router->BroadcastEvent(extension_event.Pass());
    294 
    295   return true;
    296 }
    297 
    298 ////////////////////////////////////////////////////////////////////////////////
    299 // NetworkingPrivateStartConnectFunction
    300 
    301 NetworkingPrivateStartConnectFunction::
    302   ~NetworkingPrivateStartConnectFunction() {
    303 }
    304 
    305 bool NetworkingPrivateStartConnectFunction::RunImpl() {
    306   scoped_ptr<api::StartConnect::Params> params =
    307       api::StartConnect::Params::Create(*args_);
    308   EXTENSION_FUNCTION_VALIDATE(params);
    309   if (params->network_guid == "nonexistent_path") {
    310     error_ = "configure-failed";
    311     SendResponse(false);
    312   } else {
    313     SendResponse(true);
    314     // Set Properties to reflect connected state
    315     const std::string network_properties =
    316       "{\"ConnectionState\":\"Connected\","
    317        "\"GUID\":\"stub_wifi2\","
    318        "\"Name\":\"wifi2_PSK\","
    319        "\"Type\":\"WiFi\","
    320        "\"WiFi\":{"
    321          "\"SSID\":\"stub_wifi2\","
    322          "\"Security\":\"WPA-PSK\","
    323          "\"SignalStrength\":80}}";
    324 
    325     // Store network_properties in profile to return from GetProperties.
    326     profile()->SetUserData(kNetworkingPrivateProperties,
    327       new NetworkingPrivatePropertiesData(
    328         static_cast<DictionaryValue*>(
    329           base::JSONReader::Read(network_properties))));
    330 
    331     // Broadcast NetworksChanged Event that network is connected
    332     EventRouter* event_router = ExtensionSystem::Get(profile_)->event_router();
    333     scoped_ptr<base::ListValue> args(api::OnNetworksChanged::Create(
    334         std::vector<std::string>(1, params->network_guid)));
    335     scoped_ptr<extensions::Event> netchanged_event(
    336         new extensions::Event(kOnNetworksChanged, args.Pass()));
    337     event_router->BroadcastEvent(netchanged_event.Pass());
    338 
    339     // Generate NetworkListChanged event.
    340     std::vector<std::string> list;
    341     list.push_back("stub_ethernet");
    342     list.push_back("stub_wifi2");
    343     list.push_back("stub_vpn1");
    344     list.push_back("stub_wifi1");
    345     list.push_back("stub_cellular1");
    346 
    347     scoped_ptr<base::ListValue> arg2(api::OnNetworkListChanged::Create(list));
    348     scoped_ptr<extensions::Event> netlist_event(new extensions::Event(
    349         kOnNetworkListChanged, arg2.Pass()));
    350     event_router->BroadcastEvent(netlist_event.Pass());
    351   }
    352   return true;
    353 }
    354 
    355 ////////////////////////////////////////////////////////////////////////////////
    356 // NetworkingPrivateStartDisconnectFunction
    357 
    358 NetworkingPrivateStartDisconnectFunction::
    359   ~NetworkingPrivateStartDisconnectFunction() {
    360 }
    361 
    362 bool NetworkingPrivateStartDisconnectFunction::RunImpl() {
    363   scoped_ptr<api::StartDisconnect::Params> params =
    364       api::StartDisconnect::Params::Create(*args_);
    365   EXTENSION_FUNCTION_VALIDATE(params);
    366   if (params->network_guid == "nonexistent_path") {
    367     error_ = "not-found";
    368     SendResponse(false);
    369   } else {
    370     SendResponse(true);
    371 
    372     // Send Event that network is disconnected. Listener will use GetProperties.
    373     EventRouter* event_router = ExtensionSystem::Get(profile_)->event_router();
    374     scoped_ptr<base::ListValue> args(api::OnNetworksChanged::Create(
    375         std::vector<std::string>(1, params->network_guid)));
    376     scoped_ptr<extensions::Event> extension_event(
    377         new extensions::Event(kOnNetworksChanged, args.Pass()));
    378     event_router->BroadcastEvent(extension_event.Pass());
    379   }
    380   return true;
    381 }
    382 
    383 ////////////////////////////////////////////////////////////////////////////////
    384 // NetworkingPrivateVerifyDestinationFunction
    385 
    386 NetworkingPrivateVerifyDestinationFunction::
    387   ~NetworkingPrivateVerifyDestinationFunction() {
    388 }
    389 
    390 bool NetworkingPrivateVerifyDestinationFunction::RunImpl() {
    391   scoped_ptr<api::VerifyDestination::Params> params =
    392       api::VerifyDestination::Params::Create(*args_);
    393   EXTENSION_FUNCTION_VALIDATE(params);
    394   SetResult(new base::FundamentalValue(true));
    395   SendResponse(true);
    396   return true;
    397 }
    398 
    399 ////////////////////////////////////////////////////////////////////////////////
    400 // NetworkingPrivateVerifyAndEncryptCredentialsFunction
    401 
    402 NetworkingPrivateVerifyAndEncryptCredentialsFunction::
    403   ~NetworkingPrivateVerifyAndEncryptCredentialsFunction() {
    404 }
    405 
    406 bool NetworkingPrivateVerifyAndEncryptCredentialsFunction::RunImpl() {
    407   scoped_ptr<api::VerifyAndEncryptCredentials::Params> params =
    408       api::VerifyAndEncryptCredentials::Params::Create(*args_);
    409   EXTENSION_FUNCTION_VALIDATE(params);
    410   SetResult(new base::StringValue("encrypted_credentials"));
    411   SendResponse(true);
    412   return true;
    413 }
    414 
    415 ////////////////////////////////////////////////////////////////////////////////
    416 // NetworkingPrivateVerifyAndEncryptDataFunction
    417 
    418 NetworkingPrivateVerifyAndEncryptDataFunction::
    419   ~NetworkingPrivateVerifyAndEncryptDataFunction() {
    420 }
    421 
    422 bool NetworkingPrivateVerifyAndEncryptDataFunction::RunImpl() {
    423   scoped_ptr<api::VerifyAndEncryptData::Params> params =
    424       api::VerifyAndEncryptData::Params::Create(*args_);
    425   EXTENSION_FUNCTION_VALIDATE(params);
    426   SetResult(new base::StringValue("encrypted_data"));
    427   SendResponse(true);
    428   return true;
    429 }
    430