diff --git a/config/presets/storage/backend/storage-filesystem.json b/config/presets/storage/backend/storage-filesystem.json index 2feabbf1e..5b09bf56d 100644 --- a/config/presets/storage/backend/storage-filesystem.json +++ b/config/presets/storage/backend/storage-filesystem.json @@ -26,9 +26,6 @@ "DataAccessorBasedStore:_accessor": { "@id": "urn:solid-server:default:FileDataAccessor" }, - "DataAccessorBasedStore:_base": { - "@id": "urn:solid-server:default:variable:baseUrl" - }, "DataAccessorBasedStore:_identifierStrategy": { "@id": "urn:solid-server:default:IdentifierStrategy" } diff --git a/config/presets/storage/backend/storage-memory.json b/config/presets/storage/backend/storage-memory.json index a3680178a..ef8d090eb 100644 --- a/config/presets/storage/backend/storage-memory.json +++ b/config/presets/storage/backend/storage-memory.json @@ -14,9 +14,6 @@ "DataAccessorBasedStore:_accessor": { "@id": "urn:solid-server:default:MemoryDataAccessor" }, - "DataAccessorBasedStore:_base": { - "@id": "urn:solid-server:default:variable:baseUrl" - }, "DataAccessorBasedStore:_identifierStrategy": { "@id": "urn:solid-server:default:IdentifierStrategy" } diff --git a/config/presets/storage/backend/storage-sparql-endpoint.json b/config/presets/storage/backend/storage-sparql-endpoint.json index 7d990d505..b547f31af 100644 --- a/config/presets/storage/backend/storage-sparql-endpoint.json +++ b/config/presets/storage/backend/storage-sparql-endpoint.json @@ -7,9 +7,6 @@ "SparqlDataAccessor:_endpoint": { "@id": "urn:solid-server:default:variable:sparqlEndpoint" }, - "SparqlDataAccessor:_base": { - "@id": "urn:solid-server:default:variable:baseUrl" - }, "SparqlDataAccessor:_identifierStrategy": { "@id": "urn:solid-server:default:IdentifierStrategy" } @@ -21,9 +18,6 @@ "DataAccessorBasedStore:_accessor": { "@id": "urn:solid-server:default:SparqlDataAccessor" }, - "DataAccessorBasedStore:_base": { - "@id": "urn:solid-server:default:variable:baseUrl" - }, "DataAccessorBasedStore:_identifierStrategy": { "@id": "urn:solid-server:default:IdentifierStrategy" } diff --git a/src/storage/DataAccessorBasedStore.ts b/src/storage/DataAccessorBasedStore.ts index be415351f..e71b7544a 100644 --- a/src/storage/DataAccessorBasedStore.ts +++ b/src/storage/DataAccessorBasedStore.ts @@ -50,12 +50,10 @@ import type { ResourceStore } from './ResourceStore'; */ export class DataAccessorBasedStore implements ResourceStore { private readonly accessor: DataAccessor; - private readonly base: string; private readonly identifierStrategy: IdentifierStrategy; - public constructor(accessor: DataAccessor, base: string, identifierStrategy: IdentifierStrategy) { + public constructor(accessor: DataAccessor, identifierStrategy: IdentifierStrategy) { this.accessor = accessor; - this.base = ensureTrailingSlash(base); this.identifierStrategy = identifierStrategy; } @@ -149,7 +147,7 @@ export class DataAccessorBasedStore implements ResourceStore { public async deleteResource(identifier: ResourceIdentifier): Promise { this.validateIdentifier(identifier); - if (ensureTrailingSlash(identifier.path) === this.base) { + if (this.identifierStrategy.isRootContainer(identifier)) { throw new MethodNotAllowedHttpError('Cannot delete root container.'); } const metadata = await this.accessor.getMetadata(identifier); @@ -163,7 +161,7 @@ export class DataAccessorBasedStore implements ResourceStore { * Verify if the given identifier matches the stored base. */ protected validateIdentifier(identifier: ResourceIdentifier): void { - if (!identifier.path.startsWith(this.base)) { + if (!this.identifierStrategy.supportsIdentifier(identifier)) { throw new NotFoundHttpError(); } } diff --git a/src/storage/accessors/SparqlDataAccessor.ts b/src/storage/accessors/SparqlDataAccessor.ts index cbc3eac8f..785d14dae 100644 --- a/src/storage/accessors/SparqlDataAccessor.ts +++ b/src/storage/accessors/SparqlDataAccessor.ts @@ -26,7 +26,7 @@ import { UnsupportedMediaTypeHttpError } from '../../util/errors/UnsupportedMedi import { guardStream } from '../../util/GuardedStream'; import type { Guarded } from '../../util/GuardedStream'; import type { IdentifierStrategy } from '../../util/identifiers/IdentifierStrategy'; -import { ensureTrailingSlash, isContainerIdentifier } from '../../util/PathUtil'; +import { isContainerIdentifier } from '../../util/PathUtil'; import { generateResourceQuads } from '../../util/ResourceUtil'; import { CONTENT_TYPE, LDP } from '../../util/UriConstants'; import { toNamedNode } from '../../util/UriUtil'; @@ -49,14 +49,12 @@ const { defaultGraph, namedNode, quad, variable } = DataFactory; export class SparqlDataAccessor implements DataAccessor { protected readonly logger = getLoggerFor(this); private readonly endpoint: string; - private readonly base: string; private readonly identifierStrategy: IdentifierStrategy; private readonly fetcher: SparqlEndpointFetcher; private readonly generator: SparqlGenerator; - public constructor(endpoint: string, base: string, identifierStrategy: IdentifierStrategy) { + public constructor(endpoint: string, identifierStrategy: IdentifierStrategy) { this.endpoint = endpoint; - this.base = ensureTrailingSlash(base); this.identifierStrategy = identifierStrategy; this.fetcher = new SparqlEndpointFetcher(); this.generator = new Generator(); @@ -93,7 +91,7 @@ export class SparqlDataAccessor implements DataAccessor { const quads = await arrayifyStream(stream); // Root container will not have metadata if there are no containment triples - if (quads.length === 0 && identifier.path !== this.base) { + if (quads.length === 0 && !this.identifierStrategy.isRootContainer(identifier)) { throw new NotFoundHttpError(); } @@ -103,7 +101,7 @@ export class SparqlDataAccessor implements DataAccessor { } // Need to generate type metadata for the root container since it's not stored - if (identifier.path === this.base) { + if (this.identifierStrategy.isRootContainer(identifier)) { metadata.addQuads(generateResourceQuads(name, true)); } diff --git a/test/configs/Util.ts b/test/configs/Util.ts index ad70acb7a..a39f87fe1 100644 --- a/test/configs/Util.ts +++ b/test/configs/Util.ts @@ -61,7 +61,7 @@ export const getRootFilePath = (subfolder: string): string => join(__dirname, '. * @returns The data accessor based store. */ export const getDataAccessorStore = (base: string, dataAccessor: DataAccessor): DataAccessorBasedStore => - new DataAccessorBasedStore(dataAccessor, base, new SingleRootIdentifierStrategy(base)); + new DataAccessorBasedStore(dataAccessor, new SingleRootIdentifierStrategy(base)); /** * Gives an in memory resource store based on (default) base url. diff --git a/test/integration/LockingResourceStore.test.ts b/test/integration/LockingResourceStore.test.ts index b1d50ebea..3c04fd9a3 100644 --- a/test/integration/LockingResourceStore.test.ts +++ b/test/integration/LockingResourceStore.test.ts @@ -26,7 +26,7 @@ describe('A LockingResourceStore', (): void => { const base = 'http://test.com/'; path = `${base}path`; - source = new DataAccessorBasedStore(new InMemoryDataAccessor(base), base, new SingleRootIdentifierStrategy(base)); + source = new DataAccessorBasedStore(new InMemoryDataAccessor(base), new SingleRootIdentifierStrategy(base)); locker = new SingleThreadedResourceLocker(); expiringLocker = new WrappedExpiringResourceLocker(locker, 1000); diff --git a/test/integration/SparqlStorage.test.ts b/test/integration/SparqlStorage.test.ts index 5c11d164c..e161cfad7 100644 --- a/test/integration/SparqlStorage.test.ts +++ b/test/integration/SparqlStorage.test.ts @@ -8,7 +8,7 @@ import { describeIf, FileTestHelper } from '../util/TestHelpers'; describeIf('docker', 'a server with a SPARQL endpoint as storage', (): void => { describe('without acl', (): void => { const config = new DataAccessorBasedConfig(BASE, - new SparqlDataAccessor('http://localhost:4000/sparql', BASE, new SingleRootIdentifierStrategy(BASE)), + new SparqlDataAccessor('http://localhost:4000/sparql', new SingleRootIdentifierStrategy(BASE)), INTERNAL_QUADS); const handler = config.getHttpHandler(); const fileHelper = new FileTestHelper(handler, new URL(BASE)); diff --git a/test/unit/storage/DataAccessorBasedStore.test.ts b/test/unit/storage/DataAccessorBasedStore.test.ts index 02c489898..29a14c642 100644 --- a/test/unit/storage/DataAccessorBasedStore.test.ts +++ b/test/unit/storage/DataAccessorBasedStore.test.ts @@ -80,7 +80,7 @@ describe('A DataAccessorBasedStore', (): void => { beforeEach(async(): Promise => { accessor = new SimpleDataAccessor(); - store = new DataAccessorBasedStore(accessor, root, identifierStrategy); + store = new DataAccessorBasedStore(accessor, identifierStrategy); containerMetadata = new RepresentationMetadata( { [RDF.type]: [ DataFactory.namedNode(LDP.Container), DataFactory.namedNode(LDP.BasicContainer) ]}, diff --git a/test/unit/storage/accessors/SparqlDataAccessor.test.ts b/test/unit/storage/accessors/SparqlDataAccessor.test.ts index 901331144..935c68780 100644 --- a/test/unit/storage/accessors/SparqlDataAccessor.test.ts +++ b/test/unit/storage/accessors/SparqlDataAccessor.test.ts @@ -66,7 +66,7 @@ describe('A SparqlDataAccessor', (): void => { })); // This needs to be last so the fetcher can be mocked first - accessor = new SparqlDataAccessor(endpoint, base, identifierStrategy); + accessor = new SparqlDataAccessor(endpoint, identifierStrategy); }); it('can only handle quad data.', async(): Promise => {