From fd83f4b013fa4e1572ae6357971dc05bf9e57149 Mon Sep 17 00:00:00 2001 From: Joachim Van Herwegen Date: Wed, 29 Jun 2022 11:01:22 +0200 Subject: [PATCH] feat: Update WebAclMetadataCollector to support new permission interface --- .../ldp/metadata/WebAclMetadataCollector.ts | 7 ++--- .../metadata/WebAclMetadataCollector.test.ts | 27 ++++++++++++++----- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/http/ldp/metadata/WebAclMetadataCollector.ts b/src/http/ldp/metadata/WebAclMetadataCollector.ts index ccf6753da..22b57e8f8 100644 --- a/src/http/ldp/metadata/WebAclMetadataCollector.ts +++ b/src/http/ldp/metadata/WebAclMetadataCollector.ts @@ -15,11 +15,12 @@ const VALID_ACL_MODES = new Set([ AccessMode.read, AccessMode.write, AccessMode. */ export class WebAclMetadataCollector extends OperationMetadataCollector { public async handle({ metadata, operation }: OperationMetadataCollectorInput): Promise { - if (!operation.permissionSet || !VALID_METHODS.has(operation.method)) { + const permissionSet = operation.availablePermissions?.get(operation.target); + if (!permissionSet || !VALID_METHODS.has(operation.method)) { return; } - const user: AclPermission = operation.permissionSet.agent ?? {}; - const everyone: AclPermission = operation.permissionSet.public ?? {}; + const user: AclPermission = permissionSet.agent ?? {}; + const everyone: AclPermission = permissionSet.public ?? {}; const modes = new Set([ ...Object.keys(user), ...Object.keys(everyone) ] as AccessMode[]); diff --git a/test/unit/http/ldp/metadata/WebAclMetadataCollector.test.ts b/test/unit/http/ldp/metadata/WebAclMetadataCollector.test.ts index c4c865b73..fdc05e87e 100644 --- a/test/unit/http/ldp/metadata/WebAclMetadataCollector.test.ts +++ b/test/unit/http/ldp/metadata/WebAclMetadataCollector.test.ts @@ -5,9 +5,11 @@ import { WebAclMetadataCollector } from '../../../../../src/http/ldp/metadata/We import type { Operation } from '../../../../../src/http/Operation'; import { BasicRepresentation } from '../../../../../src/http/representation/BasicRepresentation'; import { RepresentationMetadata } from '../../../../../src/http/representation/RepresentationMetadata'; +import { IdentifierMap } from '../../../../../src/util/map/IdentifierMap'; import { ACL, AUTH } from '../../../../../src/util/Vocabularies'; describe('A WebAclMetadataCollector', (): void => { + const target = { path: 'http://example.com/foo' }; let operation: Operation; let metadata: RepresentationMetadata; const writer = new WebAclMetadataCollector(); @@ -15,7 +17,7 @@ describe('A WebAclMetadataCollector', (): void => { beforeEach(async(): Promise => { operation = { method: 'GET', - target: { path: 'http://test.com/foo' }, + target, preferences: {}, body: new BasicRepresentation(), }; @@ -23,27 +25,38 @@ describe('A WebAclMetadataCollector', (): void => { metadata = new RepresentationMetadata(); }); + it('adds no metadata if there is no target entry.', async(): Promise => { + await expect(writer.handle({ metadata, operation })).resolves.toBeUndefined(); + expect(metadata.quads()).toHaveLength(0); + + operation.availablePermissions = new IdentifierMap(); + await expect(writer.handle({ metadata, operation })).resolves.toBeUndefined(); + expect(metadata.quads()).toHaveLength(0); + }); + it('adds no metadata if there are no permissions.', async(): Promise => { await expect(writer.handle({ metadata, operation })).resolves.toBeUndefined(); expect(metadata.quads()).toHaveLength(0); - operation.permissionSet = {}; + operation.availablePermissions = new IdentifierMap([[ target, {}]]); await expect(writer.handle({ metadata, operation })).resolves.toBeUndefined(); expect(metadata.quads()).toHaveLength(0); }); it('adds no metadata if the method is wrong.', async(): Promise => { - operation.permissionSet = { [CredentialGroup.public]: { read: true, write: false }}; + operation.availablePermissions = new IdentifierMap( + [[ target, { [CredentialGroup.public]: { read: true, write: false }}]], + ); operation.method = 'DELETE'; await expect(writer.handle({ metadata, operation })).resolves.toBeUndefined(); expect(metadata.quads()).toHaveLength(0); }); it('adds corresponding metadata for all permissions present.', async(): Promise => { - operation.permissionSet = { + operation.availablePermissions = new IdentifierMap([[ target, { [CredentialGroup.agent]: { read: true, write: true, control: false } as AclPermission, [CredentialGroup.public]: { read: true, write: false }, - }; + }]]); await expect(writer.handle({ metadata, operation })).resolves.toBeUndefined(); expect(metadata.quads()).toHaveLength(3); expect(metadata.getAll(AUTH.terms.userMode)).toEqualRdfTermArray([ ACL.terms.Read, ACL.terms.Write ]); @@ -51,10 +64,10 @@ describe('A WebAclMetadataCollector', (): void => { }); it('ignores unknown modes.', async(): Promise => { - operation.permissionSet = { + operation.availablePermissions = new IdentifierMap([[ target, { [CredentialGroup.agent]: { read: true, create: true }, [CredentialGroup.public]: { read: true }, - }; + }]]); await expect(writer.handle({ metadata, operation })).resolves.toBeUndefined(); expect(metadata.quads()).toHaveLength(2); expect(metadata.getAll(AUTH.terms.userMode)).toEqualRdfTermArray([ ACL.terms.Read ]);