diff --git a/client/src/components/Administration.tsx b/client/src/components/Administration.tsx index a38f900..7d6f2c5 100644 --- a/client/src/components/Administration.tsx +++ b/client/src/components/Administration.tsx @@ -55,6 +55,15 @@ export default function Administration() { const [editingUser, setEditingUser] = useState(null); const [editingStore, setEditingStore] = useState(null); + // Get current user info to prevent self-role modification + const { data: currentUser } = useQuery({ + queryKey: ['/api/auth/me'], + queryFn: async () => { + const response = await apiRequest('/api/auth/me'); + return response.json(); + }, + }); + // Queries const { data: users = [], isLoading: usersLoading } = useQuery({ queryKey: ['/api/admin/users'], @@ -126,8 +135,11 @@ export default function Administration() { editUserForm.reset(); toast({ title: "Utilisateur modifié avec succès" }); }, - onError: () => { - toast({ title: "Erreur", description: "Impossible de modifier l'utilisateur", variant: "destructive" }); + onError: (error) => { + const errorMessage = error.message.includes("Vous ne pouvez pas changer votre propre rôle") + ? "Vous ne pouvez pas changer votre propre rôle d'administrateur" + : "Impossible de modifier l'utilisateur"; + toast({ title: "Erreur", description: errorMessage, variant: "destructive" }); }, }); @@ -813,24 +825,36 @@ export default function Administration() { ( - - Rôle - - - - )} + render={({ field }) => { + const isEditingSelf = editingUser?.id === currentUser?.id; + return ( + + Rôle + + {isEditingSelf && ( +

+ Vous ne pouvez pas modifier votre propre rôle +

+ )} + +
+ ); + }} /> { app.put('/api/admin/users/:id', requireRole(['admin']), async (req, res) => { try { const userId = parseInt(req.params.id); + const currentUser = await storage.getUser(req.session.userId!); const userData = insertUserSchema.partial().parse(req.body); + + // Protection : empêcher un admin de changer son propre rôle par accident + if (userId === currentUser?.id && userData.role && userData.role !== 'administrator') { + return res.status(400).json({ + error: "Vous ne pouvez pas changer votre propre rôle d'administrateur" + }); + } + + // Protection : ne pas permettre de changer le rôle du dernier administrateur + if (userData.role && userData.role !== 'administrator') { + const users = await storage.getAllUsers(); + const adminUsers = users.filter(u => u.role === 'administrator'); + const userToUpdate = users.find(u => u.id === userId); + + if (userToUpdate?.role === 'administrator' && adminUsers.length <= 1) { + return res.status(400).json({ + error: "Impossible de modifier le rôle du dernier administrateur" + }); + } + } + const user = await storage.updateUser(userId, userData); if (!user) { return res.status(404).json({ error: "User not found" });