From c0b8283cf4a1bcda0e85b305202df9f2d3dd5bfb Mon Sep 17 00:00:00 2001 From: Schalli Date: Thu, 8 Oct 2026 22:33:12 +0200 Subject: [PATCH] fix(nextcloud-files): IN-03 sichtbare Warnung bei einer http-Adresse - Einstellungen zeigen bei http:// einen Warnhinweis: Passwoerter und App-Passwoerter gehen unverschluesselt durch das Netz; https bleibt ohne Hinweis - Anleitung Administration nennt die Warnung Co-Authored-By: Claude Opus 5.5 (1M context) --- .../modules/nextcloud-files/components/SettingsTab.tsx | 8 ++++++++ .../modules/nextcloud-files/nextcloud-files-page.test.tsx | 8 ++++++++ apps/web/src/messages/de.json | 3 ++- apps/web/src/messages/en.json | 3 ++- docs/anleitung-administration.md | 2 +- 5 files changed, 21 insertions(+), 3 deletions(-) diff --git a/apps/web/src/app/(portal)/modules/nextcloud-files/components/SettingsTab.tsx b/apps/web/src/app/(portal)/modules/nextcloud-files/components/SettingsTab.tsx index 3363910..39e425d 100644 --- a/apps/web/src/app/(portal)/modules/nextcloud-files/components/SettingsTab.tsx +++ b/apps/web/src/app/(portal)/modules/nextcloud-files/components/SettingsTab.tsx @@ -221,6 +221,14 @@ export function SettingsTab({ onChanged }: { onChanged: () => void }) { setConfirmCount(null); }} /> + {/^http:\/\//i.test(address.trim()) && ( +

+ {t('address.insecure')} +

