Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 11 additions & 3 deletions components/TabLinks.vue
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
</template>

<script setup lang="ts">
import type { OrganizationReference } from '@datagouv/components-next'

defineProps<{
links: Array<{ href: string, label: string }>
}>()
Expand All @@ -30,10 +32,16 @@ const isCurrentUrl = useIsCurrentUrl()
function show(href: string) {
const router = useRouter()
const route = router.resolve(href)
const me = useMaybeMe()
if (route.meta.requiredRole) {
return me.value?.roles?.includes(route.meta.requiredRole as string) ?? false
const requiredOrganizationPermission = route.meta.requiredOrganizationPermission as (keyof OrganizationReference['permissions'] | undefined) ?? null
if (requiredOrganizationPermission) {
const { currentOrganization } = useCurrentOwned()
if (currentOrganization.value) {
return currentOrganization.value.permissions[requiredOrganizationPermission] ?? false
}

return false
}
Comment on lines +35 to 43
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here… Visiting http://dev.local:3000/admin/datasets/66a7aad2d369533b90b4eb38 with SSR is working (I see the Activities tab) but without SSR while navigating it seems that currentOrganization is null so I don't have the tab… Not sure why…


return true
}
</script>
Expand Down
15 changes: 12 additions & 3 deletions middleware/auth.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,25 @@
import type { OrganizationReference } from '@datagouv/components-next'

export default defineNuxtRouteMiddleware(async (to, _from) => {
// console.log(`Calling auth middleware ${from.path} -> ${to.path}`)
const me = useMaybeMe()

const requiredRole = to.meta.requiredRole as string ?? ''
const requiredOrganizationPermission = to.meta.requiredOrganizationPermission as keyof OrganizationReference['permissions']

if (to.path !== '/en/login' && !me.value) {
// console.log('-> redirecting to login…')
const route = useRoute()
return navigateTo({ path: '/login', query: { next: route.fullPath } }, { external: true })
}

if (requiredRole && !me.value?.roles?.includes(requiredRole)) {
throw createError({ statusCode: 401, statusMessage: 'Unauthorized' })
if (requiredOrganizationPermission) {
const { currentOrganization } = useCurrentOwned()

if (currentOrganization.value) {
const permissionValue = currentOrganization.value.permissions[requiredOrganizationPermission]
if (!permissionValue) {
throw createError({ statusCode: 401, statusMessage: 'Unauthorized' })
}
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure this middleware is doing something. I can visit http://dev.local:3000/admin/datasets/6727201449625899ea32c0d4/activities without triggering (with the production backend, without being super-admin) because I think currentOrganization.value is null

}
})
2 changes: 1 addition & 1 deletion pages/admin/dataservices/[id]/activities.vue
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { ActivityList } from '@datagouv/components-next'
import type { Dataservice } from '@datagouv/components-next'

definePageMeta({
requiredRole: 'admin',
requiredOrganizationPermission: 'edit',
})

defineProps<{
Expand Down
2 changes: 1 addition & 1 deletion pages/admin/datasets/[id]/activities.vue
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import { ActivityList, type Dataset } from '@datagouv/components-next'

definePageMeta({
requiredRole: 'admin',
requiredOrganizationPermission: 'edit',
})

defineProps<{
Expand Down
2 changes: 1 addition & 1 deletion pages/admin/organizations/[oid]/profile/activities.vue
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import { ActivityList, type Organization } from '@datagouv/components-next'

definePageMeta({
requiredRole: 'admin',
requiredOrganizationPermission: 'edit',
})

defineProps<{
Expand Down
2 changes: 1 addition & 1 deletion pages/admin/reuses/[id]/activities.vue
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import { ActivityList, type Reuse } from '@datagouv/components-next'

definePageMeta({
requiredRole: 'admin',
requiredOrganizationPermission: 'edit',
})

defineProps<{
Expand Down
2 changes: 1 addition & 1 deletion pages/admin/topics/[id]/activities.vue
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import { ActivityList, type TopicV2 } from '@datagouv/components-next'

definePageMeta({
requiredRole: 'admin',
requiredOrganizationPermission: 'edit',
})

defineProps<{
Expand Down
Loading