proxy_config_handler.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Copyright (c) 2013 The Chromium Authors. All rights reserved. 20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Use of this source code is governed by a BSD-style license that can be 30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// found in the LICENSE file. 40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "chrome/browser/chromeos/net/proxy_config_handler.h" 60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "base/bind.h" 80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "base/json/json_writer.h" 90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "base/logging.h" 100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "base/prefs/pref_registry_simple.h" 110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "base/values.h" 120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "chrome/browser/chromeos/net/onc_utils.h" 130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "chrome/browser/prefs/proxy_config_dictionary.h" 140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "chrome/common/pref_names.h" 150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "chromeos/dbus/dbus_thread_manager.h" 160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "chromeos/dbus/shill_service_client.h" 170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "chromeos/network/network_handler_callbacks.h" 180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "chromeos/network/network_profile.h" 190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "chromeos/network/network_profile_handler.h" 200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "chromeos/network/network_state.h" 210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "chromeos/network/network_state_handler.h" 220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "components/pref_registry/pref_registry_syncable.h" 230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "dbus/object_path.h" 240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "third_party/cros_system_api/dbus/service_constants.h" 250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace chromeos { 270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace { 290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid NotifyNetworkStateHandler(const std::string& service_path) { 310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (NetworkHandler::IsInitialized()) { 32b9518277716cf5081d3058d86ab7d98b78f696e8pbos@webrtc.org NetworkHandler::Get()->network_state_handler()->RequestUpdateForNetwork( 33b9518277716cf5081d3058d86ab7d98b78f696e8pbos@webrtc.org service_path); 340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 36cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org 372a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org} // namespace 382a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org 392a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgnamespace proxy_config { 402a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org 410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgscoped_ptr<ProxyConfigDictionary> GetProxyConfigForNetwork( 420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const PrefService* profile_prefs, 430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const PrefService* local_state_prefs, 440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const NetworkState& network, 450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ::onc::ONCSource* onc_source) { 460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const base::DictionaryValue* network_policy = 470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org onc::GetPolicyForNetwork( 48e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org profile_prefs, local_state_prefs, network, onc_source); 49e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org 500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (network_policy) { 510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const base::DictionaryValue* proxy_policy = NULL; 52e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org network_policy->GetDictionaryWithoutPathExpansion( 53e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org ::onc::network_config::kProxySettings, &proxy_policy); 540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!proxy_policy) { 55e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org // This policy doesn't set a proxy for this network. Nonetheless, this 5678afd903598b85bd36e67ca5a4cf8e631cef6eaehenrike@webrtc.org // disallows changes by the user. 57e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org return scoped_ptr<ProxyConfigDictionary>(); 580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org scoped_ptr<base::DictionaryValue> proxy_dict = 610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org onc::ConvertOncProxySettingsToProxyConfig(*proxy_policy); 620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return make_scoped_ptr(new ProxyConfigDictionary(proxy_dict.get())); 630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (network.profile_path().empty()) 660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return scoped_ptr<ProxyConfigDictionary>(); 670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const NetworkProfile* profile = NetworkHandler::Get() 690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ->network_profile_handler()->GetProfileForPath(network.profile_path()); 700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!profile) { 710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VLOG(1) << "Unknown profile_path '" << network.profile_path() << "'."; 720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return scoped_ptr<ProxyConfigDictionary>(); 730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!profile_prefs && profile->type() == NetworkProfile::TYPE_USER) { 750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // This case occurs, for example, if called from the proxy config tracker 760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // created for the system request context and the signin screen. Both don't 770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // use profile prefs and shouldn't depend on the user's not shared proxy 780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // settings. 790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org VLOG(1) 800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org << "Don't use unshared settings for system context or signin screen."; 810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return scoped_ptr<ProxyConfigDictionary>(); 820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // No policy set for this network, read instead the user's (shared or 850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // unshared) configuration. 860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // The user's proxy setting is not stored in the Chrome preference yet. We 870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // still rely on Shill storing it. 880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const base::DictionaryValue& value = network.proxy_config(); 890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (value.empty()) 900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return scoped_ptr<ProxyConfigDictionary>(); 910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return make_scoped_ptr(new ProxyConfigDictionary(&value)); 920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid SetProxyConfigForNetwork(const ProxyConfigDictionary& proxy_config, 950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const NetworkState& network) { 960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org chromeos::ShillServiceClient* shill_service_client = 970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org DBusThreadManager::Get()->GetShillServiceClient(); 980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // The user's proxy setting is not stored in the Chrome preference yet. We 1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // still rely on Shill storing it. 1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ProxyPrefs::ProxyMode mode; 1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org if (!proxy_config.GetMode(&mode) || mode == ProxyPrefs::MODE_DIRECT) { 1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Return empty string for direct mode for portal check to work correctly. 1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // TODO(pneubeck): Consider removing this legacy code. 1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org shill_service_client->ClearProperty( 1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org dbus::ObjectPath(network.path()), 1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org shill::kProxyConfigProperty, 108f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org base::Bind(&NotifyNetworkStateHandler, network.path()), 109f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org base::Bind(&network_handler::ShillErrorCallbackFunction, 110f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org "SetProxyConfig.ClearProperty Failed", 111f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org network.path(), 112f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org network_handler::ErrorCallback())); 113f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org } else { 114f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org std::string proxy_config_str; 115f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org base::JSONWriter::Write(&proxy_config.GetDictionary(), &proxy_config_str); 116f99f1011aa4cd22bd86ba2e4f7d239ea1b766ec8wu@webrtc.org shill_service_client->SetProperty( 1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org dbus::ObjectPath(network.path()), 1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org shill::kProxyConfigProperty, 1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org base::StringValue(proxy_config_str), 1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org base::Bind(&NotifyNetworkStateHandler, network.path()), 1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org base::Bind(&network_handler::ShillErrorCallbackFunction, 1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "SetProxyConfig.SetProperty Failed", 1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org network.path(), 1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org network_handler::ErrorCallback())); 1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid RegisterPrefs(PrefRegistrySimple* registry) { 1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org registry->RegisterListPref(prefs::kDeviceOpenNetworkConfiguration); 1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) { 1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org registry->RegisterBooleanPref( 1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org prefs::kUseSharedProxies, 1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org false, 1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org registry->RegisterListPref(prefs::kOpenNetworkConfiguration, 1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} // namespace proxy_config 1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} // namespace chromeos 1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org