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