thunderbird2docuware/background/background.js
sylyx f1454540d5 Passwort nicht mehr speichern: OAuth-Token nur im RAM, 1x-Login pro Sitzung
Das DocuWare-Passwort wird nicht mehr in storage.local abgelegt. Das
Hintergrundskript fungiert als Auth-Broker und hält den OAuth-Token nur im
Speicher der TB-Sitzung. Der Ablage-Dialog fragt das Passwort einmalig per
Overlay ab, holt darüber den Token und verwirft das Passwort sofort.

- store.js: password aus DEFAULTS entfernt; Settings.set() löscht password defensiv
- auth.js: setToken/currentToken für Token-Transfer, Cookie-Modus als Sentinel
- background.js: Broker (auth:status/auth:logon/auth:logout)
- dialog: ensureAuth() + Passwort-Overlay statt direktem Auth.logon
- options: Passwort nur transient für Test/Diagnose, nicht gespeichert; Export ohne Passwort
- manifest: lib/store.js + lib/auth.js ins Hintergrundskript geladen

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 15:14:05 +02:00

99 lines
3.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Hintergrund-Skript: Button + Kontextmenü, öffnet den Ablage-Dialog.
// Zusätzlich Auth-Broker: hält den OAuth-Token nur im Speicher dieser TB-Sitzung
// (siehe auth.js). Das Passwort wird einmalig zum Login durchgereicht, daraus ein
// Token geholt und sofort verworfen es wird NIE gespeichert.
const DIALOG_URL = "dialog/dialog.html";
// Auth-Broker: Dialog-/Optionsfenster fragen hier den Sitzungs-Token an bzw.
// melden sich mit dem Passwort an. So muss das Passwort nur 1x pro Sitzung getippt
// werden und liegt nirgends auf der Platte.
browser.runtime.onMessage.addListener((msg) => {
if (!msg || !msg.type) return undefined;
if (msg.type === "auth:status") {
return Promise.resolve({ hasToken: Auth.hasValidToken(), token: Auth.currentToken() });
}
if (msg.type === "auth:logon") {
return (async () => {
try {
const settings = await Settings.get();
if (!settings.serverUrl) throw new Error("Keine DocuWare-Server-URL konfiguriert.");
Auth.reset();
const r = await Auth.logon({ ...settings, password: msg.password || "" });
// Passwort wird hier verworfen nur der Token bleibt im Speicher.
return { ok: true, mode: r.mode, token: Auth.currentToken() };
} catch (e) {
return { ok: false, error: String((e && e.message) || e) };
}
})();
}
if (msg.type === "auth:logout") {
Auth.reset();
return Promise.resolve({ ok: true });
}
return undefined;
});
function openDialog(messageIds) {
const ids = Array.isArray(messageIds) ? messageIds : [messageIds];
// Pro Nachricht ein eigenes Ablagefenster (leicht versetzt gestapelt).
ids.forEach((id, i) => {
const url = browser.runtime.getURL(`${DIALOG_URL}?messageId=${id}`);
browser.windows.create({
url,
type: "popup",
width: 720,
height: 820,
left: 100 + i * 28,
top: 80 + i * 28,
});
});
}
// Button in der geöffneten Nachricht
browser.messageDisplayAction.onClicked.addListener(async (tab) => {
const msg = await browser.messageDisplay.getDisplayedMessage(tab.id);
if (msg) openDialog([msg.id]);
});
// Kontextmenü-Eintrag in der Nachrichtenliste
browser.menus.create({
id: "docuware-archive",
title: "In DocuWare ablegen",
contexts: ["message_list"],
});
browser.menus.onClicked.addListener((info) => {
if (info.menuItemId !== "docuware-archive") return;
const msgs = info.selectedMessages && info.selectedMessages.messages;
if (msgs && msgs.length > 0) openDialog(msgs.map((m) => m.id));
});
// Tastenkürzel (Strg+Alt+I): angezeigte bzw. alle markierten Nachrichten ablegen.
browser.commands.onCommand.addListener(async (command) => {
if (command !== "open-archive-dialog") return;
const ids = await currentMessageIds();
if (ids.length) openDialog(ids);
});
// Ermittelt die "aktiven" Nachrichten: erst die im Reader angezeigte, sonst
// alle im Nachrichtenlisten-Tab markierten.
async function currentMessageIds() {
try {
const [tab] = await browser.tabs.query({ active: true, currentWindow: true });
if (tab) {
const shown = await browser.messageDisplay
.getDisplayedMessage(tab.id)
.catch(() => null);
if (shown) return [shown.id];
}
const sel = await browser.mailTabs.getSelectedMessages().catch(() => null);
if (sel && sel.messages && sel.messages.length) return sel.messages.map((m) => m.id);
} catch (_) {}
return [];
}