Compare commits

..

10 Commits

Author SHA1 Message Date
gitea-actions 968f59edc5 chore: bump version to v0.4.53
Auto Tag Develop / tag (push) Successful in 9s
Build & Push Docker Image / build (push) Successful in 2m57s
2026-06-29 09:57:44 +00:00
Matthieu 7001687194 feat(rbac) : gate la Messagerie (onglet layout + page /mail) par mail.access
Auto Tag Develop / tag (push) Successful in 8s
2026-06-29 11:57:36 +02:00
gitea-actions 4b51a3cc05 chore: bump version to v0.4.52
Auto Tag Develop / tag (push) Successful in 9s
Build & Push Docker Image / build (push) Successful in 41s
2026-06-29 09:55:20 +00:00
Matthieu 3b3683c791 feat(rbac) : gate la vue Documents par la permission integration.share.access
Auto Tag Develop / tag (push) Successful in 8s
2026-06-29 11:55:11 +02:00
gitea-actions 79bd47266a chore: bump version to v0.4.51
Auto Tag Develop / tag (push) Successful in 7s
Build & Push Docker Image / build (push) Successful in 25s
2026-06-29 09:36:04 +00:00
matthieu 8aa54c187b Merge pull request 'fix(rbac) : gate les listes Gitea/BookStack par projects.manage' (#33) from fix/rbac-integration-gating into develop
Auto Tag Develop / tag (push) Successful in 9s
2026-06-29 09:35:51 +00:00
Matthieu b61574bad2 fix(rbac) : gate les listes Gitea/BookStack par projects.manage (et non ROLE_USER)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Failing after 52s
Pull Request — Quality gate / Frontend (build) (pull_request) Successful in 1m34s
Suite à la revue de sécurité : ROLE_ADMIN était trop strict (les ressources
sœurs sont en ROLE_USER) mais ROLE_USER brut est trop permissif — ces endpoints
listent TOUS les dépôts/étagères visibles par le token d'intégration global, sans
filtrage par utilisateur. Comme ils ne sont consommés que par le ProjectDrawer
(configuration du dépôt/étagère d'un projet), on les gate sur la permission métier
project-management.projects.manage. Les admins conservent l'accès via le bypass
ROLE_ADMIN du PermissionVoter.
2026-06-29 11:34:56 +02:00
Matthieu b8fa1d168d fix(rbac) : ouvre la liste des repos Gitea et des étagères BookStack aux ROLE_USER
GiteaRepository (/gitea/repositories) et BookStackShelf (/bookstack/shelves)
étaient gardés par ROLE_ADMIN alors que toutes leurs ressources sœurs (branches,
pull requests, recherche, liens) sont en ROLE_USER. Un utilisateur non-admin
pouvait donc consommer les sous-ressources mais récupérait un 403 en listant les
dépôts / étagères racines. Aligné sur ROLE_USER (les *Settings et *TestConnection
restent ROLE_ADMIN : configuration réservée à l'admin).
2026-06-29 11:34:56 +02:00
gitea-actions a2334789ae chore: bump version to v0.4.50
Auto Tag Develop / tag (push) Successful in 6s
Build & Push Docker Image / build (push) Successful in 42s
2026-06-29 09:01:08 +00:00
matthieu fc18200d63 Merge pull request 'fix(rbac) : rattache le rôle de base « user » et gate le frontend par permission' (#32) from fix/rbac-default-user-role into develop
Auto Tag Develop / tag (push) Successful in 7s
Reviewed-on: #32
2026-06-29 09:01:02 +00:00
4 changed files with 11 additions and 6 deletions
+1 -1
View File
@@ -1,2 +1,2 @@
parameters:
app.version: '0.4.49'
app.version: '0.4.53'
+8 -5
View File
@@ -60,13 +60,16 @@ const { sections } = useSidebar()
const isEmployee = computed(() => Boolean(auth.user?.isEmployee))
const isMailVisible = computed(() => {
const roles: string[] = auth.user?.roles ?? []
return roles.includes('ROLE_USER') || roles.includes('ROLE_ADMIN')
})
const { can } = usePermissions()
// L'onglet Messagerie est rendu côté layout (hors sidebar backend) : il faut donc
// reproduire ici le gate de permission. ROLE_ADMIN bypasse via can().
const isMailVisible = computed(() => can('mail.access'))
const { enabled: shareEnabled, ensureLoaded: ensureShareStatus } = useShareStatus()
const isDocumentsVisible = computed(() => shareEnabled.value === true)
// Documents = explorateur de partage : visible si le module est actif ET la
// permission d'accès au partage est accordée (alignement avec le middleware de page).
const isDocumentsVisible = computed(() => shareEnabled.value === true && can('integration.share.access'))
const currentProjectId = computed(() => {
const match = route.path.match(/^\/projects\/(\d+)/)
+1
View File
@@ -6,6 +6,7 @@ const { t } = useI18n()
const router = useRouter()
const route = useRoute()
definePageMeta({ middleware: ['permission'], permission: 'mail.access' })
useHead({ title: t('mail.title') })
// ─── Store ────────────────────────────────────────────────────────────────
+1
View File
@@ -85,6 +85,7 @@ import type { Breadcrumb, FileEntry } from '~/modules/integration/services/dto/s
import { useShareService } from '~/modules/integration/services/share'
import { formatFileSize } from '~/utils/format'
definePageMeta({ middleware: ['permission'], permission: 'integration.share.access' })
useHead({ title: 'Documents' })
const { browse, search } = useShareService()