"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.authenticate = authenticate; exports.requirePermission = requirePermission; exports.requireCustomerAccess = requireCustomerAccess; const jsonwebtoken_1 = __importDefault(require("jsonwebtoken")); const client_1 = require("@prisma/client"); const prisma = new client_1.PrismaClient(); async function authenticate(req, res, next) { const authHeader = req.headers.authorization; // Token aus Header oder Query-Parameter (für Downloads) let token = null; if (authHeader && authHeader.startsWith('Bearer ')) { token = authHeader.split(' ')[1]; } else if (req.query.token && typeof req.query.token === 'string') { // Fallback für Downloads: Token als Query-Parameter token = req.query.token; } if (!token) { res.status(401).json({ success: false, error: 'Nicht authentifiziert' }); return; } try { const decoded = jsonwebtoken_1.default.verify(token, process.env.JWT_SECRET || 'fallback-secret'); // Prüfen ob Token durch Rechteänderung invalidiert wurde (nur für Mitarbeiter) if (decoded.userId && decoded.iat) { const user = await prisma.user.findUnique({ where: { id: decoded.userId }, select: { tokenInvalidatedAt: true, isActive: true }, }); // Benutzer nicht gefunden oder deaktiviert if (!user || !user.isActive) { res.status(401).json({ success: false, error: 'Benutzer nicht mehr aktiv' }); return; } // Token wurde vor der Invalidierung ausgestellt if (user.tokenInvalidatedAt) { const tokenIssuedAt = decoded.iat * 1000; // iat ist in Sekunden, Date ist in Millisekunden if (tokenIssuedAt < user.tokenInvalidatedAt.getTime()) { res.status(401).json({ success: false, error: 'Ihre Berechtigungen wurden geändert. Bitte melden Sie sich erneut an.', }); return; } } } req.user = decoded; next(); } catch { res.status(401).json({ success: false, error: 'Ungültiger Token' }); } } function requirePermission(...requiredPermissions) { return (req, res, next) => { if (!req.user) { res.status(401).json({ success: false, error: 'Nicht authentifiziert' }); return; } const userPermissions = req.user.permissions || []; // Check if user has any of the required permissions const hasPermission = requiredPermissions.some((perm) => userPermissions.includes(perm)); if (!hasPermission) { res.status(403).json({ success: false, error: 'Keine Berechtigung für diese Aktion', }); return; } next(); }; } // Middleware to check if user can access specific customer data function requireCustomerAccess(req, res, next) { if (!req.user) { res.status(401).json({ success: false, error: 'Nicht authentifiziert' }); return; } const userPermissions = req.user.permissions || []; // Admins and employees can access all customers if (userPermissions.includes('customers:read') || userPermissions.includes('customers:update')) { next(); return; } // Customers can only access their own data const customerId = parseInt(req.params.customerId || req.params.id); if (req.user.customerId && req.user.customerId === customerId) { next(); return; } res.status(403).json({ success: false, error: 'Kein Zugriff auf diese Kundendaten', }); } //# sourceMappingURL=auth.js.map