Merge pull request #704 from GoldJohnKing/feat/702-respect-system-proxy-windows

feat: respect system proxy settings on Windows platform
This commit is contained in:
MathieuG-P
2024-12-26 22:42:20 +01:00
committed by GitHub
15 changed files with 185 additions and 3 deletions
+81
View File
@@ -0,0 +1,81 @@
import log from 'electron-log';
import { RegDwordValue, RegSzValue } from "regedit-rs"
import { execOnOs } from "../helpers/env.helpers";
import { bootstrap } from 'global-agent';
import { StaticConfigurationService } from "../services/static-configuration.service";
const staticConfig = StaticConfigurationService.getInstance();
const { list } = (execOnOs({ win32: () => require("regedit-rs") }, true) ?? {}) as typeof import("regedit-rs");
async function isProxyEnabled(): Promise<boolean>{
const res = await list("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings");
const key = res["HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"];
if(!key.exists){ throw new Error("Key \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\" not exist"); }
const registryValue = key.values.ProxyEnable as RegDwordValue;
if(!registryValue){ throw new Error("Value \"ProxyEnable\" not exist"); }
return (1 === registryValue.value);
}
async function getProxyServer(): Promise<string>{
const res = await list("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings");
const key = res["HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"];
if(!key.exists){ throw new Error("Key \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\" not exist"); }
const registryValue = key.values.ProxyServer as RegSzValue;
if(!registryValue){ throw new Error("Value \"ProxyServer\" not exist"); }
return registryValue.value;
}
async function getProxyOverride(): Promise<string>{
const res = await list("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings");
const key = res["HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"];
if(!key.exists){ throw new Error("Key \"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\" not exist"); }
const registryValue = key.values.ProxyOverride as RegSzValue;
if(!registryValue){ throw new Error("Value \"ProxyOverride\" not exist"); }
return registryValue.value;
}
async function enableWindowsProxy(enable: boolean): Promise<void> {
if (!(await isProxyEnabled().catch(err => log.error(err)))) {
log.info("enableWindowsProxy: System proxy not detected");
return;
}
let { GLOBAL_AGENT: globalProxyAgent } = global as any;
if (!globalProxyAgent) { // If this is undefined, call bootstrap to set it up
if (!bootstrap()) {
log.error("enableWindowsProxy: Could not setup proxy stuff");
return;
}
globalProxyAgent = (global as any).GLOBAL_AGENT;
}
if (enable) {
const httpProxyUrl = `http://${await getProxyServer().catch(err => log.error(err))}`
globalProxyAgent.HTTP_PROXY = httpProxyUrl;
globalProxyAgent.HTTPS_PROXY = httpProxyUrl;
globalProxyAgent.NO_PROXY = `${await getProxyOverride().catch(err => log.error(err))}`;
log.info(`enableWindowsProxy: Using system proxy: ${httpProxyUrl}`);
} else {
delete globalProxyAgent.HTTP_PROXY;
delete globalProxyAgent.HTTPS_PROXY;
delete globalProxyAgent.NO_PROXY;
log.info("enableWindowsProxy: proxy disabled");
}
}
export function configureProxy() {
if (process.platform === "win32") {
enableWindowsProxy(staticConfig.get("use-system-proxy"));
staticConfig.$watch("use-system-proxy").subscribe((useSystemProxy) => {
enableWindowsProxy(useSystemProxy);
log.info(`configureProxy: UseSystemProxy is set to ${useSystemProxy}`);
});
} else {
log.info("configureProxy: Unsupported platform");
}
}
+2
View File
@@ -25,6 +25,7 @@ import { FileAssociationService } from "./services/file-association.service";
import { SongDetailsCacheService } from "./services/additional-content/maps/song-details-cache.service";
import { readdirSync, statSync, unlinkSync } from "fs-extra";
import { StaticConfigurationService } from "./services/static-configuration.service";
import { configureProxy } from './helpers/proxy.helpers';
const isDebug = process.env.NODE_ENV === "development" || process.env.DEBUG_PROD === "true";
const staticConfig = StaticConfigurationService.getInstance();
@@ -46,6 +47,7 @@ staticConfig.take("disable-hadware-acceleration", disabled => {
}
});
configureProxy();
if (process.env.NODE_ENV === "production") {
const sourceMapSupport = require("source-map-support");
@@ -88,6 +88,7 @@ export interface StaticConfigKeyValues {
"song-details-cache-etag": string;
"disable-hadware-acceleration": boolean;
"use-symlinks": boolean;
"use-system-proxy": boolean;
// Linux Specific static configs
"proton-folder": string;
@@ -544,10 +544,12 @@ function AdvancedSettings() {
const [hardwareAccelerationEnabled, setHardwareAccelerationEnabled] = useState(true);
const [useSymlink, setUseSymlink] = useState(false);
const [useSystemProxy, setUseSystemProxy] = useState(false);
useEffect(() => {
staticConfig.get("disable-hadware-acceleration").then(disabled =>setHardwareAccelerationEnabled(() => disabled !== true));
staticConfig.get("use-symlinks").then(useSymlinks => setUseSymlink(() => useSymlinks));
staticConfig.get("use-system-proxy").then(useSystemProxy => setUseSystemProxy(() => useSystemProxy));
}, []);
const onChangeHardwareAcceleration = async (newHardwareAccelerationEnabled: boolean) => {
@@ -612,6 +614,22 @@ function AdvancedSettings() {
setUseSymlink(() => newUseSymlink);
}
const onChangeUseSystemProxy = async (newUseSystemProxy: boolean) => {
if (window.electron.platform !== "win32" || newUseSystemProxy === useSystemProxy) {
return;
}
const { error } = await tryit(() => staticConfig.set("use-system-proxy", newUseSystemProxy));
if(error){
notification.notifyError({ title: "notifications.types.error", desc: "pages.settings.advanced.use-system-proxy.error-notification.message" });
return;
}
setUseSystemProxy(() => newUseSystemProxy);
}
const advancedItems: Item[] = [{
checked: hardwareAccelerationEnabled,
text: t.text("pages.settings.advanced.hardware-acceleration.title"),
@@ -625,6 +643,12 @@ function AdvancedSettings() {
desc: t.text("pages.settings.advanced.use-symlinks.description"),
onChange: onChangeUseSymlinks
});
advancedItems.push({
checked: useSystemProxy,
text: t.text("pages.settings.advanced.use-system-proxy.title"),
desc: t.text("pages.settings.advanced.use-system-proxy.description"),
onChange: onChangeUseSystemProxy
});
}
return <SettingContainer title="pages.settings.advanced.title" description="pages.settings.advanced.description">