diff --git a/app/Support/NextcloudOcc.php b/app/Support/NextcloudOcc.php index 7b8240e..b638e6b 100644 --- a/app/Support/NextcloudOcc.php +++ b/app/Support/NextcloudOcc.php @@ -72,49 +72,4 @@ final class NextcloudOcc { return 'cd '.self::DIRECTORY.' && docker compose exec -T -u '.self::USER.' app '.$arguments; } - - /** - * Wie command(), aber der Wert wird erst von der Shell IM Container - * eingesetzt. - * - * command() taugt fuer `--password-from-env`, wo occ selbst die - * Umgebungsvariable liest. `config:system:set` kann das nicht: es will den - * Wert als Argument. - * - * Ohne diese Methode staende der Wert an drei Stellen: im Argv der - * VM-Shell (wo HttpProxmoxClient::guestExec() die ganze Zeichenkette als - * ['/bin/sh', '-c', $command] uebergibt), im Argv des docker-Aufrufs, und - * im Argv von `php occ` im Container. Mit dieser Methode reist der Wert - * als Umgebungsvariable in den Container und wird erst dort von der `sh` - * eingesetzt — der Gewinn ist, dass er nicht im Prozessabbild DES - * CONTAINERS steht, wo jeder Nextcloud-Prozess und jeder, der sich - * hineinhängt, ihn aus der Umgebung auslesen kann. - * - * Der Wert bleibt im Argv der VM-Shell sichtbar, fuer die Dauer des - * Aufrufs: Debians `dash` (die Standard-Shell in den Kunden-VMs) - * optimiert den Elternprozess nicht weg, wie `bash` es täte. - * - * EHRLICHERWEISE ist das Hygiene, kein Schutz: Nextcloud legt - * `mail_smtppassword` anschliessend im Klartext in config/config.php ab. - * Wer auf der Maschine eine Shell hat, liest es dort. Die eigentliche - * Eingrenzung liegt woanders — das Versandkonto kann nur senden, und der - * Versandport nimmt nur die eigenen Hostadressen an. Diese Methode senkt - * die Gelegenheit, sie beseitigt sie nicht. - * - * @param array $env - */ - public static function commandExpandingEnv(string $arguments, array $env): string - { - $assignments = ''; - $forwards = ''; - - foreach ($env as $name => $value) { - $assignments .= $name.'='.escapeshellarg($value).' '; - $forwards .= '-e '.$name.' '; - } - - return 'cd '.self::DIRECTORY.' && '.$assignments - .'docker compose exec -T -u '.self::USER.' '.$forwards - .'app sh -c '.escapeshellarg('php occ '.$arguments); - } } diff --git a/tests/Feature/NextcloudOccTest.php b/tests/Feature/NextcloudOccTest.php deleted file mode 100644 index f665752..0000000 --- a/tests/Feature/NextcloudOccTest.php +++ /dev/null @@ -1,27 +0,0 @@ - 'geheim'], - ); - - // Der Wert steht als Zuweisung VOR dem docker-Aufruf (die aeussere Shell - // reicht ihn durch), aber der occ-Aufruf selbst (ab `sh -c`) traegt nur - // den VARIABLENNAMEN. Damit sitzt das Geheimnis nicht im Argv des - // Containers. - expect($befehl)->toContain("CLUPILOT_SMTP_PW='geheim'") - ->and($befehl)->toContain('-e CLUPILOT_SMTP_PW') - ->and($befehl)->toContain('sh -c') - // Entscheidend: ab `sh -c` (der Innenteil des Containers) steht nur der Name. - ->and(substr($befehl, strpos($befehl, 'sh -c')))->not->toContain('geheim'); -}); - -it('haelt sich an dasselbe Verzeichnis und denselben Benutzer wie command()', function () { - $befehl = NextcloudOcc::commandExpandingEnv('status', []); - - expect($befehl)->toStartWith('cd '.NextcloudOcc::DIRECTORY) - ->and($befehl)->toContain('-u '.NextcloudOcc::USER); -});