All checks were successful
Deploy GSM / deploy (push) Successful in 26s
- Add isGuest flag to UserContext - Block guests from navigating to /server/:id route - Make ServerCards non-clickable for guests - Add rejectGuest middleware to backend - Protect server detail endpoints (/:id, /metrics/history, /whitelist) Guests can now only view the dashboard overview without accessing individual server details. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
68 lines
1.6 KiB
JavaScript
68 lines
1.6 KiB
JavaScript
import jwt from 'jsonwebtoken';
|
|
|
|
const ROLE_HIERARCHY = {
|
|
'user': 1,
|
|
'moderator': 2,
|
|
'superadmin': 3
|
|
};
|
|
|
|
export function authenticateToken(req, res, next) {
|
|
const authHeader = req.headers['authorization'];
|
|
const token = authHeader && authHeader.split(' ')[1];
|
|
|
|
if (!token) {
|
|
return res.status(401).json({ error: 'Token required' });
|
|
}
|
|
|
|
jwt.verify(token, process.env.JWT_SECRET, (err, user) => {
|
|
if (err) {
|
|
return res.status(403).json({ error: 'Invalid token' });
|
|
}
|
|
req.user = user;
|
|
next();
|
|
});
|
|
}
|
|
|
|
// Optional authentication - doesn't fail if no token
|
|
export function optionalAuth(req, res, next) {
|
|
const authHeader = req.headers['authorization'];
|
|
const token = authHeader && authHeader.split(' ')[1];
|
|
|
|
if (!token) {
|
|
req.user = null;
|
|
return next();
|
|
}
|
|
|
|
jwt.verify(token, process.env.JWT_SECRET, (err, user) => {
|
|
if (err) {
|
|
req.user = null;
|
|
} else {
|
|
req.user = user;
|
|
}
|
|
next();
|
|
});
|
|
}
|
|
|
|
export function requireRole(minRole) {
|
|
return (req, res, next) => {
|
|
const userRole = req.user?.role || 'user';
|
|
const userLevel = ROLE_HIERARCHY[userRole] || 0;
|
|
const requiredLevel = ROLE_HIERARCHY[minRole] || 0;
|
|
|
|
if (userLevel < requiredLevel) {
|
|
return res.status(403).json({ error: 'Insufficient permissions' });
|
|
}
|
|
next();
|
|
};
|
|
}
|
|
|
|
export function rejectGuest(req, res, next) {
|
|
if (!req.user) {
|
|
return res.status(401).json({ error: 'Authentication required' });
|
|
}
|
|
if (req.user.isGuest || req.user.role === 'guest') {
|
|
return res.status(403).json({ error: 'Guests cannot access server details' });
|
|
}
|
|
next();
|
|
}
|