From 29fef7cb3317662e703eebf2f269b3501f210216 Mon Sep 17 00:00:00 2001 From: Louis Date: Fri, 25 Sep 2026 18:43:38 +0200 Subject: [PATCH] =?UTF-8?q?Updater=20(pacman):=20pkexec/sudo=20=C3=BCber?= =?UTF-8?q?=20systemd-run=20--user=20starten,=20da=20Electron=20NO=5FNEW?= =?UTF-8?q?=5FPRIVS=20setzt=20und=20Kindprozesse=20keine=20Root-Rechte=20e?= =?UTF-8?q?rlangen=20k=C3=B6nnen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- src/main/updater.js | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/updater.js b/src/main/updater.js index ccf46a9..ee71ae4 100644 --- a/src/main/updater.js +++ b/src/main/updater.js @@ -7,14 +7,27 @@ const os = require('os'); const path = require('path'); const i18n = require('../i18n'); -// Startet ein Programm und liefert den Exit-Code ('ENOENT', falls es nicht existiert) -function run(cmd, args) { +// Startet ein Programm und liefert den Exit-Code ('ENOENT', falls es nicht existiert). +// Electron/Chromium setzt unter Linux PR_SET_NO_NEW_PRIVS, das alle Kindprozesse erben – dann +// funktionieren weder pkexec noch sudo. Deshalb über systemd-run --user starten: Elternprozess ist +// dann der systemd-User-Manager, ohne diesen Schalter. +const GUI_ENV = ['DISPLAY', 'WAYLAND_DISPLAY', 'XAUTHORITY', 'XDG_RUNTIME_DIR', 'XDG_SESSION_TYPE', 'DBUS_SESSION_BUS_ADDRESS']; +function spawnCode(cmd, args) { return new Promise((resolve) => { const p = spawn(cmd, args, { stdio: 'ignore' }); p.on('error', (e) => resolve(e.code === 'ENOENT' ? 'ENOENT' : e.message)); p.on('exit', (c) => resolve(c)); }); } +let hasSystemdRun; +async function run(cmd, args) { + if (hasSystemdRun === undefined) hasSystemdRun = (await spawnCode('systemd-run', ['--user', '--quiet', '--wait', '--collect', 'true'])) === 0; + if (!hasSystemdRun) return spawnCode(cmd, args); + const inPath = cmd.includes('/') ? fs.existsSync(cmd) : (process.env.PATH || '').split(':').some((d) => d && fs.existsSync(path.join(d, cmd))); + if (!inPath) return 'ENOENT'; + const env = GUI_ENV.filter((k) => process.env[k]).flatMap((k) => ['-E', `${k}=${process.env[k]}`]); + return spawnCode('systemd-run', ['--user', '--quiet', '--wait', '--collect', ...env, '--', cmd, ...args]); +} // Fallback ohne Polkit-Agent: pacman -U per sudo in einem Terminalfenster; wartet, bis das Fenster geschlossen ist. // Der Erfolg wird über eine Marker-Datei erkannt, da nicht jedes Terminal den Exit-Code durchreicht.