proxy_config_handler.cc revision ca12bfac764ba476d6cd062bf1dde12cc64c3f40
1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// found in the LICENSE file.
4868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/net/proxy_config_handler.h"
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/bind.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/json/json_writer.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/logging.h"
10ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/prefs/pref_registry_simple.h"
11ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/prefs/pref_service.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/values.h"
13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/chromeos/net/onc_utils.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/prefs/proxy_config_dictionary.h"
157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/common/pref_names.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chromeos/dbus/shill_service_client.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chromeos/network/network_handler_callbacks.h"
19ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chromeos/network/network_profile.h"
20ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chromeos/network/network_profile_handler.h"
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chromeos/network/network_state.h"
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chromeos/network/network_state_handler.h"
237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "components/user_prefs/pref_registry_syncable.h"
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "dbus/object_path.h"
25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h"
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace chromeos {
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
29ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace {
30ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
31ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst base::DictionaryValue* GetNetworkConfigByGUID(
32ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const base::ListValue& network_configs,
33ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const std::string& guid) {
34ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  for (base::ListValue::const_iterator it = network_configs.begin();
35ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch       it != network_configs.end();
36ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch       ++it) {
37ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const base::DictionaryValue* network = NULL;
38ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    (*it)->GetAsDictionary(&network);
39ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    std::string current_guid;
40ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    network->GetStringWithoutPathExpansion(onc::network_config::kGUID,
41ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                           &current_guid);
42ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (current_guid == guid)
43ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      return network;
44ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
45ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return NULL;
46ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
47ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
48ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochscoped_ptr<ProxyConfigDictionary> GetProxyPolicy(
49ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const PrefService* pref_service,
50ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const char* pref_name,
51ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const NetworkState& network,
52ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    bool* network_is_managed) {
53ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  *network_is_managed = false;
54ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
55ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!pref_service || network.guid().empty())
56ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return scoped_ptr<ProxyConfigDictionary>();
57ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
58ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!pref_service->IsManagedPreference(pref_name)) {
59ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // No policy set.
60ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return scoped_ptr<ProxyConfigDictionary>();
61ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
62ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
63ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const base::ListValue* onc_policy = pref_service->GetList(pref_name);
64ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!onc_policy) {
65ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    LOG(ERROR) << "Pref " << pref_name << " is managed, but no value is set.";
66ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return scoped_ptr<ProxyConfigDictionary>();
67ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
68ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
69ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const base::DictionaryValue* network_policy =
70ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      GetNetworkConfigByGUID(*onc_policy, network.guid());
71ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!network_policy) {
72ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // This network isn't managed by this policy.
73ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return scoped_ptr<ProxyConfigDictionary>();
74ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
75ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
76ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const base::DictionaryValue* proxy_policy = NULL;
77ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  network_policy->GetDictionaryWithoutPathExpansion(
78ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      onc::network_config::kProxySettings, &proxy_policy);
79ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!proxy_policy) {
80ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // This policy doesn't set a proxy for this network. Nonetheless, this
81ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // disallows changes by the user.
82ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    *network_is_managed = true;
83ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return scoped_ptr<ProxyConfigDictionary>();
84ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
85ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
86ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  scoped_ptr<base::DictionaryValue> proxy_dict =
87ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      onc::ConvertOncProxySettingsToProxyConfig(*proxy_policy);
88ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  *network_is_managed = true;
89ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return make_scoped_ptr(new ProxyConfigDictionary(proxy_dict.get()));
90ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
91ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
92ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}  // namespace
93ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace proxy_config {
95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)scoped_ptr<ProxyConfigDictionary> GetProxyConfigForNetwork(
97ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const PrefService* profile_prefs,
98ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const PrefService* local_state_prefs,
99ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const NetworkState& network,
100ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    onc::ONCSource* onc_source) {
101ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  VLOG(2) << "GetProxyConfigForNetwork network: " << network.path()
102ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          << " , guid: " << network.guid();
103ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  *onc_source = onc::ONC_SOURCE_NONE;
104ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  bool network_is_managed = false;
105ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
106ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  scoped_ptr<ProxyConfigDictionary> proxy_config =
107ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      GetProxyPolicy(profile_prefs,
108ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                     prefs::kOpenNetworkConfiguration,
109ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                     network,
110ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                     &network_is_managed);
111ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (network_is_managed) {
112ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    VLOG(1) << "Network " << network.path() << " is managed by user policy.";
113ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    *onc_source = onc::ONC_SOURCE_USER_POLICY;
114ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return proxy_config.Pass();
115ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
116ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  proxy_config = GetProxyPolicy(local_state_prefs,
117ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                prefs::kDeviceOpenNetworkConfiguration,
118ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                network,
119ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                &network_is_managed);
120ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (network_is_managed) {
121ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    VLOG(1) << "Network " << network.path() << " is managed by device policy.";
122ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    *onc_source = onc::ONC_SOURCE_DEVICE_POLICY;
123ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return proxy_config.Pass();
124ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
125ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
126ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (network.profile_path().empty())
127ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return scoped_ptr<ProxyConfigDictionary>();
128ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
129ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const NetworkProfile* profile = NetworkHandler::Get()
130ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      ->network_profile_handler()->GetProfileForPath(network.profile_path());
131ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!profile) {
132ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    LOG(WARNING) << "Unknown profile_path '" << network.profile_path() << "'.";
133ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return scoped_ptr<ProxyConfigDictionary>();
134ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
135ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!profile_prefs && profile->type() == NetworkProfile::TYPE_USER) {
136ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // This case occurs, for example, if called from the proxy config tracker
137ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // created for the system request context and the signin screen. Both don't
138ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // use profile prefs and shouldn't depend on the user's not shared proxy
139ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // settings.
140ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    VLOG(1)
141ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        << "Don't use unshared settings for system context or signin screen.";
142ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return scoped_ptr<ProxyConfigDictionary>();
143ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
144ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
145ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // No policy set for this network, read instead the user's (shared or
146ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // unshared) configuration.
147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const base::DictionaryValue& value = network.proxy_config();
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (value.empty())
149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return scoped_ptr<ProxyConfigDictionary>();
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return make_scoped_ptr(new ProxyConfigDictionary(&value));
151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void SetProxyConfigForNetwork(const ProxyConfigDictionary& proxy_config,
154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                              const NetworkState& network) {
155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  chromeos::ShillServiceClient* shill_service_client =
156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      DBusThreadManager::Get()->GetShillServiceClient();
157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ProxyPrefs::ProxyMode mode;
159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!proxy_config.GetMode(&mode) || mode == ProxyPrefs::MODE_DIRECT) {
160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // TODO(pneubeck): Consider removing this legacy code.  Return empty string
161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // for direct mode for portal check to work correctly.
162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    shill_service_client->ClearProperty(
163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        dbus::ObjectPath(network.path()),
164868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        flimflam::kProxyConfigProperty,
165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        base::Bind(&base::DoNothing),
1667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        base::Bind(&network_handler::ShillErrorCallbackFunction,
1677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                   "SetProxyConfig.ClearProperty Failed",
168ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                   network.path(),
169ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                   network_handler::ErrorCallback()));
170868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  } else {
171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    std::string proxy_config_str;
172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::JSONWriter::Write(&proxy_config.GetDictionary(), &proxy_config_str);
173868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    shill_service_client->SetProperty(
174868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        dbus::ObjectPath(network.path()),
175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        flimflam::kProxyConfigProperty,
176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        base::StringValue(proxy_config_str),
177868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        base::Bind(&base::DoNothing),
1787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        base::Bind(&network_handler::ShillErrorCallbackFunction,
1797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                   "SetProxyConfig.SetProperty Failed",
180ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                   network.path(),
181ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                   network_handler::ErrorCallback()));
182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
183868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (NetworkHandler::IsInitialized()) {
185ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    NetworkHandler::Get()->network_state_handler()
186ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        ->RequestUpdateForNetwork(network.path());
187868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
190ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid RegisterPrefs(PrefRegistrySimple* registry) {
191ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  registry->RegisterListPref(prefs::kDeviceOpenNetworkConfiguration);
192ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
193ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
194ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) {
1957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  registry->RegisterBooleanPref(
1967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      prefs::kUseSharedProxies,
1977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      false,
1987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
199ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
200ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  registry->RegisterListPref(prefs::kOpenNetworkConfiguration,
201ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                             user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
2027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace proxy_config
205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
206868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace chromeos
207