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>
99 lines
3.4 KiB
JavaScript
99 lines
3.4 KiB
JavaScript
// 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 [];
|
||
}
|