From e1052f6c4ee745b7605de442349539bf3a716aa1 Mon Sep 17 00:00:00 2001 From: nexxo Date: Mon, 3 Aug 2026 21:32:42 +0200 Subject: [PATCH] Zwei fehlende Pruefungen aus der Nachbesserung nachgezogen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit owner und admin teilen sich dieselbe Nextcloud-Gruppe (admin) — richtig geloest durch array_unique plus Zielausschluss, aber bislang ungeprueft: ein Rollenwechsel nach admin darf group:removeuser admin nie auslösen. Und eine Instanz ohne Host muss false liefern, ohne einen einzigen Befehl abzusetzen. Beide Mutationsproben im Fix-Bericht dokumentiert, inklusive einer ehrlich vermerkten Einschraenkung: der host===null-Teil der Waechterbedingung in run() ist fuer sich genommen nicht unabhaengig von PHPs eigener Typpruefung beweisbar, weil ProxmoxClient::forHost() ohnehin einen TypeError wirft, den derselbe catch(Throwable) faengt. Der vmid-Teil derselben Bedingung ist es sehr wohl, empirisch bestaetigt. --- .../Feature/Nextcloud/NextcloudUsersTest.php | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/tests/Feature/Nextcloud/NextcloudUsersTest.php b/tests/Feature/Nextcloud/NextcloudUsersTest.php index 1702f69..35ef810 100644 --- a/tests/Feature/Nextcloud/NextcloudUsersTest.php +++ b/tests/Feature/Nextcloud/NextcloudUsersTest.php @@ -83,6 +83,35 @@ it('LOESCHT den eigenen Speicherplatz, wenn readonly verlassen wird', function ( ->and($befehle)->not->toContain('0 B'); }); +it('nimmt admin nicht kurz aus der eigenen Gruppe, wenn owner und admin auf denselben Namen zeigen', function () { + // owner und admin teilen sich dieselbe Nextcloud-Gruppe (admin). Ohne + // array_unique liefe hier group:removeuser admin VOR group:adduser admin + // — der Benutzer fiele kurz aus genau der Gruppe heraus, in die er + // gerade soll. + [$pve, $instance] = gastBereit(); + $sitz = Seat::factory()->create(['role' => 'admin', 'nc_username' => 'anna@firma.tld']); + + app(NextcloudUsers::class)->applyRole($instance, $sitz); + + $befehle = implode("\n", $pve->guestCommands); + + expect($befehle)->not->toContain("group:removeuser 'admin'") + ->and($befehle)->toContain("group:adduser 'admin'"); +}); + +it('laesst eine Instanz ohne Host unangetastet', function () { + // run() steigt vor dem Verbindungsaufbau aus, wenn es keinen Host gibt — + // es darf dabei kein einziger Befehl abgesetzt werden, denn es gibt + // nichts, worueber forHost() eine Verbindung aufbauen koennte. + $pve = new FakeProxmoxClient; + app()->instance(ProxmoxClient::class, $pve); + $instance = Instance::factory()->create(['status' => 'active', 'vmid' => 201, 'host_id' => null]); + $sitz = Seat::factory()->create(['nc_username' => 'anna@firma.tld']); + + expect(app(NextcloudUsers::class)->applyRole($instance, $sitz))->toBeFalse() + ->and($pve->guestCommands)->toBe([]); +}); + it('wirft Sitzungen beim Sperren SOFORT hinaus', function () { // user:disable allein laesst laufende Sitzungen bis zu fuenf Minuten // weiterleben. Bei einem Mitarbeiter, der gerade gegangen ist, sind fuenf