Permissions et accès
Qui peut faire quoi, et comment le site le vérifie réellement.
L'identifiant d'un serveur apparaît dans l'URL du dashboard. Il vient donc du navigateur, et n'autorise rien par lui-même : il désigne seulement la ressource dont l'accès va être vérifié.
Les sept contrôles
- La session existe et son cookie signé n'est pas expiré.
- Le jeton Discord répond encore : l'identité est réelle, pas seulement mémorisée.
- Discord place bien cet utilisateur dans ce serveur.
- Ses permissions Discord suffisent : propriétaire, Administrateur ou Gérer le serveur.
- Le bot est réellement installé sur ce serveur.
- Le bot confirme la présence et les droits actuels de l'utilisateur.
- Les permissions manquantes du bot sont remontées à l'interface.
Pourquoi le sixième contrôle existe
Un jeton OAuth conserve les permissions du moment où il a été émis. Quelqu'un rétrogradé hier garderait l'accès aujourd'hui. Le verdict du bot, lui, lit les permissions actuelles du serveur.
Réponses en cas de refus
| Situation | Code | Ce qui est affiché |
|---|---|---|
| Non connecté | 401 | Redirection vers la connexion Discord |
| Permissions insuffisantes | 403 | « Permissions insuffisantes » |
| Serveur inconnu de l'utilisateur | 404 | « Serveur introuvable » |
| Bot absent du serveur | 404 | Bouton « Ajouter Ghost's Sanctuary » |
| Bot injoignable | 503 | Accès refusé par précaution, avec explication |
Bot injoignable = accès refusé
Quand le bot ne répond pas, le site ne peut pas vérifier vos droits. Il refuse plutôt que de supposer. C'est délibéré : supposer reviendrait à ouvrir le dashboard à quiconque connaît un identifiant de serveur.
Support
Un utilisateur ne voit que ses propres demandes. Les agents déclarés dans SUPPORT_AGENT_IDS voient toutes les demandes, les notes internes, et peuvent changer statut, priorité et assignation. Un utilisateur peut seulement fermer sa propre demande.
Les notes internes ne sont pas masquées, elles sont absentes
Elles sont filtrées par le bot avant l'envoi : elles n'arrivent jamais dans le navigateur du demandeur. Les cacher en CSS aurait suffi à les lire dans le code source de la page.