/** * settings.js - Einstellungen und gemeinsam genutzte Hilfsmittel. * * Die Einstellungen liegen in browser.storage.local, also im Profil von * Thunderbird. Der Token steht dort im Klartext - das entspricht dem, was * Erweiterungen üblicherweise tun, ist aber kein Geheimnisspeicher. * Einzelheiten in SICHERHEIT.md. */ const VORGABEN = { baseUrl: "", token: "", versionLabel: "Thunderbird {datum}", shareDays: 7, shareTag: "Sharelink", // Anhänge, die üblicherweise keine Dokumente sind. Sie werden im // Auswahldialog vorab abgewählt, lassen sich aber anhaken. ignorierteTypen: ["image/gif", "image/png", "image/jpeg", "text/vcard", "text/calendar", "application/pkcs7-signature", "application/pgp-signature"], ignorierteKleiner: 8192 // Bytes; darunter meist Signaturbilder }; export async function ladeEinstellungen() { const gespeichert = await browser.storage.local.get(Object.keys(VORGABEN)); return { ...VORGABEN, ...gespeichert }; } export async function speichereEinstellungen(werte) { await browser.storage.local.set(werte); } export function vollstaendig(s) { return Boolean(s?.baseUrl) && Boolean(s?.token); } /** * Beliebige Zeichenkette in einen unbedenklichen Dateinamen überführen. * * Der Name eines E-Mail-Anhangs stammt vom Absender und ist damit nicht * vertrauenswürdig. Er wird zwar nur an Paperless weitergereicht und nicht * ins Dateisystem geschrieben, aber ein Wert wie "../../x" hat in einem * Dateinamen nichts zu suchen. */ export function sichererName(name, vorgabe = "Dokument", maxlen = 120) { let n = String(name || ""); n = n.replace(/\\/g, "/").split("/").pop(); n = n.replace(/[<>:"|?*\u0000-\u001f]/g, "").trim(); n = n.replace(/\s+/g, " ").replace(/^[. ]+|[. ]+$/g, ""); if (!n) return vorgabe; const reserviert = /^(CON|PRN|AUX|NUL|COM[1-9]|LPT[1-9])(\.|$)/i; if (reserviert.test(n)) n = "_" + n; if (n.length > maxlen) { const punkt = n.lastIndexOf("."); const endung = punkt > 0 && n.length - punkt <= 9 ? n.slice(punkt) : ""; n = n.slice(0, maxlen - endung.length) + endung; } return n || vorgabe; } export function versionslabel(vorlage) { const heute = new Date().toISOString().slice(0, 10); return String(vorlage || "Thunderbird {datum}").replace("{datum}", heute); } /** Kürzt einen Text für die Anzeige. */ export function kurz(text, laenge = 70) { const t = String(text || ""); return t.length > laenge ? t.slice(0, laenge - 1) + "…" : t; } /** Menschenlesbare Größenangabe. */ export function groesse(bytes) { const b = Number(bytes) || 0; if (b < 1024) return `${b} B`; if (b < 1024 * 1024) return `${(b / 1024).toFixed(0)} KB`; return `${(b / 1024 / 1024).toFixed(1)} MB`; } /** * Betreff einer Nachricht in einen Dokumenttitel überführen. * * Präfixe wie "AW:" oder "Fwd:" tragen im Archiv nichts bei und stören * beim Sortieren. */ export function titelAusBetreff(betreff) { let t = String(betreff || "").trim(); const praefixe = /^((AW|RE|WG|FWD|FW|TR|RÉF|REF)\s*(\[\d+\])?\s*:\s*)+/i; t = t.replace(praefixe, "").trim(); return t || "E-Mail ohne Betreff"; } /** Übersetzung über die eingebaute Verwaltung von Thunderbird. */ export function t(schluessel, ersetzungen) { const s = browser.i18n.getMessage(schluessel, ersetzungen); return s || schluessel; }