Conversation
Add usePermissions() (hasGlobal/canOnPage, admin bypasses both) and wire it everywhere the frontend used to check UserRole.Editor/Admin directly: - UserRole is now Admin | Member, matching the backend (WIKI-165). - api/pages.ts: PageDetail.canEdit -> permissions: PageAction[]; PageTreeNode gains canCreateChild. - Sidebar "New page" -> page.create_root; CommentItem moderation -> comment.moderate; PageView edit button and PageHistory restore -> page.edit / page.restore_version; PageEditor tag deletion -> tag.delete and tag attach/detach/create -> page.manage_tags (matches the backend's actual page.manage_tags check on POST/DELETE /pages/:id/tags, which was previously ungated on the client). - Media library upload tab and delete button -> media.upload/media.delete (previously any page.edit access implicitly exposed the whole global media library's upload/delete actions on the client). - ProtectedRoute accepts a `permission` prop in addition to `roles`; /new now gates on page.create_root instead of the removed editor role. - Remove PagePermissionsPanel and api/page-permissions.ts: both called the /pages/:id/permissions routes removed by WIKI-165 and have been dead/non-functional since that ticket merged. The real replacement (access-rules based panel) is WIKI-173's scope. - ProfileSummary/UsersTable: role labels admin/member, profile shows the user's groups; i18n gains permission labels reused by future admin screens instead of the deleted panel's now-unused strings. Bump to 0.30.5 with a changelog entry. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AgjQXuhToMzd4FfvJFdgUw
FireDroX
added this pull request to stack #66
September 27, 2026 17:09
…tags "Create new tag" both creates the tag (POST /tags, requires the global tag.create permission) and attaches it to the page (requires page.manage_tags). PageTagsPanel only checked page.manage_tags, so a user with page-scoped tag management but no global tag.create saw a button that would 403 on submit. "Add existing" only attaches, so it keeps requiring just page.manage_tags. Found by code review of the WIKI-170 branch stack. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AgjQXuhToMzd4FfvJFdgUw
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Résumé
Remplace toutes les vérifications de rôle côté client (
UserRole.Editor,EDITOR_ROLES,MODERATOR_ROLES,page.canEdit) par les permissions effectives renvoyées par l'API (WIKI-166/WIKI-167), via un nouveau hookusePermissions().UserRole:Admin | Member(aligné sur le backend depuis WIKI-165).AuthUsergagnepermissions/groups.api/pages.ts:PageDetail.canEdit→permissions: PageAction[];PageTreeNodegagnecanCreateChild.hooks/usePermissions.ts:hasGlobal(permission),canOnPage(page, action)— bypass total si admin.Sidebar.tsx— "Nouvelle page" (racine) →page.create_root.CommentItem.tsx— modération →comment.moderate.PageEditor.tsx— accès à l'éditeur →page.edit; suppression de tag →tag.delete; ajout/retrait de tag →page.manage_tags(aligné sur la vérification déjà faite côté backend dansTagsService, qui n'était pas reflétée côté client jusqu'ici) ; création de tag →tag.createetpage.manage_tags(les deux appels backend enchaînés par cette action).PageView.tsx— bouton Éditer →page.edit.PageHistory.tsx— restauration de version →page.restore_version.MediaLibraryPicker, boutons d'upload de l'éditeur) →media.upload/media.delete(avant ce ticket, n'importe quel accèspage.edit, même limité à une seule page, exposait l'upload/suppression sur l'ensemble de la médiathèque globale).ProtectedRouteaccepte désormais une proppermissionen plus deroles; la route/newest gardée parpage.create_root.ProfileSummary/UsersTable— libellésadmin/member, affichage des groupes de l'utilisateur sur son profil.roleEditor/roleReader, ajout deroleMember+ libellés de chaque permission (permissions.labels.*), réutilisables par les futurs écrans d'administration (WIKI-171/172).Corrections apportées suite à la revue de code (multi-agent, sur toute la pile de branches)
La revue a scanné
main...HEAD, donc au-delà du diff propre à ce ticket. Deux corrections appliquées :AccessRulesService.applyUpdate(WIKI-167,backend/src/permissions/services/access-rules.service.ts) — vraie faille d'escalade de privilèges : mettre à jour uniquementexcludedPageIdsd'une règle (sans toucheractions) ne redéclenchait jamaisassertNoEscalation. Retirer une exclusion élargit pourtant la couverture effective d'une règle exactement comme changer ses actions. Corrigée directement sur la brancheWIKI-167-access-rules-api(PR EPIC-30 / WIKI-167: API des règles d'accès aux pages et gestion des groupes #69, mise à jour), puis mergée dans cette branche. Détail complet dans la description de la PR EPIC-30 / WIKI-167: API des règles d'accès aux pages et gestion des groupes #69.PageTagsPanel(ce ticket) : le bouton "créer un tag" ne vérifiait quepage.manage_tags, alors que l'action enchaînePOST /tags(nécessite letag.createglobal) puis l'attache à la page (nécessitepage.manage_tags). Un utilisateur avec seulementpage.manage_tagsvoyait un bouton qui aurait échoué en 403 à la création. Corrigé en exigeant les deux permissions pour "créer", en gardant "ajouter un tag existant" surpage.manage_tagsseul.Signalé mais non corrigé dans cette PR
frontend/src/App.tsx:53— route/admin/userstoujours gardée parroles={[UserRole.Admin]}plutôt que par la nouvelle proppermission. Delibérément non touché : le contrôleur backendAdminUsersController(liste/rôle/suppression d'utilisateurs) reste strictement@Roles('admin')— seulAdminUserAccessController(routes/permissionset/access-rulesajoutées par WIKI-167) accepteuser.manage. Basculer le frontend surpermission="user.manage"maintenant laisserait un utilisateuruser.manage-only atteindre la page puis se prendre un 403 sur chaque appel API. C'est le même trou déjà documenté dans la PR EPIC-30 / WIKI-167: API des règles d'accès aux pages et gestion des groupes #69 (incohérenceAdminUsersController/AdminUserAccessController, harmonisation prévue par WIKI-168) — la revue a en plus trouvé le même trou côtéAdminUserCommentsController(liste/purge des commentaires d'un utilisateur toujours admin-only, alors que la suppression d'un commentaire individuel accepte déjàcomment.moderate), ajouté à la description de la PR EPIC-30 / WIKI-167: API des règles d'accès aux pages et gestion des groupes #69 pour ne pas perdre le fil.Écarts assumés par rapport au ticket (déjà notés avant la revue)
PagePermissionsPanelsupprimé plutôt que re-gardé : ce panneau etapi/page-permissions.tsappelaient les routes/pages/:id/permissions, supprimées par WIKI-165 — il était déjà mort (échec silencieux) depuis ce ticket-là. Le reconstruire sur la nouvelle API d'access-rules est le périmètre de WIKI-173.canCreateChildexposé mais pas encore consommé par une UI dédiée : aucune action "créer une sous-page" par nœud n'existe aujourd'hui dans l'arborescence. Le champ est propagé bout en bout pour que WIKI-172 puisse s'en servir.PageView: ces actions n'existent nulle part dans le frontend actuel. Les ajouter empiète sur le panneau "Accès" de WIKI-173.Test plan
pnpm run build(tsc -b + vite build) : clean.pnpm run lint(oxlint) : clean (uniquement des warnings pré-existants, non liés à ce diff).pnpm exec vitest run(frontend) : 35/35.pnpm exec vitest run(backend, pour la correction Configure pnpm workspace and add MinIO integration with MySQL #1 mergée depuis WIKI-167) : 247/247.🤖 Generated with Claude Code