1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/importer/firefox_proxy_settings.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/file_path.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_tokenizer.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/values.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/importer/firefox_importer_utils.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/proxy/proxy_config.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* const kNetworkProxyTypeKey = "network.proxy.type";
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char* const kHTTPProxyKey = "network.proxy.http";
183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* const kHTTPProxyPortKey = "network.proxy.http_port";
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char* const kSSLProxyKey = "network.proxy.ssl";
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* const kSSLProxyPortKey = "network.proxy.ssl_port";
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char* const kFTPProxyKey = "network.proxy.ftp";
223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* const kFTPProxyPortKey = "network.proxy.ftp_port";
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char* const kGopherProxyKey = "network.proxy.gopher";
243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* const kGopherProxyPortKey = "network.proxy.gopher_port";
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char* const kSOCKSHostKey = "network.proxy.socks";
263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* const kSOCKSHostPortKey = "network.proxy.socks_port";
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char* const kSOCKSVersionKey = "network.proxy.socks_version";
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char* const kAutoconfigURL = "network.proxy.autoconfig_url";
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char* const kNoProxyListKey = "network.proxy.no_proxies_on";
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char* const kPrefFileName = "prefs.js";
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochFirefoxProxySettings::ProxyConfig IntToProxyConfig(int type) {
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (type) {
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case 1:
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return FirefoxProxySettings::MANUAL;
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case 2:
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return FirefoxProxySettings::AUTO_FROM_URL;
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case 4:
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return FirefoxProxySettings::AUTO_DETECT;
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case 5:
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return FirefoxProxySettings::SYSTEM;
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    default:
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      LOG(ERROR) << "Unknown Firefox proxy config type: " << type;
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return FirefoxProxySettings::NO_PROXY;
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochFirefoxProxySettings::SOCKSVersion IntToSOCKSVersion(int type) {
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (type) {
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case 4:
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return FirefoxProxySettings::V4;
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case 5:
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return FirefoxProxySettings::V5;
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    default:
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      LOG(ERROR) << "Unknown Firefox proxy config type: " << type;
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return FirefoxProxySettings::UNKNONW;
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochFirefoxProxySettings::FirefoxProxySettings() {
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Reset();
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochFirefoxProxySettings::~FirefoxProxySettings() {
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid FirefoxProxySettings::Reset() {
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  config_type_ = NO_PROXY;
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  http_proxy_.clear();
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  http_proxy_port_ = 0;
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ssl_proxy_.clear();
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ssl_proxy_port_ = 0;
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ftp_proxy_.clear();
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ftp_proxy_port_ = 0;
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gopher_proxy_.clear();
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gopher_proxy_port_ = 0;
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  socks_host_.clear();
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  socks_port_ = 0;
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  socks_version_ = UNKNONW;
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  proxy_bypass_list_.clear();
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  autoconfig_url_.clear();
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool FirefoxProxySettings::GetSettings(FirefoxProxySettings* settings) {
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(settings);
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  settings->Reset();
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath profile_path = GetFirefoxProfilePath();
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (profile_path.empty())
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath pref_file = profile_path.AppendASCII(kPrefFileName);
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return GetSettingsFromFile(pref_file, settings);
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool FirefoxProxySettings::ToProxyConfig(net::ProxyConfig* config) {
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (config_type()) {
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case NO_PROXY:
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      *config = net::ProxyConfig::CreateDirect();
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return true;
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case AUTO_DETECT:
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      *config = net::ProxyConfig::CreateAutoDetect();
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return true;
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case AUTO_FROM_URL:
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      *config = net::ProxyConfig::CreateFromCustomPacURL(
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          GURL(autoconfig_url()));
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return true;
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case SYSTEM:
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // Can't convert this directly to a ProxyConfig.
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return false;
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case MANUAL:
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      // Handled outside of the switch (since it is a lot of code.)
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    default:
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTREACHED();
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return false;
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The rest of this funciton is for handling the MANUAL case.
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK_EQ(MANUAL, config_type());
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  *config = net::ProxyConfig();
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  config->proxy_rules().type =
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      net::ProxyConfig::ProxyRules::TYPE_PROXY_PER_SCHEME;
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!http_proxy().empty()) {
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    config->proxy_rules().proxy_for_http = net::ProxyServer(
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        net::ProxyServer::SCHEME_HTTP,
1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        net::HostPortPair(http_proxy(), http_proxy_port()));
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!ftp_proxy().empty()) {
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    config->proxy_rules().proxy_for_ftp = net::ProxyServer(
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        net::ProxyServer::SCHEME_HTTP,
1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        net::HostPortPair(ftp_proxy(), ftp_proxy_port()));
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!ssl_proxy().empty()) {
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    config->proxy_rules().proxy_for_https = net::ProxyServer(
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        net::ProxyServer::SCHEME_HTTP,
1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        net::HostPortPair(ssl_proxy(), ssl_proxy_port()));
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!socks_host().empty()) {
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    net::ProxyServer::Scheme proxy_scheme = V5 == socks_version() ?
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        net::ProxyServer::SCHEME_SOCKS5 : net::ProxyServer::SCHEME_SOCKS4;
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    config->proxy_rules().fallback_proxy = net::ProxyServer(
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        proxy_scheme,
1523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        net::HostPortPair(socks_host(), socks_port()));
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  config->proxy_rules().bypass_rules.ParseFromStringUsingSuffixMatching(
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      JoinString(proxy_bypass_list_, ';'));
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool FirefoxProxySettings::GetSettingsFromFile(const FilePath& pref_file,
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                               FirefoxProxySettings* settings) {
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DictionaryValue dictionary;
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!ParsePrefFile(pref_file, &dictionary))
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int proxy_type = 0;
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!dictionary.GetInteger(kNetworkProxyTypeKey, &proxy_type))
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;  // No type means no proxy.
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  settings->config_type_ = IntToProxyConfig(proxy_type);
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (settings->config_type_ == AUTO_FROM_URL) {
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!dictionary.GetStringASCII(kAutoconfigURL,
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   &(settings->autoconfig_url_))) {
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      LOG(ERROR) << "Failed to retrieve Firefox proxy autoconfig URL";
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (settings->config_type_ == MANUAL) {
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!dictionary.GetStringASCII(kHTTPProxyKey, &(settings->http_proxy_)))
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      LOG(ERROR) << "Failed to retrieve Firefox proxy HTTP host";
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!dictionary.GetInteger(kHTTPProxyPortKey,
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               &(settings->http_proxy_port_))) {
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      LOG(ERROR) << "Failed to retrieve Firefox proxy HTTP port";
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!dictionary.GetStringASCII(kSSLProxyKey, &(settings->ssl_proxy_)))
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      LOG(ERROR) << "Failed to retrieve Firefox proxy SSL host";
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!dictionary.GetInteger(kSSLProxyPortKey, &(settings->ssl_proxy_port_)))
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      LOG(ERROR) << "Failed to retrieve Firefox proxy SSL port";
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!dictionary.GetStringASCII(kFTPProxyKey, &(settings->ftp_proxy_)))
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      LOG(ERROR) << "Failed to retrieve Firefox proxy FTP host";
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!dictionary.GetInteger(kFTPProxyPortKey, &(settings->ftp_proxy_port_)))
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      LOG(ERROR) << "Failed to retrieve Firefox proxy SSL port";
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!dictionary.GetStringASCII(kGopherProxyKey, &(settings->gopher_proxy_)))
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      LOG(ERROR) << "Failed to retrieve Firefox proxy gopher host";
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!dictionary.GetInteger(kGopherProxyPortKey,
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               &(settings->gopher_proxy_port_))) {
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      LOG(ERROR) << "Failed to retrieve Firefox proxy gopher port";
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!dictionary.GetStringASCII(kSOCKSHostKey, &(settings->socks_host_)))
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      LOG(ERROR) << "Failed to retrieve Firefox SOCKS host";
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (!dictionary.GetInteger(kSOCKSHostPortKey, &(settings->socks_port_)))
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      LOG(ERROR) << "Failed to retrieve Firefox SOCKS port";
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int socks_version;
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (dictionary.GetInteger(kSOCKSVersionKey, &socks_version))
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      settings->socks_version_ = IntToSOCKSVersion(socks_version);
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::string proxy_bypass;
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (dictionary.GetStringASCII(kNoProxyListKey, &proxy_bypass) &&
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        !proxy_bypass.empty()) {
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      StringTokenizer string_tok(proxy_bypass, ",");
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      while (string_tok.GetNext()) {
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        std::string token = string_tok.token();
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        TrimWhitespaceASCII(token, TRIM_ALL, &token);
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        if (!token.empty())
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          settings->proxy_bypass_list_.push_back(token);
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
224