/* * Pruefung der Felder, die sowohl die Nutzerverwaltung als auch "Mein Konto" * setzen duerfen. An einer Stelle, damit beide Wege dieselben Grenzen haben. */ /** Farbe als #rgb, #rrggbb oder #rrggbbaa; leer setzt zurueck. */ export function normalizeColor(input) { if (input === null || input === undefined || input === '') return { value: null }; const value = String(input).trim(); if (!/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/.test(value)) { return { error: 'Farbe muss ein Hex-Wert sein, z. B. #C1862F.' }; } return { value: value.toLowerCase() }; } // Ein Foto liegt als Data-URL in der Datenbank. Der Browser komprimiert es // vorher auf 256 px, damit die Nutzlast klein bleibt; die Grenze hier ist das // Sicherheitsnetz gegen ein Bild, das diesen Weg umgeht. const MAX_AVATAR_CHARS = 400_000; export function normalizeAvatar(input) { if (input === null || input === undefined || input === '') return { value: null }; const value = String(input).trim(); const isDataUrl = /^data:image\/(png|jpe?g|webp|gif|avif);base64,[A-Za-z0-9+/=]+$/.test(value); const isHttpUrl = /^https?:\/\/\S+$/i.test(value); if (!isDataUrl && !isHttpUrl) { return { error: 'Foto muss ein Bild oder eine http(s)-Adresse sein.' }; } if (value.length > MAX_AVATAR_CHARS) { return { error: 'Das Foto ist zu gross. Bitte ein kleineres Bild verwenden.' }; } return { value }; } /* * Verfügbare Farbwelten. Muss mit THEME_PALETTES in src/types.ts * übereinstimmen. Ein unbekannter Wert wird abgewiesen, damit ein Tippfehler * nicht still zum Standarddesign führt. */ const THEMES = new Set(['icon', 'halflife', 'pixel']); export function normalizeTheme(input) { if (input === null || input === undefined || input === '') return { value: null }; const value = String(input).trim().toLowerCase(); if (!THEMES.has(value)) return { error: 'Unbekanntes Design.' }; return { value }; } export function normalizeThemeMode(input) { if (input === null || input === undefined || input === '') return { value: null }; const value = String(input).trim().toLowerCase(); if (value !== 'light' && value !== 'dark') return { error: 'Modus muss light oder dark sein.' }; return { value }; }