From 452032e3120d490d7261b9d304c8c393410f0406 Mon Sep 17 00:00:00 2001 From: Joachim Van Herwegen Date: Mon, 10 May 2021 15:46:42 +0200 Subject: [PATCH] feat: Split preset configurations by feature --- config/README.md | 55 +++++ config/config-default.json | 38 --- config/config-dynamic.json | 37 --- config/config-file-subdomains.json | 35 --- config/config-file.json | 38 --- config/config-memory-subdomains.json | 35 --- config/config-path-routing.json | 58 ----- config/config-rdf-to-sparql-endpoint.json | 39 --- config/config-sparql-endpoint.json | 38 --- config/default.json | 33 +++ config/dynamic.json | 33 +++ config/file.json | 33 +++ config/http/README.md | 23 ++ config/http/handler/default.json | 22 ++ config/http/handler/simple.json | 20 ++ .../middleware/handlers/constant-headers.json | 20 ++ config/http/middleware/handlers/cors.json | 26 ++ .../http/middleware/handlers/updates-via.json | 11 + config/http/middleware/no-websockets.json | 18 ++ config/http/middleware/websockets.json | 30 +++ config/http/server-factory/no-websockets.json | 13 + config/http/server-factory/websockets.json | 19 ++ config/http/static/default.json | 20 ++ config/identity/README.md | 14 ++ .../email/default.json} | 0 config/identity/email/example.json | 15 ++ .../adapter-factory/wrapped-fetch.json | 21 ++ config/identity/handler/default.json | 27 +++ .../identity/handler/interaction/handler.json | 51 ++++ .../interaction/handlers/forgot-password.json | 40 ++++ .../handler/interaction/handlers/initial.json | 26 ++ .../handler/interaction/handlers/login.json | 25 ++ .../interaction/handlers/registration.json | 29 +++ .../interaction/handlers/reset-password.json | 45 ++++ .../handler/interaction/handlers/session.json | 16 ++ .../handler/key-value/resource-store.json | 13 + .../handler/provider-factory/identity.json | 22 ++ config/init/README.md | 9 + config/init/handler/base/init.json | 19 ++ config/init/handler/default.json | 17 ++ config/init/handler/initializers/logger.json | 16 ++ .../handler/initializers/root-container.json | 12 + config/init/handler/initializers/server.json | 12 + config/ldp/README.md | 34 +++ .../ldp/authentication/debug-auth-header.json | 17 ++ .../ldp/authentication/debug-test-agent.json | 14 ++ .../authentication/dpop-bearer.json} | 9 +- .../ldp/authorization/allow-everything.json | 13 + config/ldp/authorization/authorizers/acl.json | 18 ++ config/ldp/authorization/webacl.json | 36 +++ .../components}/operation-handler.json | 36 +-- .../handler/components/request-parser.json | 23 ++ .../handler/components/response-writer.json | 17 ++ config/ldp/handler/default.json | 21 ++ .../metadata-parser/default.json} | 13 +- config/ldp/metadata-writer/default.json | 22 ++ .../ldp/metadata-writer/writers/constant.json | 20 ++ .../ldp/metadata-writer/writers/link-rel.json | 20 ++ .../ldp/metadata-writer/writers/mapped.json | 20 ++ .../metadata-writer/writers/wac-allow.json | 10 + .../permissions/acl.json} | 13 +- config/ldp/permissions/no-acl.json | 14 ++ config/memory-subdomains.json | 33 +++ config/path-routing.json | 36 +++ config/pod/README.md | 9 + config/pod/handler/dynamic.json | 59 +++++ config/pod/handler/http/manager.json | 15 ++ .../pod/handler/pod-generators/templated.json | 22 ++ .../resource-generators/templated.json | 17 ++ config/pod/handler/static.json | 23 ++ config/presets/acl.json | 62 ----- config/presets/http.json | 66 ------ .../identifiers/subdomain-identifiers.json | 19 -- .../identifiers/suffix-identifiers.json | 19 -- .../presets/identity/identity-provider.json | 84 ------- .../presets/identity/interaction-policy.json | 224 ------------------ config/presets/init.json | 51 ---- config/presets/ldp.json | 27 --- config/presets/ldp/request-parser.json | 34 --- config/presets/ldp/response-writer.json | 68 ------ config/presets/ldp/websockets.json | 12 - config/presets/middleware.json | 49 ---- config/presets/pod-dynamic.json | 140 ----------- config/presets/pod-management.json | 46 ---- config/presets/representation-conversion.json | 108 --------- config/presets/storage-wrapper.json | 96 -------- .../storage-filesystem-subdomains.json | 38 --- .../storage/backend/storage-filesystem.json | 37 --- .../storage/backend/storage-memory.json | 25 -- .../backend/storage-sparql-endpoint.json | 41 ---- .../storage/routing/quad-type-routing.json | 30 --- .../storage/routing/regex-routing.json | 19 -- config/sparql-endpoint.json | 33 +++ config/storage/README.md | 19 ++ config/storage/key-value/memory.json | 10 + config/storage/key-value/resource-store.json | 13 + .../resource-store/data-accessors/file.json | 11 + .../resource-store/data-accessors/memory.json | 11 + .../data-accessors/sparql-endpoint.json | 12 + config/storage/resource-store/dynamic.json | 39 +++ config/storage/resource-store/file.json | 32 +++ config/storage/resource-store/memory.json | 33 +++ config/storage/resource-store/regex.json | 81 +++++++ config/storage/resource-store/sparql.json | 35 +++ .../resource-store/stores/converting.json | 12 + .../resource-store/stores/data-accessor.json | 12 + .../resource-store/stores/locking.json | 12 + .../resource-store/stores/monitoring.json | 10 + .../resource-store/stores/patching.json | 16 ++ .../resource-store/stores/routing.json | 11 + config/util/README.md | 45 ++++ config/util/auxiliary/acl.json | 16 ++ config/util/auxiliary/no-acl.json | 14 ++ config/util/auxiliary/strategies/acl.json | 26 ++ config/util/identifiers/subdomain.json | 27 +++ config/util/identifiers/suffix.json | 26 ++ .../static.json => util/index/default.json} | 9 +- config/util/index/example.json | 15 ++ config/util/logging/no-logging.json | 10 + .../logging/winston.json} | 5 +- .../converters/content-type-replacer.json | 32 +++ .../converters/quad-to-rdf.json | 36 +++ .../converters/rdf-to-quad.json | 10 + .../representation-conversion/default.json | 32 +++ config/util/resource-locker/memory.json | 21 ++ config/util/resource-locker/redis.json | 23 ++ .../variables/default.json} | 6 + package.json | 4 +- src/init/AppRunner.ts | 2 +- templates/config/defaults.json | 17 +- test/integration/Config.ts | 21 +- test/integration/DynamicPods.test.ts | 4 +- test/integration/Identity.test.ts | 6 +- test/integration/LdpHandlerWithAuth.test.ts | 25 +- .../integration/LdpHandlerWithoutAuth.test.ts | 21 +- test/integration/Middleware.test.ts | 8 +- test/integration/PodCreation.test.ts | 17 +- .../RedisResourceLockerIntegration.test.ts | 4 +- test/integration/ServerFetch.test.ts | 6 +- test/integration/SparqlStorage.test.ts | 15 +- test/integration/Subdomains.test.ts | 26 +- test/integration/WebSocketsProtocol.test.ts | 6 +- test/integration/config/ldp-with-auth.json | 97 ++------ test/integration/config/run-with-redlock.json | 180 +++----------- .../config/server-dynamic-unsafe.json | 87 ++----- test/integration/config/server-memory.json | 59 ++--- .../integration/config/server-middleware.json | 17 +- .../config/server-subdomains-unsafe.json | 101 +++----- .../config/server-without-auth.json | 80 +++---- test/unit/init/AppRunner.test.ts | 8 +- .../generate/TemplatedPodGenerator.test.ts | 2 +- 151 files changed, 2358 insertions(+), 2212 deletions(-) create mode 100644 config/README.md delete mode 100644 config/config-default.json delete mode 100644 config/config-dynamic.json delete mode 100644 config/config-file-subdomains.json delete mode 100644 config/config-file.json delete mode 100644 config/config-memory-subdomains.json delete mode 100644 config/config-path-routing.json delete mode 100644 config/config-rdf-to-sparql-endpoint.json delete mode 100644 config/config-sparql-endpoint.json create mode 100644 config/default.json create mode 100644 config/dynamic.json create mode 100644 config/file.json create mode 100644 config/http/README.md create mode 100644 config/http/handler/default.json create mode 100644 config/http/handler/simple.json create mode 100644 config/http/middleware/handlers/constant-headers.json create mode 100644 config/http/middleware/handlers/cors.json create mode 100644 config/http/middleware/handlers/updates-via.json create mode 100644 config/http/middleware/no-websockets.json create mode 100644 config/http/middleware/websockets.json create mode 100644 config/http/server-factory/no-websockets.json create mode 100644 config/http/server-factory/websockets.json create mode 100644 config/http/static/default.json create mode 100644 config/identity/README.md rename config/{presets/identity/email-sender.json => identity/email/default.json} (100%) create mode 100644 config/identity/email/example.json create mode 100644 config/identity/handler/adapter-factory/wrapped-fetch.json create mode 100644 config/identity/handler/default.json create mode 100644 config/identity/handler/interaction/handler.json create mode 100644 config/identity/handler/interaction/handlers/forgot-password.json create mode 100644 config/identity/handler/interaction/handlers/initial.json create mode 100644 config/identity/handler/interaction/handlers/login.json create mode 100644 config/identity/handler/interaction/handlers/registration.json create mode 100644 config/identity/handler/interaction/handlers/reset-password.json create mode 100644 config/identity/handler/interaction/handlers/session.json create mode 100644 config/identity/handler/key-value/resource-store.json create mode 100644 config/identity/handler/provider-factory/identity.json create mode 100644 config/init/README.md create mode 100644 config/init/handler/base/init.json create mode 100644 config/init/handler/default.json create mode 100644 config/init/handler/initializers/logger.json create mode 100644 config/init/handler/initializers/root-container.json create mode 100644 config/init/handler/initializers/server.json create mode 100644 config/ldp/README.md create mode 100644 config/ldp/authentication/debug-auth-header.json create mode 100644 config/ldp/authentication/debug-test-agent.json rename config/{presets/ldp/credentials-extractor.json => ldp/authentication/dpop-bearer.json} (71%) create mode 100644 config/ldp/authorization/allow-everything.json create mode 100644 config/ldp/authorization/authorizers/acl.json create mode 100644 config/ldp/authorization/webacl.json rename config/{presets/ldp => ldp/handler/components}/operation-handler.json (54%) create mode 100644 config/ldp/handler/components/request-parser.json create mode 100644 config/ldp/handler/components/response-writer.json create mode 100644 config/ldp/handler/default.json rename config/{presets/ldp/metadata-handler.json => ldp/metadata-parser/default.json} (58%) create mode 100644 config/ldp/metadata-writer/default.json create mode 100644 config/ldp/metadata-writer/writers/constant.json create mode 100644 config/ldp/metadata-writer/writers/link-rel.json create mode 100644 config/ldp/metadata-writer/writers/mapped.json create mode 100644 config/ldp/metadata-writer/writers/wac-allow.json rename config/{presets/ldp/permissions-extractor.json => ldp/permissions/acl.json} (58%) create mode 100644 config/ldp/permissions/no-acl.json create mode 100644 config/memory-subdomains.json create mode 100644 config/path-routing.json create mode 100644 config/pod/README.md create mode 100644 config/pod/handler/dynamic.json create mode 100644 config/pod/handler/http/manager.json create mode 100644 config/pod/handler/pod-generators/templated.json create mode 100644 config/pod/handler/resource-generators/templated.json create mode 100644 config/pod/handler/static.json delete mode 100644 config/presets/acl.json delete mode 100644 config/presets/http.json delete mode 100644 config/presets/identifiers/subdomain-identifiers.json delete mode 100644 config/presets/identifiers/suffix-identifiers.json delete mode 100644 config/presets/identity/identity-provider.json delete mode 100644 config/presets/identity/interaction-policy.json delete mode 100644 config/presets/init.json delete mode 100644 config/presets/ldp.json delete mode 100644 config/presets/ldp/request-parser.json delete mode 100644 config/presets/ldp/response-writer.json delete mode 100644 config/presets/ldp/websockets.json delete mode 100644 config/presets/middleware.json delete mode 100644 config/presets/pod-dynamic.json delete mode 100644 config/presets/pod-management.json delete mode 100644 config/presets/representation-conversion.json delete mode 100644 config/presets/storage-wrapper.json delete mode 100644 config/presets/storage/backend/storage-filesystem-subdomains.json delete mode 100644 config/presets/storage/backend/storage-filesystem.json delete mode 100644 config/presets/storage/backend/storage-memory.json delete mode 100644 config/presets/storage/backend/storage-sparql-endpoint.json delete mode 100644 config/presets/storage/routing/quad-type-routing.json delete mode 100644 config/presets/storage/routing/regex-routing.json create mode 100644 config/sparql-endpoint.json create mode 100644 config/storage/README.md create mode 100644 config/storage/key-value/memory.json create mode 100644 config/storage/key-value/resource-store.json create mode 100644 config/storage/resource-store/data-accessors/file.json create mode 100644 config/storage/resource-store/data-accessors/memory.json create mode 100644 config/storage/resource-store/data-accessors/sparql-endpoint.json create mode 100644 config/storage/resource-store/dynamic.json create mode 100644 config/storage/resource-store/file.json create mode 100644 config/storage/resource-store/memory.json create mode 100644 config/storage/resource-store/regex.json create mode 100644 config/storage/resource-store/sparql.json create mode 100644 config/storage/resource-store/stores/converting.json create mode 100644 config/storage/resource-store/stores/data-accessor.json create mode 100644 config/storage/resource-store/stores/locking.json create mode 100644 config/storage/resource-store/stores/monitoring.json create mode 100644 config/storage/resource-store/stores/patching.json create mode 100644 config/storage/resource-store/stores/routing.json create mode 100644 config/util/README.md create mode 100644 config/util/auxiliary/acl.json create mode 100644 config/util/auxiliary/no-acl.json create mode 100644 config/util/auxiliary/strategies/acl.json create mode 100644 config/util/identifiers/subdomain.json create mode 100644 config/util/identifiers/suffix.json rename config/{presets/static.json => util/index/default.json} (51%) create mode 100644 config/util/index/example.json create mode 100644 config/util/logging/no-logging.json rename config/{presets/logging.json => util/logging/winston.json} (65%) create mode 100644 config/util/representation-conversion/converters/content-type-replacer.json create mode 100644 config/util/representation-conversion/converters/quad-to-rdf.json create mode 100644 config/util/representation-conversion/converters/rdf-to-quad.json create mode 100644 config/util/representation-conversion/default.json create mode 100644 config/util/resource-locker/memory.json create mode 100644 config/util/resource-locker/redis.json rename config/{presets/cli-params.json => util/variables/default.json} (66%) diff --git a/config/README.md b/config/README.md new file mode 100644 index 0000000000..468b4c8d74 --- /dev/null +++ b/config/README.md @@ -0,0 +1,55 @@ +This folder contains several configurations that can be used to start up the server. +All those configurations are created in the same way: +features are enabled or disabled by choosing a specific option for every component. +All components are represented by the subfolders found in the folders here: +`ldp` contains all LDP related components, +`identity` all IDP components, etc. +Options are then chosen by importing 1 entry from every component subfolder. +In case none of the available options have the exact feature configuration you want, +it is always possible to not choose any of them and create your own custom version instead. + +# How to use +The easiest way to create a new config is by creating a JSON-LD file +that imports one option from every component subfolder +(such as either `allow-everything.json` or `webacl.json` from `ldp/authorization`). +In case none of the available options suffice, there are 2 other ways to handle this: + +## Append to an existing config +In case the options mostly suffice, but they just need to do a bit more, +it might be possible to append to one of the solutions. + +For example, in case all the existing metadata parsers can remain, +but an additional one needs to be added, +you could import `ldp/metadata-parser/default.json` +and then add the following in your root config: +```json + { + "@id": "urn:solid-server:default:MetadataParser", + "ParallelHandler:_handlers": [ + { "@type": "MyNewParser" } + ] + } +``` +This will add the new parser to the list of metadata parsers. + +Note that generally it is only advised to append to ParallelHandlers or key/value maps. +In case the order is important this can not be guaranteed over separate files. + +## Create a new option +If a more drastic change is required, +the solution is to not import anything from that folder but instead write your own. + +For example, in case you only want the slug parser but not any of the others, +you would have to not import anything from `ldp/metadata-parser` folder, +but instead have the following in your root config: +```json + { + "@id": "urn:solid-server:default:MetadataParser", + "@type": "ParallelHandler", + "handlers": [ + { "@type": "SlugParser" } + ] + } +``` +Don't forget that in some cases you would also have to copy some imports! +The existing options can be used as inspiration. diff --git a/config/config-default.json b/config/config-default.json deleted file mode 100644 index 1e74517d4d..0000000000 --- a/config/config-default.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "import": [ - "files-scs:config/presets/acl.json", - "files-scs:config/presets/http.json", - "files-scs:config/presets/identifiers/suffix-identifiers.json", - "files-scs:config/presets/init.json", - "files-scs:config/presets/ldp.json", - "files-scs:config/presets/ldp/credentials-extractor.json", - "files-scs:config/presets/ldp/metadata-handler.json", - "files-scs:config/presets/ldp/operation-handler.json", - "files-scs:config/presets/ldp/permissions-extractor.json", - "files-scs:config/presets/ldp/response-writer.json", - "files-scs:config/presets/ldp/request-parser.json", - "files-scs:config/presets/ldp/websockets.json", - "files-scs:config/presets/logging.json", - "files-scs:config/presets/middleware.json", - "files-scs:config/presets/pod-management.json", - "files-scs:config/presets/representation-conversion.json", - "files-scs:config/presets/static.json", - "files-scs:config/presets/storage/backend/storage-memory.json", - "files-scs:config/presets/storage-wrapper.json", - "files-scs:config/presets/cli-params.json", - "files-scs:config/presets/identity/identity-provider.json", - "files-scs:config/presets/identity/interaction-policy.json", - "files-scs:config/presets/identity/email-sender.json" - ], - "@graph": [ - { - "comment": "Use a memory based store as backend with no additional routing.", - "@id": "urn:solid-server:default:RoutingResourceStore", - "@type": "PassthroughStore", - "source": { - "@id": "urn:solid-server:default:MemoryResourceStore" - } - } - ] -} diff --git a/config/config-dynamic.json b/config/config-dynamic.json deleted file mode 100644 index f0810d89cd..0000000000 --- a/config/config-dynamic.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "import": [ - "files-scs:config/presets/acl.json", - "files-scs:config/presets/http.json", - "files-scs:config/presets/identifiers/suffix-identifiers.json", - "files-scs:config/presets/init.json", - "files-scs:config/presets/ldp.json", - "files-scs:config/presets/ldp/credentials-extractor.json", - "files-scs:config/presets/ldp/metadata-handler.json", - "files-scs:config/presets/ldp/operation-handler.json", - "files-scs:config/presets/ldp/permissions-extractor.json", - "files-scs:config/presets/ldp/response-writer.json", - "files-scs:config/presets/ldp/request-parser.json", - "files-scs:config/presets/ldp/websockets.json", - "files-scs:config/presets/logging.json", - "files-scs:config/presets/middleware.json", - "files-scs:config/presets/pod-dynamic.json", - "files-scs:config/presets/representation-conversion.json", - "files-scs:config/presets/static.json", - "files-scs:config/presets/storage/backend/storage-memory.json", - "files-scs:config/presets/storage-wrapper.json", - "files-scs:config/presets/cli-params.json" - ], - "@graph": [ - { - "comment": "This configuration sets up a server that allows for the creation of dynamic pods through pod provisioning." - }, - { - "comment": "Which store to use for requests that do not match any pod", - "@id": "urn:solid-server:default:BaseUrlRouterRule", - "BaseUrlRouterRule:_baseStore": { - "@id": "urn:solid-server:default:MemoryResourceStore" - } - } - ] -} diff --git a/config/config-file-subdomains.json b/config/config-file-subdomains.json deleted file mode 100644 index f692c03c8b..0000000000 --- a/config/config-file-subdomains.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "import": [ - "files-scs:config/presets/acl.json", - "files-scs:config/presets/http.json", - "files-scs:config/presets/identifiers/subdomain-identifiers.json", - "files-scs:config/presets/init.json", - "files-scs:config/presets/ldp.json", - "files-scs:config/presets/ldp/credentials-extractor.json", - "files-scs:config/presets/ldp/metadata-handler.json", - "files-scs:config/presets/ldp/operation-handler.json", - "files-scs:config/presets/ldp/permissions-extractor.json", - "files-scs:config/presets/ldp/response-writer.json", - "files-scs:config/presets/ldp/request-parser.json", - "files-scs:config/presets/ldp/websockets.json", - "files-scs:config/presets/logging.json", - "files-scs:config/presets/middleware.json", - "files-scs:config/presets/pod-management.json", - "files-scs:config/presets/representation-conversion.json", - "files-scs:config/presets/static.json", - "files-scs:config/presets/storage/backend/storage-filesystem-subdomains.json", - "files-scs:config/presets/storage-wrapper.json", - "files-scs:config/presets/cli-params.json" - ], - "@graph": [ - { - "comment": "Use a file based store as backend with no additional routing.", - "@id": "urn:solid-server:default:RoutingResourceStore", - "@type": "PassthroughStore", - "source": { - "@id": "urn:solid-server:default:FileResourceStore" - } - } - ] -} diff --git a/config/config-file.json b/config/config-file.json deleted file mode 100644 index c033ec7205..0000000000 --- a/config/config-file.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "import": [ - "files-scs:config/presets/acl.json", - "files-scs:config/presets/http.json", - "files-scs:config/presets/identifiers/suffix-identifiers.json", - "files-scs:config/presets/init.json", - "files-scs:config/presets/ldp.json", - "files-scs:config/presets/ldp/credentials-extractor.json", - "files-scs:config/presets/ldp/metadata-handler.json", - "files-scs:config/presets/ldp/operation-handler.json", - "files-scs:config/presets/ldp/permissions-extractor.json", - "files-scs:config/presets/ldp/response-writer.json", - "files-scs:config/presets/ldp/request-parser.json", - "files-scs:config/presets/ldp/websockets.json", - "files-scs:config/presets/logging.json", - "files-scs:config/presets/middleware.json", - "files-scs:config/presets/pod-management.json", - "files-scs:config/presets/representation-conversion.json", - "files-scs:config/presets/static.json", - "files-scs:config/presets/storage/backend/storage-filesystem.json", - "files-scs:config/presets/storage-wrapper.json", - "files-scs:config/presets/cli-params.json", - "files-scs:config/presets/identity/identity-provider.json", - "files-scs:config/presets/identity/interaction-policy.json", - "files-scs:config/presets/identity/email-sender.json" - ], - "@graph": [ - { - "comment": "Use a file based store as backend with no additional routing.", - "@id": "urn:solid-server:default:RoutingResourceStore", - "@type": "PassthroughStore", - "source": { - "@id": "urn:solid-server:default:FileResourceStore" - } - } - ] -} diff --git a/config/config-memory-subdomains.json b/config/config-memory-subdomains.json deleted file mode 100644 index 41827dad91..0000000000 --- a/config/config-memory-subdomains.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "import": [ - "files-scs:config/presets/acl.json", - "files-scs:config/presets/http.json", - "files-scs:config/presets/identifiers/subdomain-identifiers.json", - "files-scs:config/presets/init.json", - "files-scs:config/presets/ldp.json", - "files-scs:config/presets/ldp/credentials-extractor.json", - "files-scs:config/presets/ldp/metadata-handler.json", - "files-scs:config/presets/ldp/operation-handler.json", - "files-scs:config/presets/ldp/permissions-extractor.json", - "files-scs:config/presets/ldp/response-writer.json", - "files-scs:config/presets/ldp/request-parser.json", - "files-scs:config/presets/ldp/websockets.json", - "files-scs:config/presets/logging.json", - "files-scs:config/presets/middleware.json", - "files-scs:config/presets/pod-management.json", - "files-scs:config/presets/representation-conversion.json", - "files-scs:config/presets/static.json", - "files-scs:config/presets/storage/backend/storage-memory.json", - "files-scs:config/presets/storage-wrapper.json", - "files-scs:config/presets/cli-params.json" - ], - "@graph": [ - { - "comment": "Use a memory based store as backend with no additional routing.", - "@id": "urn:solid-server:default:RoutingResourceStore", - "@type": "PassthroughStore", - "source": { - "@id": "urn:solid-server:default:MemoryResourceStore" - } - } - ] -} diff --git a/config/config-path-routing.json b/config/config-path-routing.json deleted file mode 100644 index 26c7aa36ca..0000000000 --- a/config/config-path-routing.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "import": [ - "files-scs:config/presets/acl.json", - "files-scs:config/presets/http.json", - "files-scs:config/presets/identifiers/suffix-identifiers.json", - "files-scs:config/presets/init.json", - "files-scs:config/presets/ldp.json", - "files-scs:config/presets/ldp/credentials-extractor.json", - "files-scs:config/presets/ldp/metadata-handler.json", - "files-scs:config/presets/ldp/operation-handler.json", - "files-scs:config/presets/ldp/permissions-extractor.json", - "files-scs:config/presets/ldp/response-writer.json", - "files-scs:config/presets/ldp/request-parser.json", - "files-scs:config/presets/ldp/websockets.json", - "files-scs:config/presets/logging.json", - "files-scs:config/presets/middleware.json", - "files-scs:config/presets/pod-management.json", - "files-scs:config/presets/representation-conversion.json", - "files-scs:config/presets/static.json", - "files-scs:config/presets/storage/backend/storage-filesystem.json", - "files-scs:config/presets/storage/backend/storage-memory.json", - "files-scs:config/presets/storage/backend/storage-sparql-endpoint.json", - "files-scs:config/presets/storage/routing/regex-routing.json", - "files-scs:config/presets/storage-wrapper.json", - "files-scs:config/presets/cli-params.json", - "files-scs:config/presets/identity/identity-provider.json", - "files-scs:config/presets/identity/interaction-policy.json", - "files-scs:config/presets/identity/email-sender.json" - ], - "@graph": [ - { - "comment": [ - "Configure routing to send all requests containing /file/ to the file store, containing /memory/ to the memory store and /sparql/ to the sparql endpoint store.", - "The root .acl file will be stored in the sparql endpoint store." - ], - "@id": "urn:solid-server:default:RegexRouterRule", - "RegexRouterRule:_storeMap": [ - { - "RegexRouterRule:_storeMap_key": "^/\\.acl$", - "RegexRouterRule:_storeMap_value": { "@id": "urn:solid-server:default:SparqlResourceStore" } - }, - { - "RegexRouterRule:_storeMap_key": "/file/", - "RegexRouterRule:_storeMap_value": { "@id": "urn:solid-server:default:FileResourceStore" } - }, - { - "RegexRouterRule:_storeMap_key": "/memory/", - "RegexRouterRule:_storeMap_value": { "@id": "urn:solid-server:default:MemoryResourceStore" } - }, - { - "RegexRouterRule:_storeMap_key": "/sparql/", - "RegexRouterRule:_storeMap_value": { "@id": "urn:solid-server:default:SparqlResourceStore" } - } - ] - } - ] -} diff --git a/config/config-rdf-to-sparql-endpoint.json b/config/config-rdf-to-sparql-endpoint.json deleted file mode 100644 index bc59f7fce0..0000000000 --- a/config/config-rdf-to-sparql-endpoint.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "import": [ - "files-scs:config/presets/acl.json", - "files-scs:config/presets/http.json", - "files-scs:config/presets/identifiers/suffix-identifiers.json", - "files-scs:config/presets/init.json", - "files-scs:config/presets/ldp.json", - "files-scs:config/presets/ldp/credentials-extractor.json", - "files-scs:config/presets/ldp/metadata-handler.json", - "files-scs:config/presets/ldp/operation-handler.json", - "files-scs:config/presets/ldp/permissions-extractor.json", - "files-scs:config/presets/ldp/response-writer.json", - "files-scs:config/presets/ldp/request-parser.json", - "files-scs:config/presets/ldp/websockets.json", - "files-scs:config/presets/logging.json", - "files-scs:config/presets/middleware.json", - "files-scs:config/presets/pod-management.json", - "files-scs:config/presets/representation-conversion.json", - "files-scs:config/presets/static.json", - "files-scs:config/presets/storage/backend/storage-filesystem.json", - "files-scs:config/presets/storage/backend/storage-sparql-endpoint.json", - "files-scs:config/presets/storage/routing/quad-type-routing.json", - "files-scs:config/presets/storage-wrapper.json", - "files-scs:config/presets/cli-params.json", - "files-scs:config/presets/identity/identity-provider.json", - "files-scs:config/presets/identity/interaction-policy.json", - "files-scs:config/presets/identity/email-sender.json" - ], - "@graph": [ - { - "comment": "Sends all data that can be interpreted as RDF to the sparql endpoint store and all other data to the default store (file in this case).", - "@id": "urn:solid-server:default:ConvertingRouterRule", - "ConvertingRouterRule:_defaultStore": { - "@id": "urn:solid-server:default:FileResourceStore" - } - } - ] -} diff --git a/config/config-sparql-endpoint.json b/config/config-sparql-endpoint.json deleted file mode 100644 index 28f4d4eb82..0000000000 --- a/config/config-sparql-endpoint.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "import": [ - "files-scs:config/presets/acl.json", - "files-scs:config/presets/http.json", - "files-scs:config/presets/identifiers/suffix-identifiers.json", - "files-scs:config/presets/init.json", - "files-scs:config/presets/ldp.json", - "files-scs:config/presets/ldp/credentials-extractor.json", - "files-scs:config/presets/ldp/metadata-handler.json", - "files-scs:config/presets/ldp/operation-handler.json", - "files-scs:config/presets/ldp/permissions-extractor.json", - "files-scs:config/presets/ldp/response-writer.json", - "files-scs:config/presets/ldp/request-parser.json", - "files-scs:config/presets/ldp/websockets.json", - "files-scs:config/presets/logging.json", - "files-scs:config/presets/middleware.json", - "files-scs:config/presets/pod-management.json", - "files-scs:config/presets/representation-conversion.json", - "files-scs:config/presets/static.json", - "files-scs:config/presets/storage/backend/storage-sparql-endpoint.json", - "files-scs:config/presets/storage-wrapper.json", - "files-scs:config/presets/cli-params.json", - "files-scs:config/presets/identity/identity-provider.json", - "files-scs:config/presets/identity/interaction-policy.json", - "files-scs:config/presets/identity/email-sender.json" - ], - "@graph": [ - { - "comment": "Use a SPARQL based store as backend with no additional routing.", - "@id": "urn:solid-server:default:RoutingResourceStore", - "@type": "PassthroughStore", - "source": { - "@id": "urn:solid-server:default:SparqlResourceStore" - } - } - ] -} diff --git a/config/default.json b/config/default.json new file mode 100644 index 0000000000..711f3714a2 --- /dev/null +++ b/config/default.json @@ -0,0 +1,33 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "import": [ + "files-scs:config/http/handler/default.json", + "files-scs:config/http/middleware/websockets.json", + "files-scs:config/http/server-factory/websockets.json", + "files-scs:config/http/static/default.json", + "files-scs:config/identity/handler/default.json", + "files-scs:config/identity/email/default.json", + "files-scs:config/init/handler/default.json", + "files-scs:config/ldp/authentication/dpop-bearer.json", + "files-scs:config/ldp/authorization/webacl.json", + "files-scs:config/ldp/handler/default.json", + "files-scs:config/ldp/metadata-parser/default.json", + "files-scs:config/ldp/metadata-writer/default.json", + "files-scs:config/ldp/permissions/acl.json", + "files-scs:config/pod/handler/static.json", + "files-scs:config/storage/key-value/memory.json", + "files-scs:config/storage/resource-store/memory.json", + "files-scs:config/util/auxiliary/acl.json", + "files-scs:config/util/identifiers/suffix.json", + "files-scs:config/util/index/default.json", + "files-scs:config/util/logging/winston.json", + "files-scs:config/util/representation-conversion/default.json", + "files-scs:config/util/resource-locker/memory.json", + "files-scs:config/util/variables/default.json" + ], + "@graph": [ + { + "comment": "A single-pod server that stores its resources in memory." + } + ] +} diff --git a/config/dynamic.json b/config/dynamic.json new file mode 100644 index 0000000000..39ed09a847 --- /dev/null +++ b/config/dynamic.json @@ -0,0 +1,33 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "import": [ + "files-scs:config/http/handler/default.json", + "files-scs:config/http/middleware/websockets.json", + "files-scs:config/http/server-factory/websockets.json", + "files-scs:config/http/static/default.json", + "files-scs:config/identity/handler/default.json", + "files-scs:config/identity/email/default.json", + "files-scs:config/init/handler/default.json", + "files-scs:config/ldp/authentication/dpop-bearer.json", + "files-scs:config/ldp/authorization/webacl.json", + "files-scs:config/ldp/handler/default.json", + "files-scs:config/ldp/metadata-parser/default.json", + "files-scs:config/ldp/metadata-writer/default.json", + "files-scs:config/ldp/permissions/acl.json", + "files-scs:config/pod/handler/dynamic.json", + "files-scs:config/storage/key-value/memory.json", + "files-scs:config/storage/resource-store/dynamic.json", + "files-scs:config/util/auxiliary/acl.json", + "files-scs:config/util/identifiers/suffix.json", + "files-scs:config/util/index/default.json", + "files-scs:config/util/logging/winston.json", + "files-scs:config/util/representation-conversion/default.json", + "files-scs:config/util/resource-locker/memory.json", + "files-scs:config/util/variables/default.json" + ], + "@graph": [ + { + "comment": "A multi-pod server that allows for the creation of dynamic pods through pod provisioning." + } + ] +} diff --git a/config/file.json b/config/file.json new file mode 100644 index 0000000000..a2b65d3def --- /dev/null +++ b/config/file.json @@ -0,0 +1,33 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "import": [ + "files-scs:config/http/handler/default.json", + "files-scs:config/http/middleware/websockets.json", + "files-scs:config/http/server-factory/websockets.json", + "files-scs:config/http/static/default.json", + "files-scs:config/identity/handler/default.json", + "files-scs:config/identity/email/default.json", + "files-scs:config/init/handler/default.json", + "files-scs:config/ldp/authentication/dpop-bearer.json", + "files-scs:config/ldp/authorization/webacl.json", + "files-scs:config/ldp/handler/default.json", + "files-scs:config/ldp/metadata-parser/default.json", + "files-scs:config/ldp/metadata-writer/default.json", + "files-scs:config/ldp/permissions/acl.json", + "files-scs:config/pod/handler/static.json", + "files-scs:config/storage/key-value/memory.json", + "files-scs:config/storage/resource-store/file.json", + "files-scs:config/util/auxiliary/acl.json", + "files-scs:config/util/identifiers/suffix.json", + "files-scs:config/util/index/default.json", + "files-scs:config/util/logging/winston.json", + "files-scs:config/util/representation-conversion/default.json", + "files-scs:config/util/resource-locker/memory.json", + "files-scs:config/util/variables/default.json" + ], + "@graph": [ + { + "comment": "A single-pod server that stores its resources on disk." + } + ] +} diff --git a/config/http/README.md b/config/http/README.md new file mode 100644 index 0000000000..9c264fad5b --- /dev/null +++ b/config/http/README.md @@ -0,0 +1,23 @@ +# HTTP +Options related to the base support of HTTP requests by the server. + +## Handler +Sets up all the handlers a request will potentially pass through. +* *default*: The full setup, that is middleware + static files + pod creation + IDP + LDP. +* *simple*: A simpler setup that only supports the base solid features. Has no pod creation or IDP. + +## Middleware +A set of handlers that will always be run on all requests to add some metadata +and then pass the request along. +* *no-websockets*: The default setup but without the websocket-related metadata. +* *websockets*: The default setup with several handlers. + +## Server-Factory +The factory used to create the actual server object. +* *no-websockets*: Only HTTP. +* *websockets*: HTTP and websockets. + +## Static +Support for static files that should be found at a specific path. +* *default*: The default handler with a favicon and css for the IDP. + New entries can easily be added for new files. diff --git a/config/http/handler/default.json b/config/http/handler/default.json new file mode 100644 index 0000000000..e18b07c237 --- /dev/null +++ b/config/http/handler/default.json @@ -0,0 +1,22 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "These are all the handlers a request will go through until it is handled.", + "@id": "urn:solid-server:default:HttpHandler", + "@type": "SequenceHandler", + "handlers": [ + { "@id": "urn:solid-server:default:Middleware" }, + { + "@type": "WaterfallHandler", + "handlers": [ + { "@id": "urn:solid-server:default:StaticAssetHandler" }, + { "@id": "urn:solid-server:default:PodManagerHandler" }, + { "@id": "urn:solid-server:default:IdentityProviderHandler" }, + { "@id": "urn:solid-server:default:LdpHandler" } + ] + } + ] + }, + ] +} diff --git a/config/http/handler/simple.json b/config/http/handler/simple.json new file mode 100644 index 0000000000..ac98ba783a --- /dev/null +++ b/config/http/handler/simple.json @@ -0,0 +1,20 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "This version of the server has no IDP or pod provisioning.", + "@id": "urn:solid-server:default:HttpHandler", + "@type": "SequenceHandler", + "handlers": [ + { "@id": "urn:solid-server:default:Middleware" }, + { + "@type": "WaterfallHandler", + "handlers": [ + { "@id": "urn:solid-server:default:StaticAssetHandler" }, + { "@id": "urn:solid-server:default:LdpHandler" } + ] + } + ] + } + ] +} diff --git a/config/http/middleware/handlers/constant-headers.json b/config/http/middleware/handlers/constant-headers.json new file mode 100644 index 0000000000..e377edfc5d --- /dev/null +++ b/config/http/middleware/handlers/constant-headers.json @@ -0,0 +1,20 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Adds several constant headers.", + "@id": "urn:solid-server:default:Middleware_Header", + "@type": "HeaderHandler", + "headers": [ + { + "HeaderHandler:_headers_key": "Vary", + "HeaderHandler:_headers_value": "Accept,Authorization,Origin" + }, + { + "HeaderHandler:_headers_key": "X-Powered-By", + "HeaderHandler:_headers_value": "Community Solid Server" + } + ] + } + ] +} diff --git a/config/http/middleware/handlers/cors.json b/config/http/middleware/handlers/cors.json new file mode 100644 index 0000000000..6cf4bc978e --- /dev/null +++ b/config/http/middleware/handlers/cors.json @@ -0,0 +1,26 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Adds all the necessary CORS headers.", + "@id": "urn:solid-server:default:Middleware_Cors", + "@type": "CorsHandler", + "options_methods": [ + "GET", + "HEAD", + "OPTIONS", + "POST", + "PUT", + "PATCH", + "DELETE" + ], + "options_credentials": true, + "options_exposedHeaders": [ + "Accept-Patch", + "Location", + "MS-Author-Via", + "Updates-Via" + ] + } + ] +} diff --git a/config/http/middleware/handlers/updates-via.json b/config/http/middleware/handlers/updates-via.json new file mode 100644 index 0000000000..559559f31d --- /dev/null +++ b/config/http/middleware/handlers/updates-via.json @@ -0,0 +1,11 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Advertises the websocket connection.", + "@id": "urn:solid-server:default:Middleware_WebSocket", + "@type": "WebSocketAdvertiser", + "baseUrl": { "@id": "urn:solid-server:default:variable:baseUrl" } + } + ] +} diff --git a/config/http/middleware/no-websockets.json b/config/http/middleware/no-websockets.json new file mode 100644 index 0000000000..dced489de7 --- /dev/null +++ b/config/http/middleware/no-websockets.json @@ -0,0 +1,18 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "import": [ + "files-scs:config/http/middleware/handlers/constant-headers.json", + "files-scs:config/http/middleware/handlers/cors.json" + ], + "@graph": [ + { + "comment": "All of these will always be executed on any incoming request. These are mostly used for adding response headers.", + "@id": "urn:solid-server:default:Middleware", + "@type": "SequenceHandler", + "handlers": [ + { "@id": "urn:solid-server:default:Middleware_Header" }, + { "@id": "urn:solid-server:default:Middleware_Cors" } + ] + } + ] +} diff --git a/config/http/middleware/websockets.json b/config/http/middleware/websockets.json new file mode 100644 index 0000000000..d1deec8a0f --- /dev/null +++ b/config/http/middleware/websockets.json @@ -0,0 +1,30 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "import": [ + "files-scs:config/http/middleware/handlers/constant-headers.json", + "files-scs:config/http/middleware/handlers/cors.json", + "files-scs:config/http/middleware/handlers/updates-via.json" + ], + "@graph": [ + { + "comment": "All of these will always be executed on any incoming request. These are mostly used for adding response headers.", + "@id": "urn:solid-server:default:Middleware", + "@type": "SequenceHandler", + "handlers": [ + { + "comment": "These handlers can be executed in any order.", + "@id": "urn:solid-server:default:ParallelMiddleware", + "@type": "ParallelHandler", + "handlers": [ + { "@id": "urn:solid-server:default:Middleware_Header" }, + { "@id": "urn:solid-server:default:Middleware_WebSocket" } + ] + }, + { + "comment": "CORS has to be last since it can close the connection.", + "@id": "urn:solid-server:default:Middleware_Cors" + } + ] + } + ] +} diff --git a/config/http/server-factory/no-websockets.json b/config/http/server-factory/no-websockets.json new file mode 100644 index 0000000000..8e39069b5e --- /dev/null +++ b/config/http/server-factory/no-websockets.json @@ -0,0 +1,13 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Creates a server that supports HTTP requests.", + "@id": "urn:solid-server:default:ServerFactory", + "@type": "BaseHttpServerFactory", + "handler": { + "@id": "urn:solid-server:default:HttpHandler" + } + } + ] +} diff --git a/config/http/server-factory/websockets.json b/config/http/server-factory/websockets.json new file mode 100644 index 0000000000..77788d940d --- /dev/null +++ b/config/http/server-factory/websockets.json @@ -0,0 +1,19 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Creates a server that supports both websocket and HTTP requests.", + "@id": "urn:solid-server:default:ServerFactory", + "@type": "WebSocketServerFactory", + "baseServerFactory": { + "@id": "urn:solid-server:default:HttpServerFactory", + "@type": "BaseHttpServerFactory", + "handler": { "@id": "urn:solid-server:default:HttpHandler" } + }, + "webSocketHandler": { + "@type": "UnsecureWebSocketsProtocol", + "source": { "@id": "urn:solid-server:default:ResourceStore" } + } + } + ] +} diff --git a/config/http/static/default.json b/config/http/static/default.json new file mode 100644 index 0000000000..d59aa9fb29 --- /dev/null +++ b/config/http/static/default.json @@ -0,0 +1,20 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Servers static files on fixed URLs.", + "@id": "urn:solid-server:default:StaticAssetHandler", + "@type": "StaticAssetHandler", + "assets": [ + { + "StaticAssetHandler:_assets_key": "/favicon.ico", + "StaticAssetHandler:_assets_value": "$PACKAGE_ROOT/templates/root/favicon.ico" + }, + { + "StaticAssetHandler:_assets_key": "/idp/style.css", + "StaticAssetHandler:_assets_value": "$PACKAGE_ROOT/templates/views/email-password-interaction/main.css" + } + ] + } + ] +} diff --git a/config/identity/README.md b/config/identity/README.md new file mode 100644 index 0000000000..40a6b9499d --- /dev/null +++ b/config/identity/README.md @@ -0,0 +1,14 @@ +# Identity +Options related to the Identity Provider. + +## Email +Necessary for sending e-mail when using IDP. +* *default*: Disables e-mail functionality. +* *example*: An example of what your e-mail configuration should look like. + In that case you should not import anything from this folder + but have the settings in your root config. + +## Handler +Contains everything needed for setting up the Identity Provider. +* *default*: As of writing there is not much customization possible. + This contains everything needed. diff --git a/config/presets/identity/email-sender.json b/config/identity/email/default.json similarity index 100% rename from config/presets/identity/email-sender.json rename to config/identity/email/default.json diff --git a/config/identity/email/example.json b/config/identity/email/example.json new file mode 100644 index 0000000000..53c9b1d63d --- /dev/null +++ b/config/identity/email/example.json @@ -0,0 +1,15 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "This is an example of what an actual email sender configuration would look like.", + "@id": "urn:solid-server:default:EmailSender", + "@type": "BaseEmailSender", + "args_senderName": "Solid Server", + "args_emailConfig_host": "smtp.example.email", + "args_emailConfig_port": 587, + "args_emailConfig_auth_user": "alice@example.email", + "args_emailConfig_auth_pass": "NYEaCsqV7aVStRCbmC" + } + ] +} diff --git a/config/identity/handler/adapter-factory/wrapped-fetch.json b/config/identity/handler/adapter-factory/wrapped-fetch.json new file mode 100644 index 0000000000..46823fc708 --- /dev/null +++ b/config/identity/handler/adapter-factory/wrapped-fetch.json @@ -0,0 +1,21 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "An adapter is responsible for storing all interaction metadata.", + "@id": "urn:solid-server:default:IdpAdapterFactory", + "@type": "WrappedFetchAdapterFactory", + "source": { + "@type": "ExpiringAdapterFactory", + "args_storageName": "/idp/oidc", + "args_storage": { "@id": "urn:solid-server:default:ExpiringIdpStorage" } + } + }, + { + "comment": "Stores expiring data. This class has a `finalize` function to call after stopping the server.", + "@id": "urn:solid-server:default:ExpiringIdpStorage", + "@type": "WrappedExpiringStorage", + "source": { "@id": "urn:solid-server:default:IdpStorage" } + } + ] +} diff --git a/config/identity/handler/default.json b/config/identity/handler/default.json new file mode 100644 index 0000000000..42ece09c90 --- /dev/null +++ b/config/identity/handler/default.json @@ -0,0 +1,27 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "import": [ + "files-scs:config/identity/handler/adapter-factory/wrapped-fetch.json", + "files-scs:config/identity/handler/interaction/handler.json", + "files-scs:config/identity/handler/key-value/resource-store.json", + "files-scs:config/identity/handler/provider-factory/identity.json" + ], + "@graph": [ + { + "comment": "Routes all IDP related requests to the relevant handlers.", + "@id": "urn:solid-server:default:IdentityProviderHandler", + "@type": "RouterHandler", + "allowedMethods": [ "GET", "POST", "PUT", "DELETE", "OPTIONS" ], + "allowedPathNames": [ "^/idp/.*", "^/\\.well-known/openid-configuration" ], + "handler": { "@id": "urn:solid-server:default:IdentityProviderHttpHandler" } + }, + { + "@id": "urn:solid-server:default:IdentityProviderHttpHandler", + "@type": "IdentityProviderHttpHandler", + "providerFactory": { "@id": "urn:solid-server:default:IdentityProviderFactory" }, + "interactionPolicy": { "@id": "urn:solid-server:auth:password:AccountInteractionPolicy" }, + "interactionHttpHandler": { "@id": "urn:solid-server:auth:password:InteractionHttpHandler" }, + "errorResponseWriter": { "@type": "ErrorResponseWriter" } + } + ] +} diff --git a/config/identity/handler/interaction/handler.json b/config/identity/handler/interaction/handler.json new file mode 100644 index 0000000000..ea15fc92b5 --- /dev/null +++ b/config/identity/handler/interaction/handler.json @@ -0,0 +1,51 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "import": [ + "files-scs:config/identity/handler/interaction/handlers/forgot-password.json", + "files-scs:config/identity/handler/interaction/handlers/initial.json", + "files-scs:config/identity/handler/interaction/handlers/login.json", + "files-scs:config/identity/handler/interaction/handlers/registration.json", + "files-scs:config/identity/handler/interaction/handlers/reset-password.json", + "files-scs:config/identity/handler/interaction/handlers/session.json" + ], + "@graph": [ + { + "comment": "Http handler to take care of all routing on for the email password interaction", + "@id": "urn:solid-server:auth:password:InteractionHttpHandler", + "@type": "WaterfallHandler", + "handlers": [ + { "@id": "urn:solid-server:auth:password:InitialInteractionHandler" }, + { "@id": "urn:solid-server:auth:password:RegistrationInteractionHandler" }, + { "@id": "urn:solid-server:auth:password:LoginInteractionHandler" }, + { "@id": "urn:solid-server:auth:password:SessionInteractionHandler" }, + { "@id": "urn:solid-server:auth:password:ForgotPasswordInteractionHandler" }, + { "@id": "urn:solid-server:auth:password:ResetPasswordViewInteractionHandler" }, + { "@id": "urn:solid-server:auth:password:ResetPasswordInteractionHandler" } + ] + }, + + { + "comment": "Below are extra classes used by the handlers." + }, + + { + "comment": "The storage adapter that persists usernames, passwords, etc.", + "@id": "urn:solid-server:auth:password:AccountStore", + "@type": "BaseAccountStore", + "args_storageName": "/idp/email-password-db", + "args_saltRounds": 10, + "args_storage": { "@id": "urn:solid-server:default:IdpStorage" } + }, + { + "comment": "Responsible for completing an OIDC interaction after login or registration", + "@id": "urn:solid-server:auth:password:InteractionCompleter", + "@type": "InteractionCompleter" + }, + { + "comment": "Sets up the email password interaction policy", + "@id": "urn:solid-server:auth:password:AccountInteractionPolicy", + "@type": "AccountInteractionPolicy", + "idpPath": "/idp" + } + ] +} diff --git a/config/identity/handler/interaction/handlers/forgot-password.json b/config/identity/handler/interaction/handlers/forgot-password.json new file mode 100644 index 0000000000..3517d7d9c9 --- /dev/null +++ b/config/identity/handler/interaction/handlers/forgot-password.json @@ -0,0 +1,40 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Handles all functionality on the forgot password page", + "@id": "urn:solid-server:auth:password:ForgotPasswordInteractionHandler", + "@type": "IdpRouteController", + "pathName": "^/idp/interaction/[-_A-Za-z0-9]+/forgotpassword/?$", + "postHandler": { + "@type": "ForgotPasswordHandler", + "args_messageRenderHandler": { "@id": "urn:solid-server:auth:password:EmailSentRenderHandler" }, + "args_accountStore": { "@id": "urn:solid-server:auth:password:AccountStore" }, + "args_baseUrl": { "@id": "urn:solid-server:default:variable:baseUrl" }, + "args_idpPath": "/idp", + "args_emailTemplateRenderer": { + "@type": "EjsTemplateRenderer", + "templatePath": { "@id": "urn:solid-server:default:variable:idpTemplateFolder" }, + "templateFile": "./email-password-interaction/resetPasswordEmail.ejs" + }, + "args_emailSender": { "@id": "urn:solid-server:default:EmailSender" } + }, + "renderHandler": { "@id": "urn:solid-server:auth:password:ForgotPasswordRenderHandler" } + }, + + { + "comment": "Renders the Email Sent message page", + "@id": "urn:solid-server:auth:password:EmailSentRenderHandler", + "@type": "RenderEjsHandler", + "templatePath": { "@id": "urn:solid-server:default:variable:idpTemplateFolder" }, + "templateFile": "./email-password-interaction/emailSent.ejs" + }, + { + "comment": "Renders the forgot password page", + "@id": "urn:solid-server:auth:password:ForgotPasswordRenderHandler", + "@type": "RenderEjsHandler", + "templatePath": { "@id": "urn:solid-server:default:variable:idpTemplateFolder" }, + "templateFile": "./email-password-interaction/forgotPassword.ejs" + } + ] +} diff --git a/config/identity/handler/interaction/handlers/initial.json b/config/identity/handler/interaction/handlers/initial.json new file mode 100644 index 0000000000..45734ebbfb --- /dev/null +++ b/config/identity/handler/interaction/handlers/initial.json @@ -0,0 +1,26 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Handles the initial route when the user is directed from their app to the IdP", + "@id": "urn:solid-server:auth:password:InitialInteractionHandler", + "@type": "RouterHandler", + "allowedMethods": [ "GET" ], + "allowedPathNames": [ "^/idp/interaction/[-_A-Za-z0-9]+/?$" ], + "handler": { + "@type": "InitialInteractionHandler", + "renderHandlerMap": [ + { + "InitialInteractionHandler:_renderHandlerMap_key": "consent", + "InitialInteractionHandler:_renderHandlerMap_value": { + "@type": "RenderEjsHandler", + "templatePath": { "@id": "urn:solid-server:default:variable:idpTemplateFolder" }, + "templateFile": "./email-password-interaction/confirm.ejs" + } + } + ], + "renderHandlerMap_default": { "@id": "urn:solid-server:auth:password:LoginRenderHandler" } + } + } + ] +} diff --git a/config/identity/handler/interaction/handlers/login.json b/config/identity/handler/interaction/handlers/login.json new file mode 100644 index 0000000000..4551f54066 --- /dev/null +++ b/config/identity/handler/interaction/handlers/login.json @@ -0,0 +1,25 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Handles all functionality on the Login Page", + "@id": "urn:solid-server:auth:password:LoginInteractionHandler", + "@type": "IdpRouteController", + "pathName": "^/idp/interaction/[-_A-Za-z0-9]+/login/?$", + "postHandler": { + "@type": "LoginHandler", + "args_accountStore": { "@id": "urn:solid-server:auth:password:AccountStore" }, + "args_interactionCompleter": { "@id": "urn:solid-server:auth:password:InteractionCompleter" } + }, + "renderHandler": { "@id": "urn:solid-server:auth:password:LoginRenderHandler" } + }, + + { + "comment": "Renders the login page", + "@id": "urn:solid-server:auth:password:LoginRenderHandler", + "@type": "RenderEjsHandler", + "templatePath": { "@id": "urn:solid-server:default:variable:idpTemplateFolder" }, + "templateFile": "./email-password-interaction/login.ejs" + } + ] +} diff --git a/config/identity/handler/interaction/handlers/registration.json b/config/identity/handler/interaction/handlers/registration.json new file mode 100644 index 0000000000..efc20d8a77 --- /dev/null +++ b/config/identity/handler/interaction/handlers/registration.json @@ -0,0 +1,29 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Handles all functionality on the register page", + "@id": "urn:solid-server:auth:password:RegistrationInteractionHandler", + "@type": "IdpRouteController", + "pathName": "^/idp/interaction/[-_A-Za-z0-9]+/register/?$", + "postHandler": { + "@type": "RegistrationHandler", + "args_ownershipValidator": { + "@type": "IssuerOwnershipValidator", + "issuer": { "@id": "urn:solid-server:default:variable:baseUrl" } + }, + "args_accountStore": { "@id": "urn:solid-server:auth:password:AccountStore" }, + "args_interactionCompleter": { "@id": "urn:solid-server:auth:password:InteractionCompleter" } + }, + "renderHandler": { "@id": "urn:solid-server:auth:password:RegisterRenderHandler" } + }, + + { + "comment": "Renders the register page", + "@id": "urn:solid-server:auth:password:RegisterRenderHandler", + "@type": "RenderEjsHandler", + "templatePath": { "@id": "urn:solid-server:default:variable:idpTemplateFolder" }, + "templateFile": "./email-password-interaction/register.ejs" + } + ] +} diff --git a/config/identity/handler/interaction/handlers/reset-password.json b/config/identity/handler/interaction/handlers/reset-password.json new file mode 100644 index 0000000000..15e6edaffe --- /dev/null +++ b/config/identity/handler/interaction/handlers/reset-password.json @@ -0,0 +1,45 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "comment": "Exports 2 handlers: one for viewing the page and one for doing the reset.", + "@graph": [ + { + "comment": "Renders the reset password page", + "@id": "urn:solid-server:auth:password:ResetPasswordViewInteractionHandler", + "@type": "RouterHandler", + "allowedMethods": [ "GET" ], + "allowedPathNames": [ "^/idp/resetpassword/?$" ], + "handler": { + "@type": "ResetPasswordViewHandler", + "renderHandler": { "@id": "urn:solid-server:auth:password:ResetPasswordRenderHandler" } + } + }, + { + "comment": "Handles the reset password page submission", + "@id": "urn:solid-server:auth:password:ResetPasswordInteractionHandler", + "@type": "RouterHandler", + "allowedMethods": [ "POST" ], + "allowedPathNames": [ "^/idp/resetpassword/?$" ], + "handler": { + "@type": "ResetPasswordHandler", + "args_accountStore": { "@id": "urn:solid-server:auth:password:AccountStore" }, + "args_renderHandler": { "@id": "urn:solid-server:auth:password:ResetPasswordRenderHandler" }, + "args_messageRenderHandler": { "@id": "urn:solid-server:auth:password:MessageRenderHandler" } + } + }, + + { + "comment": "Renders the reset password page", + "@id": "urn:solid-server:auth:password:ResetPasswordRenderHandler", + "@type": "RenderEjsHandler", + "templatePath": { "@id": "urn:solid-server:default:variable:idpTemplateFolder" }, + "templateFile": "./email-password-interaction/resetPassword.ejs" + }, + { + "comment": "Renders a generic page that says a message", + "@id": "urn:solid-server:auth:password:MessageRenderHandler", + "@type": "RenderEjsHandler", + "templatePath": { "@id": "urn:solid-server:default:variable:idpTemplateFolder" }, + "templateFile": "./email-password-interaction/message.ejs" + } + ] +} diff --git a/config/identity/handler/interaction/handlers/session.json b/config/identity/handler/interaction/handlers/session.json new file mode 100644 index 0000000000..76c7088953 --- /dev/null +++ b/config/identity/handler/interaction/handlers/session.json @@ -0,0 +1,16 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Handles confirm requests", + "@id": "urn:solid-server:auth:password:SessionInteractionHandler", + "@type": "RouterHandler", + "allowedMethods": [ "POST" ], + "allowedPathNames": [ "^/idp/interaction/[-_A-Za-z0-9]+/confirm/?$" ], + "handler": { + "@type": "SessionHttpHandler", + "interactionCompleter": { "@id": "urn:solid-server:auth:password:InteractionCompleter" } + } + } + ] +} diff --git a/config/identity/handler/key-value/resource-store.json b/config/identity/handler/key-value/resource-store.json new file mode 100644 index 0000000000..435b4db1a8 --- /dev/null +++ b/config/identity/handler/key-value/resource-store.json @@ -0,0 +1,13 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "This storage specifically uses the same path as the IDP routing, thereby guaranteeing outside access is impossible.", + "@id": "urn:solid-server:default:IdpStorage", + "@type": "JsonResourceStorage", + "source": { "@id": "urn:solid-server:default:ResourceStore" }, + "baseUrl": { "@id": "urn:solid-server:default:variable:baseUrl" }, + "container": "/idp/data/" + } + ] +} diff --git a/config/identity/handler/provider-factory/identity.json b/config/identity/handler/provider-factory/identity.json new file mode 100644 index 0000000000..1f021941aa --- /dev/null +++ b/config/identity/handler/provider-factory/identity.json @@ -0,0 +1,22 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Sets all the relevant oidc parameters.", + "@id": "urn:solid-server:default:IdentityProviderFactory", + "@type": "IdentityProviderFactory", + "issuer": { "@id": "urn:solid-server:default:variable:baseUrl" }, + "configurationFactory": { "@id": "urn:solid-server:default:IdpConfigurationFactory" }, + "errorResponseWriter": { "@type": "ErrorResponseWriter" } + }, + { + "comment": "Sets up the JWKS and cookie keys.", + "@id": "urn:solid-server:default:IdpConfigurationFactory", + "@type": "KeyConfigurationFactory", + "adapterFactory": { "@id": "urn:solid-server:default:IdpAdapterFactory" }, + "baseUrl": { "@id": "urn:solid-server:default:variable:baseUrl" }, + "idpPath": "/idp", + "storage": { "@id": "urn:solid-server:default:IdpStorage" } + } + ] +} diff --git a/config/init/README.md b/config/init/README.md new file mode 100644 index 0000000000..c2d35e3f9e --- /dev/null +++ b/config/init/README.md @@ -0,0 +1,9 @@ +# Init +Options related to the server initialization. +This is the entry point to the main server setup. + +## Handler +Contains a list of initializer that need to be run when starting the server. +For example, when acl authorization is used, +an initializer will be added that makes sure there is an acl file in the root. +* *default*: The default setup that makes sure the root container is marked as pim:storage. diff --git a/config/init/handler/base/init.json b/config/init/handler/base/init.json new file mode 100644 index 0000000000..95a710be1f --- /dev/null +++ b/config/init/handler/base/init.json @@ -0,0 +1,19 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "import": [ + "files-scs:config/init/handler/initializers/logger.json", + "files-scs:config/init/handler/initializers/server.json" + ], + "@graph": [ + { + "comment": "These initializers will be all be executed sequentially when starting the server.", + "@id": "urn:solid-server:default:Initializer", + "@type": "SequenceHandler", + "handlers": [ + { "@id": "urn:solid-server:default:LoggerInitializer" }, + { "@id": "urn:solid-server:default:ParallelInitializer" }, + { "@id": "urn:solid-server:default:ServerInitializer" } + ] + } + ] +} diff --git a/config/init/handler/default.json b/config/init/handler/default.json new file mode 100644 index 0000000000..96ba030bd7 --- /dev/null +++ b/config/init/handler/default.json @@ -0,0 +1,17 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "import": [ + "files-scs:config/init/handler/base/init.json", + "files-scs:config/init/handler/initializers/root-container.json" + ], + "@graph": [ + { + "comment": "These handlers are called whenever the server is started, and can be used to ensure that all necessary resources for booting are available.", + "@id": "urn:solid-server:default:ParallelInitializer", + "@type": "ParallelHandler", + "handlers": [ + { "@id": "urn:solid-server:default:RootContainerInitializer" } + ] + } + ] +} diff --git a/config/init/handler/initializers/logger.json b/config/init/handler/initializers/logger.json new file mode 100644 index 0000000000..ed0a3ef855 --- /dev/null +++ b/config/init/handler/initializers/logger.json @@ -0,0 +1,16 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": [ + "Sets up the global logging factory which is necessary for logging.", + "This needs to happen before any other activity takes places, since all other components depend on logging." + ], + "@id": "urn:solid-server:default:LoggerInitializer", + "@type": "LoggerInitializer", + "loggerFactory": { + "@id": "urn:solid-server:default:LoggerFactory" + } + } + ] +} diff --git a/config/init/handler/initializers/root-container.json b/config/init/handler/initializers/root-container.json new file mode 100644 index 0000000000..af8b6c85bf --- /dev/null +++ b/config/init/handler/initializers/root-container.json @@ -0,0 +1,12 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Makes sure the root container exists and marks it as pim:Storage.", + "@id": "urn:solid-server:default:RootContainerInitializer", + "@type": "RootContainerInitializer", + "settings_store": { "@id": "urn:solid-server:default:ResourceStore" }, + "settings_baseUrl": { "@id": "urn:solid-server:default:variable:baseUrl" } + } + ] +} diff --git a/config/init/handler/initializers/server.json b/config/init/handler/initializers/server.json new file mode 100644 index 0000000000..04cfb99c7c --- /dev/null +++ b/config/init/handler/initializers/server.json @@ -0,0 +1,12 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Creates the server that starts listening for requests.", + "@id": "urn:solid-server:default:ServerInitializer", + "@type": "ServerInitializer", + "serverFactory": { "@id": "urn:solid-server:default:ServerFactory" }, + "port": { "@id": "urn:solid-server:default:variable:port" } + } + ] +} diff --git a/config/ldp/README.md b/config/ldp/README.md new file mode 100644 index 0000000000..561fca8608 --- /dev/null +++ b/config/ldp/README.md @@ -0,0 +1,34 @@ +# LDP +Options related to the Linked Data Platform implementation. +This is the core part of the Solid server. + +## Authentication +Covers how agents are identified. +* *debug-auth-header*: Allows authentication headers such as `WebID http://test.com/card#me` + to identify as that WebID without further checks. +* *debug-test-agent*: Always assumes the agent is the set identifier. +* *dpop-bearer*: Uses the default DPoP and Bearer identification. + +## Authorization +Covers how operations are authorized (or rejected). +* *allow-everything*: No authorization, everything is allowed. +* *webacl*: Use the default Web Access Control. + +## Handler +Contains the default LDP handler that will handle most requests. +* *default*: The default setup. + Some identifiers seen here are defined by the other options found in this document. + +## Metadata-Parser +Contains a list of parsers that will be run on incoming requests to generate metadata. +* *default*: Contains the default parsers. Can be added to when specific parsers are required. + +## Metadata-Writer +Contains a list of metadata writers that will be run on outgoing responses. +* *default*: Contains the default writers. Can be added to when specific parsers are required. + +## Permissions +Determines which permissions are needed for requests, +by default this is based on the used HTTP method. +* *acl*: The default setup with specific support for accessing .acl documents. +* *no-acl*: Same as above but interprets .acl documents as any other document. diff --git a/config/ldp/authentication/debug-auth-header.json b/config/ldp/authentication/debug-auth-header.json new file mode 100644 index 0000000000..0ab9ec700e --- /dev/null +++ b/config/ldp/authentication/debug-auth-header.json @@ -0,0 +1,17 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": [ + "DO NOT USE IN PRODUCTION, ONLY FOR DEVELOPMENT, TESTING, OR DEBUGGING.", + "Supports authentication headers such as `Authentication: WebID http://test.com/card#me`" + ], + "@id": "urn:solid-server:default:CredentialsExtractor", + "@type": "WaterfallHandler", + "handlers": [ + { "@type": "UnsecureWebIdExtractor" }, + { "@type": "EmptyCredentialsExtractor" } + ] + } + ] +} diff --git a/config/ldp/authentication/debug-test-agent.json b/config/ldp/authentication/debug-test-agent.json new file mode 100644 index 0000000000..4daaed2b3b --- /dev/null +++ b/config/ldp/authentication/debug-test-agent.json @@ -0,0 +1,14 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": [ + "DO NOT USE IN PRODUCTION, ONLY FOR DEVELOPMENT, TESTING, OR DEBUGGING.", + "This extractor always sets the credentials to the fixed value." + ], + "@id": "urn:solid-server:default:CredentialsExtractor", + "@type": "UnsecureConstantCredentialsExtractor", + "agent": "http://test.com/card#me" + } + ] +} diff --git a/config/presets/ldp/credentials-extractor.json b/config/ldp/authentication/dpop-bearer.json similarity index 71% rename from config/presets/ldp/credentials-extractor.json rename to config/ldp/authentication/dpop-bearer.json index 016eea1901..9b79e406c0 100644 --- a/config/presets/ldp/credentials-extractor.json +++ b/config/ldp/authentication/dpop-bearer.json @@ -2,6 +2,7 @@ "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", "@graph": [ { + "comment": "Supports DPoP and Bearer access tokens, or no credentials.", "@id": "urn:solid-server:default:CredentialsExtractor", "@type": "WaterfallHandler", "handlers": [ @@ -11,12 +12,8 @@ "@type": "OriginalUrlExtractor" } }, - { - "@type": "BearerWebIdExtractor" - }, - { - "@type": "EmptyCredentialsExtractor" - } + { "@type": "BearerWebIdExtractor" }, + { "@type": "EmptyCredentialsExtractor" } ] } ] diff --git a/config/ldp/authorization/allow-everything.json b/config/ldp/authorization/allow-everything.json new file mode 100644 index 0000000000..588dd3bc7e --- /dev/null +++ b/config/ldp/authorization/allow-everything.json @@ -0,0 +1,13 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": [ + "DO NOT USE IN PRODUCTION, ONLY FOR DEVELOPMENT, TESTING, OR DEBUGGING.", + "Always allows all operations." + ], + "@id": "urn:solid-server:default:Authorizer", + "@type": "AllowEverythingAuthorizer" + } + ] +} diff --git a/config/ldp/authorization/authorizers/acl.json b/config/ldp/authorization/authorizers/acl.json new file mode 100644 index 0000000000..89fc89510f --- /dev/null +++ b/config/ldp/authorization/authorizers/acl.json @@ -0,0 +1,18 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "@id": "urn:solid-server:default:WebAclAuthorizer", + "@type": "WebAclAuthorizer", + "aclStrategy": { + "@id": "urn:solid-server:default:AclStrategy" + }, + "resourceStore": { + "@id": "urn:solid-server:default:ResourceStore" + }, + "identifierStrategy": { + "@id": "urn:solid-server:default:IdentifierStrategy" + } + } + ] +} diff --git a/config/ldp/authorization/webacl.json b/config/ldp/authorization/webacl.json new file mode 100644 index 0000000000..9d435147a4 --- /dev/null +++ b/config/ldp/authorization/webacl.json @@ -0,0 +1,36 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "import": [ + "files-scs:config/ldp/authorization/authorizers/acl.json" + ], + "@graph": [ + { + "comment": "Uses Web Access Control for authorization.", + "@id": "urn:solid-server:default:Authorizer", + "@type": "WaterfallHandler", + "handlers": [ + { + "comment": "This authorizer makes sure that for auxiliary resources, the main authorizer gets called with the associated identifier.", + "@type": "AuxiliaryAuthorizer", + "resourceAuthorizer": { "@id": "urn:solid-server:default:WebAclAuthorizer" }, + "auxStrategy": { "@id": "urn:solid-server:default:AuxiliaryStrategy" } + }, + { "@id": "urn:solid-server:default:WebAclAuthorizer" } + ] + }, + + { + "comment": "Add to the list of initializers.", + "@id": "urn:solid-server:default:ParallelInitializer", + "ParallelHandler:_handlers": [ + { + "comment": "Makes sure there is a root acl document. This is necessary for acl authorization.", + "@type": "AclInitializer", + "settings_store": { "@id": "urn:solid-server:default:ResourceStore" }, + "settings_aclStrategy": { "@id": "urn:solid-server:default:AclStrategy" }, + "settings_baseUrl": { "@id": "urn:solid-server:default:variable:baseUrl" } + } + ] + } + ] +} diff --git a/config/presets/ldp/operation-handler.json b/config/ldp/handler/components/operation-handler.json similarity index 54% rename from config/presets/ldp/operation-handler.json rename to config/ldp/handler/components/operation-handler.json index b6c261e913..503503a959 100644 --- a/config/presets/ldp/operation-handler.json +++ b/config/ldp/handler/components/operation-handler.json @@ -6,40 +6,28 @@ "@type": "WaterfallHandler", "handlers": [ { - "@type": "DeleteOperationHandler", - "store": { - "@id": "urn:solid-server:default:ResourceStore" - } + "@type": "GetOperationHandler", + "store": { "@id": "urn:solid-server:default:ResourceStore" } }, { - "@type": "GetOperationHandler", - "store": { - "@id": "urn:solid-server:default:ResourceStore" - } + "@type": "PostOperationHandler", + "store": { "@id": "urn:solid-server:default:ResourceStore" } }, { - "@type": "HeadOperationHandler", - "store": { - "@id": "urn:solid-server:default:ResourceStore" - } + "@type": "PutOperationHandler", + "store": { "@id": "urn:solid-server:default:ResourceStore" } }, { - "@type": "PatchOperationHandler", - "store": { - "@id": "urn:solid-server:default:ResourceStore" - } + "@type": "DeleteOperationHandler", + "store": { "@id": "urn:solid-server:default:ResourceStore" } }, { - "@type": "PostOperationHandler", - "store": { - "@id": "urn:solid-server:default:ResourceStore" - } + "@type": "HeadOperationHandler", + "store": { "@id": "urn:solid-server:default:ResourceStore" } }, { - "@type": "PutOperationHandler", - "store": { - "@id": "urn:solid-server:default:ResourceStore" - } + "@type": "PatchOperationHandler", + "store": { "@id": "urn:solid-server:default:ResourceStore" } } ] } diff --git a/config/ldp/handler/components/request-parser.json b/config/ldp/handler/components/request-parser.json new file mode 100644 index 0000000000..735e0e8b4f --- /dev/null +++ b/config/ldp/handler/components/request-parser.json @@ -0,0 +1,23 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Handles everything related to parsing a Request.", + "@id": "urn:solid-server:default:RequestParser", + "@type": "BasicRequestParser", + "args_targetExtractor": { + "@type": "OriginalUrlExtractor", + "options_includeQueryString": false + }, + "args_preferenceParser": { "@type": "AcceptPreferenceParser" }, + "args_metadataParser": { "@id": "urn:solid-server:default:MetadataParser" }, + "args_bodyParser": { + "@type": "WaterfallHandler", + "handlers": [ + { "@type": "SparqlUpdateBodyParser" }, + { "@type": "RawBodyParser" } + ] + } + } + ] +} diff --git a/config/ldp/handler/components/response-writer.json b/config/ldp/handler/components/response-writer.json new file mode 100644 index 0000000000..d0fa526de2 --- /dev/null +++ b/config/ldp/handler/components/response-writer.json @@ -0,0 +1,17 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Writes the result to the response stream.", + "@id": "urn:solid-server:default:ResponseWriter", + "@type": "WaterfallHandler", + "handlers": [ + { "@type": "ErrorResponseWriter" }, + { + "@type": "BasicResponseWriter", + "metadataWriter": { "@id": "urn:solid-server:default:MetadataWriter" } + } + ] + } + ] +} diff --git a/config/ldp/handler/default.json b/config/ldp/handler/default.json new file mode 100644 index 0000000000..7411c5a126 --- /dev/null +++ b/config/ldp/handler/default.json @@ -0,0 +1,21 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "import": [ + "files-scs:config/ldp/handler/components/operation-handler.json", + "files-scs:config/ldp/handler/components/request-parser.json", + "files-scs:config/ldp/handler/components/response-writer.json" + ], + "@graph": [ + { + "comment": "The main entry point into the main Solid behaviour.", + "@id": "urn:solid-server:default:LdpHandler", + "@type": "AuthenticatedLdpHandler", + "args_requestParser": { "@id": "urn:solid-server:default:RequestParser" }, + "args_credentialsExtractor": { "@id": "urn:solid-server:default:CredentialsExtractor" }, + "args_permissionsExtractor": { "@id": "urn:solid-server:default:PermissionsExtractor" }, + "args_authorizer": { "@id": "urn:solid-server:default:Authorizer" }, + "args_operationHandler": { "@id": "urn:solid-server:default:OperationHandler" }, + "args_responseWriter": { "@id": "urn:solid-server:default:ResponseWriter" } + } + ] +} diff --git a/config/presets/ldp/metadata-handler.json b/config/ldp/metadata-parser/default.json similarity index 58% rename from config/presets/ldp/metadata-handler.json rename to config/ldp/metadata-parser/default.json index 1cecf833f8..503b1724e9 100644 --- a/config/presets/ldp/metadata-handler.json +++ b/config/ldp/metadata-parser/default.json @@ -2,18 +2,13 @@ "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", "@graph": [ { + "comment": "Converts request metadata (e.g. headers) to RDF metadata.", "@id": "urn:solid-server:default:MetadataParser", "@type": "ParallelHandler", "handlers": [ - { - "@type": "ContentTypeParser" - }, - { - "@type": "LinkTypeParser" - }, - { - "@type": "SlugParser" - } + { "@type": "ContentTypeParser" }, + { "@type": "LinkTypeParser" }, + { "@type": "SlugParser" } ] } ] diff --git a/config/ldp/metadata-writer/default.json b/config/ldp/metadata-writer/default.json new file mode 100644 index 0000000000..93a1be7251 --- /dev/null +++ b/config/ldp/metadata-writer/default.json @@ -0,0 +1,22 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "import": [ + "files-scs:config/ldp/metadata-writer/writers/constant.json", + "files-scs:config/ldp/metadata-writer/writers/link-rel.json", + "files-scs:config/ldp/metadata-writer/writers/mapped.json", + "files-scs:config/ldp/metadata-writer/writers/wac-allow.json" + ], + "@graph": [ + { + "comment": "Adds metadata to the response based on the RDF metadata.", + "@id": "urn:solid-server:default:MetadataWriter", + "@type": "ParallelHandler", + "handlers": [ + { "@id": "urn:solid-server:default:MetadataWriter_Constant" }, + { "@id": "urn:solid-server:default:MetadataWriter_Mapped" }, + { "@id": "urn:solid-server:default:MetadataWriter_LinkRel" }, + { "@id": "urn:solid-server:default:MetadataWriter_WacAllow" } + ] + } + ] +} diff --git a/config/ldp/metadata-writer/writers/constant.json b/config/ldp/metadata-writer/writers/constant.json new file mode 100644 index 0000000000..02e737a300 --- /dev/null +++ b/config/ldp/metadata-writer/writers/constant.json @@ -0,0 +1,20 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Adds fixed headers to the response.", + "@id": "urn:solid-server:default:MetadataWriter_Constant", + "@type": "ConstantMetadataWriter", + "headers": [ + { + "ConstantMetadataWriter:_headers_key": "Accept-Patch", + "ConstantMetadataWriter:_headers_value": "application/sparql-update" + }, + { + "ConstantMetadataWriter:_headers_key": "MS-Author-Via", + "ConstantMetadataWriter:_headers_value": "SPARQL" + } + ] + } + ] +} diff --git a/config/ldp/metadata-writer/writers/link-rel.json b/config/ldp/metadata-writer/writers/link-rel.json new file mode 100644 index 0000000000..669cddcc96 --- /dev/null +++ b/config/ldp/metadata-writer/writers/link-rel.json @@ -0,0 +1,20 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Converts all triples with the given predicates to Link headers.", + "@id": "urn:solid-server:default:MetadataWriter_LinkRel", + "@type": "LinkRelMetadataWriter", + "linkRelMap": [ + { + "LinkRelMetadataWriter:_linkRelMap_key": "http://www.w3.org/1999/02/22-rdf-syntax-ns#type", + "LinkRelMetadataWriter:_linkRelMap_value": "type" + }, + { + "LinkRelMetadataWriter:_linkRelMap_key": "http://www.w3.org/ns/auth/acl#accessControl", + "LinkRelMetadataWriter:_linkRelMap_value": "acl" + } + ] + } + ] +} diff --git a/config/ldp/metadata-writer/writers/mapped.json b/config/ldp/metadata-writer/writers/mapped.json new file mode 100644 index 0000000000..ea6ef7e510 --- /dev/null +++ b/config/ldp/metadata-writer/writers/mapped.json @@ -0,0 +1,20 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Converts all triples with the given predicate to headers of the given type.", + "@id": "urn:solid-server:default:MetadataWriter_Mapped", + "@type": "MappedMetadataWriter", + "headerMap": [ + { + "MappedMetadataWriter:_headerMap_key": "http://www.w3.org/ns/ma-ont#format", + "MappedMetadataWriter:_headerMap_value": "Content-Type" + }, + { + "MappedMetadataWriter:_headerMap_key": "urn:solid:http:location", + "MappedMetadataWriter:_headerMap_value": "Location" + } + ] + } + ] +} diff --git a/config/ldp/metadata-writer/writers/wac-allow.json b/config/ldp/metadata-writer/writers/wac-allow.json new file mode 100644 index 0000000000..a612d1398c --- /dev/null +++ b/config/ldp/metadata-writer/writers/wac-allow.json @@ -0,0 +1,10 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Adds the correct Wac-Allow header.", + "@id": "urn:solid-server:default:MetadataWriter_WacAllow", + "@type": "WacAllowMetadataWriter" + } + ] +} diff --git a/config/presets/ldp/permissions-extractor.json b/config/ldp/permissions/acl.json similarity index 58% rename from config/presets/ldp/permissions-extractor.json rename to config/ldp/permissions/acl.json index 647b9f3598..d2b8f7ed9f 100644 --- a/config/presets/ldp/permissions-extractor.json +++ b/config/ldp/permissions/acl.json @@ -2,21 +2,16 @@ "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", "@graph": [ { + "comment": "Makes sure acl files require control permissions.", "@id": "urn:solid-server:default:PermissionsExtractor", "@type": "WaterfallHandler", "handlers": [ { "@type": "AclPermissionsExtractor", - "aclStrategy": { - "@id": "urn:solid-server:default:AclIdentifierStrategy" - } + "aclStrategy": { "@id": "urn:solid-server:default:AclStrategy" } }, - { - "@type": "MethodPermissionsExtractor" - }, - { - "@type": "SparqlPatchPermissionsExtractor" - } + { "@type": "MethodPermissionsExtractor" }, + { "@type": "SparqlPatchPermissionsExtractor" } ] } ] diff --git a/config/ldp/permissions/no-acl.json b/config/ldp/permissions/no-acl.json new file mode 100644 index 0000000000..9fe84eb4f4 --- /dev/null +++ b/config/ldp/permissions/no-acl.json @@ -0,0 +1,14 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Extracts the required permissions based on the HTTP method.", + "@id": "urn:solid-server:default:PermissionsExtractor", + "@type": "WaterfallHandler", + "handlers": [ + { "@type": "MethodPermissionsExtractor" }, + { "@type": "SparqlPatchPermissionsExtractor" } + ] + } + ] +} diff --git a/config/memory-subdomains.json b/config/memory-subdomains.json new file mode 100644 index 0000000000..108855c726 --- /dev/null +++ b/config/memory-subdomains.json @@ -0,0 +1,33 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "import": [ + "files-scs:config/http/handler/default.json", + "files-scs:config/http/middleware/websockets.json", + "files-scs:config/http/server-factory/websockets.json", + "files-scs:config/http/static/default.json", + "files-scs:config/identity/handler/default.json", + "files-scs:config/identity/email/default.json", + "files-scs:config/init/handler/default.json", + "files-scs:config/ldp/authentication/dpop-bearer.json", + "files-scs:config/ldp/authorization/webacl.json", + "files-scs:config/ldp/handler/default.json", + "files-scs:config/ldp/metadata-parser/default.json", + "files-scs:config/ldp/metadata-writer/default.json", + "files-scs:config/ldp/permissions/acl.json", + "files-scs:config/pod/handler/static.json", + "files-scs:config/storage/key-value/memory.json", + "files-scs:config/storage/resource-store/memory.json", + "files-scs:config/util/auxiliary/acl.json", + "files-scs:config/util/identifiers/subdomain.json", + "files-scs:config/util/index/default.json", + "files-scs:config/util/logging/winston.json", + "files-scs:config/util/representation-conversion/default.json", + "files-scs:config/util/resource-locker/memory.json", + "files-scs:config/util/variables/default.json" + ], + "@graph": [ + { + "comment": "A single-pod server that stores its resources in memory with support for subdomain identifiers." + } + ] +} diff --git a/config/path-routing.json b/config/path-routing.json new file mode 100644 index 0000000000..4a0320c7f6 --- /dev/null +++ b/config/path-routing.json @@ -0,0 +1,36 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "import": [ + "files-scs:config/http/handler/default.json", + "files-scs:config/http/middleware/websockets.json", + "files-scs:config/http/server-factory/websockets.json", + "files-scs:config/http/static/default.json", + "files-scs:config/identity/handler/default.json", + "files-scs:config/identity/email/default.json", + "files-scs:config/init/handler/default.json", + "files-scs:config/ldp/authentication/dpop-bearer.json", + "files-scs:config/ldp/authorization/webacl.json", + "files-scs:config/ldp/handler/default.json", + "files-scs:config/ldp/metadata-parser/default.json", + "files-scs:config/ldp/metadata-writer/default.json", + "files-scs:config/ldp/permissions/acl.json", + "files-scs:config/pod/handler/static.json", + "files-scs:config/storage/key-value/memory.json", + "files-scs:config/storage/resource-store/regex.json", + "files-scs:config/util/auxiliary/acl.json", + "files-scs:config/util/identifiers/suffix.json", + "files-scs:config/util/index/default.json", + "files-scs:config/util/logging/winston.json", + "files-scs:config/util/representation-conversion/default.json", + "files-scs:config/util/resource-locker/memory.json", + "files-scs:config/util/variables/default.json" + ], + "@graph": [ + { + "comment": [ + "A server with dynamic routing: all /file/* requests go to the file store, /memory/* to the memory store and /sparql/* to the sparql endpoint store.", + "The root .acl file will be stored in the sparql endpoint store." + ] + } + ] +} diff --git a/config/pod/README.md b/config/pod/README.md new file mode 100644 index 0000000000..381c8e5b3d --- /dev/null +++ b/config/pod/README.md @@ -0,0 +1,9 @@ +# Pod +Options related to pod provisioning. + +## Handler +What to use for pod creation. This covers several features +and is a bit more extensive than many other options. +* *dynamic*: Every created pod has its own components.js config for its ResourceStore, + which can differ from the others. +* *static*: All pod data is stored in separate containers in the same ResourceStore. diff --git a/config/pod/handler/dynamic.json b/config/pod/handler/dynamic.json new file mode 100644 index 0000000000..e87108e970 --- /dev/null +++ b/config/pod/handler/dynamic.json @@ -0,0 +1,59 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "import": [ + "files-scs:config/pod/handler/http/manager.json", + "files-scs:config/pod/handler/pod-generators/templated.json", + "files-scs:config/pod/handler/resource-generators/templated.json" + ], + "comment": "Besides the PodManager, also exports a RouterRule that will need to be added to a RoutingStore.", + "@graph": [ + { + "comment": "Generates pods based on config templates and stores the results in the correct places", + "@id": "urn:solid-server:default:PodManager", + "@type": "ConfigPodManager", + "idGenerator": { "@id": "urn:solid-server:default:IdentifierGenerator" }, + "podGenerator": { "@id": "urn:solid-server:default:PodGenerator" }, + "routingStorage": { "@id": "urn:solid-server:default:PodRoutingStorage" }, + "resourcesGenerator": { "@id": "urn:solid-server:default:ResourcesGenerator" } + }, + + { + "comment": "Router rule responsible for handling dynamic pod routing. Needs to be used by RoutingResourceStore.", + "@id": "urn:solid-server:default:RouterRule", + "@type": "BaseUrlRouterRule", + "stores": { "@id": "urn:solid-server:default:PodRoutingStorage" } + }, + + { + "comment": "Add to the list of initializers.", + "@id": "urn:solid-server:default:ParallelInitializer", + "ParallelHandler:_handlers": [ + { + "comment": "Initializer that instantiates all the dynamic pods.", + "@type": "ConfigPodInitializer", + "storeFactory": { "@type": "BaseComponentsJsFactory" }, + "configStorage": { "@id": "urn:solid-server:default:PodConfigurationStorage" }, + "routingStorage": { "@id": "urn:solid-server:default:PodRoutingStorage" } + } + ] + }, + + { + "comment": "Everything below is used for storing pod settings." + }, + + { + "comment": "This is where the pod configurations will be stored.", + "@id": "urn:solid-server:default:PodConfigurationStorage", + "@type": "JsonFileStorage", + "filePath": { "@id": "urn:solid-server:default:variable:podConfigJson" }, + "locker": { "@id": "urn:solid-server:default:ResourceLocker" } + }, + + { + "comment": "This is where instantiated pods will be stored.", + "@id": "urn:solid-server:default:PodRoutingStorage", + "@type": "MemoryMapStorage" + } + ] +} diff --git a/config/pod/handler/http/manager.json b/config/pod/handler/http/manager.json new file mode 100644 index 0000000000..e5db2e1ff9 --- /dev/null +++ b/config/pod/handler/http/manager.json @@ -0,0 +1,15 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "The main entry point into pod provisioning.", + "@id": "urn:solid-server:default:PodManagerHandler", + "@type": "PodManagerHttpHandler", + "args_requestPath": "/pods", + "args_requestParser": { "@id": "urn:solid-server:default:RequestParser" }, + "args_podSettingsParser": { "@type": "PodSettingsJsonParser" }, + "args_manager": { "@id": "urn:solid-server:default:PodManager" }, + "args_responseWriter": { "@id": "urn:solid-server:default:ResponseWriter" } + } + ] +} diff --git a/config/pod/handler/pod-generators/templated.json b/config/pod/handler/pod-generators/templated.json new file mode 100644 index 0000000000..33ed6a46c3 --- /dev/null +++ b/config/pod/handler/pod-generators/templated.json @@ -0,0 +1,22 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Generates ResourceStores that correspond to new pods.", + "@id": "urn:solid-server:default:PodGenerator", + "@type": "TemplatedPodGenerator", + "storeFactory": { "@type": "BaseComponentsJsFactory" }, + "variableHandler": { + "@type": "ParallelHandler", + "handlers": [ + { "@type": "BaseUrlHandler" }, + { + "@type": "RootFilePathHandler", + "fileMapper": { "@id": "urn:solid-server:default:FileIdentifierMapper" } + } + ] + }, + "configStorage": { "@id": "urn:solid-server:default:PodConfigurationStorage" } + } + ] +} diff --git a/config/pod/handler/resource-generators/templated.json b/config/pod/handler/resource-generators/templated.json new file mode 100644 index 0000000000..fcae057983 --- /dev/null +++ b/config/pod/handler/resource-generators/templated.json @@ -0,0 +1,17 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Generates resources based on the templates stored in the template folder.", + "@id": "urn:solid-server:default:ResourcesGenerator", + "@type": "TemplatedResourcesGenerator", + "templateFolder": "$PACKAGE_ROOT/templates/pod", + "factory": { + "@type": "ExtensionBasedMapperFactory" + }, + "engine": { + "@type": "HandlebarsTemplateEngine" + } + } + ] +} diff --git a/config/pod/handler/static.json b/config/pod/handler/static.json new file mode 100644 index 0000000000..d75c7bd57b --- /dev/null +++ b/config/pod/handler/static.json @@ -0,0 +1,23 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "import": [ + "files-scs:config/pod/handler/http/manager.json", + "files-scs:config/pod/handler/resource-generators/templated.json" + ], + "@graph": [ + { + "comment": "Stores all new resources for a pod in the default resource store under the generated identifier.", + "@id": "urn:solid-server:default:PodManager", + "@type": "GeneratedPodManager", + "store": { + "@id": "urn:solid-server:default:ResourceStore" + }, + "idGenerator": { + "@id": "urn:solid-server:default:IdentifierGenerator" + }, + "resourcesGenerator": { + "@id": "urn:solid-server:default:ResourcesGenerator" + } + } + ] +} diff --git a/config/presets/acl.json b/config/presets/acl.json deleted file mode 100644 index 4f40030cfc..0000000000 --- a/config/presets/acl.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "@graph": [ - { - "@id": "urn:solid-server:default:AclIdentifierStrategy", - "@type": "SuffixAuxiliaryIdentifierStrategy", - "suffix": ".acl" - }, - { - "@id": "urn:solid-server:default:AclStrategy", - "@type": "ComposedAuxiliaryStrategy", - "identifierStrategy": { - "@id": "urn:solid-server:default:AclIdentifierStrategy" - }, - "metadataGenerator": { - "@type": "LinkMetadataGenerator", - "link": "http://www.w3.org/ns/auth/acl#accessControl", - "identifierStrategy": { - "@id": "urn:solid-server:default:AclIdentifierStrategy" - } - }, - "validator": { - "@id": "urn:solid-server:default:RdfValidator" - }, - "isRootRequired": true - }, - - { - "@id": "urn:solid-server:default:AclBasedAuthorizer", - "@type": "WaterfallHandler", - "handlers": [ - { - "comment": "This authorizer makes sure that for auxiliary resources, the main authorizer gets called with the associated identifier.", - "@type": "AuxiliaryAuthorizer", - "resourceAuthorizer": { - "@id": "urn:solid-server:default:WebAclAuthorizer" - }, - "auxStrategy": { - "@id": "urn:solid-server:default:AuxiliaryStrategy" - } - }, - { - "@id": "urn:solid-server:default:WebAclAuthorizer" - } - ] - }, - - { - "@id": "urn:solid-server:default:WebAclAuthorizer", - "@type": "WebAclAuthorizer", - "aclStrategy": { - "@id": "urn:solid-server:default:AclIdentifierStrategy" - }, - "resourceStore": { - "@id": "urn:solid-server:default:ResourceStore" - }, - "identifierStrategy": { - "@id": "urn:solid-server:default:IdentifierStrategy" - } - } - ] -} diff --git a/config/presets/http.json b/config/presets/http.json deleted file mode 100644 index da0549a4eb..0000000000 --- a/config/presets/http.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "@graph": [ - { - "@id": "urn:solid-server:default:ServerFactory", - "@type": "WebSocketServerFactory", - "baseServerFactory": { - "@id": "urn:solid-server:default:HttpServerFactory" - }, - "webSocketHandler": { - "@id": "urn:solid-server:default:WebSocketHandler" - } - }, - { - "@id": "urn:solid-server:default:HttpServerFactory", - "@type": "BaseHttpServerFactory", - "handler": { - "@id": "urn:solid-server:default:HttpHandler" - } - }, - { - "@id": "urn:solid-server:default:HttpHandler", - "@type": "SequenceHandler", - "handlers": [ - { - "@id": "urn:solid-server:default:Middleware" - }, - { - "@type": "WaterfallHandler", - "handlers": [ - { - "@id": "urn:solid-server:default:CommonAssetHandler" - }, - { - "@id": "urn:solid-server:default:StaticAssetHandler" - }, - { - "@id": "urn:solid-server:default:PodManagerHandler" - }, - { - "@id": "urn:solid-server:default:IdentityProviderHandler" - }, - { - "@id": "urn:solid-server:default:LdpHandler" - } - ] - } - ] - }, - { - "@id": "urn:solid-server:default:CommonAssetHandler", - "@type": "StaticAssetHandler", - "comment": "Serves the favicon and the idp css", - "assets": [ - { - "StaticAssetHandler:_assets_key": "/favicon.ico", - "StaticAssetHandler:_assets_value": "$PACKAGE_ROOT/templates/root/favicon.ico" - }, - { - "StaticAssetHandler:_assets_key": "/idp/style.css", - "StaticAssetHandler:_assets_value": "$PACKAGE_ROOT/templates/views/email-password-interaction/main.css" - } - ] - } - ] -} diff --git a/config/presets/identifiers/subdomain-identifiers.json b/config/presets/identifiers/subdomain-identifiers.json deleted file mode 100644 index c6f1c6d8ac..0000000000 --- a/config/presets/identifiers/subdomain-identifiers.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "@graph": [ - { - "@id": "urn:solid-server:default:IdentifierStrategy", - "@type": "SubdomainIdentifierStrategy", - "baseUrl": { - "@id": "urn:solid-server:default:variable:baseUrl" - } - }, - { - "@id": "urn:solid-server:default:IdentifierGenerator", - "@type": "SubdomainIdentifierGenerator", - "baseUrl": { - "@id": "urn:solid-server:default:variable:baseUrl" - } - } - ] -} diff --git a/config/presets/identifiers/suffix-identifiers.json b/config/presets/identifiers/suffix-identifiers.json deleted file mode 100644 index de891d7e73..0000000000 --- a/config/presets/identifiers/suffix-identifiers.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "@graph": [ - { - "@id": "urn:solid-server:default:IdentifierStrategy", - "@type": "SingleRootIdentifierStrategy", - "baseUrl": { - "@id": "urn:solid-server:default:variable:baseUrl" - } - }, - { - "@id": "urn:solid-server:default:IdentifierGenerator", - "@type": "SuffixIdentifierGenerator", - "base": { - "@id": "urn:solid-server:default:variable:baseUrl" - } - } - ] -} diff --git a/config/presets/identity/identity-provider.json b/config/presets/identity/identity-provider.json deleted file mode 100644 index bedd8898ff..0000000000 --- a/config/presets/identity/identity-provider.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "@graph": [ - { - "@id": "urn:solid-server:default:IdpStorage", - "@type": "JsonResourceStorage", - "source": { - "@id": "urn:solid-server:default:ResourceStore" - }, - "baseUrl": { - "@id": "urn:solid-server:default:variable:baseUrl" - }, - "container": "/idp/data/" - }, - { - "@id": "urn:solid-server:default:ExpiringIdpStorage", - "@type": "WrappedExpiringStorage", - "source": { - "@id": "urn:solid-server:default:IdpStorage" - } - }, - { - "@id": "urn:solid-server:default:IdpAdapterFactory", - "@type": "WrappedFetchAdapterFactory", - "source": { - "@type": "ExpiringAdapterFactory", - "args_storageName": "/idp/oidc", - "args_storage": { - "@id": "urn:solid-server:default:ExpiringIdpStorage" - } - } - }, - { - "@id": "urn:solid-server:default:IdpConfigurationFactory", - "@type": "KeyConfigurationFactory", - "adapterFactory": { - "@id": "urn:solid-server:default:IdpAdapterFactory" - }, - "baseUrl": { - "@id": "urn:solid-server:default:variable:baseUrl" - }, - "idpPath": "/idp", - "storage": { - "@id": "urn:solid-server:default:IdpStorage" - } - }, - { - "@id": "urn:solid-server:default:IdentityProviderFactory", - "@type": "IdentityProviderFactory", - "issuer": { - "@id": "urn:solid-server:default:variable:baseUrl" - }, - "configurationFactory": { - "@id": "urn:solid-server:default:IdpConfigurationFactory" - }, - "errorResponseWriter": { - "@type": "ErrorResponseWriter" - } - }, - { - "@id": "urn:solid-server:default:IdentityProviderHttpHandler", - "@type": "IdentityProviderHttpHandler", - "providerFactory": { - "@id": "urn:solid-server:default:IdentityProviderFactory" - }, - "interactionPolicy": { - "@id": "urn:solid-server:auth:password:AccountInteractionPolicy" - }, - "interactionHttpHandler": { - "@id": "urn:solid-server:auth:password:InteractionHttpHandler" - }, - "errorResponseWriter": { - "@type": "ErrorResponseWriter" - } - }, - { - "@id": "urn:solid-server:default:IdentityProviderHandler", - "@type": "RouterHandler", - "allowedMethods": [ "GET", "POST", "PUT", "DELETE", "OPTIONS" ], - "allowedPathNames": [ "^/idp/.*", "^/\\.well-known/openid-configuration" ], - "handler": { "@id": "urn:solid-server:default:IdentityProviderHttpHandler" } - } - ] -} diff --git a/config/presets/identity/interaction-policy.json b/config/presets/identity/interaction-policy.json deleted file mode 100644 index c47543d63e..0000000000 --- a/config/presets/identity/interaction-policy.json +++ /dev/null @@ -1,224 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "@graph": [ - { - "comment": "The storage adapter that persists usernames, passwords, etc.", - "@id": "urn:solid-server:auth:password:AccountStore", - "@type": "BaseAccountStore", - "args_storageName": "/idp/email-password-db", - "args_saltRounds": 10, - "args_storage": { - "@id": "urn:solid-server:default:IdpStorage" - } - }, - { - "comment": "Responsible for completing an OIDC interaction after login or registration", - "@id": "urn:solid-server:auth:password:InteractionCompleter", - "@type": "InteractionCompleter" - }, - { - "comment": "Renders the login page", - "@id": "urn:solid-server:auth:password:LoginRenderHandler", - "@type": "RenderEjsHandler", - "templatePath": { - "@id": "urn:solid-server:default:variable:idpTemplateFolder" - }, - "templateFile": "./email-password-interaction/login.ejs" - }, - { - "comment": "Renders the register page", - "@id": "urn:solid-server:auth:password:RegisterRenderHandler", - "@type": "RenderEjsHandler", - "templatePath": { - "@id": "urn:solid-server:default:variable:idpTemplateFolder" - }, - "templateFile": "./email-password-interaction/register.ejs" - }, - { - "comment": "Renders the forgot password page", - "@id": "urn:solid-server:auth:password:ForgotPasswordRenderHandler", - "@type": "RenderEjsHandler", - "templatePath": { - "@id": "urn:solid-server:default:variable:idpTemplateFolder" - }, - "templateFile": "./email-password-interaction/forgotPassword.ejs" - }, - { - "comment": "Renders the reset password page", - "@id": "urn:solid-server:auth:password:ResetPasswordRenderHandler", - "@type": "RenderEjsHandler", - "templatePath": { - "@id": "urn:solid-server:default:variable:idpTemplateFolder" - }, - "templateFile": "./email-password-interaction/resetPassword.ejs" - }, - { - "comment": "Renders the Email Sent message page", - "@id": "urn:solid-server:auth:password:EmailSentRenderHandler", - "@type": "RenderEjsHandler", - "templatePath": { - "@id": "urn:solid-server:default:variable:idpTemplateFolder" - }, - "templateFile": "./email-password-interaction/emailSent.ejs" - }, - { - "comment": "Renders a generic page that says a message", - "@id": "urn:solid-server:auth:password:MessageRenderHandler", - "@type": "RenderEjsHandler", - "templatePath": { - "@id": "urn:solid-server:default:variable:idpTemplateFolder" - }, - "templateFile": "./email-password-interaction/message.ejs" - }, - { - "comment": "Http handler to take care of all routing on for the email password interaction", - "@id": "urn:solid-server:auth:password:InteractionHttpHandler", - "@type": "WaterfallHandler", - "handlers": [ - { - "comment": "Handles the initial route when the user is directed from their app to the IdP", - "@type": "RouterHandler", - "allowedMethods": [ "GET" ], - "allowedPathNames": [ "^/idp/interaction/[-_A-Za-z0-9]+/?$" ], - "handler": { - "@type": "InitialInteractionHandler", - "renderHandlerMap": [ - { - "InitialInteractionHandler:_renderHandlerMap_key": "consent", - "InitialInteractionHandler:_renderHandlerMap_value": { - "@type": "RenderEjsHandler", - "templatePath": { - "@id": "urn:solid-server:default:variable:idpTemplateFolder" - }, - "templateFile": "./email-password-interaction/confirm.ejs" - } - } - ], - "renderHandlerMap_default": { - "@id": "urn:solid-server:auth:password:LoginRenderHandler" - } - } - }, - { - "comment": "Handles all functionality on the register page", - "@type": "IdpRouteController", - "pathName": "^/idp/interaction/[-_A-Za-z0-9]+/register/?$", - "postHandler": { - "@type": "RegistrationHandler", - "args_ownershipValidator": { - "@type": "IssuerOwnershipValidator", - "issuer": { - "@id": "urn:solid-server:default:variable:baseUrl" - } - }, - "args_accountStore": { - "@id": "urn:solid-server:auth:password:AccountStore" - }, - "args_interactionCompleter": { - "@id": "urn:solid-server:auth:password:InteractionCompleter" - } - }, - "renderHandler": { - "@id": "urn:solid-server:auth:password:RegisterRenderHandler" - } - }, - { - "comment": "Handles all functionality on the Login Page", - "@type": "IdpRouteController", - "pathName": "^/idp/interaction/[-_A-Za-z0-9]+/login/?$", - "postHandler": { - "@type": "LoginHandler", - "args_accountStore": { - "@id": "urn:solid-server:auth:password:AccountStore" - }, - "args_interactionCompleter": { - "@id": "urn:solid-server:auth:password:InteractionCompleter" - } - }, - "renderHandler": { - "@id": "urn:solid-server:auth:password:LoginRenderHandler" - } - }, - { - "comment": "Handles confirm requests", - "@type": "RouterHandler", - "allowedMethods": [ "POST" ], - "allowedPathNames": [ "^/idp/interaction/[-_A-Za-z0-9]+/confirm/?$" ], - "handler": { - "@type": "SessionHttpHandler", - "interactionCompleter": { - "@id": "urn:solid-server:auth:password:InteractionCompleter" - } - } - }, - { - "comment": "Handles all functionality on the forgot password page", - "@type": "IdpRouteController", - "pathName": "^/idp/interaction/[-_A-Za-z0-9]+/forgotpassword/?$", - "postHandler": { - "@type": "ForgotPasswordHandler", - "args_messageRenderHandler": { - "@id": "urn:solid-server:auth:password:EmailSentRenderHandler" - }, - "args_accountStore": { - "@id": "urn:solid-server:auth:password:AccountStore" - }, - "args_baseUrl": { - "@id": "urn:solid-server:default:variable:baseUrl" - }, - "args_idpPath": "/idp", - "args_emailTemplateRenderer": { - "@type": "EjsTemplateRenderer", - "templatePath": { - "@id": "urn:solid-server:default:variable:idpTemplateFolder" - }, - "templateFile": "./email-password-interaction/resetPasswordEmail.ejs" - }, - "args_emailSender": { - "@id": "urn:solid-server:default:EmailSender" - } - }, - "renderHandler": { - "@id": "urn:solid-server:auth:password:ForgotPasswordRenderHandler" - } - }, - { - "comment": "Renders the reset password page", - "@type": "RouterHandler", - "allowedMethods": [ "GET" ], - "allowedPathNames": [ "^/idp/resetpassword/?$" ], - "handler": { - "@type": "ResetPasswordViewHandler", - "renderHandler": { - "@id": "urn:solid-server:auth:password:ResetPasswordRenderHandler" - } - } - }, - { - "comment": "Handles the reset password page submission", - "@type": "RouterHandler", - "allowedMethods": [ "POST" ], - "allowedPathNames": [ "^/idp/resetpassword/?$" ], - "handler": { - "@type": "ResetPasswordHandler", - "args_accountStore": { - "@id": "urn:solid-server:auth:password:AccountStore" - }, - "args_renderHandler": { - "@id": "urn:solid-server:auth:password:ResetPasswordRenderHandler" - }, - "args_messageRenderHandler": { - "@id": "urn:solid-server:auth:password:MessageRenderHandler" - } - } - } - ] - }, - { - "comment": "Sets up the email password interaction policy", - "@id": "urn:solid-server:auth:password:AccountInteractionPolicy", - "@type": "AccountInteractionPolicy", - "idpPath": "/idp" - } - ] -} diff --git a/config/presets/init.json b/config/presets/init.json deleted file mode 100644 index 6561f52643..0000000000 --- a/config/presets/init.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "@graph": [ - { - "@id": "urn:solid-server:default:Initializer", - "@type": "SequenceHandler", - "handlers": [ - { - "@id": "urn:solid-server:default:LoggerInitializer", - "@type": "LoggerInitializer", - "loggerFactory": { - "@id": "urn:solid-server:default:LoggerFactory" - } - }, - { - "@id": "urn:solid-server:default:RootContainerInitializer", - "@type": "RootContainerInitializer", - "settings_store": { - "@id": "urn:solid-server:default:ResourceStore" - }, - "settings_baseUrl": { - "@id": "urn:solid-server:default:variable:baseUrl" - } - }, - { - "@id": "urn:solid-server:default:AclInitializer", - "@type": "AclInitializer", - "settings_store": { - "@id": "urn:solid-server:default:ResourceStore" - }, - "settings_aclStrategy": { - "@id": "urn:solid-server:default:AclIdentifierStrategy" - }, - "settings_baseUrl": { - "@id": "urn:solid-server:default:variable:baseUrl" - } - }, - { - "@id": "urn:solid-server:default:ServerInitializer", - "@type": "ServerInitializer", - "serverFactory": { - "@id": "urn:solid-server:default:ServerFactory" - }, - "port": { - "@id": "urn:solid-server:default:variable:port" - } - } - ] - } - ] -} diff --git a/config/presets/ldp.json b/config/presets/ldp.json deleted file mode 100644 index 1716c4f530..0000000000 --- a/config/presets/ldp.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "@graph": [ - { - "@id": "urn:solid-server:default:LdpHandler", - "@type": "AuthenticatedLdpHandler", - "args_requestParser": { - "@id": "urn:solid-server:default:RequestParser" - }, - "args_credentialsExtractor": { - "@id": "urn:solid-server:default:CredentialsExtractor" - }, - "args_permissionsExtractor": { - "@id": "urn:solid-server:default:PermissionsExtractor" - }, - "args_authorizer": { - "@id": "urn:solid-server:default:AclBasedAuthorizer" - }, - "args_operationHandler": { - "@id": "urn:solid-server:default:OperationHandler" - }, - "args_responseWriter": { - "@id": "urn:solid-server:default:ResponseWriter" - } - } - ] -} diff --git a/config/presets/ldp/request-parser.json b/config/presets/ldp/request-parser.json deleted file mode 100644 index 8af28c8d31..0000000000 --- a/config/presets/ldp/request-parser.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "@graph": [ - { - "@id": "urn:solid-server:default:RequestParser", - "@type": "BasicRequestParser", - "args_targetExtractor": { - "@id": "urn:solid-server:default:TargetExtractor" - }, - "args_preferenceParser": { - "@type": "AcceptPreferenceParser" - }, - "args_metadataParser": { - "@id": "urn:solid-server:default:MetadataParser" - }, - "args_bodyParser": { - "@type": "WaterfallHandler", - "handlers": [ - { - "@type": "SparqlUpdateBodyParser" - }, - { - "@type": "RawBodyParser" - } - ] - } - }, - { - "@id": "urn:solid-server:default:TargetExtractor", - "@type": "OriginalUrlExtractor", - "options_includeQueryString": false - } - ] -} diff --git a/config/presets/ldp/response-writer.json b/config/presets/ldp/response-writer.json deleted file mode 100644 index 74a29083c4..0000000000 --- a/config/presets/ldp/response-writer.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "@graph": [ - { - "@id": "urn:solid-server:default:MetadataSerializer", - "@type": "ParallelHandler", - "handlers": [ - { - "@type": "ConstantMetadataWriter", - "headers": [ - { - "ConstantMetadataWriter:_headers_key": "Accept-Patch", - "ConstantMetadataWriter:_headers_value": "application/sparql-update" - }, - { - "ConstantMetadataWriter:_headers_key": "MS-Author-Via", - "ConstantMetadataWriter:_headers_value": "SPARQL" - } - ] - }, - { - "@type": "MappedMetadataWriter", - "headerMap": [ - { - "MappedMetadataWriter:_headerMap_key": "http://www.w3.org/ns/ma-ont#format", - "MappedMetadataWriter:_headerMap_value": "Content-Type" - }, - { - "MappedMetadataWriter:_headerMap_key": "urn:solid:http:location", - "MappedMetadataWriter:_headerMap_value": "Location" - } - ] - }, - { - "@type": "LinkRelMetadataWriter", - "linkRelMap": [ - { - "LinkRelMetadataWriter:_linkRelMap_key": "http://www.w3.org/1999/02/22-rdf-syntax-ns#type", - "LinkRelMetadataWriter:_linkRelMap_value": "type" - }, - { - "LinkRelMetadataWriter:_linkRelMap_key": "http://www.w3.org/ns/auth/acl#accessControl", - "LinkRelMetadataWriter:_linkRelMap_value": "acl" - } - ] - }, - { - "@type": "WacAllowMetadataWriter" - } - ] - }, - { - "@id": "urn:solid-server:default:ResponseWriter", - "@type": "WaterfallHandler", - "handlers": [ - { - "@type": "ErrorResponseWriter" - }, - { - "@type": "BasicResponseWriter", - "metadataWriter": { - "@id": "urn:solid-server:default:MetadataSerializer" - } - } - ] - } - ] -} diff --git a/config/presets/ldp/websockets.json b/config/presets/ldp/websockets.json deleted file mode 100644 index 8033414090..0000000000 --- a/config/presets/ldp/websockets.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "@graph": [ - { - "@id": "urn:solid-server:default:WebSocketHandler", - "@type": "UnsecureWebSocketsProtocol", - "source": { - "@id": "urn:solid-server:default:ResourceStore" - } - } - ] -} diff --git a/config/presets/middleware.json b/config/presets/middleware.json deleted file mode 100644 index 1ee2abea51..0000000000 --- a/config/presets/middleware.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "@graph": [ - { - "@id": "urn:solid-server:default:Middleware", - "@type": "SequenceHandler", - "handlers": [ - { - "@type": "HeaderHandler", - "headers": [ - { - "HeaderHandler:_headers_key": "Vary", - "HeaderHandler:_headers_value": "Accept,Authorization,Origin" - }, - { - "HeaderHandler:_headers_key": "X-Powered-By", - "HeaderHandler:_headers_value": "Community Solid Server" - } - ] - }, - { - "@type": "WebSocketAdvertiser", - "baseUrl": { - "@id": "urn:solid-server:default:variable:baseUrl" - } - }, - { - "@type": "CorsHandler", - "options_methods": [ - "GET", - "HEAD", - "OPTIONS", - "POST", - "PUT", - "PATCH", - "DELETE" - ], - "options_credentials": true, - "options_exposedHeaders": [ - "Accept-Patch", - "Location", - "MS-Author-Via", - "Updates-Via" - ] - } - ] - } - ] -} diff --git a/config/presets/pod-dynamic.json b/config/presets/pod-dynamic.json deleted file mode 100644 index 74d1cba0c0..0000000000 --- a/config/presets/pod-dynamic.json +++ /dev/null @@ -1,140 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "@graph": [ - { - "comment": "Sets up all the classes that are specifically necessary for dynamic pod generation." - }, - - { - "@id": "urn:solid-server:default:PodConfigurationStorage", - "@type": "JsonFileStorage", - "filePath": { - "@id": "urn:solid-server:default:variable:podConfigJson" - }, - "locker": { - "@id": "urn:solid-server:default:ResourceLocker" - } - }, - { - "@id": "urn:solid-server:default:PodRoutingStorage", - "@type": "MemoryMapStorage" - }, - - { - "@id": "urn:solid-server:default:StoreFactory", - "@type": "BaseComponentsJsFactory" - }, - - { - "@id": "urn:solid-server:default:PodGenerator", - "@type": "TemplatedPodGenerator", - "storeFactory": { - "@id": "urn:solid-server:default:StoreFactory" - }, - "variableHandler": { - "@type": "ParallelHandler", - "handlers": [ - { - "@type": "BaseUrlHandler" - }, - { - "@type": "RootFilePathHandler", - "fileMapper": { - "@type": "ExtensionBasedMapper", - "base": { - "@id": "urn:solid-server:default:variable:baseUrl" - }, - "rootFilepath": { - "@id": "urn:solid-server:default:variable:rootFilePath" - }, - "overrideTypes_acl": "text/turtle", - "overrideTypes_meta": "text/turtle" - } - } - ] - }, - "configStorage": { - "@id": "urn:solid-server:default:PodConfigurationStorage" - } - }, - - { - "@id": "urn:solid-server:default:PodManager", - "@type": "ConfigPodManager", - "idGenerator": { - "@type": "SuffixIdentifierGenerator", - "base": { - "@id": "urn:solid-server:default:variable:baseUrl" - } - }, - "podGenerator": { - "@id": "urn:solid-server:default:PodGenerator" - }, - "routingStorage": { - "@id": "urn:solid-server:default:PodRoutingStorage" - }, - "resourcesGenerator": { - "@id": "urn:solid-server:default:ResourcesGenerator", - "@type": "TemplatedResourcesGenerator", - "templateFolder": "$PACKAGE_ROOT/templates/pod", - "factory": { - "@type": "ExtensionBasedMapperFactory" - }, - "engine": { - "@type": "HandlebarsTemplateEngine" - } - } - }, - - { - "@id": "urn:solid-server:default:PodManagerHandler", - "@type": "PodManagerHttpHandler", - "args_requestPath": "/pods", - "args_requestParser": { - "@id": "urn:solid-server:default:RequestParser" - }, - "args_podSettingsParser": { - "@type": "PodSettingsJsonParser" - }, - "args_manager": { - "@id": "urn:solid-server:default:PodManager" - }, - "args_responseWriter": { - "@id": "urn:solid-server:default:ResponseWriter" - } - }, - - { - "@id": "urn:solid-server:default:Initializer", - "comment": "Add entry to initializer list", - "SequenceHandler:_handlers": { - "@type": "ConfigPodInitializer", - "storeFactory": { - "@id": "urn:solid-server:default:StoreFactory" - }, - "configStorage": { - "@id": "urn:solid-server:default:PodConfigurationStorage" - }, - "routingStorage": { - "@id": "urn:solid-server:default:PodRoutingStorage" - } - } - }, - - { - "@id": "urn:solid-server:default:BaseUrlRouterRule", - "@type": "BaseUrlRouterRule", - "stores": { - "@id": "urn:solid-server:default:PodRoutingStorage" - } - }, - - { - "@id": "urn:solid-server:default:RoutingResourceStore", - "@type": "RoutingResourceStore", - "rule": { - "@id": "urn:solid-server:default:BaseUrlRouterRule" - } - } - ] -} diff --git a/config/presets/pod-management.json b/config/presets/pod-management.json deleted file mode 100644 index e699fb5f59..0000000000 --- a/config/presets/pod-management.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "@graph": [ - { - "@id": "urn:solid-server:default:ResourcesGenerator", - "@type": "TemplatedResourcesGenerator", - "templateFolder": "$PACKAGE_ROOT/templates/pod", - "factory": { - "@type": "ExtensionBasedMapperFactory" - }, - "engine": { - "@type": "HandlebarsTemplateEngine" - } - }, - { - "@id": "urn:solid-server:default:PodManager", - "@type": "GeneratedPodManager", - "store": { - "@id": "urn:solid-server:default:ResourceStore" - }, - "idGenerator": { - "@id": "urn:solid-server:default:IdentifierGenerator" - }, - "resourcesGenerator": { - "@id": "urn:solid-server:default:ResourcesGenerator" - } - }, - { - "@id": "urn:solid-server:default:PodManagerHandler", - "@type": "PodManagerHttpHandler", - "args_requestPath": "/pods", - "args_requestParser": { - "@id": "urn:solid-server:default:RequestParser" - }, - "args_podSettingsParser": { - "@type": "PodSettingsJsonParser" - }, - "args_manager": { - "@id": "urn:solid-server:default:PodManager" - }, - "args_responseWriter": { - "@id": "urn:solid-server:default:ResponseWriter" - } - } - ] -} diff --git a/config/presets/representation-conversion.json b/config/presets/representation-conversion.json deleted file mode 100644 index 6f51fbec0c..0000000000 --- a/config/presets/representation-conversion.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "@graph": [ - { - "@id": "urn:solid-server:default:RdfToQuadConverter", - "@type": "RdfToQuadConverter" - }, - - { - "@id": "urn:solid-server:default:QuadToRdfConverter", - "@type": "QuadToRdfConverter", - "options_outputPreferences": [ - { - "QuadToRdfConverter:_options_outputPreferences_key": "text/turtle", - "QuadToRdfConverter:_options_outputPreferences_value": 1 - }, - { - "QuadToRdfConverter:_options_outputPreferences_key": "application/n-triples", - "QuadToRdfConverter:_options_outputPreferences_value": 0.95 - }, - { - "QuadToRdfConverter:_options_outputPreferences_key": "application/trig", - "QuadToRdfConverter:_options_outputPreferences_value": 0.95 - }, - { - "QuadToRdfConverter:_options_outputPreferences_key": "application/n-quads", - "QuadToRdfConverter:_options_outputPreferences_value": 0.95 - }, - { - "QuadToRdfConverter:_options_outputPreferences_key": "text/n3", - "QuadToRdfConverter:_options_outputPreferences_value": 0.95 - }, - { - "QuadToRdfConverter:_options_outputPreferences_key": "application/ld+json", - "QuadToRdfConverter:_options_outputPreferences_value": 0.8 - } - ] - }, - - { - "@id": "urn:solid-server:default:ContentTypeReplacer", - "@type": "ContentTypeReplacer", - "replacements": [ - { - "ContentTypeReplacer:_replacements_key": "application/n-triples", - "ContentTypeReplacer:_replacements_value": "text/turtle" - }, - { - "ContentTypeReplacer:_replacements_key": "text/turtle", - "ContentTypeReplacer:_replacements_value": "application/trig" - }, - { - "ContentTypeReplacer:_replacements_key": "application/ld+json", - "ContentTypeReplacer:_replacements_value": "application/json" - }, - { - "ContentTypeReplacer:_replacements_key": "application/*", - "ContentTypeReplacer:_replacements_value": "application/octet-stream" - }, - { - "ContentTypeReplacer:_replacements_key": "text/*", - "ContentTypeReplacer:_replacements_value": "application/octet-stream" - } - ] - }, - - { - "@id": "urn:solid-server:default:RdfRepresentationConverter", - "@type": "ChainedConverter", - "converters": [ - { - "@id": "urn:solid-server:default:RdfToQuadConverter" - }, - { - "@id": "urn:solid-server:default:QuadToRdfConverter" - } - ] - }, - - { - "@id": "urn:solid-server:default:RepresentationConverter", - "@type": "WaterfallHandler", - "handlers": [ - { - "@id": "urn:solid-server:default:IndexConverter" - }, - { - "@type": "IfNeededConverter", - "comment": "Only continue converting if the requester cannot accept the available content type" - }, - { - "@id": "urn:solid-server:default:ContentTypeReplacer" - }, - { - "@id": "urn:solid-server:default:RdfRepresentationConverter" - } - ] - }, - - { - "@id": "urn:solid-server:default:RdfValidator", - "@type": "RdfValidator", - "converter": { - "@id": "urn:solid-server:default:RepresentationConverter" - } - } - ] -} diff --git a/config/presets/storage-wrapper.json b/config/presets/storage-wrapper.json deleted file mode 100644 index 618d45c2f2..0000000000 --- a/config/presets/storage-wrapper.json +++ /dev/null @@ -1,96 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "@graph": [ - { - "@id": "urn:solid-server:default:ResourceStore", - "@type": "MonitoringStore", - "source": { - "@id": "urn:solid-server:default:ResourceStore_Locking" - } - }, - - { - "@id": "urn:solid-server:default:AuxiliaryStrategy", - "@type": "RoutingAuxiliaryStrategy", - "sources": [ - { - "@id": "urn:solid-server:default:AclStrategy" - } - ] - }, - - { - "@id": "urn:solid-server:default:ResourceStore_Locking", - "@type": "LockingResourceStore", - "source": { - "@id": "urn:solid-server:default:ResourceStore_Patching" - }, - "locks": { - "@id": "urn:solid-server:default:ResourceLocker" - }, - "strategy": { - "@id": "urn:solid-server:default:AuxiliaryStrategy" - } - }, - - { - "@id": "urn:solid-server:default:ResourceStore_Patching", - "@type": "PatchingStore", - "source": { - "@id": "urn:solid-server:default:ResourceStore_Converting" - }, - "patcher": { - "@id": "urn:solid-server:default:PatchHandler", - "@type": "SparqlUpdatePatchHandler", - "converter": { - "@id": "urn:solid-server:default:RepresentationConverter" - } - } - }, - - { - "@id": "urn:solid-server:default:ResourceLocker", - "@type": "WrappedExpiringReadWriteLocker", - "locker": { - "@type": "GreedyReadWriteLocker", - "locker": { - "@type": "SingleThreadedResourceLocker" - }, - "storage": { - "@type": "MemoryMapStorage" - }, - "suffixes_count": "count", - "suffixes_read": "read", - "suffixes_write": "write" - }, - "expiration": 3000 - }, - - - { - "@id": "urn:solid-server:default:ResourceStore_ToTurtle", - "@type": "RepresentationConvertingStore", - "source": { - "@id": "urn:solid-server:default:RoutingResourceStore" - }, - "options_outConverter": { - "@id": "urn:solid-server:default:RepresentationConverter" - }, - "options_inConverter": { - "@id": "urn:solid-server:default:RepresentationConverter" - }, - "options_inType": "text/turtle" - }, - - { - "@id": "urn:solid-server:default:ResourceStore_Converting", - "@type": "RepresentationConvertingStore", - "source": { - "@id": "urn:solid-server:default:RoutingResourceStore" - }, - "options_outConverter": { - "@id": "urn:solid-server:default:RepresentationConverter" - } - } - ] -} diff --git a/config/presets/storage/backend/storage-filesystem-subdomains.json b/config/presets/storage/backend/storage-filesystem-subdomains.json deleted file mode 100644 index b298d55de6..0000000000 --- a/config/presets/storage/backend/storage-filesystem-subdomains.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "@graph": [ - { - "@id": "urn:solid-server:default:FileIdentifierMapper", - "@type": "SubdomainExtensionBasedMapper", - "base": { - "@id": "urn:solid-server:default:variable:baseUrl" - }, - "rootFilepath": { - "@id": "urn:solid-server:default:variable:rootFilePath" - }, - "baseSubdomain": "www", - "overrideTypes_acl": "text/turtle", - "overrideTypes_meta": "text/turtle" - }, - { - "@id": "urn:solid-server:default:FileDataAccessor", - "@type": "FileDataAccessor", - "resourceMapper": { - "@id": "urn:solid-server:default:FileIdentifierMapper" - } - }, - { - "@id": "urn:solid-server:default:FileResourceStore", - "@type": "DataAccessorBasedStore", - "accessor": { - "@id": "urn:solid-server:default:FileDataAccessor" - }, - "identifierStrategy": { - "@id": "urn:solid-server:default:IdentifierStrategy" - }, - "auxiliaryStrategy": { - "@id": "urn:solid-server:default:AuxiliaryStrategy" - } - } - ] -} diff --git a/config/presets/storage/backend/storage-filesystem.json b/config/presets/storage/backend/storage-filesystem.json deleted file mode 100644 index 042c980a01..0000000000 --- a/config/presets/storage/backend/storage-filesystem.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "@graph": [ - { - "@id": "urn:solid-server:default:FileIdentifierMapper", - "@type": "ExtensionBasedMapper", - "base": { - "@id": "urn:solid-server:default:variable:baseUrl" - }, - "rootFilepath": { - "@id": "urn:solid-server:default:variable:rootFilePath" - }, - "overrideTypes_acl": "text/turtle", - "overrideTypes_meta": "text/turtle" - }, - { - "@id": "urn:solid-server:default:FileDataAccessor", - "@type": "FileDataAccessor", - "resourceMapper": { - "@id": "urn:solid-server:default:FileIdentifierMapper" - } - }, - { - "@id": "urn:solid-server:default:FileResourceStore", - "@type": "DataAccessorBasedStore", - "accessor": { - "@id": "urn:solid-server:default:FileDataAccessor" - }, - "identifierStrategy": { - "@id": "urn:solid-server:default:IdentifierStrategy" - }, - "auxiliaryStrategy": { - "@id": "urn:solid-server:default:AuxiliaryStrategy" - } - } - ] -} diff --git a/config/presets/storage/backend/storage-memory.json b/config/presets/storage/backend/storage-memory.json deleted file mode 100644 index 88fcf6048f..0000000000 --- a/config/presets/storage/backend/storage-memory.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "@graph": [ - { - "@id": "urn:solid-server:default:MemoryDataAccessor", - "@type": "InMemoryDataAccessor", - "strategy": { - "@id": "urn:solid-server:default:IdentifierStrategy" - } - }, - { - "@id": "urn:solid-server:default:MemoryResourceStore", - "@type": "DataAccessorBasedStore", - "accessor": { - "@id": "urn:solid-server:default:MemoryDataAccessor" - }, - "identifierStrategy": { - "@id": "urn:solid-server:default:IdentifierStrategy" - }, - "auxiliaryStrategy": { - "@id": "urn:solid-server:default:AuxiliaryStrategy" - } - } - ] -} diff --git a/config/presets/storage/backend/storage-sparql-endpoint.json b/config/presets/storage/backend/storage-sparql-endpoint.json deleted file mode 100644 index da9aa1d94a..0000000000 --- a/config/presets/storage/backend/storage-sparql-endpoint.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "@graph": [ - { - "@id": "urn:solid-server:default:SparqlDataAccessor", - "@type": "SparqlDataAccessor", - "endpoint": { - "@id": "urn:solid-server:default:variable:sparqlEndpoint" - }, - "identifierStrategy": { - "@id": "urn:solid-server:default:IdentifierStrategy" - } - }, - - { - "@id": "urn:solid-server:default:DataAccessorBasedStore", - "@type": "DataAccessorBasedStore", - "accessor": { - "@id": "urn:solid-server:default:SparqlDataAccessor" - }, - "identifierStrategy": { - "@id": "urn:solid-server:default:IdentifierStrategy" - }, - "auxiliaryStrategy": { - "@id": "urn:solid-server:default:AuxiliaryStrategy" - } - }, - - { - "@id": "urn:solid-server:default:SparqlResourceStore", - "@type": "RepresentationConvertingStore", - "source": { - "@id": "urn:solid-server:default:DataAccessorBasedStore" - }, - "options_inConverter": { - "@id": "urn:solid-server:default:RepresentationConverter" - }, - "options_inType": "internal/quads" - } - ] -} diff --git a/config/presets/storage/routing/quad-type-routing.json b/config/presets/storage/routing/quad-type-routing.json deleted file mode 100644 index 3ed2ce185e..0000000000 --- a/config/presets/storage/routing/quad-type-routing.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "@graph": [ - { - "@id": "urn:solid-server:default:PreferenceSupport", - "@type": "PreferenceSupport", - "type": "internal/quads", - "converter": { - "@id": "urn:solid-server:default:RepresentationConverter" - } - }, - { - "@id": "urn:solid-server:default:ConvertingRouterRule", - "@type": "ConvertingRouterRule", - "store": { - "@id": "urn:solid-server:default:SparqlResourceStore" - }, - "supportChecker": { - "@id": "urn:solid-server:default:PreferenceSupport" - } - }, - { - "@id": "urn:solid-server:default:RoutingResourceStore", - "@type": "RoutingResourceStore", - "rule": { - "@id": "urn:solid-server:default:ConvertingRouterRule" - } - } - ] -} diff --git a/config/presets/storage/routing/regex-routing.json b/config/presets/storage/routing/regex-routing.json deleted file mode 100644 index d8d7221057..0000000000 --- a/config/presets/storage/routing/regex-routing.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", - "@graph": [ - { - "@id": "urn:solid-server:default:RegexRouterRule", - "@type": "RegexRouterRule", - "base": { - "@id": "urn:solid-server:default:variable:baseUrl" - } - }, - { - "@id": "urn:solid-server:default:RoutingResourceStore", - "@type": "RoutingResourceStore", - "rule": { - "@id": "urn:solid-server:default:RegexRouterRule" - } - } - ] -} diff --git a/config/sparql-endpoint.json b/config/sparql-endpoint.json new file mode 100644 index 0000000000..bdd0ef7ba4 --- /dev/null +++ b/config/sparql-endpoint.json @@ -0,0 +1,33 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "import": [ + "files-scs:config/http/handler/default.json", + "files-scs:config/http/middleware/websockets.json", + "files-scs:config/http/server-factory/websockets.json", + "files-scs:config/http/static/default.json", + "files-scs:config/identity/handler/default.json", + "files-scs:config/identity/email/default.json", + "files-scs:config/init/handler/default.json", + "files-scs:config/ldp/authentication/dpop-bearer.json", + "files-scs:config/ldp/authorization/webacl.json", + "files-scs:config/ldp/handler/default.json", + "files-scs:config/ldp/metadata-parser/default.json", + "files-scs:config/ldp/metadata-writer/default.json", + "files-scs:config/ldp/permissions/acl.json", + "files-scs:config/pod/handler/static.json", + "files-scs:config/storage/key-value/memory.json", + "files-scs:config/storage/resource-store/sparql.json", + "files-scs:config/util/auxiliary/acl.json", + "files-scs:config/util/identifiers/suffix.json", + "files-scs:config/util/index/default.json", + "files-scs:config/util/logging/winston.json", + "files-scs:config/util/representation-conversion/default.json", + "files-scs:config/util/resource-locker/memory.json", + "files-scs:config/util/variables/default.json" + ], + "@graph": [ + { + "comment": "A single-pod server that stores its resources in a SPARQL endpoint." + } + ] +} diff --git a/config/storage/README.md b/config/storage/README.md new file mode 100644 index 0000000000..2b33a8f53c --- /dev/null +++ b/config/storage/README.md @@ -0,0 +1,19 @@ +# Storage +Options related to how data and resources are stored. + +## Key-Value +Used by certain classes for internal storage. +* *memory*: Store everything in memory. +* *resource-store*: Store everything in a specific container in the resource store. + +## Resource-Store +The chain of ResourceStores that needs to be passed through before reaching the actual data. +There is much variety possible here so chances are higher that a custom solution is needed here. +Most configs here have the same default setup (Monitoring -> Locking -> Patching -> Converting) +and only differ at the tail. +* *dynamic*: The routing store used at the tail here is needed when using dynamic pod creation. +* *file*: Default setup with a file backend. +* *memory*: Default setup with a memory backend. +* *regex*: Uses a different backend based on the container that is being used. +* *sparql*: Default setup with a SPARQL endpoint backend. + Also updates the converting store so all incoming data is transformed into quads. diff --git a/config/storage/key-value/memory.json b/config/storage/key-value/memory.json new file mode 100644 index 0000000000..7aa34a5c83 --- /dev/null +++ b/config/storage/key-value/memory.json @@ -0,0 +1,10 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Used for internal storage by some classes. This uses a memory based solution.", + "@id": "urn:solid-server:default:Storage", + "@type": "MemoryMapStorage" + } + ] +} diff --git a/config/storage/key-value/resource-store.json b/config/storage/key-value/resource-store.json new file mode 100644 index 0000000000..c74de22d76 --- /dev/null +++ b/config/storage/key-value/resource-store.json @@ -0,0 +1,13 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Used for internal storage by some classes. The specified container in the resource store will store internal data.", + "@id": "urn:solid-server:default:Storage", + "@type": "JsonResourceStorage", + "source": { "@id": "urn:solid-server:default:ResourceStore" }, + "baseUrl": { "@id": "urn:solid-server:default:variable:baseUrl" }, + "container": "/storage/" + } + ] +} diff --git a/config/storage/resource-store/data-accessors/file.json b/config/storage/resource-store/data-accessors/file.json new file mode 100644 index 0000000000..dbfbd159d4 --- /dev/null +++ b/config/storage/resource-store/data-accessors/file.json @@ -0,0 +1,11 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Stores data on a file system.", + "@id": "urn:solid-server:default:FileDataAccessor", + "@type": "FileDataAccessor", + "resourceMapper": { "@id": "urn:solid-server:default:FileIdentifierMapper" } + } + ] +} diff --git a/config/storage/resource-store/data-accessors/memory.json b/config/storage/resource-store/data-accessors/memory.json new file mode 100644 index 0000000000..1cabb705fa --- /dev/null +++ b/config/storage/resource-store/data-accessors/memory.json @@ -0,0 +1,11 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Stores data in memory.", + "@id": "urn:solid-server:default:MemoryDataAccessor", + "@type": "InMemoryDataAccessor", + "strategy": { "@id": "urn:solid-server:default:IdentifierStrategy" } + } + ] +} diff --git a/config/storage/resource-store/data-accessors/sparql-endpoint.json b/config/storage/resource-store/data-accessors/sparql-endpoint.json new file mode 100644 index 0000000000..0b620af044 --- /dev/null +++ b/config/storage/resource-store/data-accessors/sparql-endpoint.json @@ -0,0 +1,12 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Stores data on a SPARQL endpoint. Only supports quad object streams.", + "@id": "urn:solid-server:default:SparqlDataAccessor", + "@type": "SparqlDataAccessor", + "endpoint": { "@id": "urn:solid-server:default:variable:sparqlEndpoint" }, + "identifierStrategy": { "@id": "urn:solid-server:default:IdentifierStrategy" } + } + ] +} diff --git a/config/storage/resource-store/dynamic.json b/config/storage/resource-store/dynamic.json new file mode 100644 index 0000000000..4d81b72c66 --- /dev/null +++ b/config/storage/resource-store/dynamic.json @@ -0,0 +1,39 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "import": [ + "files-scs:config/storage/resource-store/data-accessors/file.json", + "files-scs:config/storage/resource-store/stores/converting.json", + "files-scs:config/storage/resource-store/stores/data-accessor.json", + "files-scs:config/storage/resource-store/stores/locking.json", + "files-scs:config/storage/resource-store/stores/patching.json", + "files-scs:config/storage/resource-store/stores/routing.json" + ], + "@graph": [ + { + "comment": "Setup when using dynamic pods.", + "@id": "urn:solid-server:default:ResourceStore", + "@type": "MonitoringStore", + "MonitoringStore:_source": { + "@id": "urn:solid-server:default:ResourceStore_Locking", + "LockingResourceStore:_source": { + "@id": "urn:solid-server:default:ResourceStore_Patching", + "PatchingStore:_source": { + "@id": "urn:solid-server:default:ResourceStore_Converting", + "RepresentationConvertingStore:_source": { + "@id": "urn:solid-server:default:ResourceStore_Routing", + "comment": "A router rule will be defined when activating dynamic pods." + } + } + } + } + }, + { + "comment": "Which store to use for requests that do not match any pod, e.g. for storage.", + "@id": "urn:solid-server:default:RouterRule", + "BaseUrlRouterRule:_baseStore": { + "@id": "urn:solid-server:default:ResourceStore_DataAccessor", + "DataAccessorBasedStore:_accessor": { "@id": "urn:solid-server:default:FileDataAccessor" } + } + } + ] +} diff --git a/config/storage/resource-store/file.json b/config/storage/resource-store/file.json new file mode 100644 index 0000000000..8cc0667ae9 --- /dev/null +++ b/config/storage/resource-store/file.json @@ -0,0 +1,32 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "import": [ + "files-scs:config/storage/resource-store/data-accessors/file.json", + "files-scs:config/storage/resource-store/stores/converting.json", + "files-scs:config/storage/resource-store/stores/data-accessor.json", + "files-scs:config/storage/resource-store/stores/locking.json", + "files-scs:config/storage/resource-store/stores/patching.json" + ], + "@graph": [ + { + "comment": "A default store setup with a file system backend.", + "@id": "urn:solid-server:default:ResourceStore", + "@type": "MonitoringStore", + "MonitoringStore:_source": { + "@id": "urn:solid-server:default:ResourceStore_Locking", + "LockingResourceStore:_source": { + "@id": "urn:solid-server:default:ResourceStore_Patching", + "PatchingStore:_source": { + "@id": "urn:solid-server:default:ResourceStore_Converting", + "RepresentationConvertingStore:_source": { + "@id": "urn:solid-server:default:ResourceStore_DataAccessor", + "DataAccessorBasedStore:_accessor": { + "@id": "urn:solid-server:default:FileDataAccessor" + } + } + } + } + } + } + ] +} diff --git a/config/storage/resource-store/memory.json b/config/storage/resource-store/memory.json new file mode 100644 index 0000000000..246e27c8a7 --- /dev/null +++ b/config/storage/resource-store/memory.json @@ -0,0 +1,33 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "import": [ + "files-scs:config/storage/resource-store/data-accessors/memory.json", + "files-scs:config/storage/resource-store/stores/converting.json", + "files-scs:config/storage/resource-store/stores/data-accessor.json", + "files-scs:config/storage/resource-store/stores/locking.json", + "files-scs:config/storage/resource-store/stores/patching.json" + ], + "@graph": [ + { + "comment": "A default store setup with a memory backend.", + "@id": "urn:solid-server:default:ResourceStore", + "@type": "MonitoringStore", + "MonitoringStore:_source": { + "@id": "urn:solid-server:default:ResourceStore_Locking", + "LockingResourceStore:_source": { + "@id": "urn:solid-server:default:ResourceStore_Patching", + "PatchingStore:_source": { + "@id": "urn:solid-server:default:ResourceStore_Converting", + "RepresentationConvertingStore:_source": { + "@id": "urn:solid-server:default:ResourceStore_DataAccessor", + "DataAccessorBasedStore:_accessor": { + "@id": "urn:solid-server:default:MemoryDataAccessor" + } + } + } + } + } + } + + ] +} diff --git a/config/storage/resource-store/regex.json b/config/storage/resource-store/regex.json new file mode 100644 index 0000000000..ba56ab14df --- /dev/null +++ b/config/storage/resource-store/regex.json @@ -0,0 +1,81 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "import": [ + "files-scs:config/storage/resource-store/data-accessors/file.json", + "files-scs:config/storage/resource-store/data-accessors/memory.json", + "files-scs:config/storage/resource-store/data-accessors/sparql-endpoint.json", + "files-scs:config/storage/resource-store/stores/converting.json", + "files-scs:config/storage/resource-store/stores/locking.json", + "files-scs:config/storage/resource-store/stores/patching.json", + "files-scs:config/storage/resource-store/stores/routing.json" + ], + "@graph": [ + { + "comment": "A more complex example with 3 different stores being routed to.", + "@id": "urn:solid-server:default:ResourceStore", + "@type": "MonitoringStore", + "MonitoringStore:_source": { + "@id": "urn:solid-server:default:ResourceStore_Locking", + "LockingResourceStore:_source": { + "@id": "urn:solid-server:default:ResourceStore_Patching", + "PatchingStore:_source": { + "@id": "urn:solid-server:default:ResourceStore_Converting", + "RepresentationConvertingStore:_source": { + "@id": "urn:solid-server:default:ResourceStore_Routing" + } + } + } + } + }, + + { + "comment": [ + "Configure routing to send all requests containing /file/ to the file store, containing /memory/ to the memory store and /sparql/ to the sparql endpoint store.", + "The root .acl file will be stored in the sparql endpoint store." + ], + "@id": "urn:solid-server:default:RouterRule", + "@type": "RegexRouterRule", + "base": { "@id": "urn:solid-server:default:variable:baseUrl" }, + "storeMap": [ + { + "RegexRouterRule:_storeMap_key": "^/\\.acl$", + "RegexRouterRule:_storeMap_value": { "@id": "urn:solid-server:default:SparqlResourceStore" } + }, + { + "RegexRouterRule:_storeMap_key": "/file/", + "RegexRouterRule:_storeMap_value": { "@id": "urn:solid-server:default:FileResourceStore" } + }, + { + "RegexRouterRule:_storeMap_key": "/memory/", + "RegexRouterRule:_storeMap_value": { "@id": "urn:solid-server:default:MemoryResourceStore" } + }, + { + "RegexRouterRule:_storeMap_key": "/sparql/", + "RegexRouterRule:_storeMap_value": { "@id": "urn:solid-server:default:SparqlResourceStore" } + } + ] + }, + + { + "@id": "urn:solid-server:default:FileResourceStore", + "@type": "DataAccessorBasedStore", + "identifierStrategy": { "@id": "urn:solid-server:default:IdentifierStrategy" }, + "auxiliaryStrategy": { "@id": "urn:solid-server:default:AuxiliaryStrategy" }, + "accessor": { "@id": "urn:solid-server:default:FileDataAccessor" } + }, + { + "@id": "urn:solid-server:default:MemoryResourceStore", + "@type": "DataAccessorBasedStore", + "identifierStrategy": { "@id": "urn:solid-server:default:IdentifierStrategy" }, + "auxiliaryStrategy": { "@id": "urn:solid-server:default:AuxiliaryStrategy" }, + "accessor": { "@id": "urn:solid-server:default:MemoryDataAccessor" } + }, + { + "@id": "urn:solid-server:default:SparqlResourceStore", + "@type": "DataAccessorBasedStore", + "identifierStrategy": { "@id": "urn:solid-server:default:IdentifierStrategy" }, + "auxiliaryStrategy": { "@id": "urn:solid-server:default:AuxiliaryStrategy" }, + "accessor": { "@id": "urn:solid-server:default:SparqlDataAccessor" } + } + ] +} diff --git a/config/storage/resource-store/sparql.json b/config/storage/resource-store/sparql.json new file mode 100644 index 0000000000..99346e9b11 --- /dev/null +++ b/config/storage/resource-store/sparql.json @@ -0,0 +1,35 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "import": [ + "files-scs:config/storage/resource-store/data-accessors/sparql-endpoint.json", + "files-scs:config/storage/resource-store/stores/converting.json", + "files-scs:config/storage/resource-store/stores/data-accessor.json", + "files-scs:config/storage/resource-store/stores/locking.json", + "files-scs:config/storage/resource-store/stores/patching.json" + ], + "@graph": [ + { + "comment": "A default store setup with a memory backend.", + "@id": "urn:solid-server:default:ResourceStore", + "@type": "MonitoringStore", + "MonitoringStore:_source": { + "@id": "urn:solid-server:default:ResourceStore_Locking", + "LockingResourceStore:_source": { + "@id": "urn:solid-server:default:ResourceStore_Patching", + "PatchingStore:_source": { + "@id": "urn:solid-server:default:ResourceStore_Converting", + "comment": "This makes it so all incoming data is converted to quad objects.", + "RepresentationConvertingStore:_options_inConverter": { "@id": "urn:solid-server:default:RepresentationConverter" }, + "RepresentationConvertingStore:_options_inType": "internal/quads", + "RepresentationConvertingStore:_source": { + "@id": "urn:solid-server:default:ResourceStore_DataAccessor", + "DataAccessorBasedStore:_accessor": { + "@id": "urn:solid-server:default:SparqlDataAccessor" + } + } + } + } + } + } + ] +} diff --git a/config/storage/resource-store/stores/converting.json b/config/storage/resource-store/stores/converting.json new file mode 100644 index 0000000000..52010b74fe --- /dev/null +++ b/config/storage/resource-store/stores/converting.json @@ -0,0 +1,12 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Converts all outgoing resources based on the preferences.", + "@id": "urn:solid-server:default:ResourceStore_Converting", + "@type": "RepresentationConvertingStore", + "source": { "@id": "urn:solid-server:default:RoutingResourceStore" }, + "options_outConverter": { "@id": "urn:solid-server:default:RepresentationConverter" } + } + ] +} diff --git a/config/storage/resource-store/stores/data-accessor.json b/config/storage/resource-store/stores/data-accessor.json new file mode 100644 index 0000000000..fc813aeafa --- /dev/null +++ b/config/storage/resource-store/stores/data-accessor.json @@ -0,0 +1,12 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Supports default Solid behaviour on any kind of data accessor.", + "@id": "urn:solid-server:default:ResourceStore_DataAccessor", + "@type": "DataAccessorBasedStore", + "identifierStrategy": { "@id": "urn:solid-server:default:IdentifierStrategy" }, + "auxiliaryStrategy": { "@id": "urn:solid-server:default:AuxiliaryStrategy" } + } + ] +} diff --git a/config/storage/resource-store/stores/locking.json b/config/storage/resource-store/stores/locking.json new file mode 100644 index 0000000000..ab21f56c6d --- /dev/null +++ b/config/storage/resource-store/stores/locking.json @@ -0,0 +1,12 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Locks resources when they are accessed until the operation is finished.", + "@id": "urn:solid-server:default:ResourceStore_Locking", + "@type": "LockingResourceStore", + "locks": { "@id": "urn:solid-server:default:ResourceLocker" }, + "strategy": { "@id": "urn:solid-server:default:AuxiliaryStrategy" } + } + ] +} diff --git a/config/storage/resource-store/stores/monitoring.json b/config/storage/resource-store/stores/monitoring.json new file mode 100644 index 0000000000..05fdae5dc0 --- /dev/null +++ b/config/storage/resource-store/stores/monitoring.json @@ -0,0 +1,10 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Emits events on changes to resources.", + "@id": "urn:solid-server:default:ResourceStore", + "@type": "MonitoringStore" + } + ] +} diff --git a/config/storage/resource-store/stores/patching.json b/config/storage/resource-store/stores/patching.json new file mode 100644 index 0000000000..bacdbc8da5 --- /dev/null +++ b/config/storage/resource-store/stores/patching.json @@ -0,0 +1,16 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Allows for PATCH operations on stores that don't have native support.", + "@id": "urn:solid-server:default:ResourceStore_Patching", + "@type": "PatchingStore", + "source": { "@id": "urn:solid-server:default:ResourceStore_Converting" }, + "patcher": { + "@id": "urn:solid-server:default:PatchHandler", + "@type": "SparqlUpdatePatchHandler", + "converter": { "@id": "urn:solid-server:default:RepresentationConverter" } + } + } + ] +} diff --git a/config/storage/resource-store/stores/routing.json b/config/storage/resource-store/stores/routing.json new file mode 100644 index 0000000000..b2da91f8ed --- /dev/null +++ b/config/storage/resource-store/stores/routing.json @@ -0,0 +1,11 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Routes data to different stores based on the chosen rule.", + "@id": "urn:solid-server:default:ResourceStore_Routing", + "@type": "RoutingResourceStore", + "rule": { "@id": "urn:solid-server:default:RouterRule" } + } + ] +} diff --git a/config/util/README.md b/config/util/README.md new file mode 100644 index 0000000000..831e18d231 --- /dev/null +++ b/config/util/README.md @@ -0,0 +1,45 @@ +# Util +Various utility related options. + +## Auxiliary +Exports an object that contains a list of all auxiliary resources that need to be supported. +In case you create a new auxiliary strategy you can just add it to this list. +* *acl*: Default list with only support for acl auxiliary resources. +* *no-acl*: An empty list which can be added to. + +## Identifiers +How identifiers should be interpreted. +This is mostly relevant when creating pods and/or using a file-based backend. +* *subdomain*: New pod identifier would be `http://alice.test.com/`. + File path of `http://alice.test.com/foo` would be `/alice/foo`. +* *suffix*: New pod identifier would be `http://test.com/alice`. + Requests to subdomain identifiers would be rejected. + +## Index +This can be used to provide different behaviour for index files. +This is mostly relevant for user interfaces. +* *default*: No special support. +* *example*: An example of how this could be configured. + If this is needed the best solution is usually to not import anything here + and have the index setup in the root config. + +## Logging +Which logger to use. +* *no-logging*: Disables all logging. +* *winston*: Uses the winston logger. + +## Representation-conversion +Used for converting from one content type to another when needed. +When a new content type needs to be supported, this can be done by adding a corresponding converter +to the ChainedConverter list. +* *default*: The default conversion setup which supports most RDF formats. + +## Resource-locker +Which locking mechanism to use to for example prevent 2 write simultaneous write requests. +* *memory*: Uses an in-memory locking mechanism. +* *redis*: Uses a Redis store for locking. + +## Variables +Various variables used by other options. +These can usually be set through CLI parameters. +* *default*: The default list of variables. diff --git a/config/util/auxiliary/acl.json b/config/util/auxiliary/acl.json new file mode 100644 index 0000000000..31e61de189 --- /dev/null +++ b/config/util/auxiliary/acl.json @@ -0,0 +1,16 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "import": [ + "files-scs:config/util/auxiliary/strategies/acl.json" + ], + "@graph": [ + { + "comment": "This will contain references to all the auxiliary strategies (such as the acl one) if they are needed.", + "@id": "urn:solid-server:default:AuxiliaryStrategy", + "@type": "RoutingAuxiliaryStrategy", + "sources": [ + { "@id": "urn:solid-server:default:AclStrategy" } + ] + } + ] +} diff --git a/config/util/auxiliary/no-acl.json b/config/util/auxiliary/no-acl.json new file mode 100644 index 0000000000..cb2e6ff01f --- /dev/null +++ b/config/util/auxiliary/no-acl.json @@ -0,0 +1,14 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": [ + "This will contain references to all the auxiliary strategies (such as the acl one) if they are needed.", + "Components.js does not support empty arrays, so this config can only by used if at least one strategy gets added." + ], + "@id": "urn:solid-server:default:AuxiliaryStrategy", + "@type": "RoutingAuxiliaryStrategy", + "sources": [ ] + } + ] +} diff --git a/config/util/auxiliary/strategies/acl.json b/config/util/auxiliary/strategies/acl.json new file mode 100644 index 0000000000..b6d12b0ad0 --- /dev/null +++ b/config/util/auxiliary/strategies/acl.json @@ -0,0 +1,26 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Contains all features of acl auxiliary resources (suffix, link header, etc.).", + "@id": "urn:solid-server:default:AclStrategy", + "@type": "ComposedAuxiliaryStrategy", + "identifierStrategy": { "@id": "urn:solid-server:default:AclIdentifierStrategy" }, + "metadataGenerator": { + "@type": "LinkMetadataGenerator", + "link": "http://www.w3.org/ns/auth/acl#accessControl", + "identifierStrategy": { "@id": "urn:solid-server:default:AclIdentifierStrategy" } + }, + "validator": { + "@type": "RdfValidator", + "converter": { "@id": "urn:solid-server:default:RepresentationConverter" } + }, + "isRootRequired": true + }, + { + "@id": "urn:solid-server:default:AclIdentifierStrategy", + "@type": "SuffixAuxiliaryIdentifierStrategy", + "suffix": ".acl" + } + ] +} diff --git a/config/util/identifiers/subdomain.json b/config/util/identifiers/subdomain.json new file mode 100644 index 0000000000..6b93aca9ac --- /dev/null +++ b/config/util/identifiers/subdomain.json @@ -0,0 +1,27 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "comment": "Supports multiple roots such as both http://test.com/ and http://alice.test.com/.", + "@graph": [ + { + "@id": "urn:solid-server:default:IdentifierStrategy", + "@type": "SubdomainIdentifierStrategy", + "baseUrl": { "@id": "urn:solid-server:default:variable:baseUrl" } + }, + { + "comment": "Only required when pod creation is enabled.", + "@id": "urn:solid-server:default:IdentifierGenerator", + "@type": "SubdomainIdentifierGenerator", + "baseUrl": { "@id": "urn:solid-server:default:variable:baseUrl" } + }, + { + "comment": "Only required when using a file-based backend.", + "@id": "urn:solid-server:default:FileIdentifierMapper", + "@type": "SubdomainExtensionBasedMapper", + "base": { "@id": "urn:solid-server:default:variable:baseUrl" }, + "rootFilepath": { "@id": "urn:solid-server:default:variable:rootFilePath" }, + "baseSubdomain": "www", + "overrideTypes_acl": "text/turtle", + "overrideTypes_meta": "text/turtle" + } + ] +} diff --git a/config/util/identifiers/suffix.json b/config/util/identifiers/suffix.json new file mode 100644 index 0000000000..c55f652ff4 --- /dev/null +++ b/config/util/identifiers/suffix.json @@ -0,0 +1,26 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "comment": "Only supports a single root, such as http://test.com/. A new pod URL would be http://test.com/alice/.", + "@graph": [ + { + "@id": "urn:solid-server:default:IdentifierStrategy", + "@type": "SingleRootIdentifierStrategy", + "baseUrl": { "@id": "urn:solid-server:default:variable:baseUrl" } + }, + { + "comment": "Only required when pod creation is enabled.", + "@id": "urn:solid-server:default:IdentifierGenerator", + "@type": "SuffixIdentifierGenerator", + "base": { "@id": "urn:solid-server:default:variable:baseUrl" } + }, + { + "comment": "Only required when using a file-based backend.", + "@id": "urn:solid-server:default:FileIdentifierMapper", + "@type": "ExtensionBasedMapper", + "base": { "@id": "urn:solid-server:default:variable:baseUrl" }, + "rootFilepath": { "@id": "urn:solid-server:default:variable:rootFilePath" }, + "overrideTypes_acl": "text/turtle", + "overrideTypes_meta": "text/turtle" + } + ] +} diff --git a/config/presets/static.json b/config/util/index/default.json similarity index 51% rename from config/presets/static.json rename to config/util/index/default.json index aa253b1ecd..49ee736e01 100644 --- a/config/presets/static.json +++ b/config/util/index/default.json @@ -2,14 +2,9 @@ "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", "@graph": [ { + "comment": "This value can be used to set a custom handler for index files. See the example file.", "@id": "urn:solid-server:default:IndexConverter", - "@type": "UnsupportedAsyncHandler", - "comment": "This value can be used to set a custom handler for index files" - }, - { - "@id": "urn:solid-server:default:StaticAssetHandler", - "@type": "UnsupportedAsyncHandler", - "comment": "This value can be used to set a custom handler for static assets" + "@type": "UnsupportedAsyncHandler" } ] } diff --git a/config/util/index/example.json b/config/util/index/example.json new file mode 100644 index 0000000000..ecce03b9b5 --- /dev/null +++ b/config/util/index/example.json @@ -0,0 +1,15 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": [ + "This converter replaces every browser request for text/html with the Databrowser UI (which then in turn loads a Turtle or other representation of the same resource).", + "This is useful when you want to serve a UI for every file from the pod." + ], + "@id": "urn:solid-server:default:IndexConverter", + "@type": "ConstantConverter", + "ConstantConverter:_contentType": "text/html", + "ConstantConverter:_filePath": "./node_modules/mashlib/dist/databrowser.html" + } + ] +} diff --git a/config/util/logging/no-logging.json b/config/util/logging/no-logging.json new file mode 100644 index 0000000000..11eab3b2a1 --- /dev/null +++ b/config/util/logging/no-logging.json @@ -0,0 +1,10 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Ignores log messages.", + "@id": "urn:solid-server:default:LoggerFactory", + "@type": "VoidLoggerFactory" + } + ] +} diff --git a/config/presets/logging.json b/config/util/logging/winston.json similarity index 65% rename from config/presets/logging.json rename to config/util/logging/winston.json index f5088f315a..d5f028f07b 100644 --- a/config/presets/logging.json +++ b/config/util/logging/winston.json @@ -2,11 +2,10 @@ "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", "@graph": [ { + "comment": "Uses the winston library for logging", "@id": "urn:solid-server:default:LoggerFactory", "@type": "WinstonLoggerFactory", - "level": { - "@id": "urn:solid-server:default:variable:loggingLevel" - } + "level": { "@id": "urn:solid-server:default:variable:loggingLevel" } } ] } diff --git a/config/util/representation-conversion/converters/content-type-replacer.json b/config/util/representation-conversion/converters/content-type-replacer.json new file mode 100644 index 0000000000..933365f669 --- /dev/null +++ b/config/util/representation-conversion/converters/content-type-replacer.json @@ -0,0 +1,32 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Changes content-type without changing content. E.g., if application/json is requested, application/ld+json is also valid.", + "@id": "urn:solid-server:default:ContentTypeReplacer", + "@type": "ContentTypeReplacer", + "replacements": [ + { + "ContentTypeReplacer:_replacements_key": "application/n-triples", + "ContentTypeReplacer:_replacements_value": "text/turtle" + }, + { + "ContentTypeReplacer:_replacements_key": "text/turtle", + "ContentTypeReplacer:_replacements_value": "application/trig" + }, + { + "ContentTypeReplacer:_replacements_key": "application/ld+json", + "ContentTypeReplacer:_replacements_value": "application/json" + }, + { + "ContentTypeReplacer:_replacements_key": "application/*", + "ContentTypeReplacer:_replacements_value": "application/octet-stream" + }, + { + "ContentTypeReplacer:_replacements_key": "text/*", + "ContentTypeReplacer:_replacements_value": "application/octet-stream" + } + ] + } + ] +} diff --git a/config/util/representation-conversion/converters/quad-to-rdf.json b/config/util/representation-conversion/converters/quad-to-rdf.json new file mode 100644 index 0000000000..275422c36c --- /dev/null +++ b/config/util/representation-conversion/converters/quad-to-rdf.json @@ -0,0 +1,36 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Converts Quad objects to many RDF serialization.", + "@id": "urn:solid-server:default:QuadToRdfConverter", + "@type": "QuadToRdfConverter", + "options_outputPreferences": [ + { + "QuadToRdfConverter:_options_outputPreferences_key": "text/turtle", + "QuadToRdfConverter:_options_outputPreferences_value": 1 + }, + { + "QuadToRdfConverter:_options_outputPreferences_key": "application/n-triples", + "QuadToRdfConverter:_options_outputPreferences_value": 0.95 + }, + { + "QuadToRdfConverter:_options_outputPreferences_key": "application/trig", + "QuadToRdfConverter:_options_outputPreferences_value": 0.95 + }, + { + "QuadToRdfConverter:_options_outputPreferences_key": "application/n-quads", + "QuadToRdfConverter:_options_outputPreferences_value": 0.95 + }, + { + "QuadToRdfConverter:_options_outputPreferences_key": "text/n3", + "QuadToRdfConverter:_options_outputPreferences_value": 0.95 + }, + { + "QuadToRdfConverter:_options_outputPreferences_key": "application/ld+json", + "QuadToRdfConverter:_options_outputPreferences_value": 0.8 + } + ] + } + ] +} diff --git a/config/util/representation-conversion/converters/rdf-to-quad.json b/config/util/representation-conversion/converters/rdf-to-quad.json new file mode 100644 index 0000000000..62c40321e1 --- /dev/null +++ b/config/util/representation-conversion/converters/rdf-to-quad.json @@ -0,0 +1,10 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Converts many RDF serialization to Quad objects.", + "@id": "urn:solid-server:default:RdfToQuadConverter", + "@type": "RdfToQuadConverter" + } + ] +} diff --git a/config/util/representation-conversion/default.json b/config/util/representation-conversion/default.json new file mode 100644 index 0000000000..c2e923d1c4 --- /dev/null +++ b/config/util/representation-conversion/default.json @@ -0,0 +1,32 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "import": [ + "files-scs:config/util/representation-conversion/converters/content-type-replacer.json", + "files-scs:config/util/representation-conversion/converters/quad-to-rdf.json", + "files-scs:config/util/representation-conversion/converters/rdf-to-quad.json" + ], + "@graph": [ + { + "comment": "Handles data conversion when required.", + "@id": "urn:solid-server:default:RepresentationConverter", + "@type": "WaterfallHandler", + "handlers": [ + { "@id": "urn:solid-server:default:IndexConverter" }, + { + "@type": "IfNeededConverter", + "comment": "Only continue converting if the requester cannot accept the available content type" + }, + { "@id": "urn:solid-server:default:ContentTypeReplacer" }, + { + "comment": "Automatically finds a path through a set of converters from one type to another.", + "@id": "urn:solid-server:default:ChainedConverter", + "@type": "ChainedConverter", + "converters": [ + { "@id": "urn:solid-server:default:RdfToQuadConverter" }, + { "@id": "urn:solid-server:default:QuadToRdfConverter" } + ] + } + ] + } + ] +} diff --git a/config/util/resource-locker/memory.json b/config/util/resource-locker/memory.json new file mode 100644 index 0000000000..e72cbfef5d --- /dev/null +++ b/config/util/resource-locker/memory.json @@ -0,0 +1,21 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Allows multiple simultaneous read operations. Locks are stored in memory. Locks expire after inactivity.", + "@id": "urn:solid-server:default:ResourceLocker", + "@type": "WrappedExpiringReadWriteLocker", + "locker": { + "@type": "GreedyReadWriteLocker", + "locker": { + "@type": "SingleThreadedResourceLocker" + }, + "storage": { "@id": "urn:solid-server:default:Storage" }, + "suffixes_count": "count", + "suffixes_read": "read", + "suffixes_write": "write" + }, + "expiration": 3000 + } + ] +} diff --git a/config/util/resource-locker/redis.json b/config/util/resource-locker/redis.json new file mode 100644 index 0000000000..5f5b3ee889 --- /dev/null +++ b/config/util/resource-locker/redis.json @@ -0,0 +1,23 @@ +{ + "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "@graph": [ + { + "comment": "Allows multiple simultaneous read operations. Locks are stored in memory. Locks expire after inactivity.", + "@id": "urn:solid-server:default:ResourceLocker", + "@type": "WrappedExpiringReadWriteLocker", + "locker": { + "@type": "GreedyReadWriteLocker", + "locker": { + "@id": "urn:solid-server:default:RedisResourceLocker", + "@type": "RedisResourceLocker", + "redisClients": [ "6379" ] + }, + "storage": { "@id": "urn:solid-server:default:Storage" }, + "suffixes_count": "count", + "suffixes_read": "read", + "suffixes_write": "write" + }, + "expiration": 3000 + } + ] +} diff --git a/config/presets/cli-params.json b/config/util/variables/default.json similarity index 66% rename from config/presets/cli-params.json rename to config/util/variables/default.json index 66d72b07f9..c54e433796 100644 --- a/config/presets/cli-params.json +++ b/config/util/variables/default.json @@ -1,19 +1,24 @@ { "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", + "comment": "Variables used throughout the other configs. Can be set using the CLI.", "@graph": [ { + "comment": "Port of the server.", "@id": "urn:solid-server:default:variable:port", "@type": "Variable" }, { + "comment": "Needs to be set to the base URL of the server for authnetication and authorization to function.", "@id": "urn:solid-server:default:variable:baseUrl", "@type": "Variable" }, { + "comment": "Folder to start the server in when using a file-based config.", "@id": "urn:solid-server:default:variable:rootFilePath", "@type": "Variable" }, { + "comment": "Endpoint to call when using a SPARQL-based config.", "@id": "urn:solid-server:default:variable:sparqlEndpoint", "@type": "Variable" }, @@ -27,6 +32,7 @@ "@type": "Variable" }, { + "comment": "Folder containing the templates used for IDP interactions.", "@id": "urn:solid-server:default:variable:idpTemplateFolder", "@type": "Variable" } diff --git a/package.json b/package.json index ecf57bccdb..4040d8ec44 100644 --- a/package.json +++ b/package.json @@ -52,14 +52,14 @@ "lint": "eslint . --cache --ignore-path .gitignore", "prepare": "npm run build", "start": "node ./bin/server.js", - "start:file": "node ./bin/server.js -c config/config-file.json -f ./data", + "start:file": "node ./bin/server.js -c config/file.json -f ./data", "test": "npm run test:ts && npm run jest", "test:deploy": "test/deploy/validate-package.sh", "test:ts": "tsc -p test --noEmit", "test:integration": "jest --coverageReporters text-summary -- test/integration", "test:unit": "jest --config=./jest.coverage.config.js test/unit", "test:watch": "jest --coverageReporters none --watch test/unit", - "validate": "componentsjs-compile-config urn:solid-server:default:Initializer -c config/config-default.json -f > /dev/null", + "validate": "componentsjs-compile-config urn:solid-server:default:Initializer -c config/default.json -f > /dev/null", "version": "manual-git-changelog onversion", "watch": "nodemon --watch \"dist/**/*.js\" --exec npm start" }, diff --git a/src/init/AppRunner.ts b/src/init/AppRunner.ts index 6ae037d87d..3ab37f344b 100644 --- a/src/init/AppRunner.ts +++ b/src/init/AppRunner.ts @@ -88,7 +88,7 @@ export class AppRunner { dumpErrorState: true, logLevel: params.loggingLevel as LogLevel, }; - const configFile = this.resolveFilePath(params.config, 'config/config-default.json'); + const configFile = this.resolveFilePath(params.config, 'config/default.json'); const variables = this.createVariables(params); // Create and execute the server initializer diff --git a/templates/config/defaults.json b/templates/config/defaults.json index d0fb2f9183..b4dcbe1276 100644 --- a/templates/config/defaults.json +++ b/templates/config/defaults.json @@ -1,26 +1,15 @@ { "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", "import": [ - "files-scs:config/presets/acl.json", - "files-scs:config/presets/representation-conversion.json", - "files-scs:config/presets/static.json" + "files-scs:config/util/auxiliary/acl.json", + "files-scs:config/util/index/default.json", + "files-scs:config/util/representation-conversion/default.json" ], "@graph": [ { "comment": "Configures classes that are used by all other storage-*.json configurations." }, - { - "@id": "urn:solid-server:default:AuxiliaryStrategy", - "comment": "Copied from storage-wrapper.json since a variable is required in there", - "@type": "RoutingAuxiliaryStrategy", - "sources": [ - { - "@id": "urn:solid-server:default:AclStrategy" - } - ] - }, - { "@id": "urn:solid-server:template:IdentifierStrategy", "@type": "SingleRootIdentifierStrategy", diff --git a/test/integration/Config.ts b/test/integration/Config.ts index a19d55ca21..3ac037a0b1 100644 --- a/test/integration/Config.ts +++ b/test/integration/Config.ts @@ -9,19 +9,32 @@ let cachedModuleState: IModuleState; /** * Returns a component instantiated from a Components.js configuration. */ -export async function instantiateFromConfig(componentUrl: string, configFile: string, +export async function instantiateFromConfig(componentUrl: string, configPaths: string | string[], variables?: Record): Promise { // Initialize the Components.js loader const mainModulePath = joinFilePath(__dirname, '../../'); const manager = await ComponentsManager.build({ mainModulePath, logLevel: 'error', moduleState: cachedModuleState }); cachedModuleState = manager.moduleState; - // Instantiate the component from the config - const configPath = joinFilePath(__dirname, 'config', configFile); - await manager.configRegistry.register(configPath); + if (!Array.isArray(configPaths)) { + configPaths = [ configPaths ]; + } + + // Instantiate the component from the config(s) + for (const configPath of configPaths) { + await manager.configRegistry.register(configPath); + } return await manager.instantiate(componentUrl, { variables }); } +export function getTestConfigPath(configFile: string): string { + return joinFilePath(__dirname, 'config', configFile); +} + +export function getPresetConfigPath(configFile: string): string { + return joinFilePath(__dirname, '../../config', configFile); +} + export function getTestFolder(name: string): string { return joinFilePath(__dirname, '../tmp', name); } diff --git a/test/integration/DynamicPods.test.ts b/test/integration/DynamicPods.test.ts index 6625bc6379..ebd79db9d9 100644 --- a/test/integration/DynamicPods.test.ts +++ b/test/integration/DynamicPods.test.ts @@ -5,7 +5,7 @@ import type { Initializer } from '../../src/init/Initializer'; import type { HttpServerFactory } from '../../src/server/HttpServerFactory'; import { joinFilePath } from '../../src/util/PathUtil'; import { getPort } from '../util/Util'; -import { getTestFolder, instantiateFromConfig, removeFolder } from './Config'; +import { getTestConfigPath, getTestFolder, instantiateFromConfig, removeFolder } from './Config'; const port = getPort('DynamicPods'); const baseUrl = `http://localhost:${port}/`; @@ -44,7 +44,7 @@ describe.each(configs)('A dynamic pod server with template config %s', (template // Create and initialize the HTTP handler and related components const instances = await instantiateFromConfig( 'urn:solid-server:test:Instances', - 'server-dynamic-unsafe.json', + getTestConfigPath('server-dynamic-unsafe.json'), variables, ) as Record; ({ factory, initializer } = instances); diff --git a/test/integration/Identity.test.ts b/test/integration/Identity.test.ts index 34c48de19d..7c47b79def 100644 --- a/test/integration/Identity.test.ts +++ b/test/integration/Identity.test.ts @@ -9,7 +9,7 @@ import type { WrappedExpiringStorage } from '../../src/storage/keyvalue/WrappedE import { APPLICATION_X_WWW_FORM_URLENCODED } from '../../src/util/ContentTypes'; import { joinFilePath } from '../../src/util/PathUtil'; import { getPort } from '../util/Util'; -import { instantiateFromConfig } from './Config'; +import { getTestConfigPath, instantiateFromConfig } from './Config'; import { IdentityTestState } from './IdentityTestState'; const port = getPort('Identity'); @@ -49,7 +49,9 @@ describe('A Solid server with IDP', (): void => { Object.assign(nodemailer, { createTransport: (): any => ({ sendMail }) }); const instances = await instantiateFromConfig( - 'urn:solid-server:test:Instances', 'server-memory.json', { + 'urn:solid-server:test:Instances', + getTestConfigPath('server-memory.json'), + { 'urn:solid-server:default:variable:port': port, 'urn:solid-server:default:variable:baseUrl': baseUrl, 'urn:solid-server:default:variable:podTemplateFolder': joinFilePath(__dirname, '../assets/templates'), diff --git a/test/integration/LdpHandlerWithAuth.test.ts b/test/integration/LdpHandlerWithAuth.test.ts index 4d88dd2af3..34c5079527 100644 --- a/test/integration/LdpHandlerWithAuth.test.ts +++ b/test/integration/LdpHandlerWithAuth.test.ts @@ -6,7 +6,13 @@ import type { HttpServerFactory } from '../../src/server/HttpServerFactory'; import { AclHelper } from '../util/AclHelper'; import { deleteResource, getResource, postResource, putResource } from '../util/FetchUtil'; import { getPort } from '../util/Util'; -import { getTestFolder, instantiateFromConfig, removeFolder } from './Config'; +import { + getPresetConfigPath, + getTestConfigPath, + getTestFolder, + instantiateFromConfig, + removeFolder, +} from './Config'; const port = getPort('LpdHandlerWithAuth'); const baseUrl = `http://localhost:${port}/`; @@ -14,16 +20,16 @@ const baseUrl = `http://localhost:${port}/`; const rootFilePath = getTestFolder('full-config-acl'); const stores: [string, any][] = [ [ 'in-memory storage', { - storeUrn: 'urn:solid-server:default:MemoryResourceStore', + storeConfig: 'storage/resource-store/memory.json', teardown: jest.fn(), }], [ 'on-disk storage', { - storeUrn: 'urn:solid-server:default:FileResourceStore', + storeConfig: 'storage/resource-store/file.json', teardown: (): void => removeFolder(rootFilePath), }], ]; -describe.each(stores)('An LDP handler with auth using %s', (name, { storeUrn, teardown }): void => { +describe.each(stores)('An LDP handler with auth using %s', (name, { storeConfig, teardown }): void => { let server: Server; let initializer: Initializer; let factory: HttpServerFactory; @@ -37,17 +43,14 @@ describe.each(stores)('An LDP handler with auth using %s', (name, { storeUrn, te 'urn:solid-server:default:variable:baseUrl': baseUrl, 'urn:solid-server:default:variable:rootFilePath': rootFilePath, }; - const internalStore = await instantiateFromConfig( - storeUrn, - 'ldp-with-auth.json', - variables, - ) as ResourceStore; - variables['urn:solid-server:default:variable:store'] = internalStore; // Create and initialize the server const instances = await instantiateFromConfig( 'urn:solid-server:test:Instances', - 'ldp-with-auth.json', + [ + getPresetConfigPath(storeConfig), + getTestConfigPath('ldp-with-auth.json'), + ], variables, ) as Record; ({ factory, initializer, store } = instances); diff --git a/test/integration/LdpHandlerWithoutAuth.test.ts b/test/integration/LdpHandlerWithoutAuth.test.ts index 56499ef4b1..8530274912 100644 --- a/test/integration/LdpHandlerWithoutAuth.test.ts +++ b/test/integration/LdpHandlerWithoutAuth.test.ts @@ -3,12 +3,12 @@ import type { Server } from 'http'; import fetch from 'cross-fetch'; import { DataFactory, Parser } from 'n3'; import { joinFilePath, PIM, RDF } from '../../src/'; -import type { Initializer, ResourceStore } from '../../src/'; +import type { Initializer } from '../../src/'; import type { HttpServerFactory } from '../../src/server/HttpServerFactory'; import { LDP } from '../../src/util/Vocabularies'; import { deleteResource, expectQuads, getResource, patchResource, postResource, putResource } from '../util/FetchUtil'; import { getPort } from '../util/Util'; -import { getTestFolder, instantiateFromConfig, removeFolder } from './Config'; +import { getPresetConfigPath, getTestConfigPath, getTestFolder, instantiateFromConfig, removeFolder } from './Config'; const { literal, namedNode, quad } = DataFactory; const port = getPort('LpdHandlerWithoutAuth'); @@ -17,16 +17,16 @@ const baseUrl = `http://localhost:${port}/`; const rootFilePath = getTestFolder('full-config-no-auth'); const stores: [string, any][] = [ [ 'in-memory storage', { - storeUrn: 'urn:solid-server:default:MemoryResourceStore', + storeConfig: 'storage/resource-store/memory.json', teardown: jest.fn(), }], [ 'on-disk storage', { - storeUrn: 'urn:solid-server:default:FileResourceStore', + storeConfig: 'storage/resource-store/file.json', teardown: (): void => removeFolder(rootFilePath), }], ]; -describe.each(stores)('An LDP handler allowing all requests %s', (name, { storeUrn, teardown }): void => { +describe.each(stores)('An LDP handler allowing all requests %s', (name, { storeConfig, teardown }): void => { let server: Server; let initializer: Initializer; let factory: HttpServerFactory; @@ -37,17 +37,14 @@ describe.each(stores)('An LDP handler allowing all requests %s', (name, { storeU 'urn:solid-server:default:variable:baseUrl': baseUrl, 'urn:solid-server:default:variable:rootFilePath': rootFilePath, }; - const internalStore = await instantiateFromConfig( - storeUrn, - 'ldp-with-auth.json', - variables, - ) as ResourceStore; - variables['urn:solid-server:default:variable:store'] = internalStore; // Create and initialize the server const instances = await instantiateFromConfig( 'urn:solid-server:test:Instances', - 'ldp-with-auth.json', + [ + getPresetConfigPath(storeConfig), + getTestConfigPath('ldp-with-auth.json'), + ], variables, ) as Record; ({ factory, initializer } = instances); diff --git a/test/integration/Middleware.test.ts b/test/integration/Middleware.test.ts index 1cca059439..4a8335e0fd 100644 --- a/test/integration/Middleware.test.ts +++ b/test/integration/Middleware.test.ts @@ -3,9 +3,8 @@ import request from 'supertest'; import type { BaseHttpServerFactory } from '../../src/server/BaseHttpServerFactory'; import type { HttpHandlerInput } from '../../src/server/HttpHandler'; import { HttpHandler } from '../../src/server/HttpHandler'; -import { StaticAsyncHandler } from '../util/StaticAsyncHandler'; import { getPort } from '../util/Util'; -import { instantiateFromConfig } from './Config'; +import { getTestConfigPath, instantiateFromConfig } from './Config'; const port = getPort('Middleware'); @@ -21,8 +20,9 @@ describe('An http server with middleware', (): void => { beforeAll(async(): Promise => { const factory = await instantiateFromConfig( - 'urn:solid-server:default:HttpServerFactory', 'server-middleware.json', { - 'urn:solid-server:default:PodManagerHandler': new StaticAsyncHandler(false, null), + 'urn:solid-server:default:HttpServerFactory', + getTestConfigPath('server-middleware.json'), + { 'urn:solid-server:default:LdpHandler': new SimpleHttpHandler(), 'urn:solid-server:default:variable:port': port, 'urn:solid-server:default:variable:baseUrl': 'https://example.pod/', diff --git a/test/integration/PodCreation.test.ts b/test/integration/PodCreation.test.ts index 0572bc48b0..00f2e0e10e 100644 --- a/test/integration/PodCreation.test.ts +++ b/test/integration/PodCreation.test.ts @@ -1,24 +1,33 @@ import type { Server } from 'http'; import fetch from 'cross-fetch'; +import type { Initializer } from '../../src/init/Initializer'; import type { HttpServerFactory } from '../../src/server/HttpServerFactory'; +import { joinFilePath } from '../../src/util/PathUtil'; import { readableToString } from '../../src/util/StreamUtil'; import { getPort } from '../util/Util'; -import { instantiateFromConfig } from './Config'; +import { getTestConfigPath, instantiateFromConfig } from './Config'; const port = getPort('PodCreation'); const baseUrl = `http://localhost:${port}/`; describe('A server with a pod handler', (): void => { + let initializer: Initializer; + let factory: HttpServerFactory; let server: Server; const settings = { login: 'alice', webId: 'http://test.com/#alice', name: 'Alice Bob' }; beforeAll(async(): Promise => { - const factory = await instantiateFromConfig( - 'urn:solid-server:default:ServerFactory', 'server-without-auth.json', { + const instances = await instantiateFromConfig( + 'urn:solid-server:test:Instances', + getTestConfigPath('server-without-auth.json'), + { 'urn:solid-server:default:variable:port': port, 'urn:solid-server:default:variable:baseUrl': baseUrl, + 'urn:solid-server:default:variable:podTemplateFolder': joinFilePath(__dirname, '../assets/templates'), }, - ) as HttpServerFactory; + ) as Record; + ({ factory, initializer } = instances); + await initializer.handleSafe(); server = factory.startServer(port); }); diff --git a/test/integration/RedisResourceLockerIntegration.test.ts b/test/integration/RedisResourceLockerIntegration.test.ts index 394ea30415..85039236b6 100644 --- a/test/integration/RedisResourceLockerIntegration.test.ts +++ b/test/integration/RedisResourceLockerIntegration.test.ts @@ -4,7 +4,7 @@ import type { RedisResourceLocker } from '../../src'; import { joinFilePath } from '../../src'; import type { HttpServerFactory } from '../../src/server/HttpServerFactory'; import { describeIf, getPort } from '../util/Util'; -import { instantiateFromConfig } from './Config'; +import { getTestConfigPath, instantiateFromConfig } from './Config'; /** * Test the general functionality of the server using a RedisResourceLocker @@ -19,7 +19,7 @@ describeIf('docker', 'A server with a RedisResourceLocker as ResourceLocker', () beforeAll(async(): Promise => { const instances = await instantiateFromConfig( 'urn:solid-server:test:Instances', - 'run-with-redlock.json', + getTestConfigPath('run-with-redlock.json'), { 'urn:solid-server:default:variable:baseUrl': baseUrl, 'urn:solid-server:default:variable:podTemplateFolder': joinFilePath(__dirname, '../assets/templates'), diff --git a/test/integration/ServerFetch.test.ts b/test/integration/ServerFetch.test.ts index 9c1ec26f43..d373dacda3 100644 --- a/test/integration/ServerFetch.test.ts +++ b/test/integration/ServerFetch.test.ts @@ -4,7 +4,7 @@ import type { Initializer } from '../../src/init/Initializer'; import type { HttpServerFactory } from '../../src/server/HttpServerFactory'; import type { WrappedExpiringStorage } from '../../src/storage/keyvalue/WrappedExpiringStorage'; import { getPort } from '../util/Util'; -import { instantiateFromConfig } from './Config'; +import { getTestConfigPath, instantiateFromConfig } from './Config'; const port = getPort('ServerFetch'); const baseUrl = `http://localhost:${port}/`; @@ -18,7 +18,9 @@ describe('A Solid server', (): void => { beforeAll(async(): Promise => { const instances = await instantiateFromConfig( - 'urn:solid-server:test:Instances', 'server-memory.json', { + 'urn:solid-server:test:Instances', + getTestConfigPath('server-memory.json'), + { 'urn:solid-server:default:variable:port': port, 'urn:solid-server:default:variable:baseUrl': baseUrl, 'urn:solid-server:default:variable:idpTemplateFolder': '', diff --git a/test/integration/SparqlStorage.test.ts b/test/integration/SparqlStorage.test.ts index 925e52a485..34db815b0e 100644 --- a/test/integration/SparqlStorage.test.ts +++ b/test/integration/SparqlStorage.test.ts @@ -1,11 +1,11 @@ import { promises as fs } from 'fs'; import type { Server } from 'http'; import { joinFilePath } from '../../src/'; -import type { Initializer, ResourceStore } from '../../src/'; +import type { Initializer } from '../../src/'; import type { HttpServerFactory } from '../../src/server/HttpServerFactory'; import { putResource } from '../util/FetchUtil'; import { describeIf, getPort } from '../util/Util'; -import { instantiateFromConfig } from './Config'; +import { getPresetConfigPath, getTestConfigPath, instantiateFromConfig } from './Config'; const port = getPort('SparqlStorage'); const baseUrl = `http://localhost:${port}/`; @@ -21,17 +21,14 @@ describeIf('docker', 'A server with a SPARQL endpoint as storage', (): void => { 'urn:solid-server:default:variable:baseUrl': baseUrl, 'urn:solid-server:default:variable:sparqlEndpoint': 'http://localhost:4000/sparql', }; - const internalStore = await instantiateFromConfig( - 'urn:solid-server:default:SparqlResourceStore', - 'ldp-with-auth.json', - variables, - ) as ResourceStore; - variables['urn:solid-server:default:variable:store'] = internalStore; // Create and initialize the server const instances = await instantiateFromConfig( 'urn:solid-server:test:Instances', - 'ldp-with-auth.json', + [ + getPresetConfigPath('storage/resource-store/sparql.json'), + getTestConfigPath('ldp-with-auth.json'), + ], variables, ) as Record; ({ factory, initializer } = instances); diff --git a/test/integration/Subdomains.test.ts b/test/integration/Subdomains.test.ts index b23cd8e3b7..7e6b46b32c 100644 --- a/test/integration/Subdomains.test.ts +++ b/test/integration/Subdomains.test.ts @@ -2,9 +2,8 @@ import type { Server } from 'http'; import fetch from 'cross-fetch'; import type { Initializer } from '../../src/init/Initializer'; import type { HttpServerFactory } from '../../src/server/HttpServerFactory'; -import type { ResourceStore } from '../../src/storage/ResourceStore'; import { getPort } from '../util/Util'; -import { getTestFolder, instantiateFromConfig, removeFolder } from './Config'; +import { getPresetConfigPath, getTestConfigPath, getTestFolder, instantiateFromConfig, removeFolder } from './Config'; const port = getPort('Subdomains'); const baseUrl = `http://localhost:${port}/`; @@ -12,17 +11,17 @@ const baseUrl = `http://localhost:${port}/`; const rootFilePath = getTestFolder('subdomains'); const stores: [string, any][] = [ [ 'in-memory storage', { - storeUrn: 'urn:solid-server:default:MemoryResourceStore', + storeConfig: 'storage/resource-store/memory.json', teardown: jest.fn(), }], [ 'on-disk storage', { - storeUrn: 'urn:solid-server:default:FileResourceStore', + storeConfig: 'storage/resource-store/file.json', teardown: (): void => removeFolder(rootFilePath), }], ]; // Simulating subdomains using the forwarded header so no DNS changes are required -describe.each(stores)('A subdomain server with %s', (name, { storeUrn, teardown }): void => { +describe.each(stores)('A subdomain server with %s', (name, { storeConfig, teardown }): void => { let server: Server; let initializer: Initializer; let factory: HttpServerFactory; @@ -32,28 +31,23 @@ describe.each(stores)('A subdomain server with %s', (name, { storeUrn, teardown beforeAll(async(): Promise => { const variables: Record = { - 'urn:solid-server:default:variable:baseUrl': baseUrl, 'urn:solid-server:default:variable:port': port, + 'urn:solid-server:default:variable:baseUrl': baseUrl, 'urn:solid-server:default:variable:rootFilePath': rootFilePath, }; - const internalStore = await instantiateFromConfig( - storeUrn, - 'server-subdomains-unsafe.json', - variables, - ) as ResourceStore; - variables['urn:solid-server:default:variable:store'] = internalStore; - // Create and initialize the HTTP handler and related components + // Create and initialize the server const instances = await instantiateFromConfig( 'urn:solid-server:test:Instances', - 'server-subdomains-unsafe.json', + [ + getPresetConfigPath(storeConfig), + getTestConfigPath('server-subdomains-unsafe.json'), + ], variables, ) as Record; ({ factory, initializer } = instances); - // Set up the internal store await initializer.handleSafe(); - server = factory.startServer(port); }); diff --git a/test/integration/WebSocketsProtocol.test.ts b/test/integration/WebSocketsProtocol.test.ts index 1686dc6a18..6ba554b03d 100644 --- a/test/integration/WebSocketsProtocol.test.ts +++ b/test/integration/WebSocketsProtocol.test.ts @@ -3,7 +3,7 @@ import fetch from 'cross-fetch'; import WebSocket from 'ws'; import type { HttpServerFactory } from '../../src/server/HttpServerFactory'; import { getPort } from '../util/Util'; -import { instantiateFromConfig } from './Config'; +import { getTestConfigPath, instantiateFromConfig } from './Config'; const port = getPort('WebSocketsProtocol'); const serverUrl = `http://localhost:${port}/`; @@ -14,7 +14,9 @@ describe('A server with the Solid WebSockets API behind a proxy', (): void => { beforeAll(async(): Promise => { const factory = await instantiateFromConfig( - 'urn:solid-server:default:ServerFactory', 'server-without-auth.json', { + 'urn:solid-server:default:ServerFactory', + getTestConfigPath('server-without-auth.json'), + { 'urn:solid-server:default:variable:port': port, 'urn:solid-server:default:variable:baseUrl': 'https://example.pod/', }, diff --git a/test/integration/config/ldp-with-auth.json b/test/integration/config/ldp-with-auth.json index dea091453f..2d8eb88bab 100644 --- a/test/integration/config/ldp-with-auth.json +++ b/test/integration/config/ldp-with-auth.json @@ -1,38 +1,36 @@ { "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", "import": [ - "files-scs:config/presets/acl.json", - "files-scs:config/presets/identifiers/suffix-identifiers.json", - "files-scs:config/presets/init.json", - "files-scs:config/presets/ldp/credentials-extractor.json", - "files-scs:config/presets/ldp/metadata-handler.json", - "files-scs:config/presets/ldp/operation-handler.json", - "files-scs:config/presets/ldp/permissions-extractor.json", - "files-scs:config/presets/ldp/response-writer.json", - "files-scs:config/presets/ldp/request-parser.json", - "files-scs:config/presets/representation-conversion.json", - "files-scs:config/presets/static.json", - "files-scs:config/presets/storage/backend/storage-memory.json", - "files-scs:config/presets/storage/backend/storage-filesystem.json", - "files-scs:config/presets/storage/backend/storage-sparql-endpoint.json", - "files-scs:config/presets/storage-wrapper.json", - "files-scs:config/presets/cli-params.json" + "files-scs:config/http/handler/simple.json", + "files-scs:config/http/middleware/no-websockets.json", + "files-scs:config/http/server-factory/no-websockets.json", + "files-scs:config/http/static/default.json", + "files-scs:config/init/handler/default.json", + "files-scs:config/ldp/authentication/debug-auth-header.json", + "files-scs:config/ldp/authorization/webacl.json", + "files-scs:config/ldp/handler/default.json", + "files-scs:config/ldp/metadata-parser/default.json", + "files-scs:config/ldp/metadata-writer/default.json", + "files-scs:config/ldp/permissions/acl.json", + "files-scs:config/storage/key-value/memory.json", + "files-scs:config/util/auxiliary/acl.json", + "files-scs:config/util/identifiers/suffix.json", + "files-scs:config/util/index/default.json", + "files-scs:config/util/logging/winston.json", + "files-scs:config/util/representation-conversion/default.json", + "files-scs:config/util/resource-locker/memory.json", + "files-scs:config/util/variables/default.json" ], "@graph": [ { - "comment": "Sets up an HTTP server with only the LDP handler as HttpHandler.", + "comment": "An HTTP server with only the LDP handler as HttpHandler and an unsecure authenticator.", "@id": "urn:solid-server:test:Instances", "@type": "RecordObject", "record": [ { + "comment": "Only use the parallel initializer. Starting the server is done in the test code..", "RecordObject:_record_key": "initializer", - "RecordObject:_record_value": { - "@type": "SequenceHandler", - "SequenceHandler:_handlers": [ - { "@id": "urn:solid-server:default:RootContainerInitializer" }, - { "@id": "urn:solid-server:default:AclInitializer" } - ] - } + "RecordObject:_record_value": { "@id": "urn:solid-server:default:ParallelInitializer" } }, { "RecordObject:_record_key": "store", @@ -43,57 +41,6 @@ "RecordObject:_record_value": { "@id": "urn:solid-server:default:ServerFactory" } } ] - }, - - { - "comment": "The default LDP handler, but with an unsecure webId extractor.", - "@id": "urn:solid-server:default:LdpHandler", - "@type": "AuthenticatedLdpHandler", - "args_requestParser": { - "@id": "urn:solid-server:default:RequestParser" - }, - "args_credentialsExtractor": { - "@type": "WaterfallHandler", - "WaterfallHandler:_handlers": [ - { - "@type": "UnsecureWebIdExtractor" - }, - { - "@type": "EmptyCredentialsExtractor" - } - ] - }, - "args_permissionsExtractor": { - "@id": "urn:solid-server:default:PermissionsExtractor" - }, - "args_authorizer": { - "@id": "urn:solid-server:default:AclBasedAuthorizer" - }, - "args_operationHandler": { - "@id": "urn:solid-server:default:OperationHandler" - }, - "args_responseWriter": { - "@id": "urn:solid-server:default:ResponseWriter" - } - }, - - { - "@id": "urn:solid-server:default:ServerFactory", - "@type": "BaseHttpServerFactory", - "handler": { - "@id": "urn:solid-server:default:LdpHandler" - } - }, - { - "@id": "urn:solid-server:default:RoutingResourceStore", - "@type": "PassthroughStore", - "source": { - "@id": "urn:solid-server:default:variable:store" - } - }, - { - "@id": "urn:solid-server:default:variable:store", - "@type": "Variable" } ] } diff --git a/test/integration/config/run-with-redlock.json b/test/integration/config/run-with-redlock.json index 228b8022bf..e95aa0326d 100644 --- a/test/integration/config/run-with-redlock.json +++ b/test/integration/config/run-with-redlock.json @@ -1,169 +1,47 @@ { "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", "import": [ - "files-scs:config/presets/acl.json", - "files-scs:config/presets/http.json", - "files-scs:config/presets/identifiers/suffix-identifiers.json", - "files-scs:config/presets/ldp/credentials-extractor.json", - "files-scs:config/presets/ldp/metadata-handler.json", - "files-scs:config/presets/ldp/operation-handler.json", - "files-scs:config/presets/ldp/permissions-extractor.json", - "files-scs:config/presets/ldp/response-writer.json", - "files-scs:config/presets/ldp/request-parser.json", - "files-scs:config/presets/ldp/websockets.json", - "files-scs:config/presets/middleware.json", - "files-scs:config/presets/pod-management.json", - "files-scs:config/presets/representation-conversion.json", - "files-scs:config/presets/static.json", - "files-scs:config/presets/storage/backend/storage-memory.json", - "files-scs:config/presets/cli-params.json" + "files-scs:config/http/handler/simple.json", + "files-scs:config/http/middleware/no-websockets.json", + "files-scs:config/http/server-factory/no-websockets.json", + "files-scs:config/http/static/default.json", + "files-scs:config/init/handler/default.json", + "files-scs:config/ldp/authentication/debug-auth-header.json", + "files-scs:config/ldp/authorization/allow-everything.json", + "files-scs:config/ldp/handler/default.json", + "files-scs:config/ldp/metadata-parser/default.json", + "files-scs:config/ldp/metadata-writer/default.json", + "files-scs:config/ldp/permissions/acl.json", + "files-scs:config/storage/key-value/memory.json", + "files-scs:config/storage/resource-store/memory.json", + "files-scs:config/util/auxiliary/acl.json", + "files-scs:config/util/identifiers/suffix.json", + "files-scs:config/util/index/default.json", + "files-scs:config/util/logging/winston.json", + "files-scs:config/util/representation-conversion/default.json", + "files-scs:config/util/resource-locker/redis.json", + "files-scs:config/util/variables/default.json" ], "@graph": [ { + "comment": "A default setup with a Redis locker and an unsecure authorizer.", "@id": "urn:solid-server:test:Instances", "@type": "RecordObject", - "RecordObject:_record": [ + "record": [ { - "RecordObject:_record_key": "factory", - "RecordObject:_record_value": { - "@id": "urn:solid-server:default:ServerFactory" - } + "comment": "Only use the parallel initializer. Starting the server is done in the test code..", + "RecordObject:_record_key": "initializer", + "RecordObject:_record_value": { "@id": "urn:solid-server:default:ParallelInitializer" } }, { "RecordObject:_record_key": "locker", - "RecordObject:_record_value": { - "@id": "urn:solid-server:default:RedisResourceLocker" - } - } - ] - }, - { - "@id": "urn:solid-server:default:LdpHandler", - "@type": "AuthenticatedLdpHandler", - "AuthenticatedLdpHandler:_args_requestParser": { - "@id": "urn:solid-server:default:RequestParser" - }, - "AuthenticatedLdpHandler:_args_credentialsExtractor": { - "@id": "urn:solid-server:default:CredentialsExtractor" - }, - "AuthenticatedLdpHandler:_args_permissionsExtractor": { - "@id": "urn:solid-server:default:PermissionsExtractor" - }, - "AuthenticatedLdpHandler:_args_authorizer": { - "@type": "AllowEverythingAuthorizer" - }, - "AuthenticatedLdpHandler:_args_operationHandler": { - "@id": "urn:solid-server:default:OperationHandler" - }, - "AuthenticatedLdpHandler:_args_responseWriter": { - "@id": "urn:solid-server:default:ResponseWriter" - } - }, - { - "@id": "urn:solid-server:default:RoutingResourceStore", - "@type": "PassthroughStore", - "PassthroughStore:_source": { - "@id": "urn:solid-server:default:MemoryResourceStore" - } - }, - - - { - "@id": "urn:solid-server:default:ResourceStore", - "@type": "MonitoringStore", - "MonitoringStore:_source": { - "@id": "urn:solid-server:default:ResourceStore_Locking" - } - }, - - { - "@id": "urn:solid-server:default:AuxiliaryStrategy", - "@type": "RoutingAuxiliaryStrategy", - "RoutingAuxiliaryStrategy:_sources": [ + "RecordObject:_record_value": { "@id": "urn:solid-server:default:RedisResourceLocker" } + }, { - "@id": "urn:solid-server:default:AclStrategy" + "RecordObject:_record_key": "factory", + "RecordObject:_record_value": { "@id": "urn:solid-server:default:ServerFactory" } } ] - }, - - { - "@id": "urn:solid-server:default:ResourceStore_Locking", - "@type": "LockingResourceStore", - "LockingResourceStore:_source": { - "@id": "urn:solid-server:default:ResourceStore_Patching" - }, - "LockingResourceStore:_locks": { - "@id": "urn:solid-server:default:ResourceLocker" - }, - "LockingResourceStore:_strategy": { - "@id": "urn:solid-server:default:AuxiliaryStrategy" - } - }, - - { - "@id": "urn:solid-server:default:ResourceStore_Patching", - "@type": "PatchingStore", - "PatchingStore:_source": { - "@id": "urn:solid-server:default:ResourceStore_Converting" - }, - "PatchingStore:_patcher": { - "@id": "urn:solid-server:default:PatchHandler", - "@type": "SparqlUpdatePatchHandler", - "SparqlUpdatePatchHandler:_source": { - "@id": "urn:solid-server:default:ResourceStore_ToTurtle" - } - } - }, - - { - "@id": "urn:solid-server:default:ResourceLocker", - "@type": "WrappedExpiringReadWriteLocker", - "WrappedExpiringReadWriteLocker:_locker": { - "@type": "GreedyReadWriteLocker", - "GreedyReadWriteLocker:_locker": { - "@id": "urn:solid-server:default:RedisResourceLocker", - "@type": "RedisResourceLocker", - "RedisResourceLocker:_redisClients": [ "6379" ] - }, - "GreedyReadWriteLocker:_storage": { - "@type": "MemoryMapStorage" - }, - "GreedyReadWriteLocker:_suffixes_count": "count", - "GreedyReadWriteLocker:_suffixes_read": "read", - "GreedyReadWriteLocker:_suffixes_write": "write" - }, - "WrappedExpiringReadWriteLocker:_expiration": 3000 - }, - - { - "@id": "urn:solid-server:default:ResourceStore_ToTurtle", - "@type": "RepresentationConvertingStore", - "RepresentationConvertingStore:_source": { - "@id": "urn:solid-server:default:RoutingResourceStore" - }, - "RepresentationConvertingStore:_options_outConverter": { - "@id": "urn:solid-server:default:RepresentationConverter" - }, - "RepresentationConvertingStore:_options_inConverter": { - "@id": "urn:solid-server:default:RepresentationConverter" - }, - "RepresentationConvertingStore:_options_inType": "text/turtle" - }, - - { - "@id": "urn:solid-server:default:ResourceStore_Converting", - "@type": "RepresentationConvertingStore", - "RepresentationConvertingStore:_source": { - "@id": "urn:solid-server:default:RoutingResourceStore" - }, - "RepresentationConvertingStore:_options_outConverter": { - "@id": "urn:solid-server:default:RepresentationConverter" - } - }, - - { - "@id": "urn:solid-server:default:IdentityProviderHandler", - "@type": "UnsupportedAsyncHandler" } ] } diff --git a/test/integration/config/server-dynamic-unsafe.json b/test/integration/config/server-dynamic-unsafe.json index fe69c7499f..3d0c314200 100644 --- a/test/integration/config/server-dynamic-unsafe.json +++ b/test/integration/config/server-dynamic-unsafe.json @@ -1,39 +1,38 @@ { "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", "import": [ - "files-scs:config/presets/acl.json", - "files-scs:config/presets/http.json", - "files-scs:config/presets/identifiers/suffix-identifiers.json", - "files-scs:config/presets/init.json", - "files-scs:config/presets/ldp/metadata-handler.json", - "files-scs:config/presets/ldp/operation-handler.json", - "files-scs:config/presets/ldp/permissions-extractor.json", - "files-scs:config/presets/ldp/response-writer.json", - "files-scs:config/presets/ldp/request-parser.json", - "files-scs:config/presets/ldp/websockets.json", - "files-scs:config/presets/middleware.json", - "files-scs:config/presets/pod-dynamic.json", - "files-scs:config/presets/representation-conversion.json", - "files-scs:config/presets/static.json", - "files-scs:config/presets/storage/backend/storage-memory.json", - "files-scs:config/presets/storage-wrapper.json", - "files-scs:config/presets/cli-params.json" + "files-scs:config/http/handler/default.json", + "files-scs:config/http/middleware/no-websockets.json", + "files-scs:config/http/server-factory/no-websockets.json", + "files-scs:config/http/static/default.json", + "files-scs:config/init/handler/default.json", + "files-scs:config/ldp/authentication/debug-auth-header.json", + "files-scs:config/ldp/authorization/webacl.json", + "files-scs:config/ldp/handler/default.json", + "files-scs:config/ldp/metadata-parser/default.json", + "files-scs:config/ldp/metadata-writer/default.json", + "files-scs:config/ldp/permissions/acl.json", + "files-scs:config/pod/handler/dynamic.json", + "files-scs:config/storage/key-value/memory.json", + "files-scs:config/storage/resource-store/dynamic.json", + "files-scs:config/util/auxiliary/acl.json", + "files-scs:config/util/identifiers/suffix.json", + "files-scs:config/util/index/default.json", + "files-scs:config/util/logging/winston.json", + "files-scs:config/util/representation-conversion/default.json", + "files-scs:config/util/resource-locker/memory.json", + "files-scs:config/util/variables/default.json" ], "@graph": [ { - "comment": "Main changes from default are the dynamic pods and the unsafe UnsecureWebIdExtractor", + "comment": "Main changes from default are the dynamic pods and the unsafe authorizer.", "@id": "urn:solid-server:test:Instances", "@type": "RecordObject", - "RecordObject:_record": [ + "record": [ { + "comment": "Only use the parallel initializer. Starting the server is done in the test code..", "RecordObject:_record_key": "initializer", - "RecordObject:_record_value": { - "@type": "SequenceHandler", - "SequenceHandler:_handlers": [ - { "@id": "urn:solid-server:default:RootContainerInitializer" }, - { "@id": "urn:solid-server:default:AclInitializer" } - ] - } + "RecordObject:_record_value": { "@id": "urn:solid-server:default:ParallelInitializer" } }, { "RecordObject:_record_key": "factory", @@ -41,46 +40,10 @@ } ] }, - { - "@id": "urn:solid-server:default:LdpHandler", - "@type": "AuthenticatedLdpHandler", - "AuthenticatedLdpHandler:_args_requestParser": { - "@id": "urn:solid-server:default:RequestParser" - }, - "AuthenticatedLdpHandler:_args_credentialsExtractor": { - "@type": "WaterfallHandler", - "WaterfallHandler:_handlers": [ - { - "@type": "UnsecureWebIdExtractor" - }, - { - "@type": "EmptyCredentialsExtractor" - } - ] - }, - "AuthenticatedLdpHandler:_args_permissionsExtractor": { - "@id": "urn:solid-server:default:PermissionsExtractor" - }, - "AuthenticatedLdpHandler:_args_authorizer": { - "@id": "urn:solid-server:default:AclBasedAuthorizer" - }, - "AuthenticatedLdpHandler:_args_operationHandler": { - "@id": "urn:solid-server:default:OperationHandler" - }, - "AuthenticatedLdpHandler:_args_responseWriter": { - "@id": "urn:solid-server:default:ResponseWriter" - } - }, { "@id": "urn:solid-server:default:IdentityProviderHandler", "@type": "UnsupportedAsyncHandler" }, - { - "@id": "urn:solid-server:default:BaseUrlRouterRule", - "BaseUrlRouterRule:_baseStore": { - "@id": "urn:solid-server:default:MemoryResourceStore" - } - }, { "@id": "urn:solid-server:default:ResourcesGenerator", "TemplatedResourcesGenerator:_templateFolder": "$PACKAGE_ROOT/test/assets/templates" diff --git a/test/integration/config/server-memory.json b/test/integration/config/server-memory.json index 0cb276eb2d..2f04661ec6 100644 --- a/test/integration/config/server-memory.json +++ b/test/integration/config/server-memory.json @@ -1,27 +1,28 @@ { "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", "import": [ - "files-scs:config/presets/acl.json", - "files-scs:config/presets/http.json", - "files-scs:config/presets/identifiers/suffix-identifiers.json", - "files-scs:config/presets/init.json", - "files-scs:config/presets/ldp.json", - "files-scs:config/presets/ldp/credentials-extractor.json", - "files-scs:config/presets/ldp/metadata-handler.json", - "files-scs:config/presets/ldp/operation-handler.json", - "files-scs:config/presets/ldp/permissions-extractor.json", - "files-scs:config/presets/ldp/response-writer.json", - "files-scs:config/presets/ldp/request-parser.json", - "files-scs:config/presets/ldp/websockets.json", - "files-scs:config/presets/middleware.json", - "files-scs:config/presets/pod-management.json", - "files-scs:config/presets/representation-conversion.json", - "files-scs:config/presets/static.json", - "files-scs:config/presets/storage/backend/storage-memory.json", - "files-scs:config/presets/storage-wrapper.json", - "files-scs:config/presets/cli-params.json", - "files-scs:config/presets/identity/identity-provider.json", - "files-scs:config/presets/identity/interaction-policy.json" + "files-scs:config/http/handler/default.json", + "files-scs:config/http/middleware/websockets.json", + "files-scs:config/http/server-factory/websockets.json", + "files-scs:config/http/static/default.json", + "files-scs:config/identity/handler/default.json", + "files-scs:config/init/handler/default.json", + "files-scs:config/ldp/authentication/dpop-bearer.json", + "files-scs:config/ldp/authorization/webacl.json", + "files-scs:config/ldp/handler/default.json", + "files-scs:config/ldp/metadata-parser/default.json", + "files-scs:config/ldp/metadata-writer/default.json", + "files-scs:config/ldp/permissions/acl.json", + "files-scs:config/pod/handler/static.json", + "files-scs:config/storage/key-value/memory.json", + "files-scs:config/storage/resource-store/memory.json", + "files-scs:config/util/auxiliary/acl.json", + "files-scs:config/util/identifiers/suffix.json", + "files-scs:config/util/index/default.json", + "files-scs:config/util/logging/winston.json", + "files-scs:config/util/representation-conversion/default.json", + "files-scs:config/util/resource-locker/memory.json", + "files-scs:config/util/variables/default.json" ], "@graph": [ { @@ -29,14 +30,9 @@ "@type": "RecordObject", "RecordObject:_record": [ { + "comment": "Only use the parallel initializer. Starting the server is done in the test code..", "RecordObject:_record_key": "initializer", - "RecordObject:_record_value": { - "@type": "SequenceHandler", - "SequenceHandler:_handlers": [ - { "@id": "urn:solid-server:default:RootContainerInitializer" }, - { "@id": "urn:solid-server:default:AclInitializer" } - ] - } + "RecordObject:_record_value": { "@id": "urn:solid-server:default:ParallelInitializer" } }, { "RecordObject:_record_key": "factory", @@ -59,11 +55,8 @@ "args_emailConfig_auth_pass": "NYEaCsqV7aVStRCbmC" }, { - "@id": "urn:solid-server:default:RoutingResourceStore", - "@type": "PassthroughStore", - "PassthroughStore:_source": { - "@id": "urn:solid-server:default:MemoryResourceStore" - } + "@id": "urn:solid-server:default:ResourcesGenerator", + "TemplatedResourcesGenerator:_templateFolder": "$PACKAGE_ROOT/test/assets/templates" } ] } diff --git a/test/integration/config/server-middleware.json b/test/integration/config/server-middleware.json index d0f7a67811..40e32a9613 100644 --- a/test/integration/config/server-middleware.json +++ b/test/integration/config/server-middleware.json @@ -1,20 +1,13 @@ { "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", "import": [ - "files-scs:config/presets/http.json", - "files-scs:config/presets/middleware.json", - "files-scs:config/presets/static.json", - "files-scs:config/presets/cli-params.json" + "files-scs:config/http/handler/simple.json", + "files-scs:config/http/middleware/websockets.json", + "files-scs:config/http/server-factory/websockets.json", + "files-scs:config/http/static/default.json", + "files-scs:config/util/variables/default.json" ], "@graph": [ - { - "@id": "urn:solid-server:default:IdentityProviderHandler", - "@type": "UnsupportedAsyncHandler" - }, - { - "@id": "urn:solid-server:default:PodManagerHandler", - "@type": "Variable" - }, { "@id": "urn:solid-server:default:LdpHandler", "@type": "Variable" diff --git a/test/integration/config/server-subdomains-unsafe.json b/test/integration/config/server-subdomains-unsafe.json index 1a54f97fe6..7c471e729d 100644 --- a/test/integration/config/server-subdomains-unsafe.json +++ b/test/integration/config/server-subdomains-unsafe.json @@ -1,40 +1,41 @@ { "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", "import": [ - "files-scs:config/presets/acl.json", - "files-scs:config/presets/http.json", - "files-scs:config/presets/identifiers/subdomain-identifiers.json", - "files-scs:config/presets/init.json", - "files-scs:config/presets/ldp/metadata-handler.json", - "files-scs:config/presets/ldp/operation-handler.json", - "files-scs:config/presets/ldp/permissions-extractor.json", - "files-scs:config/presets/ldp/response-writer.json", - "files-scs:config/presets/ldp/request-parser.json", - "files-scs:config/presets/ldp/websockets.json", - "files-scs:config/presets/middleware.json", - "files-scs:config/presets/pod-management.json", - "files-scs:config/presets/representation-conversion.json", - "files-scs:config/presets/static.json", - "files-scs:config/presets/storage/backend/storage-memory.json", - "files-scs:config/presets/storage/backend/storage-filesystem-subdomains.json", - "files-scs:config/presets/storage-wrapper.json", - "files-scs:config/presets/cli-params.json" + "files-scs:config/http/handler/default.json", + "files-scs:config/http/middleware/no-websockets.json", + "files-scs:config/http/server-factory/no-websockets.json", + "files-scs:config/http/static/default.json", + "files-scs:config/init/handler/default.json", + "files-scs:config/ldp/authentication/debug-auth-header.json", + "files-scs:config/ldp/authorization/webacl.json", + "files-scs:config/ldp/handler/default.json", + "files-scs:config/ldp/metadata-parser/default.json", + "files-scs:config/ldp/metadata-writer/default.json", + "files-scs:config/ldp/permissions/acl.json", + "files-scs:config/pod/handler/static.json", + "files-scs:config/storage/key-value/memory.json", + "files-scs:config/util/auxiliary/acl.json", + "files-scs:config/util/identifiers/subdomain.json", + "files-scs:config/util/index/default.json", + "files-scs:config/util/logging/winston.json", + "files-scs:config/util/representation-conversion/default.json", + "files-scs:config/util/resource-locker/memory.json", + "files-scs:config/util/variables/default.json" ], "@graph": [ { - "comment": "Main changes from default are the subdomain parts and the unsafe UnsecureWebIdExtractor", + "comment": "A default setup with an unsecure authenticator and support for subdomains.", "@id": "urn:solid-server:test:Instances", "@type": "RecordObject", - "RecordObject:_record": [ + "record": [ { + "comment": "Only use the parallel initializer. Starting the server is done in the test code..", "RecordObject:_record_key": "initializer", - "RecordObject:_record_value": { - "@type": "SequenceHandler", - "SequenceHandler:_handlers": [ - { "@id": "urn:solid-server:default:RootContainerInitializer" }, - { "@id": "urn:solid-server:default:AclInitializer" } - ] - } + "RecordObject:_record_value": { "@id": "urn:solid-server:default:ParallelInitializer" } + }, + { + "RecordObject:_record_key": "store", + "RecordObject:_record_value": { "@id": "urn:solid-server:default:ResourceStore" } }, { "RecordObject:_record_key": "factory", @@ -42,54 +43,10 @@ } ] }, - { - "@id": "urn:solid-server:default:LdpHandler", - "@type": "AuthenticatedLdpHandler", - "AuthenticatedLdpHandler:_args_requestParser": { - "@id": "urn:solid-server:default:RequestParser" - }, - "AuthenticatedLdpHandler:_args_credentialsExtractor": { - "@type": "WaterfallHandler", - "WaterfallHandler:_handlers": [ - { - "@type": "UnsecureWebIdExtractor" - }, - { - "@type": "EmptyCredentialsExtractor" - } - ] - }, - "AuthenticatedLdpHandler:_args_permissionsExtractor": { - "@id": "urn:solid-server:default:PermissionsExtractor" - }, - "AuthenticatedLdpHandler:_args_authorizer": { - "@id": "urn:solid-server:default:AclBasedAuthorizer" - }, - "AuthenticatedLdpHandler:_args_operationHandler": { - "@id": "urn:solid-server:default:OperationHandler" - }, - "AuthenticatedLdpHandler:_args_responseWriter": { - "@id": "urn:solid-server:default:ResponseWriter" - } - }, - { - "@id": "urn:solid-server:default:RoutingResourceStore", - "@type": "PassthroughStore", - "PassthroughStore:_source": { - "@id": "urn:solid-server:default:variable:store" - } - }, - { - "@id": "urn:solid-server:default:ResourcesGenerator", - "TemplatedResourcesGenerator:_templateFolder": "$PACKAGE_ROOT/test/assets/templates" - }, + { "@id": "urn:solid-server:default:IdentityProviderHandler", "@type": "UnsupportedAsyncHandler" - }, - { - "@id": "urn:solid-server:default:variable:store", - "@type": "Variable" } ] } diff --git a/test/integration/config/server-without-auth.json b/test/integration/config/server-without-auth.json index ee3ed245ee..c17307e9b0 100644 --- a/test/integration/config/server-without-auth.json +++ b/test/integration/config/server-without-auth.json @@ -1,58 +1,50 @@ { "@context": "https://linkedsoftwaredependencies.org/bundles/npm/@solid/community-server/^0.0.0/components/context.jsonld", "import": [ - "files-scs:config/presets/acl.json", - "files-scs:config/presets/http.json", - "files-scs:config/presets/identifiers/suffix-identifiers.json", - "files-scs:config/presets/ldp/credentials-extractor.json", - "files-scs:config/presets/ldp/metadata-handler.json", - "files-scs:config/presets/ldp/operation-handler.json", - "files-scs:config/presets/ldp/permissions-extractor.json", - "files-scs:config/presets/ldp/response-writer.json", - "files-scs:config/presets/ldp/request-parser.json", - "files-scs:config/presets/ldp/websockets.json", - "files-scs:config/presets/middleware.json", - "files-scs:config/presets/pod-management.json", - "files-scs:config/presets/representation-conversion.json", - "files-scs:config/presets/static.json", - "files-scs:config/presets/storage/backend/storage-memory.json", - "files-scs:config/presets/storage-wrapper.json", - "files-scs:config/presets/cli-params.json" + "files-scs:config/http/handler/default.json", + "files-scs:config/http/middleware/websockets.json", + "files-scs:config/http/server-factory/websockets.json", + "files-scs:config/http/static/default.json", + "files-scs:config/init/handler/default.json", + "files-scs:config/ldp/authentication/dpop-bearer.json", + "files-scs:config/ldp/authorization/allow-everything.json", + "files-scs:config/ldp/handler/default.json", + "files-scs:config/ldp/metadata-parser/default.json", + "files-scs:config/ldp/metadata-writer/default.json", + "files-scs:config/ldp/permissions/acl.json", + "files-scs:config/pod/handler/static.json", + "files-scs:config/storage/key-value/memory.json", + "files-scs:config/storage/resource-store/memory.json", + "files-scs:config/util/auxiliary/acl.json", + "files-scs:config/util/identifiers/suffix.json", + "files-scs:config/util/index/default.json", + "files-scs:config/util/logging/winston.json", + "files-scs:config/util/representation-conversion/default.json", + "files-scs:config/util/resource-locker/memory.json", + "files-scs:config/util/variables/default.json" ], "@graph": [ { - "@id": "urn:solid-server:default:LdpHandler", - "@type": "AuthenticatedLdpHandler", - "AuthenticatedLdpHandler:_args_requestParser": { - "@id": "urn:solid-server:default:RequestParser" - }, - "AuthenticatedLdpHandler:_args_credentialsExtractor": { - "@id": "urn:solid-server:default:CredentialsExtractor" - }, - "AuthenticatedLdpHandler:_args_permissionsExtractor": { - "@id": "urn:solid-server:default:PermissionsExtractor" - }, - "AuthenticatedLdpHandler:_args_authorizer": { - "@type": "AllowEverythingAuthorizer" - }, - "AuthenticatedLdpHandler:_args_operationHandler": { - "@id": "urn:solid-server:default:OperationHandler" - }, - "AuthenticatedLdpHandler:_args_responseWriter": { - "@id": "urn:solid-server:default:ResponseWriter" - } + "@id": "urn:solid-server:test:Instances", + "@type": "RecordObject", + "RecordObject:_record": [ + { + "comment": "Only use the parallel initializer. Starting the server is done in the test code..", + "RecordObject:_record_key": "initializer", + "RecordObject:_record_value": { "@id": "urn:solid-server:default:ParallelInitializer" } + }, + { + "RecordObject:_record_key": "factory", + "RecordObject:_record_value": { "@id": "urn:solid-server:default:ServerFactory" } + } + ] }, + { "@id": "urn:solid-server:default:IdentityProviderHandler", "@type": "UnsupportedAsyncHandler" }, - { - "@id": "urn:solid-server:default:RoutingResourceStore", - "@type": "PassthroughStore", - "PassthroughStore:_source": { - "@id": "urn:solid-server:default:MemoryResourceStore" - } - }, + { "@id": "urn:solid-server:default:ResourcesGenerator", "TemplatedResourcesGenerator:_templateFolder": "$PACKAGE_ROOT/test/assets/templates" diff --git a/test/unit/init/AppRunner.test.ts b/test/unit/init/AppRunner.test.ts index aa2f3b7a73..7b5b1af50e 100644 --- a/test/unit/init/AppRunner.test.ts +++ b/test/unit/init/AppRunner.test.ts @@ -39,7 +39,7 @@ describe('AppRunner', (): void => { dumpErrorState: true, logLevel: 'info', }, - joinFilePath(__dirname, '../../../config/config-default.json'), + joinFilePath(__dirname, '../../../config/default.json'), { port: 3000, loggingLevel: 'info', @@ -56,7 +56,7 @@ describe('AppRunner', (): void => { }); expect(manager.configRegistry.register).toHaveBeenCalledTimes(1); expect(manager.configRegistry.register) - .toHaveBeenCalledWith(joinFilePath(__dirname, '/../../../config/config-default.json')); + .toHaveBeenCalledWith(joinFilePath(__dirname, '/../../../config/default.json')); expect(manager.instantiate).toHaveBeenCalledTimes(1); expect(manager.instantiate).toHaveBeenCalledWith( 'urn:solid-server:default:Initializer', @@ -96,7 +96,7 @@ describe('AppRunner', (): void => { }); expect(manager.configRegistry.register).toHaveBeenCalledTimes(1); expect(manager.configRegistry.register) - .toHaveBeenCalledWith(joinFilePath(__dirname, '/../../../config/config-default.json')); + .toHaveBeenCalledWith(joinFilePath(__dirname, '/../../../config/default.json')); expect(manager.instantiate).toHaveBeenCalledTimes(1); expect(manager.instantiate).toHaveBeenCalledWith( 'urn:solid-server:default:Initializer', @@ -267,7 +267,7 @@ describe('AppRunner', (): void => { expect(write).toHaveBeenCalledTimes(2); expect(write).toHaveBeenNthCalledWith(1, - expect.stringMatching(/^Error: could not instantiate server from .*config-default\.json/u)); + expect.stringMatching(/^Error: could not instantiate server from .*default\.json/u)); expect(write).toHaveBeenNthCalledWith(2, expect.stringMatching(/^Error: Fatal/u)); diff --git a/test/unit/pods/generate/TemplatedPodGenerator.test.ts b/test/unit/pods/generate/TemplatedPodGenerator.test.ts index eba4c425f5..9d684139d2 100644 --- a/test/unit/pods/generate/TemplatedPodGenerator.test.ts +++ b/test/unit/pods/generate/TemplatedPodGenerator.test.ts @@ -73,7 +73,7 @@ describe('A TemplatedPodGenerator', (): void => { it('uses a default template folder if none is provided.', async(): Promise => { generator = new TemplatedPodGenerator(storeFactory, variableHandler, configStorage); - const defaultPath = joinFilePath(__dirname, '../../../../config/templates/', template); + const defaultPath = joinFilePath(__dirname, '../../../../templates/config/', template); await expect(generator.generate(identifier, settings)).resolves.toBe('store'); expect(storeFactory.generate)