Revision control
Copy as Markdown
Other Tools
/* 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,
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
});
const PREF_LOGLEVEL = "browser.policies.loglevel";
ChromeUtils.defineLazyGetter(lazy, "log", () => {
return console.createInstance({
prefix: "ProxyPolicies",
// 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 accessed 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],
]);
const proxyPreferences = [
"network.proxy.type",
"network.proxy.autoconfig_url",
"network.proxy.socks_remote_dns",
"network.proxy.socks5_remote_dns",
"signon.autologin.proxy",
"network.proxy.socks_version",
"network.proxy.no_proxies_on",
"network.proxy.share_proxy_settings",
"network.proxy.http",
"network.proxy.http_port",
"network.proxy.ssl",
"network.proxy.ssl_port",
"network.proxy.socks",
"network.proxy.socks_port",
];
/**
* Reports an operation of a policy that failed, so that the policy is flagged
* as only partially applied in about:policies.
*
* @param {string} message A description of what failed.
*/
function reportFailure(message) {
lazy.log.error(message);
lazy.PolicyFailures.report("Proxy", message);
}
export var ProxyPolicies = {
configureProxySettings(param, setPref) {
if (param.Mode !== undefined) {
setPref("network.proxy.type", PROXY_TYPES_MAP.get(param.Mode));
}
if (param.AutoConfigURL !== undefined) {
setPref("network.proxy.autoconfig_url", param.AutoConfigURL.href);
}
if (param.UseProxyForDNS !== undefined) {
setPref("network.proxy.socks_remote_dns", param.UseProxyForDNS);
setPref("network.proxy.socks5_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) {
}
function setProxyHostAndPort(type, address) {
// Prepend https just so we can use the URL parser
// instead of parsing manually.
if (address) {
if (!url) {
reportFailure(`Invalid address for ${type} proxy: ${address}`);
return;
}
setPref(`network.proxy.${type}`, url.hostname);
if (url.port) {
setPref(`network.proxy.${type}_port`, Number(url.port));
}
} else {
setPref(`network.proxy.${type}`, "");
setPref(`network.proxy.${type}_port`, 0);
}
}
if (param.HTTPProxy !== undefined) {
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.HTTPProxy;
}
}
if (param.SSLProxy !== undefined) {
setProxyHostAndPort("ssl", param.SSLProxy);
}
if (param.SOCKSProxy !== undefined) {
setProxyHostAndPort("socks", param.SOCKSProxy);
}
// All preferences should be locked regardless of whether or not a
// specific value was set.
if ("Locked" in param) {
for (const preference of proxyPreferences) {
if (param.Locked) {
Services.prefs.lockPref(preference);
} else {
Services.prefs.unlockPref(preference);
}
}
}
},
/**
* Restores every proxy preference to the state it had before the policy was
* applied.
*
* @param {Function} unsetPref A function that restores a preference
* to its pre-policy state.
*/
resetProxySettings(unsetPref) {
for (const preference of proxyPreferences) {
unsetPref(preference);
}
},
};