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 "chrome/browser/browser_process.h"
12 #include "chrome/browser/browser_process_platform_part_chromeos.h"
13 #include "chrome/browser/chromeos/profiles/profile_helper.h"
14 #include "chrome/browser/extensions/extension_function_registry.h"
15 #include "chrome/common/chrome_switches.h"
16 #include "chrome/common/extensions/api/networking_private.h"
17 #include "chromeos/dbus/dbus_thread_manager.h"
18 #include "chromeos/dbus/shill_manager_client.h"
19 #include "chromeos/network/managed_network_configuration_handler.h"
20 #include "chromeos/network/network_connection_handler.h"
21 #include "chromeos/network/network_state.h"
22 #include "chromeos/network/network_state_handler.h"
23 #include "chromeos/network/onc/onc_signature.h"
24 #include "chromeos/network/onc/onc_translator.h"
25 #include "chromeos/network/shill_property_util.h"
26 #include "components/onc/onc_constants.h"
28 namespace api = extensions::api::networking_private;
30 using chromeos::DBusThreadManager;
31 using chromeos::ManagedNetworkConfigurationHandler;
32 using chromeos::NetworkHandler;
33 using chromeos::NetworkState;
34 using chromeos::NetworkStateHandler;
35 using chromeos::NetworkTypePattern;
36 using chromeos::ShillManagerClient;
40 // Helper function that converts between the two types of verification
41 // properties. They should always have the same fields, but we do this here to
42 // prevent ShillManagerClient from depending directly on the extension API.
43 ShillManagerClient::VerificationProperties ConvertVerificationProperties(
44 const api::VerificationProperties& input) {
45 ShillManagerClient::VerificationProperties output;
46 COMPILE_ASSERT(sizeof(api::VerificationProperties) ==
47 sizeof(ShillManagerClient::VerificationProperties),
48 verification_properties_no_longer_match);
50 output.certificate = input.certificate;
51 output.public_key = input.public_key;
52 output.nonce = input.nonce;
53 output.signed_data = input.signed_data;
54 output.device_serial = input.device_serial;
55 output.device_ssid = input.device_ssid;
56 output.device_bssid = input.device_bssid;
60 std::string GetUserIdHash(Profile* profile) {
61 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kMultiProfiles)) {
62 return g_browser_process->platform_part()->
63 profile_helper()->GetUserIdHashFromProfile(profile);
65 return g_browser_process->platform_part()->
66 profile_helper()->active_user_id_hash();
72 ////////////////////////////////////////////////////////////////////////////////
73 // NetworkingPrivateGetPropertiesFunction
75 NetworkingPrivateGetPropertiesFunction::
76 ~NetworkingPrivateGetPropertiesFunction() {
79 bool NetworkingPrivateGetPropertiesFunction::RunImpl() {
80 scoped_ptr<api::GetProperties::Params> params =
81 api::GetProperties::Params::Create(*args_);
82 EXTENSION_FUNCTION_VALIDATE(params);
84 NetworkHandler::Get()->managed_network_configuration_handler()->GetProperties(
85 params->network_guid, // service path
86 base::Bind(&NetworkingPrivateGetPropertiesFunction::GetPropertiesSuccess,
88 base::Bind(&NetworkingPrivateGetPropertiesFunction::GetPropertiesFailed,
93 void NetworkingPrivateGetPropertiesFunction::GetPropertiesSuccess(
94 const std::string& service_path,
95 const base::DictionaryValue& dictionary) {
96 base::DictionaryValue* network_properties = dictionary.DeepCopy();
97 network_properties->SetStringWithoutPathExpansion(onc::network_config::kGUID,
99 SetResult(network_properties);
103 void NetworkingPrivateGetPropertiesFunction::GetPropertiesFailed(
104 const std::string& error_name,
105 scoped_ptr<base::DictionaryValue> error_data) {
110 ////////////////////////////////////////////////////////////////////////////////
111 // NetworkingPrivateGetManagedPropertiesFunction
113 NetworkingPrivateGetManagedPropertiesFunction::
114 ~NetworkingPrivateGetManagedPropertiesFunction() {
117 bool NetworkingPrivateGetManagedPropertiesFunction::RunImpl() {
118 scoped_ptr<api::GetManagedProperties::Params> params =
119 api::GetManagedProperties::Params::Create(*args_);
120 EXTENSION_FUNCTION_VALIDATE(params);
122 std::string user_id_hash;
123 GetUserIdHash(GetProfile());
124 NetworkHandler::Get()->managed_network_configuration_handler()->
125 GetManagedProperties(
127 params->network_guid, // service path
128 base::Bind(&NetworkingPrivateGetManagedPropertiesFunction::Success,
130 base::Bind(&NetworkingPrivateGetManagedPropertiesFunction::Failure,
135 void NetworkingPrivateGetManagedPropertiesFunction::Success(
136 const std::string& service_path,
137 const base::DictionaryValue& dictionary) {
138 base::DictionaryValue* network_properties = dictionary.DeepCopy();
139 network_properties->SetStringWithoutPathExpansion(onc::network_config::kGUID,
141 SetResult(network_properties);
145 void NetworkingPrivateGetManagedPropertiesFunction::Failure(
146 const std::string& error_name,
147 scoped_ptr<base::DictionaryValue> error_data) {
152 ////////////////////////////////////////////////////////////////////////////////
153 // NetworkingPrivateGetStateFunction
155 NetworkingPrivateGetStateFunction::
156 ~NetworkingPrivateGetStateFunction() {
159 bool NetworkingPrivateGetStateFunction::RunImpl() {
160 scoped_ptr<api::GetState::Params> params =
161 api::GetState::Params::Create(*args_);
162 EXTENSION_FUNCTION_VALIDATE(params);
163 // The |network_guid| parameter is storing the service path.
164 std::string service_path = params->network_guid;
166 const NetworkState* state = NetworkHandler::Get()->network_state_handler()->
167 GetNetworkState(service_path);
169 error_ = "Error.InvalidParameter";
173 scoped_ptr<base::DictionaryValue> result_dict(new base::DictionaryValue);
174 state->GetProperties(result_dict.get());
175 scoped_ptr<base::DictionaryValue> onc_network_part =
176 chromeos::onc::TranslateShillServiceToONCPart(*result_dict,
177 &chromeos::onc::kNetworkWithStateSignature);
178 SetResult(onc_network_part.release());
184 ////////////////////////////////////////////////////////////////////////////////
185 // NetworkingPrivateSetPropertiesFunction
187 NetworkingPrivateSetPropertiesFunction::
188 ~NetworkingPrivateSetPropertiesFunction() {
191 bool NetworkingPrivateSetPropertiesFunction::RunImpl() {
192 scoped_ptr<api::SetProperties::Params> params =
193 api::SetProperties::Params::Create(*args_);
194 EXTENSION_FUNCTION_VALIDATE(params);
196 scoped_ptr<base::DictionaryValue> properties_dict(
197 params->properties.ToValue());
199 NetworkHandler::Get()->managed_network_configuration_handler()->SetProperties(
200 params->network_guid, // service path
202 base::Bind(&NetworkingPrivateSetPropertiesFunction::ResultCallback,
204 base::Bind(&NetworkingPrivateSetPropertiesFunction::ErrorCallback,
209 void NetworkingPrivateSetPropertiesFunction::ErrorCallback(
210 const std::string& error_name,
211 const scoped_ptr<base::DictionaryValue> error_data) {
216 void NetworkingPrivateSetPropertiesFunction::ResultCallback() {
220 ////////////////////////////////////////////////////////////////////////////////
221 // NetworkingPrivateCreateNetworkFunction
223 NetworkingPrivateCreateNetworkFunction::
224 ~NetworkingPrivateCreateNetworkFunction() {
227 bool NetworkingPrivateCreateNetworkFunction::RunImpl() {
228 scoped_ptr<api::CreateNetwork::Params> params =
229 api::CreateNetwork::Params::Create(*args_);
230 EXTENSION_FUNCTION_VALIDATE(params);
232 std::string user_id_hash;
234 user_id_hash = GetUserIdHash(GetProfile());
236 scoped_ptr<base::DictionaryValue> properties_dict(
237 params->properties.ToValue());
239 NetworkHandler::Get()->managed_network_configuration_handler()->
243 base::Bind(&NetworkingPrivateCreateNetworkFunction::ResultCallback,
245 base::Bind(&NetworkingPrivateCreateNetworkFunction::ErrorCallback,
250 void NetworkingPrivateCreateNetworkFunction::ErrorCallback(
251 const std::string& error_name,
252 const scoped_ptr<base::DictionaryValue> error_data) {
257 void NetworkingPrivateCreateNetworkFunction::ResultCallback(
258 const std::string& guid) {
259 results_ = api::CreateNetwork::Results::Create(guid);
263 ////////////////////////////////////////////////////////////////////////////////
264 // NetworkingPrivateGetVisibleNetworksFunction
266 NetworkingPrivateGetVisibleNetworksFunction::
267 ~NetworkingPrivateGetVisibleNetworksFunction() {
270 bool NetworkingPrivateGetVisibleNetworksFunction::RunImpl() {
271 scoped_ptr<api::GetVisibleNetworks::Params> params =
272 api::GetVisibleNetworks::Params::Create(*args_);
273 EXTENSION_FUNCTION_VALIDATE(params);
274 std::string type_filter =
275 api::GetVisibleNetworks::Params::ToString(params->type);
277 NetworkStateHandler::NetworkStateList network_states;
278 NetworkHandler::Get()->network_state_handler()->GetNetworkList(
281 base::ListValue* network_properties_list = new base::ListValue;
282 for (NetworkStateHandler::NetworkStateList::iterator it =
283 network_states.begin();
284 it != network_states.end(); ++it) {
285 const std::string& service_path = (*it)->path();
286 base::DictionaryValue shill_dictionary;
287 (*it)->GetProperties(&shill_dictionary);
289 scoped_ptr<base::DictionaryValue> onc_network_part =
290 chromeos::onc::TranslateShillServiceToONCPart(shill_dictionary,
291 &chromeos::onc::kNetworkWithStateSignature);
293 std::string onc_type;
294 onc_network_part->GetStringWithoutPathExpansion(onc::network_config::kType,
296 if (type_filter == onc::network_type::kAllTypes ||
297 onc_type == type_filter) {
298 onc_network_part->SetStringWithoutPathExpansion(
299 onc::network_config::kGUID,
301 network_properties_list->Append(onc_network_part.release());
305 SetResult(network_properties_list);
310 ////////////////////////////////////////////////////////////////////////////////
311 // NetworkingPrivateGetEnabledNetworkTypesFunction
313 NetworkingPrivateGetEnabledNetworkTypesFunction::
314 ~NetworkingPrivateGetEnabledNetworkTypesFunction() {
317 bool NetworkingPrivateGetEnabledNetworkTypesFunction::RunImpl() {
318 NetworkStateHandler* state_handler =
319 NetworkHandler::Get()->network_state_handler();
321 base::ListValue* network_list = new base::ListValue;
323 if (state_handler->IsTechnologyEnabled(NetworkTypePattern::Ethernet()))
324 network_list->AppendString("Ethernet");
325 if (state_handler->IsTechnologyEnabled(NetworkTypePattern::WiFi()))
326 network_list->AppendString("WiFi");
327 if (state_handler->IsTechnologyEnabled(NetworkTypePattern::Cellular()))
328 network_list->AppendString("Cellular");
330 SetResult(network_list);
334 ////////////////////////////////////////////////////////////////////////////////
335 // NetworkingPrivateEnableNetworkTypeFunction
337 NetworkingPrivateEnableNetworkTypeFunction::
338 ~NetworkingPrivateEnableNetworkTypeFunction() {
341 bool NetworkingPrivateEnableNetworkTypeFunction::RunImpl() {
342 scoped_ptr<api::EnableNetworkType::Params> params =
343 api::EnableNetworkType::Params::Create(*args_);
344 EXTENSION_FUNCTION_VALIDATE(params);
345 NetworkStateHandler* state_handler =
346 NetworkHandler::Get()->network_state_handler();
348 switch (params->network_type) {
349 case api::NETWORK_TYPE_ETHERNET:
350 state_handler->SetTechnologyEnabled(
351 NetworkTypePattern::Ethernet(), true,
352 chromeos::network_handler::ErrorCallback());
355 case api::NETWORK_TYPE_WIFI:
356 state_handler->SetTechnologyEnabled(
357 NetworkTypePattern::WiFi(), true,
358 chromeos::network_handler::ErrorCallback());
361 case api::NETWORK_TYPE_CELLULAR:
362 state_handler->SetTechnologyEnabled(
363 NetworkTypePattern::Cellular(), true,
364 chromeos::network_handler::ErrorCallback());
373 ////////////////////////////////////////////////////////////////////////////////
374 // NetworkingPrivateDisableNetworkTypeFunction
376 NetworkingPrivateDisableNetworkTypeFunction::
377 ~NetworkingPrivateDisableNetworkTypeFunction() {
380 bool NetworkingPrivateDisableNetworkTypeFunction::RunImpl() {
381 scoped_ptr<api::DisableNetworkType::Params> params =
382 api::DisableNetworkType::Params::Create(*args_);
383 NetworkStateHandler* state_handler =
384 NetworkHandler::Get()->network_state_handler();
386 switch (params->network_type) {
387 case api::NETWORK_TYPE_ETHERNET:
388 state_handler->SetTechnologyEnabled(
389 NetworkTypePattern::Ethernet(), false,
390 chromeos::network_handler::ErrorCallback());
393 case api::NETWORK_TYPE_WIFI:
394 state_handler->SetTechnologyEnabled(
395 NetworkTypePattern::WiFi(), false,
396 chromeos::network_handler::ErrorCallback());
399 case api::NETWORK_TYPE_CELLULAR:
400 state_handler->SetTechnologyEnabled(
401 NetworkTypePattern::Cellular(), false,
402 chromeos::network_handler::ErrorCallback());
412 ////////////////////////////////////////////////////////////////////////////////
413 // NetworkingPrivateRequestNetworkScanFunction
415 NetworkingPrivateRequestNetworkScanFunction::
416 ~NetworkingPrivateRequestNetworkScanFunction() {
419 bool NetworkingPrivateRequestNetworkScanFunction::RunImpl() {
420 NetworkHandler::Get()->network_state_handler()->RequestScan();
424 ////////////////////////////////////////////////////////////////////////////////
425 // NetworkingPrivateStartConnectFunction
427 NetworkingPrivateStartConnectFunction::
428 ~NetworkingPrivateStartConnectFunction() {
431 void NetworkingPrivateStartConnectFunction::ConnectionStartSuccess() {
435 void NetworkingPrivateStartConnectFunction::ConnectionStartFailed(
436 const std::string& error_name,
437 const scoped_ptr<base::DictionaryValue> error_data) {
442 bool NetworkingPrivateStartConnectFunction::RunImpl() {
443 scoped_ptr<api::StartConnect::Params> params =
444 api::StartConnect::Params::Create(*args_);
445 EXTENSION_FUNCTION_VALIDATE(params);
447 const bool check_error_state = false;
448 NetworkHandler::Get()->network_connection_handler()->ConnectToNetwork(
449 params->network_guid, // service path
451 &NetworkingPrivateStartConnectFunction::ConnectionStartSuccess,
454 &NetworkingPrivateStartConnectFunction::ConnectionStartFailed,
460 ////////////////////////////////////////////////////////////////////////////////
461 // NetworkingPrivateStartDisconnectFunction
463 NetworkingPrivateStartDisconnectFunction::
464 ~NetworkingPrivateStartDisconnectFunction() {
467 void NetworkingPrivateStartDisconnectFunction::DisconnectionStartSuccess() {
471 void NetworkingPrivateStartDisconnectFunction::DisconnectionStartFailed(
472 const std::string& error_name,
473 const scoped_ptr<base::DictionaryValue> error_data) {
478 bool NetworkingPrivateStartDisconnectFunction::RunImpl() {
479 scoped_ptr<api::StartDisconnect::Params> params =
480 api::StartDisconnect::Params::Create(*args_);
481 EXTENSION_FUNCTION_VALIDATE(params);
483 NetworkHandler::Get()->network_connection_handler()->DisconnectNetwork(
484 params->network_guid, // service path
486 &NetworkingPrivateStartDisconnectFunction::DisconnectionStartSuccess,
489 &NetworkingPrivateStartDisconnectFunction::DisconnectionStartFailed,
494 ////////////////////////////////////////////////////////////////////////////////
495 // NetworkingPrivateVerifyDestinationFunction
497 NetworkingPrivateVerifyDestinationFunction::
498 ~NetworkingPrivateVerifyDestinationFunction() {
501 bool NetworkingPrivateVerifyDestinationFunction::RunImpl() {
502 scoped_ptr<api::VerifyDestination::Params> params =
503 api::VerifyDestination::Params::Create(*args_);
504 EXTENSION_FUNCTION_VALIDATE(params);
506 ShillManagerClient::VerificationProperties verification_properties =
507 ConvertVerificationProperties(params->properties);
509 DBusThreadManager::Get()->GetShillManagerClient()->VerifyDestination(
510 verification_properties,
512 &NetworkingPrivateVerifyDestinationFunction::ResultCallback,
515 &NetworkingPrivateVerifyDestinationFunction::ErrorCallback,
520 void NetworkingPrivateVerifyDestinationFunction::ResultCallback(
522 results_ = api::VerifyDestination::Results::Create(result);
526 void NetworkingPrivateVerifyDestinationFunction::ErrorCallback(
527 const std::string& error_name, const std::string& error) {
532 ////////////////////////////////////////////////////////////////////////////////
533 // NetworkingPrivateVerifyAndEncryptCredentialsFunction
535 NetworkingPrivateVerifyAndEncryptCredentialsFunction::
536 ~NetworkingPrivateVerifyAndEncryptCredentialsFunction() {
539 bool NetworkingPrivateVerifyAndEncryptCredentialsFunction::RunImpl() {
540 scoped_ptr<api::VerifyAndEncryptCredentials::Params> params =
541 api::VerifyAndEncryptCredentials::Params::Create(*args_);
542 EXTENSION_FUNCTION_VALIDATE(params);
543 ShillManagerClient* shill_manager_client =
544 DBusThreadManager::Get()->GetShillManagerClient();
546 ShillManagerClient::VerificationProperties verification_properties =
547 ConvertVerificationProperties(params->properties);
549 shill_manager_client->VerifyAndEncryptCredentials(
550 verification_properties,
553 &NetworkingPrivateVerifyAndEncryptCredentialsFunction::ResultCallback,
556 &NetworkingPrivateVerifyAndEncryptCredentialsFunction::ErrorCallback,
561 void NetworkingPrivateVerifyAndEncryptCredentialsFunction::ResultCallback(
562 const std::string& result) {
563 results_ = api::VerifyAndEncryptCredentials::Results::Create(result);
567 void NetworkingPrivateVerifyAndEncryptCredentialsFunction::ErrorCallback(
568 const std::string& error_name, const std::string& error) {
573 ////////////////////////////////////////////////////////////////////////////////
574 // NetworkingPrivateVerifyAndEncryptDataFunction
576 NetworkingPrivateVerifyAndEncryptDataFunction::
577 ~NetworkingPrivateVerifyAndEncryptDataFunction() {
580 bool NetworkingPrivateVerifyAndEncryptDataFunction::RunImpl() {
581 scoped_ptr<api::VerifyAndEncryptData::Params> params =
582 api::VerifyAndEncryptData::Params::Create(*args_);
583 EXTENSION_FUNCTION_VALIDATE(params);
585 ShillManagerClient::VerificationProperties verification_properties =
586 ConvertVerificationProperties(params->properties);
588 DBusThreadManager::Get()->GetShillManagerClient()->VerifyAndEncryptData(
589 verification_properties,
592 &NetworkingPrivateVerifyAndEncryptDataFunction::ResultCallback,
595 &NetworkingPrivateVerifyAndEncryptDataFunction::ErrorCallback,
600 void NetworkingPrivateVerifyAndEncryptDataFunction::ResultCallback(
601 const std::string& result) {
602 results_ = api::VerifyAndEncryptData::Results::Create(result);
606 void NetworkingPrivateVerifyAndEncryptDataFunction::ErrorCallback(
607 const std::string& error_name, const std::string& error) {