CluPilotCloud/app
nexxo f62304a245 Jemanden aus einer Gruppe zu nehmen, in der er nicht ist, ist kein Fehler
K3. `mitarbeiter` und `nur-lesen` legt niemand an — sie entstehen erst, wenn
`user:add --group=…` sie zum ersten Mal braucht. `occ group:removeuser` legt
nichts an und beendet mit Fehlercode, wenn die Gruppe fehlt, und run() verundet
alle Exitcodes. Auf einer frischen Instanz scheiterte damit die erste
Rollenaenderung dauerhaft: "fehlgeschlagen — Die Cloud hat die Aenderung nicht
angenommen", und Wiederholen waehlte wieder role, also wieder denselben
Fehlschlag.

`2>/dev/null || true` hinter dem Entfernen, mit derselben Begruendung wie in
HostFirewall::releaseMany(): nicht in der Gruppe zu sein IST der gewuenschte
Endzustand. Nur fuers Entfernen — ein gescheitertes group:adduser bleibt ein
Fehlschlag, denn wer in keiner Gruppe landet, sieht in seiner neuen Cloud
nichts.

Warum die Suite das nie sah: FakeProxmoxClient liess jeden nicht verskripteten
Befehl gelingen, und die Pruefungen belegten die erzeugte Befehlsmenge, nie die
Antwort des Gasts. Der Fake beachtet jetzt ein abschliessendes `|| true` — das
ist eine Aussage der Shell, nicht des Aufrufers, und ein Fake, der trotzdem
einen Fehlercode zurueckgaebe, liesse einen Test beweisen, dass ein Befehl
scheitert, den keine echte Shell je scheitern laesst. Damit haelt die Pruefung
den Fake ausdruecklich auf Fehlercode und sieht applyRole() trotzdem true
liefern.

Dazu ein Testkommentar, der den falschen Schutz benannte: bei owner/admin auf
denselben Gruppennamen traegt `if ($gruppe !== $ziel)`, nicht array_unique.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 23:57:15 +02:00
..
Actions Jede Mail faehrt wieder ueber ihren eigenen Mailer 2026-08-03 20:36:20 +02:00
Console Behebt Zaehlfehler: gestartete Instanzen wurden doppelt gezaehlt 2026-08-03 20:39:14 +02:00
Exceptions Refuse the sale instead of reaching Stripe without a key 2026-07-30 11:58:01 +02:00
Http Nicht mehr damit werben, in welcher Sprache wir antworten 2026-08-02 00:17:36 +02:00
Jobs Fix-Runde 2: eine fremde Mailklasse faehrt im ruhigen Takt statt ungebremst 2026-08-03 19:04:32 +02:00
Listeners Jede Mail faehrt wieder ueber ihren eigenen Mailer 2026-08-03 20:36:20 +02:00
Livewire Die Adresse ist die Person, sobald es das Konto im Gast gibt 2026-08-03 23:57:14 +02:00
Mail Zwei Empfaengerkreise, und eine Wegwahl, die auch das Konto verschiebt 2026-08-03 17:00:20 +02:00
Models Wanderung friert das Nachziehen selbst ein, statt die Modellmethode zu rufen 2026-08-03 20:59:45 +02:00
Notifications Zwei Empfaengerkreise, und eine Wegwahl, die auch das Konto verschiebt 2026-08-03 17:00:20 +02:00
Observers Say the same thing to the customer, the register and the bank 2026-07-30 01:30:24 +02:00
Policies Move the console's identity out of the customer table 2026-07-28 10:31:43 +02:00
Providers Eine verschickte Mail hinterlaesst wieder eine Zeile, nicht zwei 2026-08-03 21:13:36 +02:00
Provisioning Was der Auftrag ausfuehrt, ist die Absicht von jetzt, nicht die von vorhin 2026-08-03 23:56:48 +02:00
Services Jemanden aus einer Gruppe zu nehmen, in der er nicht ist, ist kein Fehler 2026-08-03 23:57:15 +02:00
Support commandExpandingEnv zurueckgenommen — sie schuetzte vor nichts 2026-08-03 19:46:44 +02:00