Updater (pacman): pkexec/sudo über systemd-run --user starten, da Electron NO_NEW_PRIVS setzt und Kindprozesse keine Root-Rechte erlangen können

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-25 18:43:38 +02:00
co-authored by Claude Opus 5.5
parent 74ce2c20be
commit 29fef7cb33
+15 -2
View File
@@ -7,14 +7,27 @@ const os = require('os');
const path = require('path'); const path = require('path');
const i18n = require('../i18n'); const i18n = require('../i18n');
// Startet ein Programm und liefert den Exit-Code ('ENOENT', falls es nicht existiert) // Startet ein Programm und liefert den Exit-Code ('ENOENT', falls es nicht existiert).
function run(cmd, args) { // 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) => { return new Promise((resolve) => {
const p = spawn(cmd, args, { stdio: 'ignore' }); const p = spawn(cmd, args, { stdio: 'ignore' });
p.on('error', (e) => resolve(e.code === 'ENOENT' ? 'ENOENT' : e.message)); p.on('error', (e) => resolve(e.code === 'ENOENT' ? 'ENOENT' : e.message));
p.on('exit', (c) => resolve(c)); 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. // 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. // Der Erfolg wird über eine Marker-Datei erkannt, da nicht jedes Terminal den Exit-Code durchreicht.