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
|
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs";
const PREF_LOGLEVEL = "browser.policies.loglevel";
const lazy = {};
XPCOMUtils.defineLazyGetter(lazy, "log", () => {
let { ConsoleAPI } = ChromeUtils.importESModule(
"resource://gre/modules/Console.sys.mjs"
);
return new ConsoleAPI({
prefix: "ProxyPolicies.jsm",
// tip: set maxLogLevel to "debug" and use log.debug() to create detailed
// messages during development. See LOG_LEVELS in Console.sys.mjs for details.
maxLogLevel: "error",
maxLogLevelPref: PREF_LOGLEVEL,
});
});
// Don't use const here because this is acessed by
// tests through the BackstagePass object.
export var PROXY_TYPES_MAP = new Map([
["none", Ci.nsIProtocolProxyService.PROXYCONFIG_DIRECT],
["system", Ci.nsIProtocolProxyService.PROXYCONFIG_SYSTEM],
["manual", Ci.nsIProtocolProxyService.PROXYCONFIG_MANUAL],
["autoDetect", Ci.nsIProtocolProxyService.PROXYCONFIG_WPAD],
["autoConfig", Ci.nsIProtocolProxyService.PROXYCONFIG_PAC],
]);
export var ProxyPolicies = {
configureProxySettings(param, setPref) {
if (param.Mode) {
setPref("network.proxy.type", PROXY_TYPES_MAP.get(param.Mode));
}
if (param.AutoConfigURL) {
setPref("network.proxy.autoconfig_url", param.AutoConfigURL.href);
}
if (param.UseProxyForDNS !== undefined) {
setPref("network.proxy.socks_remote_dns", param.UseProxyForDNS);
}
if (param.AutoLogin !== undefined) {
setPref("signon.autologin.proxy", param.AutoLogin);
}
if (param.SOCKSVersion !== undefined) {
if (param.SOCKSVersion != 4 && param.SOCKSVersion != 5) {
lazy.log.error("Invalid SOCKS version");
} else {
setPref("network.proxy.socks_version", param.SOCKSVersion);
}
}
if (param.Passthrough !== undefined) {
setPref("network.proxy.no_proxies_on", param.Passthrough);
}
if (param.UseHTTPProxyForAllProtocols !== undefined) {
setPref(
"network.proxy.share_proxy_settings",
param.UseHTTPProxyForAllProtocols
);
}
if (param.FTPProxy) {
lazy.log.warn("FTPProxy support was removed in bug 1574475");
}
function setProxyHostAndPort(type, address) {
let url;
try {
// Prepend https just so we can use the URL parser
// instead of parsing manually.
url = new URL(`https://${address}`);
} catch (e) {
lazy.log.error(`Invalid address for ${type} proxy: ${address}`);
return;
}
setPref(`network.proxy.${type}`, url.hostname);
if (url.port) {
setPref(`network.proxy.${type}_port`, Number(url.port));
}
}
if (param.HTTPProxy) {
setProxyHostAndPort("http", param.HTTPProxy);
// network.proxy.share_proxy_settings is a UI feature, not handled by the
// network code. That pref only controls if the checkbox is checked, and
// then we must manually set the other values.
if (param.UseHTTPProxyForAllProtocols) {
param.SSLProxy = param.SOCKSProxy = param.HTTPProxy;
}
}
if (param.SSLProxy) {
setProxyHostAndPort("ssl", param.SSLProxy);
}
if (param.SOCKSProxy) {
setProxyHostAndPort("socks", param.SOCKSProxy);
}
},
};
|