diff --git a/Changes.md b/Changes.md index 174a841..2395a76 100644 --- a/Changes.md +++ b/Changes.md @@ -2,6 +2,11 @@ --- +## 2026-09-20 – Fehlende Admin-Prüfung bei GET /settings (#206) + +- **`src/Controllers/SettingsController.php`:** `show()` prüfte keine Rolle, sodass jeder eingeloggte Nicht-Admin IBAN/BIC, Steuernummer, Nextcloud- und SMTP-Daten einsehen konnte. `Auth::requireAdmin()` ergänzt. +- **`tests/e2e/specs/settings-admin-authorization.spec.js`:** Fall für `GET /settings` (403) ergänzt; die CSRF-Token-Beschaffung in diesem und dem SMTP-Spec läuft nun über `/` statt `/settings`. + ## 2026-08-26 – Fehlende Admin-Prüfung im BankinstituteController (#203) - **`src/Controllers/BankinstituteController.php`:** `index()`, `check()` und `import()` prüften bislang keine Rolle, obwohl der globale Admin-Gate in `public/index.php` nur `/useradmin*` abdeckt und `SettingsController` erst seit Fix #200 admin-pflichtig ist – dieser Controller wurde dabei übersehen. Insbesondere `import()` ersetzt über `Bankinstitut::replaceAll()` die komplette BLZ/BIC-Referenztabelle (u. a. für die FinTS-Direktverbindung genutzt) anhand einer hochgeladenen Datei; jeder eingeloggte Nicht-Admin-Nutzer konnte diese systemweite Tabelle beliebig überschreiben. Alle drei Methoden rufen jetzt `Auth::requireAdmin()` zu Beginn auf. `search()` bleibt bewusst offen, da sie unter der eigenen Route `/bankinstitute/search` für die BLZ-Suche beim Anlegen einer FinTS-Verbindung (`bank/fints.php`) von allen eingeloggten Nutzern benötigt wird. diff --git a/src/Controllers/SettingsController.php b/src/Controllers/SettingsController.php index 4062560..0ffcde7 100644 --- a/src/Controllers/SettingsController.php +++ b/src/Controllers/SettingsController.php @@ -16,6 +16,10 @@ class SettingsController extends BaseController { public function show(array $params): void { + // Die Seite zeigt IBAN/BIC, Steuernummer, Nextcloud- und SMTP-Daten + // (Issue #206) – wie alle übrigen Settings-Endpoints nur für Admins. + Auth::requireAdmin(); + $settings = Setting::get(); $versionFile = dirname(__DIR__) . '/version.txt'; $version = file_exists($versionFile) ? trim(file_get_contents($versionFile)) : ''; diff --git a/tests/e2e/specs/settings-admin-authorization.spec.js b/tests/e2e/specs/settings-admin-authorization.spec.js index 77ae021..da60bca 100644 --- a/tests/e2e/specs/settings-admin-authorization.spec.js +++ b/tests/e2e/specs/settings-admin-authorization.spec.js @@ -36,12 +36,15 @@ test.describe('Autorisierung: Settings-Verwaltungsendpoints nur für Admins (Fix await userPage.click('form[action="/login"] button[type="submit"]') await userPage.waitForURL(url => !url.pathname.startsWith('/login')) - await userPage.goto('/settings') + await userPage.goto('/') const csrfToken = await userPage.evaluate(() => document.querySelector('meta[name="csrf-token"]')?.content || '') expect(csrfToken).not.toBe('') const headers = { 'X-CSRF-Token': csrfToken } + const settingsGet = await userPage.request.get('/settings') + expect(settingsGet.status()).toBe(403) + const bankImportGet = await userPage.request.get('/settings/bankimport') expect(bankImportGet.status()).toBe(403) diff --git a/tests/e2e/specs/settings-smtp-authorization.spec.js b/tests/e2e/specs/settings-smtp-authorization.spec.js index 00ad06e..01319ed 100644 --- a/tests/e2e/specs/settings-smtp-authorization.spec.js +++ b/tests/e2e/specs/settings-smtp-authorization.spec.js @@ -35,7 +35,7 @@ test.describe('Autorisierung: SMTP-Einstellungen nur für Admins (Fix #193)', () // GET /settings bleibt für alle eingeloggten Benutzer erreichbar // (Firmendaten sind kein Admin-Feature) – nur die SMTP-mutierenden // Endpunkte werden geschützt. - await userPage.goto('/settings') + await userPage.goto('/') const csrfToken = await userPage.evaluate(() => document.querySelector('meta[name="csrf-token"]')?.content || '') expect(csrfToken).not.toBe('')