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.
5 #include "chrome/browser/extensions/api/networking_private/networking_private_api.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_router.h"
14 #include "chrome/browser/extensions/extension_function_registry.h"
15 #include "chrome/browser/extensions/extension_system.h"
16 #include "chrome/browser/profiles/profile.h"
17 #include "chrome/common/chrome_switches.h"
18 #include "chrome/common/extensions/api/networking_private.h"
20 using extensions::EventRouter;
21 using extensions::ExtensionSystem;
22 namespace api = extensions::api::networking_private;
24 ////////////////////////////////////////////////////////////////////////////////
25 // NetworkingPrivateGetPropertiesFunction
28 const char kNetworkingPrivateProperties[] = "NetworkingPrivateProperties";
30 struct NetworkingPrivatePropertiesData : base::SupportsUserData::Data {
31 explicit NetworkingPrivatePropertiesData(const base::DictionaryValue* prop) :
32 properties_(prop->DeepCopy()) { }
33 scoped_ptr<base::DictionaryValue> properties_;
36 NetworkingPrivateGetPropertiesFunction::
37 ~NetworkingPrivateGetPropertiesFunction() {
40 bool NetworkingPrivateGetPropertiesFunction::RunImpl() {
41 scoped_ptr<api::GetProperties::Params> params =
42 api::GetProperties::Params::Create(*args_);
43 EXTENSION_FUNCTION_VALIDATE(params);
45 // If there are properties set by SetProperties function, use those.
46 NetworkingPrivatePropertiesData* stored_properties =
47 static_cast<NetworkingPrivatePropertiesData*>(
48 GetProfile()->GetUserData(kNetworkingPrivateProperties));
49 if (stored_properties != NULL) {
50 SetResult(stored_properties->properties_.release());
55 const std::string network_properties =
56 "{\"ConnectionState\":\"NotConnected\","
57 "\"GUID\":\"stub_wifi2\","
58 "\"Name\":\"wifi2_PSK\","
62 "\"FrequencyList\":[2400,5000],"
63 "\"SSID\":\"wifi2_PSK\","
64 "\"Security\":\"WPA-PSK\","
65 "\"SignalStrength\":80}}";
67 if (params->network_guid == "nonexistent_path") {
68 error_ = "Error.DBusFailed";
71 SetResult(base::JSONReader::Read(network_properties));
77 ////////////////////////////////////////////////////////////////////////////////
78 // NetworkingPrivateGetManagedPropertiesFunction
80 NetworkingPrivateGetManagedPropertiesFunction::
81 ~NetworkingPrivateGetManagedPropertiesFunction() {
84 bool NetworkingPrivateGetManagedPropertiesFunction::RunImpl() {
85 scoped_ptr<api::GetManagedProperties::Params> params =
86 api::GetManagedProperties::Params::Create(*args_);
87 EXTENSION_FUNCTION_VALIDATE(params);
88 const std::string network_properties =
90 " \"ConnectionState\": {"
91 " \"Active\": \"NotConnected\","
92 " \"Effective\": \"Unmanaged\""
94 " \"GUID\": \"stub_wifi2\","
96 " \"Active\": \"wifi2_PSK\","
97 " \"Effective\": \"UserPolicy\","
98 " \"UserPolicy\": \"My WiFi Network\""
101 " \"Active\": \"WiFi\","
102 " \"Effective\": \"UserPolicy\","
103 " \"UserPolicy\": \"WiFi\""
106 " \"AutoConnect\": {"
107 " \"Active\": false,"
108 " \"UserEditable\": true"
112 " \"Effective\": \"Unmanaged\""
114 " \"FrequencyList\" : {"
115 " \"Active\": [2400, 5000],"
116 " \"Effective\": \"Unmanaged\""
119 " \"Effective\": \"UserSetting\","
120 " \"UserEditable\": true,"
121 " \"UserSetting\": \"FAKE_CREDENTIAL_VPaJDV9x\""
124 " \"Active\": \"wifi2_PSK\","
125 " \"Effective\": \"UserPolicy\","
126 " \"UserPolicy\": \"wifi2_PSK\""
129 " \"Active\": \"WPA-PSK\","
130 " \"Effective\": \"UserPolicy\","
131 " \"UserPolicy\": \"WPA-PSK\""
133 " \"SignalStrength\": {"
135 " \"Effective\": \"Unmanaged\""
140 SetResult(base::JSONReader::Read(network_properties));
145 ////////////////////////////////////////////////////////////////////////////////
146 // NetworkingPrivateGetStateFunction
148 NetworkingPrivateGetStateFunction::
149 ~NetworkingPrivateGetStateFunction() {
152 bool NetworkingPrivateGetStateFunction::RunImpl() {
153 scoped_ptr<api::GetState::Params> params =
154 api::GetState::Params::Create(*args_);
155 EXTENSION_FUNCTION_VALIDATE(params);
156 const std::string network_state =
158 " \"ConnectionState\": \"NotConnected\","
159 " \"GUID\": \"stub_wifi2\","
160 " \"Name\": \"wifi2_PSK\","
161 " \"Type\": \"WiFi\","
163 " \"Security\": \"WPA-PSK\","
164 " \"SignalStrength\": 80"
167 SetResult(base::JSONReader::Read(network_state));
173 ////////////////////////////////////////////////////////////////////////////////
174 // NetworkingPrivateSetPropertiesFunction
176 NetworkingPrivateSetPropertiesFunction::
177 ~NetworkingPrivateSetPropertiesFunction() {
180 bool NetworkingPrivateSetPropertiesFunction::RunImpl() {
181 scoped_ptr<api::SetProperties::Params> params =
182 api::SetProperties::Params::Create(*args_);
183 EXTENSION_FUNCTION_VALIDATE(params);
184 scoped_ptr<base::DictionaryValue> properties_dict(
185 params->properties.ToValue());
187 // Store properties_dict in profile to return from GetProperties.
188 GetProfile()->SetUserData(
189 kNetworkingPrivateProperties,
190 new NetworkingPrivatePropertiesData(properties_dict.get()));
195 ////////////////////////////////////////////////////////////////////////////////
196 // NetworkingPrivateCreateNetworkFunction
198 NetworkingPrivateCreateNetworkFunction::
199 ~NetworkingPrivateCreateNetworkFunction() {
202 bool NetworkingPrivateCreateNetworkFunction::RunImpl() {
203 scoped_ptr<api::CreateNetwork::Params> params =
204 api::CreateNetwork::Params::Create(*args_);
205 EXTENSION_FUNCTION_VALIDATE(params);
207 // Store properties_dict in profile to return from GetProperties.
208 scoped_ptr<base::DictionaryValue> properties_dict(
209 params->properties.ToValue());
210 properties_dict->SetString("GUID", "fake_guid");
211 GetProfile()->SetUserData(
212 kNetworkingPrivateProperties,
213 new NetworkingPrivatePropertiesData(properties_dict.get()));
215 results_ = api::CreateNetwork::Results::Create("fake_guid");
220 ////////////////////////////////////////////////////////////////////////////////
221 // NetworkingPrivateGetVisibleNetworksFunction
223 NetworkingPrivateGetVisibleNetworksFunction::
224 ~NetworkingPrivateGetVisibleNetworksFunction() {
227 bool NetworkingPrivateGetVisibleNetworksFunction::RunImpl() {
228 scoped_ptr<api::GetVisibleNetworks::Params> params =
229 api::GetVisibleNetworks::Params::Create(*args_);
230 EXTENSION_FUNCTION_VALIDATE(params);
231 const std::string networks_json =
233 " \"ConnectionState\": \"Connected\","
234 " \"GUID\": \"stub_ethernet\","
235 " \"Name\": \"eth0\","
236 " \"Type\": \"Ethernet\","
238 " \"Authentication\": \"None\""
242 " \"ConnectionState\": \"Connected\","
243 " \"GUID\": \"stub_wifi1\","
244 " \"Name\": \"wifi1\","
245 " \"Type\": \"WiFi\","
247 " \"Security\": \"WEP-PSK\","
248 " \"SignalStrength\": 0"
252 " \"ConnectionState\": \"Connected\","
253 " \"GUID\": \"stub_vpn1\","
254 " \"Name\": \"vpn1\","
258 " \"ConnectionState\": \"NotConnected\","
259 " \"GUID\": \"stub_wifi2\","
260 " \"Name\": \"wifi2_PSK\","
261 " \"Type\": \"WiFi\","
263 " \"Security\": \"WPA-PSK\","
264 " \"SignalStrength\": 80"
269 " \"ActivateOverNonCellularNetwork\": false,"
270 " \"ActivationState\": \"not-activated\","
271 " \"NetworkTechnology\": \"GSM\","
272 " \"RoamingState\": \"home\""
274 " \"ConnectionState\": \"NotConnected\","
275 " \"GUID\": \"stub_cellular1\","
276 " \"Name\": \"cellular1\","
277 " \"Type\": \"Cellular\""
279 ListValue* visible_networks =
280 static_cast<ListValue*>(base::JSONReader::Read(networks_json));
281 // If caller only needs WiFi networks, then remove all other networks.
282 if (params->type == api::GetVisibleNetworks::Params::TYPE_WIFI) {
283 visible_networks->Remove(4, NULL);
284 visible_networks->Remove(2, NULL);
285 visible_networks->Remove(0, NULL);
288 SetResult(visible_networks);
293 ////////////////////////////////////////////////////////////////////////////////
294 // NetworkingPrivateGetEnabledNetworkTypesFunction
296 NetworkingPrivateGetEnabledNetworkTypesFunction::
297 ~NetworkingPrivateGetEnabledNetworkTypesFunction() {
300 bool NetworkingPrivateGetEnabledNetworkTypesFunction::RunImpl() {
301 base::ListValue* network_list = new base::ListValue;
303 network_list->Append(new base::StringValue("Ethernet"));
304 network_list->Append(new base::StringValue("WiFi"));
305 network_list->Append(new base::StringValue("Cellular"));
307 SetResult(network_list);
311 ////////////////////////////////////////////////////////////////////////////////
312 // NetworkingPrivateEnableNetworkTypeFunction
314 NetworkingPrivateEnableNetworkTypeFunction::
315 ~NetworkingPrivateEnableNetworkTypeFunction() {
318 bool NetworkingPrivateEnableNetworkTypeFunction::RunImpl() {
319 scoped_ptr<api::EnableNetworkType::Params> params =
320 api::EnableNetworkType::Params::Create(*args_);
321 EXTENSION_FUNCTION_VALIDATE(params);
325 ////////////////////////////////////////////////////////////////////////////////
326 // NetworkingPrivateDisableNetworkTypeFunction
328 NetworkingPrivateDisableNetworkTypeFunction::
329 ~NetworkingPrivateDisableNetworkTypeFunction() {
332 bool NetworkingPrivateDisableNetworkTypeFunction::RunImpl() {
333 scoped_ptr<api::DisableNetworkType::Params> params =
334 api::DisableNetworkType::Params::Create(*args_);
335 EXTENSION_FUNCTION_VALIDATE(params);
339 ////////////////////////////////////////////////////////////////////////////////
340 // NetworkingPrivateRequestNetworkScanFunction
342 NetworkingPrivateRequestNetworkScanFunction::
343 ~NetworkingPrivateRequestNetworkScanFunction() {
346 bool NetworkingPrivateRequestNetworkScanFunction::RunImpl() {
347 // Generate onNetworkListChanged event.
348 std::vector<std::string> changes;
349 changes.push_back("stub_ethernet");
350 changes.push_back("stub_wifi1");
351 changes.push_back("stub_vpn1");
352 changes.push_back("stub_wifi2");
353 changes.push_back("stub_cellular1");
355 EventRouter* event_router =
356 ExtensionSystem::Get(GetProfile())->event_router();
357 scoped_ptr<base::ListValue> args(api::OnNetworkListChanged::Create(changes));
358 scoped_ptr<extensions::Event> extension_event(new extensions::Event(
359 api::OnNetworkListChanged::kEventName, args.Pass()));
360 event_router->BroadcastEvent(extension_event.Pass());
365 ////////////////////////////////////////////////////////////////////////////////
366 // NetworkingPrivateStartConnectFunction
368 NetworkingPrivateStartConnectFunction::
369 ~NetworkingPrivateStartConnectFunction() {
372 bool NetworkingPrivateStartConnectFunction::RunImpl() {
373 scoped_ptr<api::StartConnect::Params> params =
374 api::StartConnect::Params::Create(*args_);
375 EXTENSION_FUNCTION_VALIDATE(params);
376 if (params->network_guid == "nonexistent_path") {
377 error_ = "configure-failed";
381 // Set Properties to reflect connected state
382 const std::string network_properties =
383 "{\"ConnectionState\":\"Connected\","
384 "\"GUID\":\"stub_wifi2\","
385 "\"Name\":\"wifi2_PSK\","
388 "\"SSID\":\"stub_wifi2\","
389 "\"Security\":\"WPA-PSK\","
390 "\"SignalStrength\":80}}";
392 // Store network_properties in profile to return from GetProperties.
393 scoped_ptr<Value> network_properties_value(
394 base::JSONReader::Read(network_properties));
395 GetProfile()->SetUserData(
396 kNetworkingPrivateProperties,
397 new NetworkingPrivatePropertiesData(
398 static_cast<DictionaryValue*>(network_properties_value.get())));
400 // Broadcast NetworksChanged Event that network is connected
401 EventRouter* event_router =
402 ExtensionSystem::Get(GetProfile())->event_router();
403 scoped_ptr<base::ListValue> args(api::OnNetworksChanged::Create(
404 std::vector<std::string>(1, params->network_guid)));
405 scoped_ptr<extensions::Event> netchanged_event(
406 new extensions::Event(api::OnNetworksChanged::kEventName, args.Pass()));
407 event_router->BroadcastEvent(netchanged_event.Pass());
409 // Generate NetworkListChanged event.
410 std::vector<std::string> list;
411 list.push_back("stub_ethernet");
412 list.push_back("stub_wifi2");
413 list.push_back("stub_vpn1");
414 list.push_back("stub_wifi1");
415 list.push_back("stub_cellular1");
417 scoped_ptr<base::ListValue> arg2(api::OnNetworkListChanged::Create(list));
418 scoped_ptr<extensions::Event> netlist_event(new extensions::Event(
419 api::OnNetworkListChanged::kEventName, arg2.Pass()));
420 event_router->BroadcastEvent(netlist_event.Pass());
425 ////////////////////////////////////////////////////////////////////////////////
426 // NetworkingPrivateStartDisconnectFunction
428 NetworkingPrivateStartDisconnectFunction::
429 ~NetworkingPrivateStartDisconnectFunction() {
432 bool NetworkingPrivateStartDisconnectFunction::RunImpl() {
433 scoped_ptr<api::StartDisconnect::Params> params =
434 api::StartDisconnect::Params::Create(*args_);
435 EXTENSION_FUNCTION_VALIDATE(params);
436 if (params->network_guid == "nonexistent_path") {
437 error_ = "not-found";
442 // Send Event that network is disconnected. Listener will use GetProperties.
443 EventRouter* event_router =
444 ExtensionSystem::Get(GetProfile())->event_router();
445 scoped_ptr<base::ListValue> args(api::OnNetworksChanged::Create(
446 std::vector<std::string>(1, params->network_guid)));
447 scoped_ptr<extensions::Event> extension_event(
448 new extensions::Event(api::OnNetworksChanged::kEventName, args.Pass()));
449 event_router->BroadcastEvent(extension_event.Pass());
454 ////////////////////////////////////////////////////////////////////////////////
455 // NetworkingPrivateVerifyDestinationFunction
457 NetworkingPrivateVerifyDestinationFunction::
458 ~NetworkingPrivateVerifyDestinationFunction() {
461 bool NetworkingPrivateVerifyDestinationFunction::RunImpl() {
462 scoped_ptr<api::VerifyDestination::Params> params =
463 api::VerifyDestination::Params::Create(*args_);
464 EXTENSION_FUNCTION_VALIDATE(params);
465 SetResult(new base::FundamentalValue(true));
470 ////////////////////////////////////////////////////////////////////////////////
471 // NetworkingPrivateVerifyAndEncryptCredentialsFunction
473 NetworkingPrivateVerifyAndEncryptCredentialsFunction::
474 ~NetworkingPrivateVerifyAndEncryptCredentialsFunction() {
477 bool NetworkingPrivateVerifyAndEncryptCredentialsFunction::RunImpl() {
478 scoped_ptr<api::VerifyAndEncryptCredentials::Params> params =
479 api::VerifyAndEncryptCredentials::Params::Create(*args_);
480 EXTENSION_FUNCTION_VALIDATE(params);
481 SetResult(new base::StringValue("encrypted_credentials"));
486 ////////////////////////////////////////////////////////////////////////////////
487 // NetworkingPrivateVerifyAndEncryptDataFunction
489 NetworkingPrivateVerifyAndEncryptDataFunction::
490 ~NetworkingPrivateVerifyAndEncryptDataFunction() {
493 bool NetworkingPrivateVerifyAndEncryptDataFunction::RunImpl() {
494 scoped_ptr<api::VerifyAndEncryptData::Params> params =
495 api::VerifyAndEncryptData::Params::Create(*args_);
496 EXTENSION_FUNCTION_VALIDATE(params);
497 SetResult(new base::StringValue("encrypted_data"));