15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/proxy_config_dictionary.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Integer to specify the type of proxy settings. 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See ProxyPrefs for possible values and interactions with the other proxy 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// preferences. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProxyMode[] = "mode"; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// String specifying the proxy server. For a specification of the expected 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// syntax see net::ProxyConfig::ProxyRules::ParseFromString(). 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProxyServer[] = "server"; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URL to the proxy .pac file. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProxyPacUrl[] = "pac_url"; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Optional boolean flag indicating whether a valid PAC script is mandatory. 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If true, network traffic does not fall back to direct connections in case the 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PAC script is not available. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProxyPacMandatory[] = "pac_mandatory"; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// String containing proxy bypass rules. For a specification of the 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// expected syntax see net::ProxyBypassRules::ParseFromString(). 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProxyBypassList[] = "bypass_list"; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProxyConfigDictionary::ProxyConfigDictionary(const DictionaryValue* dict) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : dict_(dict->DeepCopy()) { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ProxyConfigDictionary::~ProxyConfigDictionary() {} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProxyConfigDictionary::GetMode(ProxyPrefs::ProxyMode* out) const { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string mode_str; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dict_->GetString(kProxyMode, &mode_str) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && StringToProxyMode(mode_str, out); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProxyConfigDictionary::GetPacUrl(std::string* out) const { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dict_->GetString(kProxyPacUrl, out); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProxyConfigDictionary::GetPacMandatory(bool* out) const { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dict_->HasKey(kProxyPacMandatory)) { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out = false; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dict_->GetBoolean(kProxyPacMandatory, out); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProxyConfigDictionary::GetProxyServer(std::string* out) const { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dict_->GetString(kProxyServer, out); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProxyConfigDictionary::GetBypassList(std::string* out) const { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dict_->GetString(kProxyBypassList, out); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ProxyConfigDictionary::HasBypassList() const { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dict_->HasKey(kProxyBypassList); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const DictionaryValue& ProxyConfigDictionary::GetDictionary() const { 69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return *dict_; 70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue* ProxyConfigDictionary::CreateDirect() { 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return CreateDictionary(ProxyPrefs::MODE_DIRECT, 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false, 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string()); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue* ProxyConfigDictionary::CreateAutoDetect() { 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return CreateDictionary(ProxyPrefs::MODE_AUTO_DETECT, 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false, 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string()); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue* ProxyConfigDictionary::CreatePacScript( 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& pac_url, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool pac_mandatory) { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateDictionary(ProxyPrefs::MODE_PAC_SCRIPT, 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pac_url, 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pac_mandatory, 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string()); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue* ProxyConfigDictionary::CreateFixedServers( 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& proxy_server, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& bypass_list) { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!proxy_server.empty()) { 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return CreateDictionary(ProxyPrefs::MODE_FIXED_SERVERS, 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false, 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) proxy_server, 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bypass_list); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CreateDirect(); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue* ProxyConfigDictionary::CreateSystem() { 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return CreateDictionary(ProxyPrefs::MODE_SYSTEM, 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) false, 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string()); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DictionaryValue* ProxyConfigDictionary::CreateDictionary( 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyPrefs::ProxyMode mode, 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& pac_url, 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool pac_mandatory, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& proxy_server, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& bypass_list) { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DictionaryValue* dict = new DictionaryValue(); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->SetString(kProxyMode, ProxyModeToString(mode)); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!pac_url.empty()) { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->SetString(kProxyPacUrl, pac_url); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->SetBoolean(kProxyPacMandatory, pac_mandatory); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!proxy_server.empty()) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->SetString(kProxyServer, proxy_server); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!bypass_list.empty()) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dict->SetString(kProxyBypassList, bypass_list); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dict; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 144