1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
|
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Definition of helper functions for the Chrome Extensions Proxy Settings API.
#ifndef CHROME_BROWSER_EXTENSIONS_API_PROXY_PROXY_API_HELPERS_H_
#define CHROME_BROWSER_EXTENSIONS_API_PROXY_PROXY_API_HELPERS_H_
#include <array>
#include <memory>
#include <optional>
#include <string>
#include "base/values.h"
#include "components/proxy_config/proxy_prefs.h"
#include "net/proxy_resolution/proxy_config.h"
class ProxyConfigDictionary;
namespace extensions {
namespace proxy_api_helpers {
// The scheme for which to use a manually specified proxy, not of the proxy URI
// itself.
enum {
SCHEME_ALL = 0,
SCHEME_HTTP,
SCHEME_HTTPS,
SCHEME_FTP,
SCHEME_FALLBACK,
SCHEME_MAX = SCHEME_FALLBACK // Keep this value up to date.
};
// The names of the schemes to be used to build the preference value string
// for manual proxy settings. These must be kept in sync with the SCHEME_*
// constants.
inline constexpr std::array kSchemeNames{"*error*", "http", "https", "ftp",
"socks"};
inline constexpr std::array kFieldNames{"singleProxy", "proxyForHttp",
"proxyForHttps", "proxyForFtp",
"fallbackProxy"};
static_assert(SCHEME_MAX == SCHEME_FALLBACK, "SCHEME_MAX is incorrect");
static_assert(std::size(kFieldNames) == SCHEME_MAX + 1,
"kFieldNames array size is incorrect");
static_assert(std::size(kSchemeNames) == SCHEME_MAX + 1,
"kSchemeNames array size is incorrect");
static_assert(SCHEME_ALL == 0, "SCHEME_ALL must be the first value");
// Conversion between PAC scripts and data-encoding URLs containing these
// PAC scripts. Data-encoding URLs consist of a data:// prefix, a mime-type and
// base64 encoded text. CreatePACScriptFromDataURL should only be called on
// data-encoding urls created with CreateDataURLFromPACScript.
std::string CreateDataURLFromPACScript(const std::string& pac_script);
bool CreatePACScriptFromDataURL(
const std::string& pac_script_url_base64_encoded,
std::string* pac_script);
// Helper functions for extension->browser pref transformation:
// The following functions extract one piece of data from the `proxy_config`
// each. `proxy_config` is a ProxyConfig dictionary as defined in the
// extension API. All output values conform to the format expected by a
// ProxyConfigDictionary.
//
// - If there are NO entries for the respective pieces of data, the functions
// return true.
// The GetPacMandatoryFromExtensionPref() function sets `out` to false in this
// case.
// - If there ARE entries and they could be parsed, the functions set `out`
// and return true.
// - If there are entries that could not be parsed, the functions set `error`
// and return false.
//
// The parameter `bad_message` is passed to simulate the behavior of
// EXTENSION_FUNCTION_VALIDATE. It is never NULL.
bool GetProxyModeFromExtensionPref(const base::Value::Dict& proxy_config,
ProxyPrefs::ProxyMode* out,
std::string* error,
bool* bad_message);
bool GetPacMandatoryFromExtensionPref(const base::Value::Dict& proxy_config,
bool* out,
std::string* error,
bool* bad_message);
bool GetPacUrlFromExtensionPref(const base::Value::Dict& proxy_config,
std::string* out,
std::string* error,
bool* bad_message);
bool GetPacDataFromExtensionPref(const base::Value::Dict& proxy_config,
std::string* out,
std::string* error,
bool* bad_message);
bool GetProxyRulesStringFromExtensionPref(const base::Value::Dict& proxy_config,
std::string* out,
std::string* error,
bool* bad_message);
bool GetBypassListFromExtensionPref(const base::Value::Dict& proxy_config,
std::string* out,
std::string* error,
bool* bad_message);
// Creates and returns a ProxyConfig dictionary (as defined in the extension
// API) from the given parameters. Ownership is passed to the caller.
// Depending on the value of `mode_enum`, several of the strings may be empty.
std::optional<base::Value::Dict> CreateProxyConfigDict(
ProxyPrefs::ProxyMode mode_enum,
bool pac_mandatory,
const std::string& pac_url,
const std::string& pac_data,
const std::string& proxy_rules_string,
const std::string& bypass_list,
std::string* error);
// Converts a ProxyServer dictionary instance (as defined in the extension API)
// `proxy_server` to a net::ProxyServer.
// `default_scheme` is the default scheme that is filled in, in case the
// caller did not pass one.
// Returns true if successful and sets `error` otherwise.
bool GetProxyServer(const base::Value::Dict& proxy_server,
net::ProxyServer::Scheme default_scheme,
net::ProxyServer* out,
std::string* error,
bool* bad_message);
// Joins a list of URLs (stored as StringValues) in `list` with `joiner`
// to `out`. Returns true if successful and sets `error` otherwise.
bool JoinUrlList(const base::Value::List& list,
const std::string& joiner,
std::string* out,
std::string* error,
bool* bad_message);
// Helper functions for browser->extension pref transformation:
// Creates and returns a ProxyRules dictionary as defined in the extension API
// with the values of a ProxyConfigDictionary configured for fixed proxy
// servers. Returns an empty object in case of failures.
std::optional<base::Value::Dict> CreateProxyRulesDict(
const ProxyConfigDictionary& proxy_config);
// Creates and returns a ProxyServer dictionary as defined in the extension API
// with values from a net::ProxyChain object. Returns an empty dictionary on
// error.
base::Value::Dict CreateProxyServerDict(const net::ProxyChain& proxy);
// Creates and returns a PacScript dictionary as defined in the extension API
// with the values of a ProxyconfigDictionary configured for pac scripts.
// Returns an empty object in case of failures.
std::optional<base::Value::Dict> CreatePacScriptDict(
const ProxyConfigDictionary& proxy_config);
// Tokenizes the `in` at delimiters `delims` and returns a new
// base::Value::List with string values created from the tokens.
base::Value::List TokenizeToStringList(const std::string& in,
const std::string& delims);
} // namespace proxy_api_helpers
} // namespace extensions
#endif // CHROME_BROWSER_EXTENSIONS_API_PROXY_PROXY_API_HELPERS_H_
|