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 ¤t_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