• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CHROME_BROWSER_CHROMEOS_UI_PROXY_CONFIG_H_
6 #define CHROME_BROWSER_CHROMEOS_UI_PROXY_CONFIG_H_
7 
8 #include <string>
9 
10 #include "chrome/browser/prefs/proxy_prefs.h"
11 #include "net/proxy/proxy_bypass_rules.h"
12 #include "net/proxy/proxy_server.h"
13 #include "url/gurl.h"
14 
15 namespace base {
16 class DictionaryValue;
17 }
18 
19 namespace net {
20 class ProxyConfig;
21 }
22 
23 namespace chromeos {
24 
25 // Contrary to other platforms which simply use the systems' UI to allow users
26 // to configure proxies, we have to implement our own UI on the chromeos device.
27 // This requires extra and specific UI requirements that net::ProxyConfig does
28 // not supply.  So we create an augmented analog to net::ProxyConfig here to
29 // include and handle these UI requirements, e.g.
30 // - state of configuration e.g. where it was picked up from - policy,
31 //   extension, etc (refer to ProxyPrefs::ConfigState)
32 // - the read/write access of a proxy setting
33 // - may add more stuff later.
34 // This is then converted to the common net::ProxyConfig before being pushed
35 // to PrefProxyConfigTrackerImpl::OnProxyConfigChanged and then to the network
36 // stack.
37 struct UIProxyConfig {
38   // Specifies if proxy config is direct, auto-detect, using pac script,
39   // single-proxy, or proxy-per-scheme.
40   enum Mode {
41     MODE_DIRECT,
42     MODE_AUTO_DETECT,
43     MODE_PAC_SCRIPT,
44     MODE_SINGLE_PROXY,
45     MODE_PROXY_PER_SCHEME,
46   };
47 
48   // Proxy setting for mode = direct or auto-detect or using pac script.
49   struct AutomaticProxy {
50     GURL pac_url;  // Set if proxy is using pac script.
51   };
52 
53   // Proxy setting for mode = single-proxy or proxy-per-scheme.
54   struct ManualProxy {
55     net::ProxyServer server;
56   };
57 
58   UIProxyConfig();
59   ~UIProxyConfig();
60 
61   void SetPacUrl(const GURL& pac_url);
62   void SetSingleProxy(const net::ProxyServer& server);
63 
64   // |scheme| is one of "http", "https", "ftp" or "socks".
65   void SetProxyForScheme(const std::string& scheme,
66                          const net::ProxyServer& server);
67 
68   // Only valid for MODE_SINGLE_PROXY or MODE_PROXY_PER_SCHEME.
69   void SetBypassRules(const net::ProxyBypassRules& rules);
70 
71   // Converts net::ProxyConfig to |this|.
72   bool FromNetProxyConfig(const net::ProxyConfig& net_config);
73 
74   // Converts |this| to Dictionary of ProxyConfigDictionary format (which
75   // is the same format used by prefs).
76   base::DictionaryValue* ToPrefProxyConfig() const;
77 
78   // Map |scheme| (one of "http", "https", "ftp" or "socks") to the correct
79   // ManualProxy.  Returns NULL if scheme is invalid.
80   ManualProxy* MapSchemeToProxy(const std::string& scheme);
81 
82   // Encodes the proxy server as "<url-scheme>=<proxy-scheme>://<proxy>"
83   static void EncodeAndAppendProxyServer(const std::string& url_scheme,
84                                          const net::ProxyServer& server,
85                                          std::string* spec);
86 
87   Mode mode;
88 
89   ProxyPrefs::ConfigState state;
90 
91   // True if user can modify proxy settings via UI.
92   // If proxy is managed by policy or extension or other_precde or is for
93   // shared network but kUseSharedProxies is turned off, it can't be modified
94   // by user.
95   bool user_modifiable;
96 
97   // Set if mode is MODE_DIRECT or MODE_AUTO_DETECT or MODE_PAC_SCRIPT.
98   AutomaticProxy  automatic_proxy;
99   // Set if mode is MODE_SINGLE_PROXY.
100   ManualProxy     single_proxy;
101   // Set if mode is MODE_PROXY_PER_SCHEME and has http proxy.
102   ManualProxy     http_proxy;
103   // Set if mode is MODE_PROXY_PER_SCHEME and has https proxy.
104   ManualProxy     https_proxy;
105   // Set if mode is MODE_PROXY_PER_SCHEME and has ftp proxy.
106   ManualProxy     ftp_proxy;
107   // Set if mode is MODE_PROXY_PER_SCHEME and has socks proxy.
108   ManualProxy     socks_proxy;
109 
110   // Exceptions for when not to use a proxy.
111   net::ProxyBypassRules bypass_rules;
112 };
113 
114 }  // namespace chromeos
115 
116 #endif  // CHROME_BROWSER_CHROMEOS_UI_PROXY_CONFIG_H_
117