From bcaf60a3b2b6e1aaeaf463ec2558543abab9e594 Mon Sep 17 00:00:00 2001 From: Fedor Indutny <79877362+indutny-signal@users.noreply.github.com> Date: Thu, 11 Apr 2024 19:06:54 +0200 Subject: [PATCH] Introduce --disable-ipv6 CLI option --- app/main.ts | 6 ++++++ ts/types/RendererConfig.ts | 1 + ts/util/dns.ts | 15 ++++++++++++++- ts/windows/main/phase2-dependencies.ts | 3 +++ 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/app/main.ts b/app/main.ts index 21b9b4dd55..23bc75b5db 100644 --- a/app/main.ts +++ b/app/main.ts @@ -207,6 +207,8 @@ const defaultWebPrefs = { const DISABLE_GPU = OS.isLinux() && !process.argv.some(arg => arg === '--enable-gpu'); +const DISABLE_IPV6 = process.argv.some(arg => arg === '--disable-ipv6'); + const CLI_LANG = cliOptions.lang as string | undefined; setupCrashReports(getLogger, showDebugLogWindow); @@ -1719,6 +1721,9 @@ if (DISABLE_GPU) { let ready = false; app.on('ready', async () => { dns.setFallback(await getDNSFallback()); + if (DISABLE_IPV6) { + dns.setIPv6Enabled(false); + } const [userDataPath, crashDumpsPath, installPath] = await Promise.all([ realpath(app.getPath('userData')), @@ -2448,6 +2453,7 @@ ipc.on('get-config', async event => { ciMode, // Should be already computed and cached at this point dnsFallback: await getDNSFallback(), + disableIPv6: DISABLE_IPV6, ciBackupPath: config.get('ciBackupPath') || undefined, nodeVersion: process.versions.node, hostname: os.hostname(), diff --git a/ts/types/RendererConfig.ts b/ts/types/RendererConfig.ts index 09497a11c8..a691df39fc 100644 --- a/ts/types/RendererConfig.ts +++ b/ts/types/RendererConfig.ts @@ -41,6 +41,7 @@ export const rendererConfigSchema = z.object({ contentProxyUrl: configRequiredStringSchema, crashDumpsPath: configRequiredStringSchema, ciMode: z.enum(['full', 'benchmark']).or(z.literal(false)), + disableIPv6: z.boolean(), dnsFallback: DNSFallbackSchema, ciBackupPath: configOptionalStringSchema, environment: environmentSchema, diff --git a/ts/util/dns.ts b/ts/util/dns.ts index fc40191f9c..501a7106d5 100644 --- a/ts/util/dns.ts +++ b/ts/util/dns.ts @@ -26,6 +26,12 @@ export function setFallback(dnsFallback: DNSFallbackType): void { } } +let ipv6Enabled = true; + +export function setIPv6Enabled(value: boolean): void { + ipv6Enabled = value; +} + function lookupAll( hostname: string, opts: LookupOneOptions | LookupAllOptions, @@ -77,7 +83,7 @@ function lookupAll( } } - const addresses = result.endpoints.map(({ address, family }) => { + let addresses = result.endpoints.map(({ address, family }) => { let numericFamily = -1; if (family === 'ipv4') { numericFamily = 4; @@ -90,6 +96,13 @@ function lookupAll( }; }); + if (!ipv6Enabled) { + const ipv4Only = addresses.filter(({ family }) => family !== 6); + if (ipv4Only.length !== 0) { + addresses = ipv4Only; + } + } + if (!opts.all) { const random = addresses.at(Math.floor(Math.random() * addresses.length)); if (random === undefined) { diff --git a/ts/windows/main/phase2-dependencies.ts b/ts/windows/main/phase2-dependencies.ts index 5bc4c81627..7705adc93f 100644 --- a/ts/windows/main/phase2-dependencies.ts +++ b/ts/windows/main/phase2-dependencies.ts @@ -74,6 +74,9 @@ if (config.crashDumpsPath) { addSensitivePath(config.crashDumpsPath); } +if (SignalContext.config.disableIPv6) { + dns.setIPv6Enabled(false); +} dns.setFallback(SignalContext.config.dnsFallback); window.Signal = setup({