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