2026-01-28 14:36:33 -07:00
|
|
|
// Authentication Middleware
|
|
|
|
|
|
|
|
|
|
// Require authenticated user
|
|
|
|
|
function requireAuth(db) {
|
|
|
|
|
return async (req, res, next) => {
|
|
|
|
|
const sessionId = req.cookies?.session_id;
|
|
|
|
|
|
|
|
|
|
if (!sessionId) {
|
|
|
|
|
return res.status(401).json({ error: 'Authentication required' });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
const session = await new Promise((resolve, reject) => {
|
|
|
|
|
db.get(
|
2026-04-06 16:18:07 -06:00
|
|
|
`SELECT s.*, u.id as user_id, u.username, u.email, u.role, u.user_group, u.is_active
|
2026-01-28 14:36:33 -07:00
|
|
|
FROM sessions s
|
|
|
|
|
JOIN users u ON s.user_id = u.id
|
|
|
|
|
WHERE s.session_id = ? AND s.expires_at > datetime('now')`,
|
|
|
|
|
[sessionId],
|
|
|
|
|
(err, row) => {
|
|
|
|
|
if (err) reject(err);
|
|
|
|
|
else resolve(row);
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (!session) {
|
|
|
|
|
return res.status(401).json({ error: 'Session expired or invalid' });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!session.is_active) {
|
|
|
|
|
return res.status(401).json({ error: 'Account is disabled' });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Attach user to request
|
|
|
|
|
req.user = {
|
|
|
|
|
id: session.user_id,
|
|
|
|
|
username: session.username,
|
|
|
|
|
email: session.email,
|
2026-04-06 16:18:07 -06:00
|
|
|
role: session.role,
|
|
|
|
|
group: session.user_group
|
2026-01-28 14:36:33 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
next();
|
|
|
|
|
} catch (err) {
|
|
|
|
|
console.error('Auth middleware error:', err);
|
|
|
|
|
return res.status(500).json({ error: 'Authentication error' });
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-06 16:18:07 -06:00
|
|
|
// Require specific group(s)
|
|
|
|
|
function requireGroup(...allowedGroups) {
|
2026-01-28 14:36:33 -07:00
|
|
|
return (req, res, next) => {
|
|
|
|
|
if (!req.user) {
|
|
|
|
|
return res.status(401).json({ error: 'Authentication required' });
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-06 16:18:07 -06:00
|
|
|
if (!allowedGroups.includes(req.user.group)) {
|
2026-01-28 14:36:33 -07:00
|
|
|
return res.status(403).json({
|
|
|
|
|
error: 'Insufficient permissions',
|
2026-04-06 16:18:07 -06:00
|
|
|
required: allowedGroups,
|
|
|
|
|
current: req.user.group
|
2026-01-28 14:36:33 -07:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
next();
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-06 16:18:07 -06:00
|
|
|
module.exports = { requireAuth, requireGroup };
|