feat(nextcloud-status): Clouds verwalten, Logos, stündliche Prüfung und Sortierung

- Ändern, Entfernen, Logo-Upload und -Abruf, Sammelprüfung nur mit Verwalten
- Stündlicher Auftrag beim Start registriert, Prüfung je Cloud an ihren Mandanten gebunden
- Sortierung nach Kundenname, Status, Version und Support-Ende, je Benutzer gemerkt
- Formular zum Anlegen und Bearbeiten, Zugriffsinventar angepasst

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-10-02 14:54:58 +02:00
parent 5ef7b0c6cc
commit 6698ef1a92
23 changed files with 2061 additions and 30 deletions
@@ -0,0 +1,21 @@
import { type DashboardImageMime, detectImageMime } from '../dashboard/dashboard-image-rules';
/**
* Regeln fuer hochgeladene Cloud-Logos (quick-261002-k67, L-02, D-A).
* Kein Nest, kein Prisma — direkt an den Bytes testbar.
*
* Erlaubt sind PNG, JPEG, GIF und WebP bis 1 MiB. KEIN SVG: ein SVG kann
* Skript tragen und wuerde, direkt im Tab geoeffnet, unter der Adresse von
* Tessera laufen. Der Typ kommt aus den Magic Bytes, nie aus dem vom Browser
* behaupteten `mimetype` oder der Dateiendung (Muster T-PI9-01); der erkannte
* Typ ist zugleich der Typ, mit dem die Auslieferung antwortet (T-k67-02).
*/
/** Hoechstgroesse: 1 MiB (multer `limits.fileSize` an der Route + zweites Netz im Dienst). */
export const NEXTCLOUD_LOGO_MAX_BYTES = 1024 * 1024;
/** Erkannter Bildtyp oder `null`, wenn leer, zu gross oder kein erlaubtes Bildformat. */
export function checkLogoUpload(buffer: Uint8Array): DashboardImageMime | null {
if (buffer.length === 0 || buffer.length > NEXTCLOUD_LOGO_MAX_BYTES) return null;
return detectImageMime(buffer);
}