Index: chrome/browser/ui/webui/options2/chromeos/internet_options_handler.cc |
diff --git a/chrome/browser/ui/webui/options2/chromeos/internet_options_handler.cc b/chrome/browser/ui/webui/options2/chromeos/internet_options_handler.cc |
index 09dbe3900dea19e75536e99958eacc228c16238f..7a79f1b0fa66f889d40c46d4381b2e7ef366d99f 100644 |
--- a/chrome/browser/ui/webui/options2/chromeos/internet_options_handler.cc |
+++ b/chrome/browser/ui/webui/options2/chromeos/internet_options_handler.cc |
@@ -18,6 +18,7 @@ |
#include "base/bind_helpers.h" |
#include "base/command_line.h" |
#include "base/i18n/time_formatting.h" |
+#include "base/json/json_writer.h" |
#include "base/string16.h" |
#include "base/string_number_conversions.h" |
#include "base/stringprintf.h" |
@@ -27,6 +28,7 @@ |
#include "chrome/browser/browser_process.h" |
#include "chrome/browser/chromeos/choose_mobile_network_dialog.h" |
#include "chrome/browser/chromeos/cros/cros_library.h" |
+#include "chrome/browser/chromeos/cros/cros_network_functions.h" |
#include "chrome/browser/chromeos/cros/network_library.h" |
#include "chrome/browser/chromeos/cros/onc_constants.h" |
#include "chrome/browser/chromeos/enrollment_dialog_view.h" |
@@ -54,6 +56,7 @@ |
#include "grit/generated_resources.h" |
#include "grit/locale_settings.h" |
#include "grit/theme_resources.h" |
+#include "third_party/cros_system_api/dbus/service_constants.h" |
#include "ui/base/l10n/l10n_util.h" |
#include "ui/base/layout.h" |
#include "ui/base/resource/resource_bundle.h" |
@@ -81,6 +84,9 @@ const char kNetworkInfoKeyRemembered[] = "remembered"; |
const char kNetworkInfoKeyServicePath[] = "servicePath"; |
const char kNetworkInfoKeyPolicyManaged[] = "policyManaged"; |
+// Google public name servers (DNS). |
+const char kGoogleNameServers[] = "8.8.4.4,8.8.8.8"; |
+ |
// A helper class for building network information dictionaries to be sent to |
// the webui code. |
class NetworkInfoDictionary { |
@@ -260,6 +266,68 @@ DictionaryValue* NetworkInfoDictionary::BuildDictionary() { |
return network_info.release(); |
} |
+// Pulls IP information out of a shill service properties dictionary. If |
+// |static_ip| is true, then it fetches "StaticIP.*" properties. If not, then it |
+// fetches "SavedIP.*" properties. Caller must take ownership of returned |
+// dictionary. If non-NULL, |ip_parameters_set| returns a count of the number |
+// of IP routing parameters that get set. |
+DictionaryValue* BuildIPInfoDictionary(const DictionaryValue& shill_properties, |
+ bool static_ip, |
+ int* routing_parameters_set) { |
+ std::string address_key; |
+ std::string prefix_len_key; |
+ std::string gateway_key; |
+ std::string name_servers_key; |
+ if (static_ip) { |
+ address_key = shill::kStaticIPAddressProperty; |
+ prefix_len_key = shill::kStaticIPPrefixlenProperty; |
+ gateway_key = shill::kStaticIPGatewayProperty; |
+ name_servers_key = shill::kStaticIPNameServersProperty; |
+ } else { |
+ address_key = shill::kSavedIPAddressProperty; |
+ prefix_len_key = shill::kSavedIPPrefixlenProperty; |
+ gateway_key = shill::kSavedIPGatewayProperty; |
+ name_servers_key = shill::kSavedIPNameServersProperty; |
+ } |
+ |
+ scoped_ptr<DictionaryValue> ip_info_dict(new DictionaryValue); |
+ std::string value; |
stevenjb
2012/08/13 17:43:44
nit: I think this would be more readable using sep
Greg Spencer (Chromium)
2012/08/13 23:53:44
Done.
|
+ int routing_parameters = 0; |
+ if (shill_properties.GetStringWithoutPathExpansion(address_key, &value)) { |
+ ip_info_dict->SetString("address", value); |
stevenjb
2012/08/13 17:43:44
"address" and other JS (I assume?) keys should be
Greg Spencer (Chromium)
2012/08/13 23:53:44
Done, but I'd like to point out that there are sev
stevenjb
2012/08/14 01:06:38
Thanks for doing these. Anything that is used as a
Greg Spencer (Chromium)
2012/08/14 01:19:27
OK, I do agree that they *should* be. I'll take a
|
+ VLOG(2) << "Found " << address_key << ": " << value; |
+ routing_parameters++; |
+ } |
+ int prefix_len = -1; |
+ if (shill_properties.GetIntegerWithoutPathExpansion( |
+ prefix_len_key, &prefix_len)) { |
+ ip_info_dict->SetInteger("prefixLength", prefix_len); |
+ ip_info_dict->SetString("netmask", |
+ chromeos::CrosPrefixLengthToNetmask(prefix_len)); |
+ VLOG(2) << "Found " << prefix_len_key << ": " |
+ << prefix_len |
+ << " (" << chromeos::CrosPrefixLengthToNetmask(prefix_len) << ")"; |
+ routing_parameters++; |
+ } |
+ value.clear(); |
+ if (shill_properties.GetStringWithoutPathExpansion(gateway_key, &value)) { |
+ ip_info_dict->SetString("gateway", value); |
+ VLOG(2) << "Found " << gateway_key << ": " << value; |
+ routing_parameters++; |
+ } |
+ if (routing_parameters_set) |
+ *routing_parameters_set = routing_parameters; |
+ |
+ value.clear(); |
+ if (shill_properties.GetStringWithoutPathExpansion( |
+ name_servers_key, &value)) { |
+ ip_info_dict->SetString("nameServers", value); |
+ VLOG(2) << "Found " << name_servers_key << ": " << value; |
+ } |
+ |
+ return ip_info_dict.release(); |
+} |
+ |
} // namespace |
namespace options2 { |
@@ -338,13 +406,21 @@ void InternetOptionsHandler::GetLocalizedValues( |
{ "networkTabLabel", IDS_OPTIONS_SETTINGS_INTERNET_TAB_NETWORK }, |
{ "securityTabLabel", IDS_OPTIONS_SETTINGS_INTERNET_TAB_SECURITY }, |
{ "proxyTabLabel", IDS_OPTIONS_SETTINGS_INTERNET_TAB_PROXY }, |
- { "useDHCP", IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_USE_DHCP }, |
- { "useStaticIP", IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_USE_STATIC_IP }, |
{ "connectionState", IDS_OPTIONS_SETTINGS_INTERNET_CONNECTION_STATE }, |
{ "inetAddress", IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_ADDRESS }, |
- { "inetSubnetAddress", IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_SUBNETMASK }, |
+ { "inetNetmask", IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_SUBNETMASK }, |
{ "inetGateway", IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_GATEWAY }, |
- { "inetDns", IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_DNSSERVER }, |
+ { "inetNameServers", IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_DNSSERVER }, |
+ { "ipAutomaticConfiguration", |
+ IDS_OPTIONS_SETTINGS_INTERNET_IP_AUTOMATIC_CONFIGURATION }, |
+ { "automaticNameServers", |
+ IDS_OPTIONS_SETTINGS_INTERNET_AUTOMATIC_NAME_SERVERS }, |
+ { "userNameServer1", IDS_OPTIONS_SETTINGS_INTERNET_USER_NAME_SERVER_1 }, |
+ { "userNameServer2", IDS_OPTIONS_SETTINGS_INTERNET_USER_NAME_SERVER_2 }, |
+ { "userNameServer3", IDS_OPTIONS_SETTINGS_INTERNET_USER_NAME_SERVER_3 }, |
+ { "userNameServer4", IDS_OPTIONS_SETTINGS_INTERNET_USER_NAME_SERVER_4 }, |
+ { "googleNameServers", IDS_OPTIONS_SETTINGS_INTERNET_GOOGLE_NAME_SERVERS }, |
+ { "userNameServers", IDS_OPTIONS_SETTINGS_INTERNET_USER_NAME_SERVERS }, |
{ "hardwareAddress", |
IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_HARDWARE_ADDRESS }, |
{ "detailsInternetDismiss", IDS_CLOSE }, |
@@ -811,37 +887,70 @@ void InternetOptionsHandler::SetAutoConnectCallback(const ListValue* args) { |
void InternetOptionsHandler::SetIPConfigCallback(const ListValue* args) { |
std::string service_path; |
- std::string dhcp_str; |
+ std::string dhcp_for_ip; |
std::string address; |
std::string netmask; |
std::string gateway; |
+ std::string name_server_type; |
std::string name_servers; |
- if (args->GetSize() < 6 || |
+ if (args->GetSize() < 7 || |
!args->GetString(0, &service_path) || |
- !args->GetString(1, &dhcp_str) || |
+ !args->GetString(1, &dhcp_for_ip) || |
!args->GetString(2, &address) || |
!args->GetString(3, &netmask) || |
!args->GetString(4, &gateway) || |
- !args->GetString(5, &name_servers)) { |
+ !args->GetString(5, &name_server_type) || |
+ !args->GetString(6, &name_servers)) { |
NOTREACHED(); |
return; |
} |
- chromeos::Network* network = cros_->FindNetworkByPath(service_path); |
- if (!network) |
- return; |
+ int dhcp_usage_mask = 0; |
+ if (dhcp_for_ip == "true") { |
+ dhcp_usage_mask = (chromeos::NetworkLibrary::USE_DHCP_ADDRESS | |
+ chromeos::NetworkLibrary::USE_DHCP_NETMASK | |
+ chromeos::NetworkLibrary::USE_DHCP_GATEWAY); |
+ } |
+ if (name_server_type == "automatic") { |
stevenjb
2012/08/13 17:43:44
nit: kNameServerTypeAutomatic
Greg Spencer (Chromium)
2012/08/13 23:53:44
Done.
|
+ dhcp_usage_mask |= chromeos::NetworkLibrary::USE_DHCP_NAME_SERVERS; |
+ name_servers.clear(); |
+ } else if (name_server_type == "google") { |
stevenjb
2012/08/13 17:43:44
nit: kNameServerTypeGoogle
Greg Spencer (Chromium)
2012/08/13 23:53:44
Done.
|
+ name_servers = kGoogleNameServers; |
+ } |
- cros_->SetIPConfig(chromeos::NetworkIPConfig(network->device_path(), |
- dhcp_str == "true" ? chromeos::IPCONFIG_TYPE_DHCP : |
- chromeos::IPCONFIG_TYPE_IPV4, |
- address, netmask, gateway, name_servers)); |
+ cros_->SetIPParameters(service_path, |
+ address, |
+ netmask, |
+ gateway, |
+ name_servers, |
+ dhcp_usage_mask); |
} |
void InternetOptionsHandler::PopulateDictionaryDetails( |
const chromeos::Network* network) { |
DCHECK(network); |
+ // Send off an asynchronous request to Shill to get the service properties |
+ // before we continue. |
stevenjb
2012/08/13 17:43:44
nit: 'before we continue' implies waiting to me; '
Greg Spencer (Chromium)
2012/08/13 23:53:44
Done.
|
+ chromeos::CrosRequestNetworkServiceProperties( |
+ network->service_path(), |
+ base::Bind(&InternetOptionsHandler::PopulateDictionaryDetailsCallback, |
+ weak_factory_.GetWeakPtr(), network)); |
+} |
+ |
+void InternetOptionsHandler::PopulateDictionaryDetailsCallback( |
+ const chromeos::Network* network, |
+ const std::string& service_path, |
+ const base::DictionaryValue* shill_properties) { |
+ if (VLOG_IS_ON(2)) { |
+ std::string properties_json; |
+ base::JSONWriter::WriteWithOptions(shill_properties, |
+ base::JSONWriter::OPTIONS_PRETTY_PRINT, |
+ &properties_json); |
+ VLOG(2) << "Shill Properties: " << std::endl << properties_json; |
+ } |
+ |
if (web_ui()) { |
Profile::FromWebUI(web_ui())->GetProxyConfigTracker()->UISetCurrentNetwork( |
network->service_path()); |
@@ -851,7 +960,7 @@ void InternetOptionsHandler::PopulateDictionaryDetails( |
const base::DictionaryValue* onc = |
cros_->FindOncForNetwork(network->unique_id()); |
- DictionaryValue dictionary; |
+ base::DictionaryValue dictionary; |
std::string hardware_address; |
chromeos::NetworkIPConfigVector ipconfigs = cros_->GetIPConfigs( |
network->device_path(), &hardware_address, |
@@ -859,28 +968,58 @@ void InternetOptionsHandler::PopulateDictionaryDetails( |
if (!hardware_address.empty()) |
dictionary.SetString("hardwareAddress", hardware_address); |
- scoped_ptr<DictionaryValue> ipconfig_dhcp; |
- scoped_ptr<DictionaryValue> ipconfig_static; |
+ // The DHCP IPConfig contains the values that are actually in use at the |
+ // moment, even if some are overridden by static IP values. |
+ scoped_ptr<DictionaryValue> ipconfig_dhcp(new DictionaryValue); |
+ std::string ipconfig_name_servers; |
for (chromeos::NetworkIPConfigVector::const_iterator it = ipconfigs.begin(); |
it != ipconfigs.end(); ++it) { |
const chromeos::NetworkIPConfig& ipconfig = *it; |
- scoped_ptr<DictionaryValue> ipconfig_dict(new DictionaryValue()); |
- ipconfig_dict->SetString("address", ipconfig.address); |
- ipconfig_dict->SetString("subnetAddress", ipconfig.netmask); |
- ipconfig_dict->SetString("gateway", ipconfig.gateway); |
- ipconfig_dict->SetString("dns", ipconfig.name_servers); |
- if (ipconfig.type == chromeos::IPCONFIG_TYPE_DHCP) |
- ipconfig_dhcp.reset(ipconfig_dict.release()); |
- else if (ipconfig.type == chromeos::IPCONFIG_TYPE_IPV4) |
- ipconfig_static.reset(ipconfig_dict.release()); |
+ if (ipconfig.type == chromeos::IPCONFIG_TYPE_DHCP) { |
+ ipconfig_dhcp->SetString("address", ipconfig.address); |
stevenjb
2012/08/13 17:43:44
Use consts
Greg Spencer (Chromium)
2012/08/13 23:53:44
Done.
|
+ VLOG(2) << "Found DHCP Address: " << ipconfig.address; |
+ ipconfig_dhcp->SetString("netmask", ipconfig.netmask); |
+ VLOG(2) << "Found DHCP Netmask: " << ipconfig.netmask; |
+ ipconfig_dhcp->SetString("gateway", ipconfig.gateway); |
+ VLOG(2) << "Found DHCP Gateway: " << ipconfig.gateway; |
+ ipconfig_dhcp->SetString("nameServers", ipconfig.name_servers); |
+ ipconfig_name_servers = ipconfig.name_servers; // save for later |
+ VLOG(2) << "Found DHCP Name Servers: " << ipconfig.name_servers; |
+ break; |
+ } |
} |
chromeos::NetworkPropertyUIData ipconfig_dhcp_ui_data(ui_data); |
- SetValueDictionary(&dictionary, "ipconfigDHCP", ipconfig_dhcp.release(), |
+ |
+ chromeos::NetworkPropertyUIData static_ip_ui_data(ui_data); |
+ int automatic_ip_config; |
+ scoped_ptr<DictionaryValue> static_ip_dict( |
+ BuildIPInfoDictionary(*shill_properties, true, &automatic_ip_config)); |
+ dictionary.SetBoolean("ipAutoConfig", automatic_ip_config == 0); |
stevenjb
2012/08/13 17:43:44
Use const here and below
Greg Spencer (Chromium)
2012/08/13 23:53:44
Done in my changes at least. Do you want me to fi
|
+ DCHECK(automatic_ip_config == 3 || automatic_ip_config == 0) |
+ << "UI doesn't support automatic specification of individual " |
+ << "static ip parameters."; |
+ scoped_ptr<DictionaryValue> saved_ip_dict( |
+ BuildIPInfoDictionary(*shill_properties, false, NULL)); |
+ dictionary.Set("savedIP", saved_ip_dict.release()); |
+ |
+ // Determine what kind of name server setting we have by comparing the |
+ // StaticIP and Google values with the ipconfig values. |
+ std::string name_server_type = "automatic"; |
+ std::string static_ip_nameservers; |
+ static_ip_dict->GetString("nameServers", &static_ip_nameservers); |
+ if (!static_ip_nameservers.empty() && |
+ static_ip_nameservers == ipconfig_name_servers) { |
+ name_server_type = "user"; |
+ } |
+ if (ipconfig_name_servers == kGoogleNameServers) { |
+ name_server_type = "google"; |
+ } |
+ |
+ SetValueDictionary(&dictionary, "ipconfig", ipconfig_dhcp.release(), |
ipconfig_dhcp_ui_data); |
- chromeos::NetworkPropertyUIData ipconfig_static_ui_data(ui_data); |
- SetValueDictionary(&dictionary, "ipconfigStatic", ipconfig_static.release(), |
- ipconfig_static_ui_data); |
+ SetValueDictionary(&dictionary, "staticIP", static_ip_dict.release(), |
+ static_ip_ui_data); |
chromeos::ConnectionType type = network->type(); |
dictionary.SetInteger("type", type); |
@@ -889,6 +1028,8 @@ void InternetOptionsHandler::PopulateDictionaryDetails( |
dictionary.SetBoolean("connected", network->connected()); |
dictionary.SetString("connectionState", network->GetStateString()); |
dictionary.SetString("networkName", network->name()); |
+ dictionary.SetString("nameServerType", name_server_type); |
+ dictionary.SetString("nameServersGoogle", kGoogleNameServers); |
// Only show proxy for remembered networks. |
chromeos::NetworkProfileType network_profile = network->profile_type(); |