feat(einstellungen): Betriebswerte im Dashboard einstellbar (#025)
Vier Bereiche unter Einstellungen -> System: Adresse und Agent, Kaufmaennisches, Sicherheit sowie Firma und Darstellung. Alles liegt als eine JSON-Zeile in der Tabelle Einstellung; fehlende Felder bekommen ihren Vorgabewert, eine kaputte Zeile legt den Betrieb nicht lahm. Die Werte wirken auch wirklich: Die Dashboard-Adresse und der Melderhythmus landen im ausgelieferten Einzeiler und im systemd-Timer (live geprueft), der Steuersatz in neuen Rechnungspositionen, die Sitzungsdauer im Token, die Firmenangaben im Kopf der PDF-Dateien. Nebenbei geschlossen: die OIDC-Luecke aus #024. Erlaubte Domaenen und ein Schalter gegen automatisch angelegte Konten. Dazu raeumt der Worker nachts nach den eingestellten Fristen auf - der juengste Report je Host bleibt. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
+8
-4
@@ -6,6 +6,7 @@ import { SignJWT, jwtVerify } from "jose";
|
||||
*/
|
||||
|
||||
export const SITZUNGS_COOKIE = "pl_sitzung";
|
||||
/** Rückfall, solange nichts in den Einstellungen steht (#025). */
|
||||
export const SITZUNGSDAUER_STUNDEN = 12;
|
||||
|
||||
/** Eine gelesene Sitzung weiß zusätzlich, wann sie ausgestellt wurde – nötig für den Widerruf. */
|
||||
@@ -31,13 +32,16 @@ function schluessel(): Uint8Array {
|
||||
return new TextEncoder().encode(geheimnis);
|
||||
}
|
||||
|
||||
export async function sitzungErzeugen(sitzung: Sitzung): Promise<string> {
|
||||
export async function sitzungErzeugen(
|
||||
sitzung: Sitzung,
|
||||
dauerStunden: number = SITZUNGSDAUER_STUNDEN,
|
||||
): Promise<string> {
|
||||
return new SignJWT({ ...sitzung })
|
||||
.setProtectedHeader({ alg: "HS256" })
|
||||
.setSubject(sitzung.benutzerId)
|
||||
.setIssuedAt()
|
||||
.setIssuer("proxledger")
|
||||
.setExpirationTime(`${SITZUNGSDAUER_STUNDEN}h`)
|
||||
.setExpirationTime(`${dauerStunden}h`)
|
||||
.sign(schluessel());
|
||||
}
|
||||
|
||||
@@ -70,12 +74,12 @@ export function ueberHttps(): boolean {
|
||||
return process.env.NODE_ENV === "production";
|
||||
}
|
||||
|
||||
export function cookieOptionen() {
|
||||
export function cookieOptionen(dauerStunden: number = SITZUNGSDAUER_STUNDEN) {
|
||||
return {
|
||||
httpOnly: true,
|
||||
sameSite: "lax" as const,
|
||||
secure: ueberHttps(),
|
||||
path: "/",
|
||||
maxAge: SITZUNGSDAUER_STUNDEN * 3600,
|
||||
maxAge: dauerStunden * 3600,
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user