File Details
arcadia-lib-1.2.9
- R
- May 1, 2026
- 2.53 MB
- 6.1K
- 1.21.1
- NeoForge
File Name
arcadia-lib-1.2.9.jar
Supported Versions
- 1.21.1
Curse Maven Snippet
## [1.2.9] - 2026-05-01 (latest)
### Fixed
- **Admin Panel reachable without permission via dashboard carousel arrows when LuckPerms wasn't bound** — `PermissionBackend.NOOP` returns `true` for every node by design (so singleplayer "just works" without a perm plugin). On a dedicated server where LuckPerms had not been loaded or hadn't initialized yet, that NOOP fallback meant `PermissionService.hasPermission(player, "arcadia.staff.mod")` granted access to literally every player. Two paths exploited it: (1) `ArcadiaModRegistry.resolveCarouselTarget(int, int, ServerPlayer)` filtered `visible` cards through the lenient `hasPermission`, so the Admin Panel card stayed in the carousel and the prev/next arrows in any dashboard tab (cosmetics, pets, daily, AH) navigated to it, and (2) the registered server action `adminpanel:open` re-checked the same lenient call before opening the menu — both gates failed open. New `PermissionService.hasPermissionStrict(Player, String)` returns `false` when the active backend IS the NOOP fallback (real backends honor the underlying check). The carousel filter now uses the strict variant, so any card with a `permissionNode` is hidden on a server whose perm backend is misconfigured. Lenient `hasPermission` is unchanged for non-security-sensitive call sites that want the singleplayer-friendly behavior.
### Correctifs
- **Admin Panel accessible sans permission via les flèches du carousel quand LuckPerms n'était pas branché** — `PermissionBackend.NOOP` retourne `true` pour chaque node par design (pour que le solo « marche tout seul » sans plugin de perms). Sur un serveur dédié où LuckPerms n'avait pas été chargé ou pas encore initialisé, ce fallback NOOP signifiait que `PermissionService.hasPermission(player, "arcadia.staff.mod")` accordait l'accès à littéralement tous les joueurs. Deux chemins exploitaient ça : (1) `ArcadiaModRegistry.resolveCarouselTarget(int, int, ServerPlayer)` filtrait les cards `visible` via le `hasPermission` permissif, donc la card Admin Panel restait dans le carousel et les flèches prev/next de n'importe quel onglet dashboard (cosmétiques, pets, daily, HDV) y menaient, et (2) le server action `adminpanel:open` re-vérifiait le même appel permissif avant d'ouvrir le menu — les deux gates s'ouvraient. Nouveau `PermissionService.hasPermissionStrict(Player, String)` retourne `false` quand le backend actif EST le fallback NOOP (les vrais backends honorent le check sous-jacent). Le filtre carousel utilise maintenant la variante stricte, donc toute card avec un `permissionNode` est cachée sur un serveur dont le backend de perms est mal configuré. Le `hasPermission` permissif est inchangé pour les sites d'appel non sensibles à la sécurité qui veulent le comportement singleplayer-friendly.

