const crypto = require('crypto'); const bcrypt = require('bcryptjs'); const db = require('./db'); const SESSION_LIFETIME_DAYS = 30; function hashPassword(password) { return bcrypt.hashSync(password, 10); } function verifyPassword(password, hash) { return bcrypt.compareSync(password, hash); } function createSession(userId) { db.prepare("DELETE FROM sessions WHERE expires_at <= datetime('now')").run(); const token = crypto.randomBytes(32).toString('hex'); db.prepare( `INSERT INTO sessions (token, user_id, expires_at) VALUES (?, ?, datetime('now', '+${SESSION_LIFETIME_DAYS} days'))` ).run(token, userId); return token; } function requireAuth(req, res, next) { const header = req.get('authorization') || ''; const token = header.startsWith('Bearer ') ? header.slice(7) : null; if (!token) return res.status(401).json({ error: 'nicht angemeldet' }); const row = db .prepare( `SELECT u.id, u.employee_id, u.email, u.role FROM sessions s JOIN users u ON u.id = s.user_id WHERE s.token = ? AND s.expires_at > datetime('now')` ) .get(token); if (!row) return res.status(401).json({ error: 'Sitzung ungültig oder abgelaufen' }); req.user = row; req.sessionToken = token; next(); } function requireRole(...roles) { return (req, res, next) => { if (!req.user || !roles.includes(req.user.role)) { return res.status(403).json({ error: 'keine Berechtigung' }); } next(); }; } module.exports = { hashPassword, verifyPassword, createSession, requireAuth, requireRole };