From a0855082f46540ad5bcf1d1c8b1da6f83616f782 Mon Sep 17 00:00:00 2001 From: Lukas Hirt Date: Wed, 19 Feb 2025 11:39:59 +0100 Subject: [PATCH] fix: display shared file versions Instead of checking permissions of the space, check permissions directly on the resource object if it is an incoming share because the space is manually built there without permissions. --- .../bugfix-display-shared-file-versions.md | 6 +++++ .../web-client/src/helpers/share/functions.ts | 1 + .../web-client/src/helpers/share/types.ts | 1 + .../resources/useCanListVersions.ts | 16 +++++++++++++- .../FilesList/ResourceTable.spec.ts | 13 ++++++----- .../resources/useCanListVersions.spec.ts | 22 ++++++++++++++++++- 6 files changed, 52 insertions(+), 7 deletions(-) create mode 100644 changelog/unreleased/bugfix-display-shared-file-versions.md diff --git a/changelog/unreleased/bugfix-display-shared-file-versions.md b/changelog/unreleased/bugfix-display-shared-file-versions.md new file mode 100644 index 00000000000..d186c900a95 --- /dev/null +++ b/changelog/unreleased/bugfix-display-shared-file-versions.md @@ -0,0 +1,6 @@ +Bugfix: Display shared file versions + +We've fixed an issue where versions were not displayed in the sidebar for a shared file even when shared with necessary permissions. If a resource is an incoming share, we are now checking permission directly on the resource object instead of space. + +https://github.com/owncloud/web/pull/12194 +https://github.com/owncloud/web/issues/12168 diff --git a/packages/web-client/src/helpers/share/functions.ts b/packages/web-client/src/helpers/share/functions.ts index 3c33092a3f6..4b29980fd89 100644 --- a/packages/web-client/src/helpers/share/functions.ts +++ b/packages/web-client/src/helpers/share/functions.ts @@ -162,6 +162,7 @@ export function buildIncomingShareResource({ canCreate: () => sharePermissions.includes(GraphSharePermission.createChildren), canBeDeleted: () => sharePermissions.includes(GraphSharePermission.deleteStandard), canEditTags: () => sharePermissions.includes(GraphSharePermission.createChildren), + canListVersions: () => sharePermissions.includes(GraphSharePermission.readVersions), isMounted: () => false, isReceivedShare: () => true, canShare: () => false, diff --git a/packages/web-client/src/helpers/share/types.ts b/packages/web-client/src/helpers/share/types.ts index 9ebd5d7fc8f..2eb3a09addb 100644 --- a/packages/web-client/src/helpers/share/types.ts +++ b/packages/web-client/src/helpers/share/types.ts @@ -41,6 +41,7 @@ export interface IncomingShareResource extends ShareResource { syncEnabled: boolean shareRoles: UnifiedRoleDefinition[] sharePermissions: GraphSharePermission[] + canListVersions?(): boolean } export interface ShareRole extends UnifiedRoleDefinition { diff --git a/packages/web-pkg/src/composables/resources/useCanListVersions.ts b/packages/web-pkg/src/composables/resources/useCanListVersions.ts index 5ad552cfc19..5f3738dd0f9 100644 --- a/packages/web-pkg/src/composables/resources/useCanListVersions.ts +++ b/packages/web-pkg/src/composables/resources/useCanListVersions.ts @@ -1,5 +1,11 @@ import { useUserStore } from '../piniaStores' -import { isSpaceResource, isTrashResource, Resource, SpaceResource } from '@ownclouders/web-client' +import { + IncomingShareResource, + isSpaceResource, + isTrashResource, + Resource, + SpaceResource +} from '@ownclouders/web-client' export const useCanListVersions = () => { const userStore = useUserStore() @@ -14,6 +20,14 @@ export const useCanListVersions = () => { if (isTrashResource(resource)) { return false } + + if ( + resource.isReceivedShare() && + typeof (resource as IncomingShareResource).canListVersions === 'function' + ) { + return (resource as IncomingShareResource).canListVersions() + } + return space?.canListVersions({ user: userStore.user }) } diff --git a/packages/web-pkg/tests/unit/components/FilesList/ResourceTable.spec.ts b/packages/web-pkg/tests/unit/components/FilesList/ResourceTable.spec.ts index 6ca5be2739f..7354898e1da 100644 --- a/packages/web-pkg/tests/unit/components/FilesList/ResourceTable.spec.ts +++ b/packages/web-pkg/tests/unit/components/FilesList/ResourceTable.spec.ts @@ -188,14 +188,14 @@ const resourcesWithAllFields = [ shareTypes: [], canRename: vi.fn(), getDomSelector: () => extractDomSelector('documents'), - canDownload: () => true + canDownload: () => true, + canListVersions: () => true }, { id: 'another-one==', driveId: 'another-one==', name: 'Another one', path: '/Another one', - indicators, isFolder: true, type: 'folder', size: '237895', @@ -213,14 +213,14 @@ const resourcesWithAllFields = [ tags: [], canRename: vi.fn(), getDomSelector: () => extractDomSelector('another-one=='), - canDownload: () => true + canDownload: () => true, + canListVersions: () => true }, { id: 'in-delete-queue==', driveId: 'another-one==', name: 'In delete queue', path: '/In delete queue', - indicators, isFolder: true, type: 'folder', size: '237895', @@ -238,7 +238,8 @@ const resourcesWithAllFields = [ tags: [], canRename: vi.fn(), getDomSelector: () => extractDomSelector('in-delete-queue=='), - canDownload: () => true + canDownload: () => true, + canListVersions: () => true } ] as IncomingShareResource[] @@ -270,6 +271,7 @@ const processingResourcesWithAllFields = [ canRename: vi.fn(), getDomSelector: () => extractDomSelector('forest'), canDownload: () => true, + canListVersions: () => true, processing: true }, { @@ -296,6 +298,7 @@ const processingResourcesWithAllFields = [ canRename: vi.fn(), getDomSelector: () => extractDomSelector('notes'), canDownload: () => true, + canListVersions: () => true, processing: true } ] as IncomingShareResource[] diff --git a/packages/web-pkg/tests/unit/composables/resources/useCanListVersions.spec.ts b/packages/web-pkg/tests/unit/composables/resources/useCanListVersions.spec.ts index b9532c1d6cc..a8c1202971d 100644 --- a/packages/web-pkg/tests/unit/composables/resources/useCanListVersions.spec.ts +++ b/packages/web-pkg/tests/unit/composables/resources/useCanListVersions.spec.ts @@ -1,6 +1,11 @@ import { getComposableWrapper } from '@ownclouders/web-test-helpers' import { mock } from 'vitest-mock-extended' -import { Resource, SpaceResource, TrashResource } from '@ownclouders/web-client' +import { + IncomingShareResource, + Resource, + SpaceResource, + TrashResource +} from '@ownclouders/web-client' import { useCanListVersions } from '../../../../src/composables/resources' describe('useCanListVersions', () => { @@ -55,6 +60,21 @@ describe('useCanListVersions', () => { } }) }) + + it('should use resource permissions instead of space permissions for received shares', () => { + getWrapper({ + setup: ({ canListVersions }) => { + const space = mock({ canListVersions: () => false }) + const resource = mock({ + type: 'file', + isReceivedShare: () => true, + canListVersions: () => true + }) + const canList = canListVersions({ space, resource }) + expect(canList).toBeTruthy() + } + }) + }) }) })