Optional Domain mit Port und ohne für Sharelinks

This commit is contained in:
2026-09-05 23:59:21 +02:00
parent 3ae0ab0a88
commit 172dd95387
7 changed files with 100 additions and 17 deletions

View File

@@ -34,7 +34,7 @@ const TASK_POLL = 1500;
export class PaperlessError extends Error {}
export class PaperlessClient {
constructor(baseUrl, token) {
constructor(baseUrl, token, shareBaseUrl = "") {
let parsed;
try {
parsed = new URL(String(baseUrl || "").trim());
@@ -48,6 +48,13 @@ export class PaperlessClient {
}
this.base = String(baseUrl).trim().replace(/\/+$/, "");
this.token = String(token || "").trim();
// Adresse für Freigabelinks. Paperless liefert nur den Slug, die
// vollständige Adresse wird hier zusammengesetzt. Führt der interne
// Zugang über einen abweichenden Port, wäre ein daraus gebauter Link
// für den Empfänger wertlos - deshalb getrennt konfigurierbar.
this.shareBase = String(shareBaseUrl || "").trim().replace(/\/+$/, "")
|| this.base;
}
get origin() {
@@ -313,7 +320,7 @@ export class PaperlessClient {
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload)
});
if (res?.slug) return `${this.base}/share/${res.slug}`;
if (res?.slug) return `${this.shareBase}/share/${res.slug}`;
return null;
} catch (err) {
last = err;

View File

@@ -10,9 +10,23 @@
const VORGABEN = {
baseUrl: "",
token: "",
// Adresse, unter der das Archiv von aussen erreichbar ist.
//
// Wird nur für Freigabelinks verwendet. Paperless liefert in der
// Antwort lediglich den Slug; die vollständige Adresse setzt die
// Erweiterung zusammen. Führt der interne Zugang über einen
// abweichenden Port oder einen anderen Namen, wäre ein daraus gebauter
// Link für den Empfänger wertlos.
//
// Leer = baseUrl verwenden.
shareBaseUrl: "",
versionLabel: "Thunderbird {datum}",
shareDays: 7,
shareTag: "Sharelink",
// Beschriftung der eingefügten Linkblöcke. Leer lassen für keine
// Nummerierung ist nicht vorgesehen - eine Nummer hilft beim Bezugnehmen
// im Fließtext ("siehe Datei 2").
linkBezeichner: "",
// 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",
@@ -34,6 +48,21 @@ export function vollstaendig(s) {
return Boolean(s?.baseUrl) && Boolean(s?.token);
}
/**
* Zugriffsmuster für browser.permissions aus einer Basisadresse.
*
* WICHTIG: Muster dürfen KEINEN Port enthalten. "https://rechner:8443/*"
* ist ungültig, und permissions.request wirft dann eine Ausnahme mit
* einer Meldung, die nichts über die Ursache verrät.
*
* Ein Zugriffsrecht gilt ohnehin für alle Ports desselben Rechners - die
* Einschränkung kostet also nichts.
*/
export function zugriffsmuster(baseUrl) {
const u = new URL(String(baseUrl).trim());
return `${u.protocol}//${u.hostname}/*`;
}
/**
* Beliebige Zeichenkette in einen unbedenklichen Dateinamen überführen.
*