+ )} {!isAdmin && (

{t('address.adminOnly')} diff --git a/apps/web/src/app/(portal)/modules/nextcloud-files/nextcloud-files-page.test.tsx b/apps/web/src/app/(portal)/modules/nextcloud-files/nextcloud-files-page.test.tsx index 5d2e7d8..e3c276f 100644 --- a/apps/web/src/app/(portal)/modules/nextcloud-files/nextcloud-files-page.test.tsx +++ b/apps/web/src/app/(portal)/modules/nextcloud-files/nextcloud-files-page.test.tsx @@ -287,6 +287,14 @@ describe('SettingsTab', () => { expect(mockSaveSettings).not.toHaveBeenCalled(); }); + it('eine http-Adresse zeigt eine sichtbare Warnung, https nicht (IN-03)', async () => { + const input = await openSettings(); + await waitFor(() => expect((input as HTMLInputElement).value).toBe('https://cloud.example')); + expect(screen.queryByText(/nicht verschlüsselt/)).toBeNull(); + fireEvent.change(input, { target: { value: 'http://cloud.intern' } }); + expect(screen.getByText(/nicht verschlüsselt/)).toBeTruthy(); + }); + it('die Hinweiskarte nennt den Befehl fuer die Ausnahmeliste', async () => { await openSettings(); expect(screen.getByText(/occ config:app:set bruteForce whitelist_0/)).toBeTruthy(); diff --git a/apps/web/src/messages/de.json b/apps/web/src/messages/de.json index 7dfaa51..a1a58a5 100644 --- a/apps/web/src/messages/de.json +++ b/apps/web/src/messages/de.json @@ -2391,7 +2391,8 @@ "test": "Verbindung prüfen", "testing": "Prüfe …", "connectedUsers": "{count, plural, =0 {Zurzeit ist niemand verbunden.} one {Ein Benutzer ist verbunden.} other {# Benutzer sind verbunden.}}", - "adminOnly": "Die Adresse legt ein Administrator fest. Sie können sie hier ansehen und die Verbindung prüfen." + "adminOnly": "Die Adresse legt ein Administrator fest. Sie können sie hier ansehen und die Verbindung prüfen.", + "insecure": "Achtung: Mit http:// gehen Passwörter nicht verschlüsselt durch das Netz, auch das Nextcloud-Passwort, das Benutzer beim Anmelden eingeben. Verwenden Sie nach Möglichkeit https://." }, "reconnect": { "message": "{count, plural, one {Ein Benutzer ist verbunden. Nach dem Wechsel muss er sich neu anmelden.} other {# Benutzer sind verbunden. Nach dem Wechsel müssen sich alle neu anmelden.}}", diff --git a/apps/web/src/messages/en.json b/apps/web/src/messages/en.json index cac1534..bb16a70 100644 --- a/apps/web/src/messages/en.json +++ b/apps/web/src/messages/en.json @@ -2391,7 +2391,8 @@ "test": "Check connection", "testing": "Checking …", "connectedUsers": "{count, plural, =0 {Nobody is connected right now.} one {One user is connected.} other {# users are connected.}}", - "adminOnly": "The address is set by an administrator. You can view it here and check the connection." + "adminOnly": "The address is set by an administrator. You can view it here and check the connection.", + "insecure": "Caution: with http://, passwords travel across the network unencrypted, including the Nextcloud password users enter when signing in. Use https:// whenever possible." }, "reconnect": { "message": "{count, plural, one {One user is connected. After the change they have to sign in again.} other {# users are connected. After the change everyone has to sign in again.}}", diff --git a/docs/anleitung-administration.md b/docs/anleitung-administration.md index 1969e51..4c79052 100644 --- a/docs/anleitung-administration.md +++ b/docs/anleitung-administration.md @@ -360,7 +360,7 @@ Das Modul „Nextcloud-Status“ (Gruppe Infrastruktur) aktivieren Sie wie jedes Das Modul „Dateien“ (Gruppe Infrastruktur) aktivieren Sie wie jedes Modul im Marktplatz; wer es nutzen soll, bekommt die Freigabe „Benutzen“. **Die Adresse der Nextcloud legt ausschließlich ein Administrator fest** (Reiter „Einstellungen“ im Modul). Der Grund: Alle Benutzer schicken ihr Nextcloud-Passwort an diese Adresse, und das ist oft zugleich ihr Windows-Passwort. Benutzer mit der Freigabestufe „Verwalten“ sehen den Reiter ebenfalls, können die eingetragene Adresse aber nur ansehen und mit „Verbindung prüfen“ testen, nicht ändern. Wer nur „Benutzen“ hat, sieht den Reiter nicht. -- **Adresse:** Tragen Sie die Adresse so ein, wie Ihre Benutzer die Nextcloud im Browser aufrufen, möglichst mit `https://` (zum Beispiel `https://cloud.ihre-firma.de`). Es gibt genau eine Nextcloud für die ganze Installation. Interne Adressen sind erlaubt. „Verbindung prüfen“ ruft nur die öffentliche Statusseite ab und meldet bewusst nur grob: Nextcloud erreichbar (mit Version), Wartungsmodus, „leitet weiter“, „keine Nextcloud“ oder „nicht erreichbar“. Fehlernummern oder Ziele einer Weiterleitung nennt Tessera nicht, damit sich die Prüfung nicht zum Abtasten interner Adressen eignet. Tessera folgt nie einer Weiterleitung: Leitet die Adresse um (zum Beispiel von `http` auf `https`), tragen Sie die endgültige Adresse ein. +- **Adresse:** Tragen Sie die Adresse so ein, wie Ihre Benutzer die Nextcloud im Browser aufrufen, möglichst mit `https://` (zum Beispiel `https://cloud.ihre-firma.de`). Es gibt genau eine Nextcloud für die ganze Installation. Interne Adressen sind erlaubt. Eine Adresse mit `http://` nimmt Tessera an, zeigt aber eine Warnung: Dann gehen die Passwörter der Benutzer (beim Anmelden) und die App-Passwörter (bei jedem Aufruf) nicht verschlüsselt durch das Netz. „Verbindung prüfen“ ruft nur die öffentliche Statusseite ab und meldet bewusst nur grob: Nextcloud erreichbar (mit Version), Wartungsmodus, „leitet weiter“, „keine Nextcloud“ oder „nicht erreichbar“. Fehlernummern oder Ziele einer Weiterleitung nennt Tessera nicht, damit sich die Prüfung nicht zum Abtasten interner Adressen eignet. Tessera folgt nie einer Weiterleitung: Leitet die Adresse um (zum Beispiel von `http` auf `https`), tragen Sie die endgültige Adresse ein. - **Vertrauenswürdige Domains:** Meldet die Prüfung „keine Nextcloud“, obwohl unter der Adresse eine Nextcloud läuft, muss der Rechnername der Adresse in der Nextcloud unter `trusted_domains` stehen (`config.php`, oder `occ config:system:set trusted_domains 1 --value=`). - **Zugang der Benutzer:** Jeder Benutzer meldet sich mit seinem eigenen Nextcloud-Konto an. Tessera speichert nur ein von Nextcloud ausgestelltes App-Passwort (verschlüsselt), nie das Passwort. Konten mit Zwei-Faktor-Anmeldung melden sich über den Browser an; das Passwortfenster genügt für sie nicht. - **Ausnahme für den Tessera-Server in der Nextcloud (wichtig):** Nextcloud sperrt nach mehreren fehlgeschlagenen Anmeldungen die Absender-Adresse (Brute-Force-Schutz). Alle Tessera-Benutzer kommen von **derselben Adresse**, nämlich der des Tessera-Servers; eine Sperre träfe also alle gleichzeitig. Tessera begrenzt Fehlversuche deshalb selbst (höchstens drei je Benutzer in 15 Minuten und acht für den ganzen Server in 30 Minuten) und **hält alle Anfragen an die Nextcloud für bis zu 15 Minuten an**, sobald Nextcloud „zu viele Anfragen“ meldet; Benutzer sehen dann eine Wartezeit. Tragen Sie die Adresse des Tessera-Servers in die Ausnahmeliste der Nextcloud ein, dann kommt es dazu gar nicht erst. Auf dem Nextcloud-Server: