Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: respect system proxy settings on Windows platform #704

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions assets/jsons/translations/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,13 @@
"error-notification": {
"message": "Ein Fehler ist aufgetreten, die Einstellungen für symbolische Links können nicht geändert werden."
}
},
"use-system-proxy": {
"title": "System-Proxy verwenden",
"description": "BSManager wird Netzwerkrequests über Ihren Systemproxy durchführen.",
"error-notification": {
"message": "Es ist ein Fehler aufgetreten, die Systemproxyeinstellungen können nicht geändert werden."
}
}
}
}
Expand Down
13 changes: 10 additions & 3 deletions assets/jsons/translations/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,7 @@
"confirm-btn": "Yes I'm sure"
},
"error-notification": {
"message": "An error occured, unable to disable hardware acceleration."
"message": "An error occurred, unable to disable hardware acceleration."
}
},
"use-symlinks": {
Expand All @@ -277,7 +277,14 @@
"confirm-btn": "Yes I'm sure"
},
"error-notification": {
"message": "An error occured, unable to change symlinks settings."
"message": "An error occurred, unable to change symlinks settings."
}
},
"use-system-proxy": {
"title": "Use system proxy",
"description": "BSManager will make network requests through your system proxy.",
"error-notification": {
"message": "An error occurred, unable to change system proxy settings."
}
}
}
Expand Down Expand Up @@ -1045,7 +1052,7 @@
},
"no-models": "No models found.",
"no-internet": "No internet connection.",
"error-occured": "An error occurred, try again later."
"error-occurred": "An error occurred, try again later."
}
},
"notifications": {
Expand Down
7 changes: 7 additions & 0 deletions assets/jsons/translations/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,13 @@
"error-notification": {
"message": "Ocurrió un error, no se pueden cambiar los ajustes de los enlaces simbólicos."
}
},
"use-system-proxy": {
"title": "Usar proxy del sistema",
"description": "BSManager realizará solicitudes de red a través de su proxy del sistema.",
"error-notification": {
"message": "Ocurrió un error, no se pueden cambiar los ajustes del proxy del sistema."
}
}
}
}
Expand Down
7 changes: 7 additions & 0 deletions assets/jsons/translations/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,13 @@
"error-notification": {
"message": "Une erreur s'est produite, impossible de changer les paramètres des liens symboliques."
}
},
"use-system-proxy": {
"title": "Utiliser le proxy du système",
"description": "BSManager effectuera des requêtes réseau via votre proxy système.",
"error-notification": {
"message": "Une erreur est survenue, impossible de modifier les paramètres du proxy système."
}
}
}
}
Expand Down
7 changes: 7 additions & 0 deletions assets/jsons/translations/ja.json
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,13 @@
"error-notification": {
"message": "エラーが発生しました。シンボリックリンク設定を変更できません。"
}
},
"use-system-proxy": {
"title": "システムプロキシを使用",
"description": "BSManagerはシステムプロキシを通じてネットワークリクエストを行います。",
"error-notification": {
"message": "エラーが発生しました。システムプロキシ設定を変更できません。"
}
}
}
}
Expand Down
7 changes: 7 additions & 0 deletions assets/jsons/translations/ko.json
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,13 @@
"error-notification": {
"message": "오류가 발생했습니다. 심볼릭 링크 설정을 변경할 수 없습니다."
}
},
"use-system-proxy": {
"title": "시스템 프록시 사용",
"description": "BSManager는 시스템 프록시를 통해 네트워크 요청을 수행합니다.",
"error-notification": {
"message": "오류가 발생했습니다. 시스템 프록시 설정을 변경할 수 없습니다."
}
}
}
}
Expand Down
7 changes: 7 additions & 0 deletions assets/jsons/translations/ru.json
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,13 @@
"error-notification": {
"message": "Произошла ошибка, невозможно изменить настройки символических ссылок."
}
},
"use-system-proxy": {
"title": "Использовать системный прокси",
"description": "BSManager будет делать сетевые запросы через ваш системный прокси.",
"error-notification": {
"message": "Произошла ошибка, не удалось изменить настройки системного прокси."
}
}
}
}
Expand Down
7 changes: 7 additions & 0 deletions assets/jsons/translations/zh-tw.json
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,13 @@
"error-notification": {
"message": "發生錯誤,無法更改符號鏈接設置。"
}
},
"use-system-proxy": {
"title": "使用系統代理",
"description": "BSManager將通過您的系統代理發送網絡請求。",
"error-notification": {
"message": "發生錯誤,無法更改系統代理設置。"
}
}
}
}
Expand Down
7 changes: 7 additions & 0 deletions assets/jsons/translations/zh.json
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,13 @@
"error-notification": {
"message": "发生错误,无法更改符号链接设置。"
}
},
"use-system-proxy": {
"title": "使用系统代理",
"description": "BSMansger将通过系统代理发起网络请求。",
"error-notification": {
"message": "发生错误,无法启用系统代理。"
}
}
}
}
Expand Down
9 changes: 9 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@
"@types/color": "^3.0.3",
"@types/crypto-js": "^4.2.1",
"@types/dateformat": "^5.0.0",
"@types/global-agent": "^2.1.3",
"@types/got": "^9.6.12",
"@types/jest": "^29.5.11",
"@types/node": "22.8.6",
Expand Down Expand Up @@ -170,6 +171,7 @@
"format-duration": "^3.0.2",
"framer-motion": "^11.2.6",
"fs-extra": "^11.2.0",
"global-agent": "^3.0.0",
"got": "^14.4.4",
"history": "^5.3.0",
"is-elevated": "^4.0.0",
Expand Down
81 changes: 81 additions & 0 deletions src/main/helpers/proxy.helpers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
import log from 'electron-log';
GoldJohnKing marked this conversation as resolved.
Show resolved Hide resolved
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 changes: 2 additions & 0 deletions src/main/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -46,6 +47,7 @@ staticConfig.take("disable-hadware-acceleration", disabled => {
}
});

configureProxy();

if (process.env.NODE_ENV === "production") {
const sourceMapSupport = require("source-map-support");
Expand Down
1 change: 1 addition & 0 deletions src/main/services/static-configuration.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
24 changes: 24 additions & 0 deletions src/renderer/pages/settings-page.component.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -541,10 +541,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) => {
Expand Down Expand Up @@ -609,6 +611,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"),
Expand All @@ -622,6 +640,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">
Expand Down