From b24535483eba9b099e739ce59838664e3660e215 Mon Sep 17 00:00:00 2001 From: AAGaming Date: Tue, 31 Oct 2023 21:50:18 -0400 Subject: [PATCH] proper fix for disabling sandbox on steamos (#206) Co-authored-by: Vendicated --- package.json | 1 + scripts/build/sandboxFix.js | 74 +++++++++++++++++++++++++++++++++++++ src/main/utils/steamOS.ts | 4 +- 3 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 scripts/build/sandboxFix.js diff --git a/package.json b/package.json index 5e3b211..aa118b4 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,7 @@ "package.json", "LICENSE" ], + "beforePack": "scripts/build/sandboxFix.js", "linux": { "icon": "build/icon.icns", "category": "Network", diff --git a/scripts/build/sandboxFix.js b/scripts/build/sandboxFix.js new file mode 100644 index 0000000..327ee24 --- /dev/null +++ b/scripts/build/sandboxFix.js @@ -0,0 +1,74 @@ +/* + * SPDX-License-Identifier: GPL-3.0 + * Vesktop, a desktop app aiming to give you a snappier Discord Experience + * Copyright (c) 2023 Vendicated and Vencord contributors + */ + +// Based on https://github.com/gergof/electron-builder-sandbox-fix/blob/master/lib/index.js + +const fs = require("fs/promises"); +const path = require("path"); +let isApplied = false; + +const hook = async () => { + if (isApplied) return; + isApplied = true; + if (process.platform !== "linux") { + // this fix is only required on linux + return; + } + const AppImageTarget = require("app-builder-lib/out/targets/AppImageTarget"); + const oldBuildMethod = AppImageTarget.default.prototype.build; + AppImageTarget.default.prototype.build = async function (...args) { + console.log("Running AppImage builder hook", args); + const oldPath = args[0]; + const newPath = oldPath + "-appimage-sandbox-fix"; + // just in case + try { + await fs.rm(newPath, { + recursive: true + }); + } catch {} + + console.log("Copying to apply appimage fix", oldPath, newPath); + await fs.cp(oldPath, newPath, { + recursive: true + }); + args[0] = newPath; + + const executable = path.join(newPath, this.packager.executableName); + + const loaderScript = ` +#!/usr/bin/env bash + +SCRIPT_DIR="$( cd "$( dirname "\${BASH_SOURCE[0]}" )" && pwd )" +IS_STEAMOS=0 + +if [[ "$SteamOS" == "1" && "$SteamGamepadUI" == "1" ]]; then + echo "Running Vesktop on SteamOS, disabling sandbox" + IS_STEAMOS=1 +fi + +exec "$SCRIPT_DIR/${this.packager.executableName}.bin" "$([ "$IS_STEAMOS" == 1 ] && echo '--no-sandbox')" "$@" + `.trim(); + + try { + await fs.rename(executable, executable + ".bin"); + await fs.writeFile(executable, loaderScript); + await fs.chmod(executable, 0o755); + } catch (e) { + console.error("failed to create loder for sandbox fix: " + e.message); + throw new Error("Failed to create loader for sandbox fix"); + } + + const ret = await oldBuildMethod.apply(this, args); + + await fs.rm(newPath, { + recursive: true + }); + + return ret; + }; +}; + +module.exports = hook; diff --git a/src/main/utils/steamOS.ts b/src/main/utils/steamOS.ts index 5f99139..1bacc92 100644 --- a/src/main/utils/steamOS.ts +++ b/src/main/utils/steamOS.ts @@ -6,9 +6,9 @@ import { exec as callbackExec } from "child_process"; import { BrowserWindow, dialog } from "electron"; +import { sleep } from "shared/utils/sleep"; import { promisify } from "util"; -import { sleep } from "../../shared/utils/sleep"; import { MessageBoxChoice } from "../constants"; import { Settings } from "../settings"; @@ -50,7 +50,7 @@ async function showLayout(appId: string) { await execSteamURL(`steam://controllerconfig/${appId}/${layoutId}`); // because the UI doesn't consistently reload after the data for the config has loaded... // HOW HAS NOBODY AT VALVE RUN INTO THIS YET - await sleep(300); + await sleep(100); await execSteamURL(`steam://controllerconfig/${appId}/${layoutId}`); }