Eine occ-Befehlsform, deren Wert erst im Container eingesetzt wird
config:system:set will den Wert als Argument. Setzte ihn die aeussere Shell ein, stuende das SMTP-Passwort in der Prozessliste der Kunden-VM. Mit `sh -c` im Container steht dort nur der Variablenname. Im Kopfkommentar steht ausdruecklich, dass das Hygiene ist und kein Schutz: Nextcloud legt den Wert danach im Klartext in config.php ab. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>feat/versandtakt
parent
cacdca0a18
commit
4feaba1bb1
|
|
@ -72,4 +72,39 @@ 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. Setzte die aeussere Shell ihn ein, stuende das
|
||||
* Passwort in der Prozessliste der KUNDEN-VM — dort, wo jeder mit einer
|
||||
* Shell auf der Maschine `ps` ausfuehren kann. So steht es nur in der des
|
||||
* Containers.
|
||||
*
|
||||
* 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<string, string> $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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,26 @@
|
|||
<?php // tests/Feature/NextcloudOccTest.php
|
||||
|
||||
use App\Support\NextcloudOcc;
|
||||
|
||||
it('setzt den Wert erst IM Container ein, nicht in der VM', function () {
|
||||
$befehl = NextcloudOcc::commandExpandingEnv(
|
||||
'config:system:set mail_smtppassword --value="$CLUPILOT_SMTP_PW"',
|
||||
['CLUPILOT_SMTP_PW' => 'geheim'],
|
||||
);
|
||||
|
||||
// Das Geheimnis steht als Zuweisung da (die aeussere Shell reicht es
|
||||
// durch), aber der occ-Aufruf traegt nur den VARIABLENNAMEN — eingesetzt
|
||||
// wird er von der sh INNERHALB des Containers.
|
||||
expect($befehl)->toContain("CLUPILOT_SMTP_PW='geheim'")
|
||||
->and($befehl)->toContain('-e CLUPILOT_SMTP_PW')
|
||||
->and($befehl)->toContain('sh -c')
|
||||
// Entscheidend: hinter `php occ` steht der Name, nicht der Wert.
|
||||
->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);
|
||||
});
|
||||
Loading…
Reference in New Issue