Files
AfiS-Aktensystem/web/lib/export/renderAccess.ts
T
Harlekin e0b03ea336
Prüfung / Lint, Typen, Tests (push) Canceled after 0s
Prüfung / Images bauen (pdf) (push) Canceled after 0s
Prüfung / Images bauen (web) (push) Canceled after 0s
Prüfung / Images bauen (worker) (push) Canceled after 0s
Images / bauen (pdf, docker/pdf.Dockerfile) (push) Canceled after 0s
Images / bauen (web, docker/web.Dockerfile) (push) Canceled after 0s
Images / bauen (worker, docker/worker.Dockerfile) (push) Canceled after 0s
Gedankenstriche durch Bindestriche ersetzt
375 Vorkommen in 210 Dateien. Betrifft Kommentare, Oberflaechentexte und die
README; an keiner Stelle Bedeutung, nur Zeichensetzung.
2026-09-04 08:54:52 +02:00

49 lines
1.8 KiB
TypeScript

import { db } from '@/lib/db'
import { verifyRenderToken } from '@/lib/export/token'
import { resolvePermissions } from '@/lib/auth/effective'
import type { EffectivePermissions } from '@/lib/auth/permissions'
/**
* Wer die Druckansicht sehen darf.
*
* Zwei Wege: die angemeldete Person selbst, oder der PDF-Dienst mit einem
* kurzlebigen Zeichen, das für **genau diesen Auftrag** ausgestellt wurde.
*
* Die Stufe kommt dabei nicht aus dem Zeichen, sondern wird frisch aufgelöst
* und dann auf die im Zeichen vermerkte **gedeckelt**. Damit kann ein Zeichen
* nie mehr zeigen, als der Abrufer beim Anfragen sehen durfte - und auch nicht
* mehr, als er jetzt noch darf, falls ihm inzwischen Rechte entzogen wurden.
*/
export async function permissionsFromRenderToken(
token: string | null | undefined,
): Promise<{ permissions: EffectivePermissions; displayName: string } | null> {
const claim = verifyRenderToken(token)
{
if (!claim) return null
const auftrag = await db.exportJob.findUnique({
where: { id: claim.jobId },
select: { status: true, requestedById: true },
})
// Nur solange der Auftrag wirklich läuft. Ein Zeichen aus einem
// abgeschlossenen oder abgelehnten Auftrag taugt zu nichts.
if (!auftrag || auftrag.status !== 'RUNNING') return null
if (auftrag.requestedById !== claim.userId) return null
const nutzer = await db.user.findUnique({
where: { id: claim.userId },
select: { displayName: true, isActive: true },
})
if (!nutzer?.isActive) return null
const aktuell = await resolvePermissions(claim.userId)
return {
permissions: {
...aktuell,
clearanceLevel: Math.min(aktuell.clearanceLevel, claim.clearanceLevel),
},
displayName: nutzer.displayName,
}
}
}