Initial commit

This commit is contained in:
2026-09-04 19:50:29 +02:00
parent 742e5bc6b2
commit 3ae0ab0a88
37 changed files with 3459 additions and 0 deletions

97
lib/settings.js Normal file
View File

@@ -0,0 +1,97 @@
/**
* 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;
}