Portal: Admin-Panel, Rechnungsanalyse und alte Admin-Schnittstellen entfernt
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
3a4fa581c0
commit
7c00633db0
43 files changed
+229
-4001
No files matched your search
@@ -3,11 +3,11 @@ import { VIEW_EXPIRED_MESSAGE, endKundenansicht, isExpired, isKundenansicht, log
|
||||
|
||||
/**
|
||||
* Waechter der Kundenansicht vor allen Kunden-Routen (Spec 2026-10-01, Abschnitt 3):
|
||||
* 1. abgelaufen (2 h) -> 401 view_expired, Cookies weg
|
||||
* 1. abgelaufen (2 h) -> 401 view_expired, Cookies weg; ebenso alte Ansichten ohne viewId ("Als Kunde ansehen" aus
|
||||
* dem frueheren Admin-Panel)
|
||||
* 2. fremde Kennung im Header X-Kundenansicht -> 409 view_replaced (Tab einer anderen Kundenansicht)
|
||||
* 3. Lesen ist erlaubt; Schreiben nur mit passender Kennung und nur, was auf der Erlaubnisliste steht.
|
||||
* Neue Schreib-Routen sind damit in der Kundenansicht gesperrt, bis sie bewusst auf die Liste kommen.
|
||||
* Alte Ansichten aus dem Admin-Panel (ohne viewId) duerfen nichts schreiben ausser Ab- und Anmelden.
|
||||
*/
|
||||
export const KUNDENANSICHT_ALLOWED = [
|
||||
['POST', /^\/api\/news\/?$/],
|
||||
@@ -19,13 +19,9 @@ export const KUNDENANSICHT_ALLOWED = [
|
||||
['POST', /^\/api\/auth\/logout\/?$/],
|
||||
['POST', /^\/api\/auth\/login\/?$/],
|
||||
]
|
||||
const LEGACY_ALLOWED = [
|
||||
['POST', /^\/api\/auth\/logout\/?$/],
|
||||
['POST', /^\/api\/auth\/login\/?$/],
|
||||
]
|
||||
|
||||
// Eigene Pruefung (Ticketsystem-JWT, Admin-Sitzung) oder Ablauf/Wechsel selbst behandelt (me, Einloesen)
|
||||
const PASS_PREFIXES = ['/api/team/', '/api/admin/', '/api/portal-admin/']
|
||||
// Eigene Pruefung (Ticketsystem-JWT) oder Ablauf/Wechsel selbst behandelt (me, Einloesen)
|
||||
const PASS_PREFIXES = ['/api/team/', '/api/admin/']
|
||||
const PASS_EXACT = ['/api/auth/me', '/api/auth/kundenansicht']
|
||||
const READ_METHODS = ['GET', 'HEAD', 'OPTIONS']
|
||||
|
||||
@@ -41,20 +37,20 @@ export async function kundenansichtGuard(req, res, next) {
|
||||
if (!session) return next()
|
||||
|
||||
const current = isKundenansicht(session)
|
||||
if (current && isExpired(session)) {
|
||||
// Abgelaufen oder alte Ansicht ohne Kennung (frueheres Admin-Panel): beenden, nichts mehr lesen oder schreiben
|
||||
if (session.viewAs && (!current || isExpired(session))) {
|
||||
endKundenansicht(res)
|
||||
await logOnce(session, 'abgelaufen')
|
||||
if (current) await logOnce(session, 'abgelaufen')
|
||||
return res.status(401).json({ code: 'view_expired', error: VIEW_EXPIRED_MESSAGE })
|
||||
}
|
||||
// Tab einer Kundenansicht, deren Cookie inzwischen zu etwas anderem gehoert (andere Kundenansicht, alte
|
||||
// Admin-Ansicht, Kunden-Login): keine fremden Daten in diesen Tab
|
||||
// Tab einer Kundenansicht, deren Cookie inzwischen zu etwas anderem gehoert (andere Kundenansicht,
|
||||
// Kunden-Login): keine fremden Daten in diesen Tab
|
||||
const header = req.get('X-Kundenansicht')
|
||||
if (header && header !== session.viewId) return replaced(res, session)
|
||||
if (!session.viewAs) return next()
|
||||
if (READ_METHODS.includes(req.method)) return next()
|
||||
if (current && !header) return replaced(res, session)
|
||||
if (!header) return replaced(res, session)
|
||||
|
||||
const list = current ? KUNDENANSICHT_ALLOWED : LEGACY_ALLOWED
|
||||
if (list.some(([method, re]) => method === req.method && re.test(pathname))) return next()
|
||||
if (KUNDENANSICHT_ALLOWED.some(([method, re]) => method === req.method && re.test(pathname))) return next()
|
||||
return res.status(403).json({ code: 'view_blocked', error: 'In der Kundenansicht nicht möglich.' })
|
||||
}
|
||||
@@ -58,16 +58,6 @@ export async function requireSession(req, res, next) {
|
||||
next()
|
||||
}
|
||||
|
||||
/** Admin-Session: Ticketsystem-Mitarbeiter (Appwrite-Label "admin") im Portal. */
|
||||
export function requireAdminSession(req, res, next) {
|
||||
const session = parsePortalSession(req)
|
||||
if (!session?.appwriteUserId || session.role !== 'admin') {
|
||||
return res.status(401).json({ error: 'Admin-Anmeldung erforderlich' })
|
||||
}
|
||||
req.session = session
|
||||
next()
|
||||
}
|
||||
|
||||
export function getSessionCustomerId(req) {
|
||||
return req.session?.customerId
|
||||
}
|
||||
Reference in new issue
Block a user