15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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/chromeos/proxy_cros_settings_parser.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/ui_proxy_config.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/ui_proxy_config_service.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Common prefix of all proxy prefs.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProxyPrefsPrefix[] = "cros.session.proxy";
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Names of proxy preferences.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProxyPacUrl[]         = "cros.session.proxy.pacurl";
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProxySingleHttp[]     = "cros.session.proxy.singlehttp";
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProxySingleHttpPort[] = "cros.session.proxy.singlehttpport";
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProxyHttpUrl[]        = "cros.session.proxy.httpurl";
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProxyHttpPort[]       = "cros.session.proxy.httpport";
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProxyHttpsUrl[]       = "cros.session.proxy.httpsurl";
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProxyHttpsPort[]      = "cros.session.proxy.httpsport";
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProxyType[]           = "cros.session.proxy.type";
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProxySingle[]         = "cros.session.proxy.single";
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProxyFtpUrl[]         = "cros.session.proxy.ftpurl";
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProxyFtpPort[]        = "cros.session.proxy.ftpport";
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProxySocks[]          = "cros.session.proxy.socks";
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProxySocksPort[]      = "cros.session.proxy.socksport";
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kProxyIgnoreList[]     = "cros.session.proxy.ignorelist";
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kProxyUsePacUrl[]      = "cros.session.proxy.usepacurl";
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* const kProxySettings[] = {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kProxyPacUrl,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kProxySingleHttp,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kProxySingleHttpPort,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kProxyHttpUrl,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kProxyHttpPort,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kProxyHttpsUrl,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kProxyHttpsPort,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kProxyType,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kProxySingle,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kProxyFtpUrl,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kProxyFtpPort,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kProxySocks,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kProxySocksPort,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kProxyIgnoreList,
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  kProxyUsePacUrl,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We have to explicitly export this because the arraysize macro doesn't like
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// extern arrays as their size is not known on compile time.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t kProxySettingsCount = arraysize(kProxySettings);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)base::Value* CreateServerHostValue(const UIProxyConfig::ManualProxy& proxy) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return proxy.server.is_valid() ?
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         new base::StringValue(proxy.server.host_port_pair().host()) :
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         NULL;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)base::Value* CreateServerPortValue(const UIProxyConfig::ManualProxy& proxy) {
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return proxy.server.is_valid()
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)             ? new base::FundamentalValue(proxy.server.host_port_pair().port())
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)             : NULL;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::ProxyServer CreateProxyServer(std::string host,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   uint16 port,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   net::ProxyServer::Scheme scheme) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (host.empty() && port == 0)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return net::ProxyServer();
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 default_port = net::ProxyServer::GetDefaultPortForScheme(scheme);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::HostPortPair host_port_pair;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check if host is a valid URL or a string of valid format <server>::<port>.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(host);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (url.is_valid())  // See if host is URL.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_port_pair = net::HostPortPair::FromURL(url);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (host_port_pair.host().empty())  // See if host is <server>::<port>.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_port_pair = net::HostPortPair::FromString(host);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (host_port_pair.host().empty())  // Host is not URL or <server>::<port>.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_port_pair = net::HostPortPair(host, port);
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (host_port_pair.port() == 0)  // No port in host, use default.
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_port_pair.set_port(default_port);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return net::ProxyServer(scheme, host_port_pair);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::ProxyServer CreateProxyServerFromHost(
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& host,
92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const UIProxyConfig::ManualProxy& proxy,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::ProxyServer::Scheme scheme) {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 port = 0;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (proxy.server.is_valid())
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    port = proxy.server.host_port_pair().port();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CreateProxyServer(host, port, scheme);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::ProxyServer CreateProxyServerFromPort(
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint16 port,
102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const UIProxyConfig::ManualProxy& proxy,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::ProxyServer::Scheme scheme) {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string host;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (proxy.server.is_valid())
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host = proxy.server.host_port_pair().host();
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CreateProxyServer(host, port, scheme);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace proxy_cros_settings_parser {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsProxyPref(const std::string& path) {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return StartsWithASCII(path, kProxyPrefsPrefix, true);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void SetProxyPrefValue(const std::string& path,
119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       const base::Value* in_value,
120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       UIProxyConfigService* config_service) {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!in_value) {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Retrieve proxy config.
127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  UIProxyConfig config;
128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  config_service->GetProxyConfig(&config);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (path == kProxyPacUrl) {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string val;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in_value->GetAsString(&val)) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL url(val);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (url.is_valid())
135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        config.SetPacUrl(url);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        config.mode = UIProxyConfig::MODE_AUTO_DETECT;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (path == kProxySingleHttp) {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string val;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in_value->GetAsString(&val)) {
142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      config.SetSingleProxy(CreateProxyServerFromHost(
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          val, config.single_proxy, net::ProxyServer::SCHEME_HTTP));
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (path == kProxySingleHttpPort) {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int val;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in_value->GetAsInteger(&val)) {
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      config.SetSingleProxy(CreateProxyServerFromPort(
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          val, config.single_proxy, net::ProxyServer::SCHEME_HTTP));
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (path == kProxyHttpUrl) {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string val;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in_value->GetAsString(&val)) {
154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      config.SetProxyForScheme(
155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          "http", CreateProxyServerFromHost(
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              val, config.http_proxy, net::ProxyServer::SCHEME_HTTP));
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (path == kProxyHttpPort) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int val;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in_value->GetAsInteger(&val)) {
161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      config.SetProxyForScheme(
162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          "http", CreateProxyServerFromPort(
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              val, config.http_proxy, net::ProxyServer::SCHEME_HTTP));
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (path == kProxyHttpsUrl) {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string val;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in_value->GetAsString(&val)) {
168868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      config.SetProxyForScheme(
169868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          "https", CreateProxyServerFromHost(
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              val, config.https_proxy, net::ProxyServer::SCHEME_HTTP));
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (path == kProxyHttpsPort) {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int val;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in_value->GetAsInteger(&val)) {
175868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      config.SetProxyForScheme(
176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          "https", CreateProxyServerFromPort(
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              val, config.https_proxy, net::ProxyServer::SCHEME_HTTP));
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (path == kProxyType) {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int val;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in_value->GetAsInteger(&val)) {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (val == 3) {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (config.automatic_proxy.pac_url.is_valid())
184868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          config.SetPacUrl(config.automatic_proxy.pac_url);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          config.mode = UIProxyConfig::MODE_AUTO_DETECT;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else if (val == 2) {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (config.single_proxy.server.is_valid()) {
189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          config.SetSingleProxy(config.single_proxy.server);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          bool set_config = false;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (config.http_proxy.server.is_valid()) {
193868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            config.SetProxyForScheme("http", config.http_proxy.server);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            set_config = true;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (config.https_proxy.server.is_valid()) {
197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            config.SetProxyForScheme("https", config.https_proxy.server);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            set_config = true;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (config.ftp_proxy.server.is_valid()) {
201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            config.SetProxyForScheme("ftp", config.ftp_proxy.server);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            set_config = true;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (config.socks_proxy.server.is_valid()) {
205868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            config.SetProxyForScheme("socks", config.socks_proxy.server);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            set_config = true;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          }
208868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          if (!set_config)
209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            config.SetProxyForScheme("http", net::ProxyServer());
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        config.mode = UIProxyConfig::MODE_DIRECT;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (path == kProxySingle) {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool val;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in_value->GetAsBoolean(&val)) {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (val)
219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        config.SetSingleProxy(config.single_proxy.server);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      else
221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        config.SetProxyForScheme("http", config.http_proxy.server);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else if (path == kProxyUsePacUrl) {
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool use_pac_url;
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (in_value->GetAsBoolean(&use_pac_url)) {
226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      if (use_pac_url && config.automatic_proxy.pac_url.is_valid())
227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        config.SetPacUrl(config.automatic_proxy.pac_url);
228868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      else
229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        config.mode = UIProxyConfig::MODE_AUTO_DETECT;
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (path == kProxyFtpUrl) {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string val;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in_value->GetAsString(&val)) {
234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      config.SetProxyForScheme(
235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          "ftp", CreateProxyServerFromHost(
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              val, config.ftp_proxy, net::ProxyServer::SCHEME_HTTP));
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (path == kProxyFtpPort) {
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int val;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in_value->GetAsInteger(&val)) {
241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      config.SetProxyForScheme(
242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          "ftp", CreateProxyServerFromPort(
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              val, config.ftp_proxy, net::ProxyServer::SCHEME_HTTP));
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (path == kProxySocks) {
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string val;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in_value->GetAsString(&val)) {
248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      config.SetProxyForScheme(
249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          "socks", CreateProxyServerFromHost(
250868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              val,
251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              config.socks_proxy,
252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              StartsWithASCII(val, "socks5://", false) ?
253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              net::ProxyServer::SCHEME_SOCKS5 :
254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              net::ProxyServer::SCHEME_SOCKS4));
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (path == kProxySocksPort) {
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int val;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in_value->GetAsInteger(&val)) {
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string host = config.socks_proxy.server.host_port_pair().host();
260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      config.SetProxyForScheme(
261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          "socks", CreateProxyServerFromPort(
262868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              val,
263868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              config.socks_proxy,
264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              StartsWithASCII(host, "socks5://", false) ?
265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              net::ProxyServer::SCHEME_SOCKS5 :
266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              net::ProxyServer::SCHEME_SOCKS4));
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (path == kProxyIgnoreList) {
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::ProxyBypassRules bypass_rules;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (in_value->GetType() == base::Value::TYPE_LIST) {
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const base::ListValue* list_value =
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          static_cast<const base::ListValue*>(in_value);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (size_t x = 0; x < list_value->GetSize(); x++) {
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        std::string val;
275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        if (list_value->GetString(x, &val))
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          bypass_rules.AddRuleFromString(val);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      config.SetBypassRules(bypass_rules);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  } else {
281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    LOG(WARNING) << "Unknown proxy settings path " << path;
282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
284868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
285868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  config_service->SetProxyConfig(config);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
288868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool GetProxyPrefValue(const UIProxyConfigService& config_service,
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const std::string& path,
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::Value** out_value) {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string controlled_by;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Value* data = NULL;
293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  UIProxyConfig config;
294868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  config_service.GetProxyConfig(&config);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (path == kProxyPacUrl) {
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Only show pacurl for pac-script mode.
298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (config.mode == UIProxyConfig::MODE_PAC_SCRIPT &&
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        config.automatic_proxy.pac_url.is_valid()) {
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      data = new base::StringValue(config.automatic_proxy.pac_url.spec());
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (path == kProxySingleHttp) {
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data = CreateServerHostValue(config.single_proxy);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (path == kProxySingleHttpPort) {
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data = CreateServerPortValue(config.single_proxy);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (path == kProxyHttpUrl) {
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data = CreateServerHostValue(config.http_proxy);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (path == kProxyHttpsUrl) {
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data = CreateServerHostValue(config.https_proxy);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (path == kProxyType) {
311868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    if (config.mode == UIProxyConfig::MODE_AUTO_DETECT ||
312868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        config.mode == UIProxyConfig::MODE_PAC_SCRIPT) {
3135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      data = new base::FundamentalValue(3);
314868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    } else if (config.mode == UIProxyConfig::MODE_SINGLE_PROXY ||
315868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)               config.mode == UIProxyConfig::MODE_PROXY_PER_SCHEME) {
3165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      data = new base::FundamentalValue(2);
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
3185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      data = new base::FundamentalValue(1);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (config.state) {
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ProxyPrefs::CONFIG_POLICY:
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        controlled_by = "policy";
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ProxyPrefs::CONFIG_EXTENSION:
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        controlled_by = "extension";
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ProxyPrefs::CONFIG_OTHER_PRECEDE:
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        controlled_by = "other";
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!config.user_modifiable)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          controlled_by = "shared";
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (path == kProxySingle) {
336116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    data = new base::FundamentalValue(config.mode ==
337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                      UIProxyConfig::MODE_SINGLE_PROXY);
338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  } else if (path == kProxyUsePacUrl) {
339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    data = new base::FundamentalValue(config.mode ==
340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                      UIProxyConfig::MODE_PAC_SCRIPT);
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (path == kProxyFtpUrl) {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data = CreateServerHostValue(config.ftp_proxy);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (path == kProxySocks) {
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data = CreateServerHostValue(config.socks_proxy);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (path == kProxyHttpPort) {
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data = CreateServerPortValue(config.http_proxy);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (path == kProxyHttpsPort) {
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data = CreateServerPortValue(config.https_proxy);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (path == kProxyFtpPort) {
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data = CreateServerPortValue(config.ftp_proxy);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (path == kProxySocksPort) {
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data = CreateServerPortValue(config.socks_proxy);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (path == kProxyIgnoreList) {
3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::ListValue* list =  new base::ListValue();
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::ProxyBypassRules::RuleList bypass_rules = config.bypass_rules.rules();
356868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    for (size_t x = 0; x < bypass_rules.size(); x++)
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      list->Append(new base::StringValue(bypass_rules[x]->ToString()));
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data = list;
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *out_value = NULL;
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Decorate pref value as CoreOptionsHandler::CreateValueForPref() does.
3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DictionaryValue* dict = new base::DictionaryValue;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!data)
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    data = new base::StringValue("");
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dict->Set("value", data);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (path == kProxyType) {
370ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (!controlled_by.empty())
371ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      dict->SetString("controlledBy", controlled_by);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->SetBoolean("disabled", !config.user_modifiable);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->SetBoolean("disabled", false);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *out_value = dict;
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace proxy_cros_settings_parser
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
383