solid-server 5.8.8 → 6.0.0-2a7305e7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/CONTRIBUTING.md +0 -0
- package/CONTRIBUTORS.md +0 -0
- package/Dockerfile +0 -0
- package/LICENSE.md +0 -0
- package/README.md +3 -0
- package/bin/config.json +0 -0
- package/bin/lib/cli-utils.mjs +54 -0
- package/bin/lib/cli.mjs +44 -0
- package/bin/lib/{init.js → init.mjs} +93 -94
- package/bin/lib/{invalidUsernames.js → invalidUsernames.mjs} +136 -148
- package/bin/lib/{migrateLegacyResources.js → migrateLegacyResources.mjs} +64 -69
- package/bin/lib/{options.js → options.mjs} +379 -405
- package/bin/lib/{start.js → start.mjs} +124 -148
- package/bin/lib/{updateIndex.js → updateIndex.mjs} +55 -56
- package/bin/solid +2 -2
- package/bin/solid-test +0 -0
- package/common/css/bootstrap.min.css +0 -0
- package/common/css/solid.css +0 -0
- package/common/fonts/glyphicons-halflings-regular.eot +0 -0
- package/common/fonts/glyphicons-halflings-regular.svg +0 -0
- package/common/fonts/glyphicons-halflings-regular.ttf +0 -0
- package/common/fonts/glyphicons-halflings-regular.woff +0 -0
- package/common/fonts/glyphicons-halflings-regular.woff2 +0 -0
- package/common/img/solid-emblem.svg +0 -0
- package/common/js/{auth-buttons.js → auth-buttons.mjs} +57 -67
- package/common/js/index-buttons.mjs +44 -0
- package/common/js/solid.js +0 -0
- package/common/js/solid.mjs +456 -0
- package/common/well-known/security.txt +0 -0
- package/config/{defaults.js → defaults.mjs} +22 -25
- package/config/templates/emails/delete-account.mjs +31 -0
- package/config/templates/emails/invalid-username.mjs +27 -0
- package/config/templates/emails/reset-password.mjs +31 -0
- package/config/templates/emails/welcome.mjs +23 -0
- package/config/templates/new-account/favicon.ico +0 -0
- package/config/templates/new-account/favicon.ico.acl +26 -0
- package/config/templates/new-account/profile/card$.ttl +26 -0
- package/config/templates/new-account/robots.txt +3 -0
- package/config/templates/new-account/robots.txt.acl +26 -0
- package/config/templates/new-account/settings/prefs.ttl +15 -0
- package/config/templates/new-account/settings/privateTypeIndex.ttl +4 -0
- package/config/templates/new-account/settings/publicTypeIndex.ttl +4 -0
- package/{default-templates/new-account/.meta.acl → config/templates/new-account/settings/publicTypeIndex.ttl.acl} +4 -4
- package/config/templates/new-account/settings/serverSide.ttl.acl +13 -0
- package/config/templates/new-account/settings/serverSide.ttl.inactive +12 -0
- package/config/templates/server/favicon.ico +0 -0
- package/{.well-known/.acl → config/templates/server/favicon.ico.acl} +2 -2
- package/config/templates/server/index.html +54 -0
- package/config/templates/server/robots.txt +3 -0
- package/{default-templates/server/.well-known/.acl → config/templates/server/robots.txt.acl} +2 -2
- package/config/usernames-blacklist.json +0 -0
- package/config/views/account/account-deleted.hbs +17 -0
- package/config/views/account/delete-confirm.hbs +51 -0
- package/config/views/account/delete-link-sent.hbs +17 -0
- package/config/views/account/delete.hbs +51 -0
- package/config/views/account/invalid-username.hbs +22 -0
- package/config/views/account/register-disabled.hbs +6 -0
- package/config/views/account/register-form.hbs +133 -0
- package/config/views/account/register.hbs +24 -0
- package/config/views/auth/auth-hidden-fields.hbs +8 -0
- package/config/views/auth/change-password.hbs +58 -0
- package/config/views/auth/goodbye.hbs +23 -0
- package/config/views/auth/login-required.hbs +34 -0
- package/config/views/auth/login-tls.hbs +11 -0
- package/config/views/auth/login-username-password.hbs +28 -0
- package/config/views/auth/login.hbs +55 -0
- package/config/views/auth/no-permission.hbs +29 -0
- package/config/views/auth/password-changed.hbs +27 -0
- package/config/views/auth/reset-link-sent.hbs +21 -0
- package/config/views/auth/reset-password.hbs +52 -0
- package/config/views/auth/sharing.hbs +49 -0
- package/config/views/shared/create-account.hbs +8 -0
- package/config/views/shared/error.hbs +5 -0
- package/config.json-default +0 -0
- package/coverage/tmp/coverage-2464-1774119519703-0.json +1 -0
- package/coverage/tmp/coverage-2465-1774119498270-0.json +1 -0
- package/default-templates/emails/delete-account.mjs +31 -0
- package/default-templates/emails/invalid-username.mjs +27 -0
- package/default-templates/emails/reset-password.mjs +31 -0
- package/default-templates/emails/welcome.mjs +23 -0
- package/default-templates/new-account/favicon.ico +0 -0
- package/default-templates/new-account/favicon.ico.acl +0 -0
- package/default-templates/new-account/profile/card$.ttl +0 -0
- package/default-templates/new-account/robots.txt +0 -0
- package/default-templates/new-account/robots.txt.acl +0 -0
- package/default-templates/new-account/settings/prefs.ttl +0 -0
- package/default-templates/new-account/settings/privateTypeIndex.ttl +0 -0
- package/default-templates/new-account/settings/publicTypeIndex.ttl +0 -0
- package/default-templates/new-account/settings/publicTypeIndex.ttl.acl +0 -0
- package/default-templates/new-account/settings/serverSide.ttl.acl +0 -0
- package/default-templates/new-account/settings/serverSide.ttl.inactive +0 -0
- package/default-templates/server/favicon.ico +0 -0
- package/default-templates/server/favicon.ico.acl +0 -0
- package/default-templates/server/index.html +1 -1
- package/default-templates/server/robots.txt +0 -0
- package/default-templates/server/robots.txt.acl +0 -0
- package/default-views/account/account-deleted.hbs +0 -0
- package/default-views/account/delete-confirm.hbs +0 -0
- package/default-views/account/delete-link-sent.hbs +0 -0
- package/default-views/account/delete.hbs +0 -0
- package/default-views/account/invalid-username.hbs +0 -0
- package/default-views/account/register-disabled.hbs +0 -0
- package/default-views/account/register-form.hbs +0 -0
- package/default-views/account/register.hbs +0 -0
- package/default-views/auth/auth-hidden-fields.hbs +0 -0
- package/default-views/auth/change-password.hbs +0 -0
- package/default-views/auth/goodbye.hbs +0 -0
- package/default-views/auth/login-required.hbs +0 -0
- package/default-views/auth/login-tls.hbs +0 -0
- package/default-views/auth/login-username-password.hbs +0 -0
- package/default-views/auth/login.hbs +0 -0
- package/default-views/auth/no-permission.hbs +0 -0
- package/default-views/auth/password-changed.hbs +0 -0
- package/default-views/auth/reset-link-sent.hbs +0 -0
- package/default-views/auth/reset-password.hbs +0 -0
- package/default-views/auth/sharing.hbs +0 -0
- package/default-views/shared/create-account.hbs +0 -0
- package/default-views/shared/error.hbs +0 -0
- package/docker-compose.yml +0 -0
- package/docker-image/CONTRIBUTING.md +33 -0
- package/docker-image/Makefile +32 -0
- package/docker-image/README.md +65 -0
- package/docker-image/examples/docker-compose.all-in-one.yml +76 -0
- package/docker-image/examples/docker-compose.nginx.yml +51 -0
- package/docker-image/examples/docker-compose.simple.yml +34 -0
- package/docker-image/src/Dockerfile +34 -0
- package/docker-image/src/checks.sh +56 -0
- package/docker-image/src/create-temporary-cert.sh +14 -0
- package/docker-image/src/entrypoint.sh +8 -0
- package/{common/img/.gitkeep → docker-image/test/__init__.py} +0 -0
- package/docker-image/test/conftest.py +15 -0
- package/docker-image/test/test_image_foundations.py +51 -0
- package/docker-image/test/test_non_accessible_key_cert.py +36 -0
- package/docker-image/test/test_precondition_checks.py +41 -0
- package/docker-image/test/test_solid_default_config.py +66 -0
- package/docker-image/test/test_volumes.py +55 -0
- package/docker-image/test/wait_for_container.py +8 -0
- package/docs/how-to-delete-your-account.md +0 -0
- package/docs/login-and-grant-access-to-application.md +0 -0
- package/eslint.config.mjs +102 -0
- package/examples/custom-error-handling.js +0 -0
- package/examples/custom-error-handling.mjs +29 -0
- package/examples/ldp-with-webid.js +0 -0
- package/examples/ldp-with-webid.mjs +12 -0
- package/examples/simple-express-app.js +0 -0
- package/examples/simple-express-app.mjs +20 -0
- package/examples/simple-ldp-server.js +0 -0
- package/examples/simple-ldp-server.mjs +8 -0
- package/favicon.ico +0 -0
- package/favicon.ico.acl +0 -0
- package/index.cjs +4 -0
- package/index.html +0 -0
- package/index.mjs +23 -0
- package/lib/{acl-checker.js → acl-checker.mjs} +13 -17
- package/lib/api/accounts/{user-accounts.js → user-accounts.mjs} +17 -16
- package/lib/api/authn/{force-user.js → force-user.mjs} +5 -4
- package/lib/api/authn/index.mjs +8 -0
- package/lib/api/authn/{webid-oidc.js → webid-oidc.mjs} +27 -20
- package/lib/api/authn/{webid-tls.js → webid-tls.mjs} +12 -11
- package/lib/api/index.mjs +7 -0
- package/lib/{capability-discovery.js → capability-discovery.mjs} +3 -6
- package/lib/common/{fs-utils.js → fs-utils.mjs} +35 -43
- package/lib/common/template-utils.mjs +29 -0
- package/lib/common/{user-utils.js → user-utils.mjs} +24 -28
- package/lib/{create-app.js → create-app.mjs} +372 -361
- package/lib/{create-server.js → create-server.mjs} +34 -13
- package/lib/debug.mjs +37 -0
- package/lib/handlers/{allow.js → allow.mjs} +79 -83
- package/lib/handlers/{auth-proxy.js → auth-proxy.mjs} +4 -5
- package/lib/handlers/{copy.js → copy.mjs} +35 -39
- package/lib/handlers/{cors-proxy.js → cors-proxy.mjs} +10 -14
- package/lib/handlers/{delete.js → delete.mjs} +20 -22
- package/lib/handlers/{error-pages.js → error-pages.mjs} +144 -212
- package/lib/handlers/{get.js → get.mjs} +258 -252
- package/lib/handlers/{index.js → index.mjs} +7 -10
- package/lib/handlers/{notify.js → notify.mjs} +8 -10
- package/lib/handlers/{options.js → options.mjs} +3 -7
- package/lib/handlers/patch/{n3-patch-parser.js → n3-patch-parser.mjs} +57 -59
- package/lib/handlers/patch/{sparql-update-parser.js → sparql-update-parser.mjs} +14 -16
- package/lib/handlers/{patch.js → patch.mjs} +241 -235
- package/lib/handlers/{post.js → post.mjs} +101 -99
- package/lib/handlers/{put.js → put.mjs} +101 -105
- package/lib/handlers/{restrict-to-top-domain.js → restrict-to-top-domain.mjs} +2 -2
- package/lib/{header.js → header.mjs} +138 -143
- package/lib/{http-error.js → http-error.mjs} +35 -34
- package/lib/{ldp-container.js → ldp-container.mjs} +10 -12
- package/lib/ldp-copy.mjs +82 -0
- package/lib/ldp-middleware.mjs +38 -0
- package/lib/{ldp.js → ldp.mjs} +288 -79
- package/lib/{lock.js → lock.mjs} +10 -10
- package/lib/{metadata.js → metadata.mjs} +11 -11
- package/lib/models/account-manager.mjs +297 -0
- package/lib/models/account-template.mjs +70 -0
- package/lib/models/authenticator.mjs +161 -0
- package/lib/models/oidc-manager.mjs +22 -0
- package/lib/models/solid-host.mjs +63 -0
- package/lib/models/user-account.mjs +50 -0
- package/lib/models/webid-tls-certificate.mjs +97 -0
- package/lib/{payment-pointer-discovery.js → payment-pointer-discovery.mjs} +5 -8
- package/lib/{rdf-notification-template.js → rdf-notification-template.mjs} +3 -5
- package/lib/requests/add-cert-request.mjs +70 -0
- package/lib/requests/auth-request.mjs +151 -0
- package/lib/requests/{create-account-request.js → create-account-request.mjs} +249 -452
- package/lib/requests/delete-account-confirm-request.mjs +85 -0
- package/lib/requests/{delete-account-request.js → delete-account-request.mjs} +73 -134
- package/lib/requests/login-request.mjs +89 -0
- package/lib/requests/{password-change-request.js → password-change-request.mjs} +132 -201
- package/lib/requests/{password-reset-email-request.js → password-reset-email-request.mjs} +123 -202
- package/lib/requests/password-reset-request.mjs +47 -0
- package/lib/requests/register-request.mjs +48 -0
- package/lib/requests/{sharing-request.js → sharing-request.mjs} +174 -261
- package/lib/{resource-mapper.js → resource-mapper.mjs} +8 -9
- package/lib/{server-config.js → server-config.mjs} +15 -20
- package/lib/services/{blacklist-service.js → blacklist-service.mjs} +36 -33
- package/lib/services/email-service.mjs +76 -0
- package/lib/services/{token-service.js → token-service.mjs} +36 -44
- package/lib/{utils.js → utils.mjs} +307 -254
- package/lib/webid/{index.js → index.mjs} +9 -13
- package/lib/webid/lib/{get.js → get.mjs} +30 -35
- package/lib/webid/lib/{parse.js → parse.mjs} +10 -12
- package/lib/webid/lib/verify.mjs +77 -0
- package/lib/webid/tls/generate.mjs +53 -0
- package/lib/webid/tls/index.mjs +6 -0
- package/package.json +77 -56
- package/renovate.json +0 -0
- package/robots.txt +0 -0
- package/robots.txt.acl +0 -0
- package/solid-server-6.0.0.tgz +0 -0
- package/static/account-recovery.html +0 -0
- package/static/popup-redirect.html +0 -0
- package/static/signup.html +0 -0
- package/static/signup.html.acl +0 -0
- package/test/index.mjs +167 -0
- package/test/integration/account-creation-tls-test.mjs +127 -0
- package/test/integration/account-manager-test.mjs +150 -0
- package/test/integration/account-template-test.mjs +135 -0
- package/test/integration/acl-oidc-test.mjs +1047 -0
- package/test/integration/acl-tls-test.mjs +964 -0
- package/test/integration/auth-proxy-test.mjs +144 -0
- package/test/integration/authentication-oidc-test.mjs +817 -0
- package/test/integration/authentication-oidc-with-strict-origins-turned-off-test.mjs +643 -0
- package/test/integration/capability-discovery-test.mjs +115 -0
- package/test/integration/cors-proxy-test.mjs +145 -0
- package/test/integration/errors-oidc-test.mjs +109 -0
- package/test/integration/errors-test.mjs +49 -0
- package/test/integration/formats-test.mjs +136 -0
- package/test/integration/header-test.mjs +101 -0
- package/test/integration/http-copy-test.mjs +109 -0
- package/test/integration/http-test.mjs +1197 -0
- package/test/integration/ldp-test.mjs +528 -0
- package/test/integration/oidc-manager-test.mjs +135 -0
- package/test/integration/params-test.mjs +192 -0
- package/test/integration/patch-sparql-update-test.mjs +195 -0
- package/test/integration/patch-test.mjs +590 -0
- package/test/integration/payment-pointer-test.mjs +155 -0
- package/test/integration/prep-test.mjs +314 -0
- package/test/integration/quota-test.mjs +50 -0
- package/test/integration/special-root-acl-handling-test.mjs +68 -0
- package/test/integration/validate-tts-test.mjs +57 -0
- package/test/integration/www-account-creation-oidc-test.mjs +310 -0
- package/test/keys/cert.pem +21 -0
- package/test/keys/client-cert.pem +19 -0
- package/test/keys/client-key.pem +27 -0
- package/test/keys/key.pem +27 -0
- package/test/keys/user1-cert.pem +23 -0
- package/test/keys/user1-key.pem +28 -0
- package/test/keys/user2-cert.pem +23 -0
- package/test/keys/user2-key.pem +27 -0
- package/test/mocha.opts +2 -0
- package/test/resources/Makefile +146 -0
- package/test/resources/accounts/alice.localhost/profile/card +0 -0
- package/test/resources/accounts/db/oidc/op/clients/_key_8f4057a9910720d670db30e886e55a28.json +1 -0
- package/test/resources/accounts/db/oidc/op/provider.json +763 -0
- package/test/resources/accounts/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A3457.json +1 -0
- package/test/resources/accounts/localhost/samplePublicContainer/nicola.jpg +0 -0
- package/test/resources/accounts/tim.localhost/hello.html +9 -0
- package/test/resources/accounts/tim.localhost/profile/card +0 -0
- package/{default-templates/emails/welcome.js → test/resources/accounts-acl/config/templates/emails/welcome-test.js} +0 -0
- package/test/resources/accounts-acl/config/templates/new-account/favicon.ico +0 -0
- package/test/resources/accounts-acl/config/templates/new-account/favicon.ico.acl +26 -0
- package/test/resources/accounts-acl/config/templates/new-account/index.html +28 -0
- package/test/resources/accounts-acl/config/templates/new-account/index.html.acl +22 -0
- package/test/resources/accounts-acl/config/templates/new-account/profile/card +27 -0
- package/{default-templates/new-account/inbox/.acl → test/resources/accounts-acl/config/templates/new-account/profile/card.acl} +5 -6
- package/test/resources/accounts-acl/config/templates/new-account/settings/prefs.ttl +9 -0
- package/test/resources/accounts-acl/config/templates/new-account/settings/privateTypeIndex.ttl +4 -0
- package/test/resources/accounts-acl/config/templates/new-account/settings/publicTypeIndex.ttl +4 -0
- package/test/resources/accounts-acl/config/templates/new-account/settings/publicTypeIndex.ttl.acl +25 -0
- package/test/resources/accounts-acl/config/templates/new-account/settings/serverSide.ttl +14 -0
- package/test/resources/accounts-acl/config/templates/server/index.html +35 -0
- package/{.acl → test/resources/accounts-acl/config/templates/server/index.html.acl} +4 -3
- package/test/resources/accounts-acl/config/views/account/register.hbs +58 -0
- package/test/resources/accounts-acl/config/views/auth/consent.hbs +49 -0
- package/test/resources/accounts-acl/config/views/auth/goodbye.hbs +20 -0
- package/test/resources/accounts-acl/config/views/auth/login-required.hbs +0 -0
- package/test/resources/accounts-acl/config/views/auth/login.hbs +51 -0
- package/test/resources/accounts-acl/config/views/auth/no-permission.hbs +0 -0
- package/test/resources/accounts-acl/db/oidc/op/clients/_key_77bb3b35edb1f3f7b887c25d1211a491.json +1 -0
- package/test/resources/accounts-acl/db/oidc/op/provider.json +763 -0
- package/test/resources/accounts-acl/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A7777.json +1 -0
- package/test/resources/accounts-acl/localhost/favicon.ico +0 -0
- package/test/resources/accounts-acl/localhost/index.html +35 -0
- package/{default-templates/server/.acl → test/resources/accounts-acl/localhost/index.html.acl} +4 -3
- package/test/resources/accounts-acl/nicola.localhost/index.html +1 -0
- package/test/resources/accounts-acl/nicola.localhost/index.html.acl +10 -0
- package/test/resources/accounts-acl/quota/settings/serverSide.ttl +11 -0
- package/test/resources/accounts-acl/tim.localhost/append-acl/abc.ttl +1 -0
- package/test/resources/accounts-acl/tim.localhost/append-acl/abc.ttl.acl +8 -0
- package/test/resources/accounts-acl/tim.localhost/append-acl/abc2.ttl +1 -0
- package/test/resources/accounts-acl/tim.localhost/append-acl/abc2.ttl.acl +8 -0
- package/test/resources/accounts-acl/tim.localhost/fake-account/hello.html +9 -0
- package/test/resources/accounts-acl/tim.localhost/group/test-folder/group-listing-error.ttl +1 -0
- package/test/resources/accounts-acl/tim.localhost/group/test-folder/group-listing.ttl +14 -0
- package/test/resources/accounts-acl/tim.localhost/group/test-folder/some-other-file.txt +1 -0
- package/test/resources/accounts-acl/tim.localhost/multi-server/protected.txt +1 -0
- package/test/resources/accounts-acl/tim.localhost/multi-server/protected.txt.acl +8 -0
- package/test/resources/accounts-acl/tim.localhost/no-acl/test-file.html +1 -0
- package/test/resources/accounts-acl/tim.localhost/read-acl/deeper-tree/acls-only-on-top/example.ttl +1 -0
- package/test/resources/accounts-acl/tim.localhost/write-acl/test-file$.txt +1 -0
- package/test/resources/accounts-scenario/alice/db/oidc/op/clients/_key_6650825912d0863cdf3912a7cf126e5b.json +1 -0
- package/test/resources/accounts-scenario/alice/db/oidc/op/provider.json +986 -0
- package/test/resources/accounts-scenario/alice/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A7000.json +1 -0
- package/test/resources/accounts-scenario/alice/private-for-alice.txt +1 -0
- package/test/resources/accounts-scenario/alice/private-for-alice.txt.acl +12 -0
- package/test/resources/accounts-scenario/alice/profile/card$.ttl +10 -0
- package/test/resources/accounts-scenario/bob/db/oidc/op/clients/_key_48169a1b331d035f37baa3a86a58ea6d.json +1 -0
- package/test/resources/accounts-scenario/bob/db/oidc/op/provider.json +986 -0
- package/test/resources/accounts-scenario/bob/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A7001.json +1 -0
- package/test/resources/accounts-scenario/bob/profile/card$.ttl +5 -0
- package/test/resources/accounts-scenario/bob/shared-with-alice.txt +1 -0
- package/test/resources/accounts-scenario/bob/shared-with-alice.txt.acl +15 -0
- package/test/resources/accounts-scenario/charlie/db/oidc/op/clients/_key_0d74487d00832e8e7c7f26a452deb3b5.json +1 -0
- package/test/resources/accounts-scenario/charlie/db/oidc/op/provider.json +759 -0
- package/test/resources/accounts-scenario/charlie/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A5002.json +1 -0
- package/test/resources/accounts-scenario/charlie/profile/card$.ttl +5 -0
- package/test/resources/accounts-strict-origin-off/alice/db/oidc/op/clients/_key_ab533276eb849645e8a501eae3e9ab0f.json +1 -0
- package/test/resources/accounts-strict-origin-off/alice/db/oidc/op/provider.json +763 -0
- package/test/resources/accounts-strict-origin-off/alice/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A7010.json +1 -0
- package/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt +1 -0
- package/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt.acl +12 -0
- package/test/resources/accounts-strict-origin-off/alice/profile/card$.ttl +10 -0
- package/test/resources/accounts-strict-origin-off/bob/db/oidc/op/clients/_key_819fda7216ab836c5505938973c74c34.json +1 -0
- package/test/resources/accounts-strict-origin-off/bob/db/oidc/op/provider.json +763 -0
- package/test/resources/accounts-strict-origin-off/bob/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A7011.json +1 -0
- package/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt +1 -0
- package/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt.acl +15 -0
- package/{default-templates → test/resources/acl-tls/config/templates}/emails/delete-account.js +0 -0
- package/{default-templates → test/resources/acl-tls/config/templates}/emails/invalid-username.js +0 -0
- package/{default-templates → test/resources/acl-tls/config/templates}/emails/reset-password.js +0 -0
- package/test/resources/acl-tls/config/templates/emails/welcome.js +39 -0
- package/test/resources/acl-tls/config/templates/new-account/favicon.ico +0 -0
- package/test/resources/acl-tls/config/templates/new-account/favicon.ico.acl +26 -0
- package/test/resources/acl-tls/config/templates/new-account/profile/card$.ttl +26 -0
- package/test/resources/acl-tls/config/templates/new-account/robots.txt +3 -0
- package/test/resources/acl-tls/config/templates/new-account/robots.txt.acl +26 -0
- package/test/resources/acl-tls/config/templates/new-account/settings/prefs.ttl +15 -0
- package/test/resources/acl-tls/config/templates/new-account/settings/privateTypeIndex.ttl +4 -0
- package/test/resources/acl-tls/config/templates/new-account/settings/publicTypeIndex.ttl +4 -0
- package/test/resources/acl-tls/config/templates/new-account/settings/publicTypeIndex.ttl.acl +25 -0
- package/test/resources/acl-tls/config/templates/new-account/settings/serverSide.ttl.acl +13 -0
- package/test/resources/acl-tls/config/templates/new-account/settings/serverSide.ttl.inactive +12 -0
- package/test/resources/acl-tls/config/templates/server/favicon.ico +0 -0
- package/test/resources/acl-tls/config/templates/server/favicon.ico.acl +15 -0
- package/test/resources/acl-tls/config/templates/server/index.html +55 -0
- package/test/resources/acl-tls/config/templates/server/robots.txt +3 -0
- package/test/resources/acl-tls/config/templates/server/robots.txt.acl +15 -0
- package/test/resources/acl-tls/config/views/account/account-deleted.hbs +17 -0
- package/test/resources/acl-tls/config/views/account/delete-confirm.hbs +51 -0
- package/test/resources/acl-tls/config/views/account/delete-link-sent.hbs +17 -0
- package/test/resources/acl-tls/config/views/account/delete.hbs +51 -0
- package/test/resources/acl-tls/config/views/account/invalid-username.hbs +22 -0
- package/test/resources/acl-tls/config/views/account/register-disabled.hbs +6 -0
- package/test/resources/acl-tls/config/views/account/register-form.hbs +147 -0
- package/test/resources/acl-tls/config/views/account/register.hbs +24 -0
- package/test/resources/acl-tls/config/views/auth/auth-hidden-fields.hbs +8 -0
- package/test/resources/acl-tls/config/views/auth/change-password.hbs +58 -0
- package/test/resources/acl-tls/config/views/auth/goodbye.hbs +23 -0
- package/test/resources/acl-tls/config/views/auth/login-required.hbs +34 -0
- package/test/resources/acl-tls/config/views/auth/login-tls.hbs +11 -0
- package/test/resources/acl-tls/config/views/auth/login-username-password.hbs +28 -0
- package/test/resources/acl-tls/config/views/auth/login.hbs +55 -0
- package/test/resources/acl-tls/config/views/auth/no-permission.hbs +29 -0
- package/test/resources/acl-tls/config/views/auth/password-changed.hbs +27 -0
- package/test/resources/acl-tls/config/views/auth/reset-link-sent.hbs +21 -0
- package/test/resources/acl-tls/config/views/auth/reset-password.hbs +52 -0
- package/test/resources/acl-tls/config/views/auth/sharing.hbs +49 -0
- package/test/resources/acl-tls/config/views/shared/create-account.hbs +8 -0
- package/test/resources/acl-tls/config/views/shared/error.hbs +5 -0
- package/test/resources/acl-tls/localhost/favicon.ico +0 -0
- package/test/resources/acl-tls/localhost/favicon.ico.acl +15 -0
- package/test/resources/acl-tls/localhost/index.html +48 -0
- package/test/resources/acl-tls/localhost/robots.txt +3 -0
- package/test/resources/acl-tls/localhost/robots.txt.acl +15 -0
- package/test/resources/acl-tls/tim.localhost/append-acl/abc.ttl +1 -0
- package/test/resources/acl-tls/tim.localhost/append-acl/abc.ttl.acl +8 -0
- package/test/resources/acl-tls/tim.localhost/append-acl/abc2.ttl +1 -0
- package/test/resources/acl-tls/tim.localhost/append-acl/abc2.ttl.acl +8 -0
- package/test/resources/acl-tls/tim.localhost/fake-account/hello.html +9 -0
- package/test/resources/acl-tls/tim.localhost/no-acl/test-file.html +1 -0
- package/test/resources/acl-tls/tim.localhost/profile/card$.ttl +17 -0
- package/test/resources/acl-tls/write-acl/test-file$.ttl +1 -0
- package/test/resources/auth-proxy/index.html +0 -0
- package/test/resources/auth-proxy/index.html.acl +0 -0
- package/test/resources/config/templates/emails/delete-account.js +49 -0
- package/test/resources/config/templates/emails/delete-account.mjs +31 -0
- package/test/resources/config/templates/emails/invalid-username.js +30 -0
- package/test/resources/config/templates/emails/invalid-username.mjs +27 -0
- package/test/resources/config/templates/emails/reset-password.js +49 -0
- package/test/resources/config/templates/emails/reset-password.mjs +31 -0
- package/test/resources/config/templates/emails/welcome.js +39 -0
- package/test/resources/config/templates/emails/welcome.mjs +23 -0
- package/test/resources/config/templates/new-account/favicon.ico +0 -0
- package/test/resources/config/templates/new-account/favicon.ico.acl +26 -0
- package/test/resources/config/templates/new-account/profile/card$.ttl +26 -0
- package/test/resources/config/templates/new-account/robots.txt +3 -0
- package/test/resources/config/templates/new-account/robots.txt.acl +26 -0
- package/test/resources/config/templates/new-account/settings/prefs.ttl +15 -0
- package/test/resources/config/templates/new-account/settings/privateTypeIndex.ttl +4 -0
- package/test/resources/config/templates/new-account/settings/publicTypeIndex.ttl +4 -0
- package/test/resources/config/templates/new-account/settings/publicTypeIndex.ttl.acl +25 -0
- package/test/resources/config/templates/new-account/settings/serverSide.ttl.acl +13 -0
- package/test/resources/config/templates/new-account/settings/serverSide.ttl.inactive +12 -0
- package/test/resources/config/templates/server/favicon.ico +0 -0
- package/test/resources/config/templates/server/favicon.ico.acl +15 -0
- package/test/resources/config/templates/server/index.html +54 -0
- package/test/resources/config/templates/server/robots.txt +3 -0
- package/test/resources/config/templates/server/robots.txt.acl +15 -0
- package/test/resources/config/views/account/account-deleted.hbs +17 -0
- package/test/resources/config/views/account/delete-confirm.hbs +51 -0
- package/test/resources/config/views/account/delete-link-sent.hbs +17 -0
- package/test/resources/config/views/account/delete.hbs +51 -0
- package/test/resources/config/views/account/invalid-username.hbs +22 -0
- package/test/resources/config/views/account/register-disabled.hbs +6 -0
- package/test/resources/config/views/account/register-form.hbs +133 -0
- package/test/resources/config/views/account/register.hbs +24 -0
- package/test/resources/config/views/auth/auth-hidden-fields.hbs +8 -0
- package/test/resources/config/views/auth/change-password.hbs +58 -0
- package/test/resources/config/views/auth/goodbye.hbs +23 -0
- package/test/resources/config/views/auth/login-required.hbs +34 -0
- package/test/resources/config/views/auth/login-tls.hbs +11 -0
- package/test/resources/config/views/auth/login-username-password.hbs +28 -0
- package/test/resources/config/views/auth/login.hbs +55 -0
- package/test/resources/config/views/auth/no-permission.hbs +29 -0
- package/test/resources/config/views/auth/password-changed.hbs +27 -0
- package/test/resources/config/views/auth/reset-link-sent.hbs +21 -0
- package/test/resources/config/views/auth/reset-password.hbs +52 -0
- package/test/resources/config/views/auth/sharing.hbs +49 -0
- package/test/resources/config/views/shared/create-account.hbs +8 -0
- package/test/resources/config/views/shared/error.hbs +5 -0
- package/test/resources/empty.spatch +0 -0
- package/test/resources/errorPages/401.html +5 -0
- package/test/resources/errorPages/403.html +5 -0
- package/test/resources/errorPages/404.html +5 -0
- package/test/resources/errorPages/405.html +5 -0
- package/test/resources/errorPages/415.html +5 -0
- package/test/resources/errorPages/500.html +5 -0
- package/test/resources/example_spkac.cnf +1 -0
- package/test/resources/external-servers/example.com/jwks.json +81 -0
- package/test/resources/external-servers/example.com/openid-configuration.json +53 -0
- package/test/resources/favicon.ico +0 -0
- package/test/resources/favicon.ico.acl +15 -0
- package/test/resources/headers/index.html +0 -0
- package/test/resources/headers/public-ra +0 -0
- package/test/resources/headers/public-ra.acl +7 -0
- package/test/resources/headers/user-rw-public-r +0 -0
- package/test/resources/headers/user-rw-public-r.acl +12 -0
- package/test/resources/headers/user-rwac-public-0 +0 -0
- package/test/resources/headers/user-rwac-public-0.acl +7 -0
- package/test/resources/hello.html +3 -0
- package/test/resources/invalid1.ttl +13 -0
- package/test/resources/invalid2.ttl +9 -0
- package/test/resources/ldpatch-example-final.ttl +23 -0
- package/test/resources/ldpatch-example-initial.ttl +22 -0
- package/test/resources/ldpatch-example-patch-1.spatch +8 -0
- package/test/resources/ldpatch-example-patch-2.spatch +12 -0
- package/test/resources/ldpatch-example-patch-3.spatch +14 -0
- package/test/resources/ldpatch-example-patch.ldpatch +25 -0
- package/test/resources/ldpatch-example-patch.spatch +24 -0
- package/test/resources/lennon.jsonld +7 -0
- package/test/resources/lfs-0.sparql +9 -0
- package/test/resources/lfs-1-final.json +10 -0
- package/test/resources/lfs-1.sparql +11 -0
- package/test/resources/messaging-scenario/user1.databox.me/profile/card +21 -0
- package/test/resources/nicola.jpg +0 -0
- package/test/resources/patch/append-only.ttl +2 -0
- package/test/resources/patch/append-only.ttl.acl +6 -0
- package/test/resources/patch/favicon.ico +0 -0
- package/test/resources/patch/favicon.ico.acl +15 -0
- package/test/resources/patch/index.html +0 -0
- package/test/resources/patch/read-append.ttl +2 -0
- package/test/resources/patch/read-append.ttl.acl +6 -0
- package/test/resources/patch/read-only.ttl +2 -0
- package/test/resources/patch/read-only.ttl.acl +6 -0
- package/test/resources/patch/read-write.ttl +2 -0
- package/test/resources/patch/read-write.ttl.acl +6 -0
- package/test/resources/patch/robots.txt +3 -0
- package/test/resources/patch/robots.txt.acl +15 -0
- package/test/resources/patch/write-only.ttl +2 -0
- package/test/resources/patch/write-only.ttl.acl +6 -0
- package/test/resources/patch-1-initial.ttl +3 -0
- package/test/resources/patch-2-final.ttl +2 -0
- package/test/resources/patch-2-initial.ttl +3 -0
- package/test/resources/patch-2.spatch +2 -0
- package/test/resources/patch-2n.spatch +2 -0
- package/test/resources/patch-3-final.ttl +28 -0
- package/test/resources/patch-4-final.ttl +29 -0
- package/test/resources/patch-5-final.ttl +1 -0
- package/test/resources/patch-5-initial.ttl +3 -0
- package/test/resources/patch-5.spatch +2 -0
- package/test/resources/put-input-2.html +13 -0
- package/test/resources/put-input.txt +6 -0
- package/test/resources/robots.txt +3 -0
- package/test/resources/robots.txt.acl +15 -0
- package/test/resources/sampleContainer/blank +0 -0
- package/test/resources/sampleContainer/cert.pkcs +0 -0
- package/test/resources/sampleContainer/example.ttl.old +1 -0
- package/test/resources/sampleContainer/example1.ttl +12 -0
- package/test/resources/sampleContainer/example2.ttl +3 -0
- package/test/resources/sampleContainer/example3.ttl +7 -0
- package/test/resources/sampleContainer/example4$.ttl +7 -0
- package/test/resources/sampleContainer/filename with spaces.txt +0 -0
- package/test/resources/sampleContainer/index.html +9 -0
- package/test/resources/sampleContainer/post2.ttl +6 -0
- package/test/resources/sampleContainer/put1.ttl +13 -0
- package/test/resources/sampleContainer/solid.png +0 -0
- package/test/resources/sampleContainer/user1.pfx +0 -0
- package/test/resources/sampleContainer/user2.pfx +0 -0
- package/test/resources/sampleContainer2/example1.ttl +10 -0
- package/test/resources/sampleContainer2/example2.ttl +7 -0
- package/test/resources/timbl.jpg +0 -0
- package/test/scenarios.md +23 -0
- package/test/surface/docker/cookie/Dockerfile +6 -0
- package/test/surface/docker/cookie/app/index.js +29 -0
- package/test/surface/docker/cookie/app/package-lock.json +13 -0
- package/test/surface/docker/cookie/app/package.json +14 -0
- package/test/surface/docker/server/Dockerfile +19 -0
- package/test/surface/docker/server/config/defaults.js +10 -0
- package/test/surface/docker/server/config/templates/emails/delete-account.js +49 -0
- package/test/surface/docker/server/config/templates/emails/invalid-username.js +30 -0
- package/test/surface/docker/server/config/templates/emails/reset-password.js +49 -0
- package/test/surface/docker/server/config/templates/emails/welcome.js +39 -0
- package/test/surface/docker/server/config/templates/new-account/favicon.ico +0 -0
- package/test/surface/docker/server/config/templates/new-account/favicon.ico.acl +26 -0
- package/test/surface/docker/server/config/templates/new-account/profile/card$.ttl +26 -0
- package/test/surface/docker/server/config/templates/new-account/robots.txt +3 -0
- package/test/surface/docker/server/config/templates/new-account/robots.txt.acl +26 -0
- package/test/surface/docker/server/config/templates/new-account/settings/prefs.ttl +15 -0
- package/test/surface/docker/server/config/templates/new-account/settings/privateTypeIndex.ttl +4 -0
- package/test/surface/docker/server/config/templates/new-account/settings/publicTypeIndex.ttl +4 -0
- package/test/surface/docker/server/config/templates/new-account/settings/publicTypeIndex.ttl.acl +25 -0
- package/test/surface/docker/server/config/templates/new-account/settings/serverSide.ttl.acl +13 -0
- package/test/surface/docker/server/config/templates/new-account/settings/serverSide.ttl.inactive +12 -0
- package/test/surface/docker/server/config/templates/server/favicon.ico +0 -0
- package/test/surface/docker/server/config/templates/server/favicon.ico.acl +15 -0
- package/test/surface/docker/server/config/templates/server/index.html +55 -0
- package/test/surface/docker/server/config/templates/server/robots.txt +3 -0
- package/test/surface/docker/server/config/templates/server/robots.txt.acl +15 -0
- package/test/surface/docker/server/config/usernames-blacklist.json +4 -0
- package/test/surface/docker/server/config/views/account/account-deleted.hbs +17 -0
- package/test/surface/docker/server/config/views/account/delete-confirm.hbs +51 -0
- package/test/surface/docker/server/config/views/account/delete-link-sent.hbs +17 -0
- package/test/surface/docker/server/config/views/account/delete.hbs +51 -0
- package/test/surface/docker/server/config/views/account/invalid-username.hbs +22 -0
- package/test/surface/docker/server/config/views/account/register-disabled.hbs +6 -0
- package/test/surface/docker/server/config/views/account/register-form.hbs +147 -0
- package/test/surface/docker/server/config/views/account/register.hbs +24 -0
- package/test/surface/docker/server/config/views/auth/auth-hidden-fields.hbs +8 -0
- package/test/surface/docker/server/config/views/auth/change-password.hbs +58 -0
- package/test/surface/docker/server/config/views/auth/goodbye.hbs +23 -0
- package/test/surface/docker/server/config/views/auth/login-required.hbs +34 -0
- package/test/surface/docker/server/config/views/auth/login-tls.hbs +11 -0
- package/test/surface/docker/server/config/views/auth/login-username-password.hbs +28 -0
- package/test/surface/docker/server/config/views/auth/login.hbs +55 -0
- package/test/surface/docker/server/config/views/auth/no-permission.hbs +29 -0
- package/test/surface/docker/server/config/views/auth/password-changed.hbs +27 -0
- package/test/surface/docker/server/config/views/auth/reset-link-sent.hbs +21 -0
- package/test/surface/docker/server/config/views/auth/reset-password.hbs +52 -0
- package/test/surface/docker/server/config/views/auth/sharing.hbs +49 -0
- package/test/surface/docker/server/config/views/shared/create-account.hbs +8 -0
- package/test/surface/docker/server/config/views/shared/error.hbs +5 -0
- package/test/surface/docker/server/config.json +22 -0
- package/test/surface/docker/server/data/favicon.ico +0 -0
- package/test/surface/docker/server/data/favicon.ico.acl +26 -0
- package/test/surface/docker/server/data/index.html +48 -0
- package/test/surface/docker/server/data/profile/card$.ttl +31 -0
- package/test/surface/docker/server/data/robots.txt +3 -0
- package/test/surface/docker/server/data/robots.txt.acl +26 -0
- package/test/surface/docker/server/data/settings/prefs.ttl +15 -0
- package/test/surface/docker/server/data/settings/privateTypeIndex.ttl +4 -0
- package/test/surface/docker/server/data/settings/publicTypeIndex.ttl +4 -0
- package/test/surface/docker/server/data/settings/publicTypeIndex.ttl.acl +25 -0
- package/test/surface/docker/server/data/settings/serverSide.ttl +0 -0
- package/test/surface/docker/server/data/settings/serverSide.ttl.acl +13 -0
- package/test/surface/docker/server/data/settings/serverSide.ttl.inactive +12 -0
- package/test/surface/docker/server/env.list +4 -0
- package/test/surface/docker/solid-crud/Dockerfile +4 -0
- package/test/surface/docker/web-access-control/Dockerfile +1 -0
- package/test/surface/docker/webid-provider/Dockerfile +1 -0
- package/test/surface/run-solid-test-suite.sh +75 -0
- package/test/surface/server-env.list +5 -0
- package/test/surface/solid-crud-tests-env.list +5 -0
- package/test/surface/thirdparty-config.json +23 -0
- package/test/surface/thirdparty-env.list +6 -0
- package/test/surface/web-access-control-tests-env.list +6 -0
- package/test/surface/webid-provider-tests-env.list +4 -0
- package/test/test-helpers.mjs +63 -0
- package/test/unit/account-manager-test.mjs +610 -0
- package/test/unit/account-template-test.mjs +58 -0
- package/test/unit/acl-checker-test.mjs +51 -0
- package/test/unit/add-cert-request-test.mjs +119 -0
- package/test/unit/auth-handlers-test.mjs +108 -0
- package/test/unit/auth-proxy-test.mjs +224 -0
- package/test/unit/auth-request-test.mjs +96 -0
- package/test/unit/authenticator-test.mjs +34 -0
- package/test/unit/blacklist-service-test.mjs +49 -0
- package/test/unit/create-account-request-test.mjs +306 -0
- package/test/unit/delete-account-confirm-request-test.mjs +234 -0
- package/test/unit/delete-account-request-test.mjs +180 -0
- package/test/unit/email-service-test.mjs +165 -0
- package/test/unit/email-welcome-test.mjs +80 -0
- package/test/unit/error-pages-test.mjs +100 -0
- package/test/unit/esm-imports.test.mjs +148 -0
- package/test/unit/force-user-test.mjs +73 -0
- package/test/unit/getAvailableUrl-test.mjs +30 -0
- package/test/unit/getTrustedOrigins-test.mjs +20 -0
- package/test/unit/login-request-test.mjs +246 -0
- package/test/unit/oidc-manager-test.mjs +49 -0
- package/test/unit/password-authenticator-test.mjs +125 -0
- package/test/unit/password-change-request-test.mjs +259 -0
- package/test/unit/password-reset-email-request-test.mjs +234 -0
- package/test/unit/resource-mapper-test.mjs +673 -0
- package/test/unit/solid-host-test.mjs +118 -0
- package/test/unit/tls-authenticator-test.mjs +174 -0
- package/test/unit/token-service-test.mjs +82 -0
- package/test/unit/user-account-test.mjs +37 -0
- package/test/unit/user-accounts-api-test.mjs +59 -0
- package/test/unit/user-utils-test.mjs +64 -0
- package/test/unit/utils-test.mjs +112 -0
- package/test/utils/index.mjs +166 -0
- package/test/utils.mjs +204 -0
- package/test/validate-turtle.mjs +42 -0
- package/.github/workflows/ci.yml +0 -113
- package/.nvmrc +0 -1
- package/.snyk +0 -35
- package/bin/lib/cli-utils.js +0 -85
- package/bin/lib/cli.js +0 -39
- package/bin/solid.js +0 -3
- package/common/js/index-buttons.js +0 -44
- package/default-templates/new-account/.acl +0 -26
- package/default-templates/new-account/.meta +0 -5
- package/default-templates/new-account/.well-known/.acl +0 -19
- package/default-templates/new-account/private/.acl +0 -10
- package/default-templates/new-account/profile/.acl +0 -19
- package/default-templates/new-account/public/.acl +0 -19
- package/default-templates/new-account/settings/.acl +0 -20
- package/index.js +0 -3
- package/lib/api/authn/index.js +0 -5
- package/lib/api/index.js +0 -6
- package/lib/common/template-utils.js +0 -50
- package/lib/debug.js +0 -18
- package/lib/ldp-copy.js +0 -73
- package/lib/ldp-middleware.js +0 -40
- package/lib/models/account-manager.js +0 -604
- package/lib/models/account-template.js +0 -156
- package/lib/models/authenticator.js +0 -337
- package/lib/models/oidc-manager.js +0 -53
- package/lib/models/solid-host.js +0 -131
- package/lib/models/user-account.js +0 -113
- package/lib/models/webid-tls-certificate.js +0 -184
- package/lib/requests/add-cert-request.js +0 -138
- package/lib/requests/auth-request.js +0 -234
- package/lib/requests/delete-account-confirm-request.js +0 -170
- package/lib/requests/login-request.js +0 -205
- package/lib/services/email-service.js +0 -162
- package/lib/webid/tls/index.js +0 -185
package/lib/{ldp.js → ldp.mjs}
RENAMED
|
@@ -1,28 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const ldpContainer = require('./ldp-container')
|
|
19
|
-
const parse = require('./utils').parse
|
|
20
|
-
const fetch = require('node-fetch')
|
|
21
|
-
const { promisify } = require('util')
|
|
22
|
-
const URL = require('url')
|
|
23
|
-
const withLock = require('./lock')
|
|
24
|
-
const utilPath = require('path')
|
|
25
|
-
const { clearAclCache } = require('./acl-checker')
|
|
1
|
+
import utilPath, { join, dirname } from 'path'
|
|
2
|
+
import intoStream from 'into-stream'
|
|
3
|
+
import urlModule from 'url'
|
|
4
|
+
import fs from 'fs'
|
|
5
|
+
import $rdf from 'rdflib'
|
|
6
|
+
import { mkdirp } from 'fs-extra'
|
|
7
|
+
import { v4 as uuid } from 'uuid' // there seem to be an esm module
|
|
8
|
+
import debug from './debug.mjs'
|
|
9
|
+
import error from './http-error.mjs'
|
|
10
|
+
import { stringToStream, serialize, overQuota, getContentType, parse } from './utils.mjs'
|
|
11
|
+
import extend from 'extend'
|
|
12
|
+
import rimraf from 'rimraf'
|
|
13
|
+
import { exec } from 'child_process'
|
|
14
|
+
import * as ldpContainer from './ldp-container.mjs'
|
|
15
|
+
import { promisify } from 'util'
|
|
16
|
+
import withLock from './lock.mjs'
|
|
17
|
+
import { clearAclCache } from './acl-checker.mjs'
|
|
26
18
|
|
|
27
19
|
const RDF_MIME_TYPES = new Set([
|
|
28
20
|
'text/turtle', // .ttl
|
|
@@ -149,6 +141,7 @@ class LDP {
|
|
|
149
141
|
extension = ''
|
|
150
142
|
}
|
|
151
143
|
// pepare slug
|
|
144
|
+
debug.handlers('POST -- Slug: ' + slug) // alain
|
|
152
145
|
if (slug) {
|
|
153
146
|
slug = decodeURIComponent(slug)
|
|
154
147
|
|
|
@@ -170,7 +163,8 @@ class LDP {
|
|
|
170
163
|
debug.handlers('POST -- Will create at: ' + resourceUrl)
|
|
171
164
|
|
|
172
165
|
await ldp.put(resourceUrl, stream, contentType)
|
|
173
|
-
return
|
|
166
|
+
// return urlModule.parse(resourceUrl).path
|
|
167
|
+
return new URL(resourceUrl).pathname
|
|
174
168
|
}
|
|
175
169
|
|
|
176
170
|
isAuxResource (slug, extension) {
|
|
@@ -200,10 +194,9 @@ class LDP {
|
|
|
200
194
|
* @return {Promise<Graph>}
|
|
201
195
|
*/
|
|
202
196
|
async putGraph (graph, uri, contentType) {
|
|
203
|
-
const { path } = url.parse(uri)
|
|
204
197
|
const content = await serialize(graph, uri, contentType)
|
|
205
198
|
const stream = stringToStream(content)
|
|
206
|
-
return await this.put(
|
|
199
|
+
return await this.put(uri, stream, contentType)
|
|
207
200
|
}
|
|
208
201
|
|
|
209
202
|
isValidRdf (body, requestUri, contentType) {
|
|
@@ -211,7 +204,7 @@ class LDP {
|
|
|
211
204
|
try {
|
|
212
205
|
$rdf.parse(body, resourceGraph, requestUri, contentType)
|
|
213
206
|
} catch (err) {
|
|
214
|
-
debug.ldp('VALIDATE -- Error parsing data: ' + err)
|
|
207
|
+
if (debug && debug.ldp) debug.ldp('VALIDATE -- Error parsing data: ' + err)
|
|
215
208
|
return false
|
|
216
209
|
}
|
|
217
210
|
return true
|
|
@@ -225,7 +218,7 @@ class LDP {
|
|
|
225
218
|
'PUT request requires a content-type via the Content-Type header')
|
|
226
219
|
}
|
|
227
220
|
// reject resource with percent-encoded $ extension
|
|
228
|
-
const dollarExtensionRegex = /%(?:24)\.[^%(?:24)]*$/
|
|
221
|
+
const dollarExtensionRegex = /%(?:24)\.[^%(?:24)]*$/
|
|
229
222
|
if ((url.url || url).match(dollarExtensionRegex)) {
|
|
230
223
|
throw error(400, 'Resource with a $.ext is not allowed by the server')
|
|
231
224
|
}
|
|
@@ -233,7 +226,7 @@ class LDP {
|
|
|
233
226
|
let isOverQuota
|
|
234
227
|
// Someone had a reason to make url actually a req sometimes but not
|
|
235
228
|
// all the time. So now we have to account for that, as done below.
|
|
236
|
-
const hostname = typeof url !== 'string' ? url.hostname :
|
|
229
|
+
const hostname = typeof url !== 'string' ? url.hostname : urlModule.parse(url).hostname
|
|
237
230
|
try {
|
|
238
231
|
isOverQuota = await overQuota(this.resourceMapper.resolveFilePath(hostname), this.serverUri)
|
|
239
232
|
} catch (err) {
|
|
@@ -251,7 +244,6 @@ class LDP {
|
|
|
251
244
|
})
|
|
252
245
|
|
|
253
246
|
if (container) { path += suffixMeta }
|
|
254
|
-
// debug.handlers(container + ' item ' + (url.url || url) + ' ' + contentType + ' ' + path)
|
|
255
247
|
// check if file exists, and in that case that it has the same extension
|
|
256
248
|
if (!container) { await this.checkFileExtension(url, path) }
|
|
257
249
|
// Create the enclosing directory, if necessary, do not create pubsub if PUT create container
|
|
@@ -266,7 +258,7 @@ class LDP {
|
|
|
266
258
|
return withLock(path, () => new Promise((resolve, reject) => {
|
|
267
259
|
// HACK: the middleware in webid-oidc.js uses body-parser, thus ending the stream of data
|
|
268
260
|
// for JSON bodies. So, the stream needs to be reset
|
|
269
|
-
if (contentType.includes('application/json')) {
|
|
261
|
+
if (contentType && contentType.includes && contentType.includes('application/json')) {
|
|
270
262
|
stream = intoStream(JSON.stringify(stream.body))
|
|
271
263
|
}
|
|
272
264
|
const file = stream.pipe(fs.createWriteStream(path))
|
|
@@ -288,9 +280,9 @@ class LDP {
|
|
|
288
280
|
* @param {*} hostname
|
|
289
281
|
* @param {*} nonContainer
|
|
290
282
|
*/
|
|
291
|
-
async createDirectory (
|
|
283
|
+
async createDirectory (pathArg, hostname, nonContainer = true) {
|
|
292
284
|
try {
|
|
293
|
-
const dirName = dirname(
|
|
285
|
+
const dirName = dirname(pathArg)
|
|
294
286
|
if (!fs.existsSync(dirName)) {
|
|
295
287
|
await promisify(mkdirp)(dirName)
|
|
296
288
|
if (this.live && nonContainer) {
|
|
@@ -303,20 +295,19 @@ class LDP {
|
|
|
303
295
|
hostname
|
|
304
296
|
})).url
|
|
305
297
|
// Update websockets
|
|
306
|
-
this.live(
|
|
298
|
+
this.live(urlModule.parse(parentDirectoryUrl).pathname)
|
|
307
299
|
}
|
|
308
300
|
}
|
|
309
301
|
} catch (err) {
|
|
310
302
|
debug.handlers('PUT -- Error creating directory: ' + err)
|
|
311
|
-
throw error(err,
|
|
312
|
-
'Failed to create the path to the new resource')
|
|
303
|
+
throw error(err, 'Failed to create the path to the new resource')
|
|
313
304
|
}
|
|
314
305
|
}
|
|
315
306
|
|
|
316
|
-
async checkFileExtension (
|
|
307
|
+
async checkFileExtension (urlArg, pathArg) {
|
|
317
308
|
try {
|
|
318
|
-
const { path: existingPath } = await this.resourceMapper.mapUrlToFile({ url })
|
|
319
|
-
if (
|
|
309
|
+
const { path: existingPath } = await this.resourceMapper.mapUrlToFile({ url: urlArg })
|
|
310
|
+
if (pathArg !== existingPath) {
|
|
320
311
|
try {
|
|
321
312
|
await withLock(existingPath, () => promisify(fs.unlink)(existingPath))
|
|
322
313
|
} catch (err) { throw error(err, 'Failed to delete resource') }
|
|
@@ -346,7 +337,8 @@ class LDP {
|
|
|
346
337
|
const container = itemUrl.endsWith('/')
|
|
347
338
|
try {
|
|
348
339
|
const testUrl = container ? itemUrl.slice(0, -1) : itemUrl + '/'
|
|
349
|
-
const
|
|
340
|
+
const mapped = await this.resourceMapper.mapUrlToFile({ url: testUrl })
|
|
341
|
+
testPath = mapped.path
|
|
350
342
|
testName = container ? fs.lstatSync(testPath).isFile() : fs.lstatSync(testPath).isDirectory()
|
|
351
343
|
} catch (err) {
|
|
352
344
|
testName = false
|
|
@@ -390,11 +382,11 @@ class LDP {
|
|
|
390
382
|
async fetchGraph (uri, options = {}) {
|
|
391
383
|
const response = await fetch(uri)
|
|
392
384
|
if (!response.ok) {
|
|
393
|
-
const
|
|
385
|
+
const err = new Error(
|
|
394
386
|
`Error fetching ${uri}: ${response.status} ${response.statusText}`
|
|
395
387
|
)
|
|
396
|
-
|
|
397
|
-
throw
|
|
388
|
+
err.statusCode = response.status || 400
|
|
389
|
+
throw err
|
|
398
390
|
}
|
|
399
391
|
const body = await response.text()
|
|
400
392
|
|
|
@@ -402,20 +394,19 @@ class LDP {
|
|
|
402
394
|
}
|
|
403
395
|
|
|
404
396
|
/**
|
|
405
|
-
*
|
|
397
|
+
* Remotely loads the graph at a given uri, parses it and and returns it.
|
|
406
398
|
* Usage:
|
|
407
399
|
*
|
|
408
400
|
* ```
|
|
409
|
-
* ldp.
|
|
401
|
+
* ldp.fetchGraph('https://example.com/contacts/card1.ttl')
|
|
410
402
|
* .then(graph => {
|
|
411
|
-
* //
|
|
403
|
+
* // const matches = graph.match(...)
|
|
412
404
|
* })
|
|
413
405
|
* ```
|
|
414
406
|
*
|
|
415
407
|
* @param uri {string} Fully qualified uri of the request.
|
|
416
|
-
*
|
|
417
|
-
*
|
|
418
|
-
* @param [contentType] {string}
|
|
408
|
+
*
|
|
409
|
+
* @param [options] {object} Options hashmap, passed through to fetchGraph
|
|
419
410
|
*
|
|
420
411
|
* @return {Promise<Graph>}
|
|
421
412
|
*/
|
|
@@ -439,55 +430,47 @@ class LDP {
|
|
|
439
430
|
// this /.meta has no functionality in actual NSS
|
|
440
431
|
// comment https://github.com/solid/node-solid-server/pull/1604#discussion_r652903546
|
|
441
432
|
async isOwner (webId, hostname) {
|
|
442
|
-
// const ldp = req.app.locals.ldp
|
|
443
433
|
const rootUrl = this.resourceMapper.resolveUrl(hostname)
|
|
444
434
|
let graph
|
|
445
435
|
try {
|
|
446
|
-
// TODO check for permission ?? Owner is a MUST
|
|
447
436
|
graph = await this.getGraph(rootUrl + '/.meta')
|
|
448
437
|
const SOLID = $rdf.Namespace('http://www.w3.org/ns/solid/terms#')
|
|
449
438
|
const owner = await graph.statementsMatching($rdf.sym(webId), SOLID('account'), $rdf.sym(rootUrl + '/'))
|
|
450
439
|
return owner.length
|
|
451
440
|
} catch (error) {
|
|
452
|
-
throw new Error(`Failed to get owner from ${rootUrl}/.meta, got ` + error)
|
|
441
|
+
throw new Error(`Failed to get owner from ${rootUrl}/.meta, got ` + error, { cause: error })
|
|
453
442
|
}
|
|
454
443
|
}
|
|
455
444
|
|
|
456
445
|
async get (options, searchIndex = true) {
|
|
457
|
-
let
|
|
446
|
+
let pathLocal, contentType, stats
|
|
458
447
|
try {
|
|
459
|
-
({ path, contentType } = await this.resourceMapper.mapUrlToFile({ url: options, searchIndex }))
|
|
460
|
-
stats = await this.stat(
|
|
448
|
+
({ path: pathLocal, contentType } = await this.resourceMapper.mapUrlToFile({ url: options, searchIndex }))
|
|
449
|
+
stats = await this.stat(pathLocal)
|
|
461
450
|
} catch (err) {
|
|
462
451
|
throw error(err.status || 500, err.message)
|
|
463
452
|
}
|
|
464
453
|
|
|
465
|
-
// Just return, since resource exists
|
|
466
454
|
if (!options.includeBody) {
|
|
467
455
|
return { stream: stats, contentType, container: stats.isDirectory() }
|
|
468
456
|
}
|
|
469
457
|
|
|
470
|
-
// Found a container
|
|
471
458
|
if (stats.isDirectory()) {
|
|
472
|
-
const { url: absContainerUri } = await this.resourceMapper
|
|
473
|
-
|
|
474
|
-
const metaFile = await this.readContainerMeta(absContainerUri)
|
|
475
|
-
.catch(() => '') // Default to an empty meta file if it is missing
|
|
459
|
+
const { url: absContainerUri } = await this.resourceMapper.mapFileToUrl({ path: pathLocal, hostname: options.hostname })
|
|
460
|
+
const metaFile = await this.readContainerMeta(absContainerUri).catch(() => '')
|
|
476
461
|
let data
|
|
477
462
|
try {
|
|
478
|
-
data = await this.listContainer(
|
|
463
|
+
data = await this.listContainer(pathLocal, absContainerUri, metaFile, options.hostname)
|
|
479
464
|
} catch (err) {
|
|
480
465
|
debug.handlers('GET container -- Read error:' + err.message)
|
|
481
466
|
throw err
|
|
482
467
|
}
|
|
483
468
|
const stream = stringToStream(data)
|
|
484
|
-
// TODO contentType is defaultContainerContentType ('text/turtle'),
|
|
485
|
-
// This forces one translation turtle -> desired
|
|
486
469
|
return { stream, contentType, container: true }
|
|
487
470
|
} else {
|
|
488
471
|
let chunksize, contentRange, start, end
|
|
489
472
|
if (options.range) {
|
|
490
|
-
const total = fs.statSync(
|
|
473
|
+
const total = fs.statSync(pathLocal).size
|
|
491
474
|
const parts = options.range.replace(/bytes=/, '').split('-')
|
|
492
475
|
const partialstart = parts[0]
|
|
493
476
|
const partialend = parts[1]
|
|
@@ -496,15 +479,15 @@ class LDP {
|
|
|
496
479
|
chunksize = (end - start) + 1
|
|
497
480
|
contentRange = 'bytes ' + start + '-' + end + '/' + total
|
|
498
481
|
}
|
|
499
|
-
return withLock(
|
|
500
|
-
const stream = fs.createReadStream(
|
|
482
|
+
return withLock(pathLocal, () => new Promise((resolve, reject) => {
|
|
483
|
+
const stream = fs.createReadStream(pathLocal, start && end ? { start, end } : {})
|
|
501
484
|
stream
|
|
502
485
|
.on('error', function (err) {
|
|
503
|
-
debug.handlers(`GET -- error reading ${
|
|
486
|
+
debug.handlers(`GET -- error reading ${pathLocal}: ${err.message}`)
|
|
504
487
|
return reject(error(err, "Can't read file " + err))
|
|
505
488
|
})
|
|
506
489
|
.on('open', function () {
|
|
507
|
-
debug.handlers(`GET -- Reading ${
|
|
490
|
+
debug.handlers(`GET -- Reading ${pathLocal}`)
|
|
508
491
|
return resolve({ stream, contentType, container: false, contentRange, chunksize })
|
|
509
492
|
})
|
|
510
493
|
}))
|
|
@@ -544,9 +527,7 @@ class LDP {
|
|
|
544
527
|
}
|
|
545
528
|
|
|
546
529
|
async deleteContainer (directory) {
|
|
547
|
-
if (directory[directory.length - 1] !== '/')
|
|
548
|
-
directory += '/'
|
|
549
|
-
}
|
|
530
|
+
if (directory[directory.length - 1] !== '/') directory += '/'
|
|
550
531
|
|
|
551
532
|
// Ensure the container exists
|
|
552
533
|
let list
|
|
@@ -590,22 +571,245 @@ class LDP {
|
|
|
590
571
|
}
|
|
591
572
|
}
|
|
592
573
|
|
|
593
|
-
async
|
|
574
|
+
async copy (from, to, options) {
|
|
575
|
+
if (overQuota(this.quotaFile, this.quota)) {
|
|
576
|
+
debug.handlers('COPY -- Over quota')
|
|
577
|
+
throw error(413, 'Storage quota exceeded')
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
const originalParsedPath = urlModule.parse(from)
|
|
581
|
+
const parsedPath = urlModule.parse(to)
|
|
582
|
+
const fromPath = this.resourceMapper.resolveFilePath(
|
|
583
|
+
originalParsedPath.hostname,
|
|
584
|
+
decodeURIComponent(originalParsedPath.pathname)
|
|
585
|
+
)
|
|
586
|
+
const toPath = this.resourceMapper.resolveFilePath(
|
|
587
|
+
parsedPath.hostname,
|
|
588
|
+
decodeURIComponent(parsedPath.pathname)
|
|
589
|
+
)
|
|
590
|
+
|
|
591
|
+
// Check if file already exists
|
|
592
|
+
if (fs.existsSync(toPath)) {
|
|
593
|
+
throw error(412, 'Target file already exists')
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
let copyPromise
|
|
597
|
+
|
|
598
|
+
// create destination directory if not exists
|
|
599
|
+
mkdirp(dirname(toPath))
|
|
600
|
+
|
|
601
|
+
// If original is a single file
|
|
602
|
+
if (!fromPath.endsWith('/')) {
|
|
603
|
+
copyPromise = new Promise((resolve, reject) => {
|
|
604
|
+
const readStream = fs.createReadStream(fromPath)
|
|
605
|
+
const writeStream = fs.createWriteStream(toPath)
|
|
606
|
+
readStream.on('error', function (err) {
|
|
607
|
+
debug.handlers('Error reading file: ' + err)
|
|
608
|
+
reject(error(500, err))
|
|
609
|
+
})
|
|
610
|
+
writeStream.on('error', function (err) {
|
|
611
|
+
debug.handlers('Error writing file: ' + err)
|
|
612
|
+
reject(error(500, err))
|
|
613
|
+
})
|
|
614
|
+
writeStream.on('finish', function () {
|
|
615
|
+
debug.handlers('Finished copying file')
|
|
616
|
+
resolve()
|
|
617
|
+
})
|
|
618
|
+
readStream.pipe(writeStream)
|
|
619
|
+
})
|
|
620
|
+
} else {
|
|
621
|
+
// If original is a folder, copy recursively
|
|
622
|
+
copyPromise = new Promise((resolve, reject) => {
|
|
623
|
+
exec(`cp -r "${fromPath}" "${toPath}"`, function (err) {
|
|
624
|
+
if (err) {
|
|
625
|
+
debug.handlers('Error copying directory: ' + err)
|
|
626
|
+
reject(error(500, err))
|
|
627
|
+
} else {
|
|
628
|
+
debug.handlers('Finished copying directory')
|
|
629
|
+
resolve()
|
|
630
|
+
}
|
|
631
|
+
})
|
|
632
|
+
})
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
await copyPromise
|
|
636
|
+
// Copy ACL file if exists
|
|
637
|
+
if (fs.existsSync(fromPath + this.suffixAcl)) {
|
|
638
|
+
const readAclStream = fs.createReadStream(fromPath + this.suffixAcl)
|
|
639
|
+
const writeAclStream = fs.createWriteStream(toPath + this.suffixAcl)
|
|
640
|
+
await new Promise((resolve, reject) => {
|
|
641
|
+
readAclStream.on('error', function (err) {
|
|
642
|
+
debug.handlers('Error reading ACL file: ' + err)
|
|
643
|
+
reject(error(500, err))
|
|
644
|
+
})
|
|
645
|
+
writeAclStream.on('error', function (err) {
|
|
646
|
+
debug.handlers('Error writing ACL file: ' + err)
|
|
647
|
+
reject(error(500, err))
|
|
648
|
+
})
|
|
649
|
+
writeAclStream.on('finish', function () {
|
|
650
|
+
debug.handlers('Finished copying ACL file')
|
|
651
|
+
resolve()
|
|
652
|
+
})
|
|
653
|
+
readAclStream.pipe(writeAclStream)
|
|
654
|
+
})
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
// Copy meta file if exists
|
|
658
|
+
if (fs.existsSync(fromPath + this.suffixMeta)) {
|
|
659
|
+
const readMetaStream = fs.createReadStream(fromPath + this.suffixMeta)
|
|
660
|
+
const writeMetaStream = fs.createWriteStream(toPath + this.suffixMeta)
|
|
661
|
+
await new Promise((resolve, reject) => {
|
|
662
|
+
readMetaStream
|
|
663
|
+
.on('error', function (err) {
|
|
664
|
+
debug.handlers('Error reading meta file: ' + err)
|
|
665
|
+
reject(error(500, err))
|
|
666
|
+
})
|
|
667
|
+
.on('open', function () {
|
|
668
|
+
readMetaStream.pipe(writeMetaStream)
|
|
669
|
+
})
|
|
670
|
+
writeMetaStream.on('error', function (err) {
|
|
671
|
+
debug.handlers('Error writing meta file: ' + err)
|
|
672
|
+
reject(error(500, err))
|
|
673
|
+
})
|
|
674
|
+
writeMetaStream.on('finish', function () {
|
|
675
|
+
debug.handlers('Finished copying meta file')
|
|
676
|
+
resolve()
|
|
677
|
+
})
|
|
678
|
+
})
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
await clearAclCache()
|
|
682
|
+
|
|
683
|
+
debug.handlers('COPY -- Copied ' + fromPath + ' to ' + toPath)
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
async patch (uri, patchObject) {
|
|
687
|
+
if (overQuota(this.quotaFile, this.quota)) {
|
|
688
|
+
debug.handlers('PATCH -- Over quota')
|
|
689
|
+
throw error(413, 'Storage quota exceeded')
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
const url = uri
|
|
693
|
+
let path
|
|
694
|
+
try {
|
|
695
|
+
({ path } = await this.resourceMapper.mapUrlToFile({ url }))
|
|
696
|
+
} catch (err) {
|
|
697
|
+
throw error(err.status || 500, err.message)
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
await withLock(path, async () => {
|
|
701
|
+
let originalData
|
|
702
|
+
|
|
703
|
+
try {
|
|
704
|
+
originalData = await promisify(fs.readFile)(path, { encoding: 'utf8' })
|
|
705
|
+
} catch (err) {
|
|
706
|
+
throw error(err, 'Cannot patch a file that does not exist')
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
const contentType = getContentType(path)
|
|
710
|
+
const patchedData = await this.applyPatch(originalData, patchObject, contentType, uri)
|
|
711
|
+
|
|
712
|
+
// Write patched data back to file
|
|
713
|
+
await promisify(fs.writeFile)(path, patchedData, 'utf8')
|
|
714
|
+
})
|
|
715
|
+
|
|
716
|
+
await clearAclCache()
|
|
717
|
+
|
|
718
|
+
debug.handlers('PATCH -- Patched:' + path)
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
async applyPatch (data, patchObject, contentType, uri) {
|
|
722
|
+
const baseGraph = $rdf.graph()
|
|
723
|
+
let patchedGraph
|
|
724
|
+
|
|
725
|
+
try {
|
|
726
|
+
$rdf.parse(data, baseGraph, uri, contentType)
|
|
727
|
+
} catch (err) {
|
|
728
|
+
throw error(500, 'Cannot parse file for patching: ' + uri)
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
// Apply patches
|
|
732
|
+
if (patchObject.updates) {
|
|
733
|
+
patchedGraph = await this.applyPatchUpdate(baseGraph, patchObject.updates, uri, contentType)
|
|
734
|
+
} else if (patchObject.deletes || patchObject.inserts) {
|
|
735
|
+
patchedGraph = await this.applyPatchInsertDelete(baseGraph, patchObject, uri, contentType)
|
|
736
|
+
} else {
|
|
737
|
+
throw error(422, 'Invalid patch object')
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
try {
|
|
741
|
+
return await serialize(patchedGraph, uri, contentType)
|
|
742
|
+
} catch (err) {
|
|
743
|
+
throw error(500, 'Cannot serialize patched file: ' + uri)
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
async applyPatchUpdate (baseGraph, updates, uri, contentType) {
|
|
748
|
+
const patchedGraph = baseGraph
|
|
749
|
+
|
|
750
|
+
for (const update of updates) {
|
|
751
|
+
if (update.operation === 'delete') {
|
|
752
|
+
const deleteQuads = this.parseQuads(update.where, uri, contentType)
|
|
753
|
+
for (const quad of deleteQuads) {
|
|
754
|
+
patchedGraph.removeMatches(quad.subject, quad.predicate, quad.object)
|
|
755
|
+
}
|
|
756
|
+
} else if (update.operation === 'insert') {
|
|
757
|
+
const insertQuads = this.parseQuads(update.quads, uri, contentType)
|
|
758
|
+
for (const quad of insertQuads) {
|
|
759
|
+
patchedGraph.add(quad.subject, quad.predicate, quad.object)
|
|
760
|
+
}
|
|
761
|
+
} else {
|
|
762
|
+
throw error(422, 'Unknown patch operation: ' + update.operation)
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
return patchedGraph
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
async applyPatchInsertDelete (baseGraph, patchObject, uri, contentType) {
|
|
770
|
+
const patchedGraph = baseGraph
|
|
771
|
+
|
|
772
|
+
// Apply deletes first
|
|
773
|
+
if (patchObject.deletes) {
|
|
774
|
+
const deleteQuads = this.parseQuads(patchObject.deletes, uri, contentType)
|
|
775
|
+
for (const quad of deleteQuads) {
|
|
776
|
+
patchedGraph.removeMatches(quad.subject, quad.predicate, quad.object)
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
// Apply inserts
|
|
781
|
+
if (patchObject.inserts) {
|
|
782
|
+
const insertQuads = this.parseQuads(patchObject.inserts, uri, contentType)
|
|
783
|
+
for (const quad of insertQuads) {
|
|
784
|
+
patchedGraph.add(quad.subject, quad.predicate, quad.object)
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
|
|
788
|
+
return patchedGraph
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
parseQuads (quads, uri, contentType) {
|
|
792
|
+
const graph = $rdf.graph()
|
|
793
|
+
$rdf.parse(quads, graph, uri, contentType)
|
|
794
|
+
return graph.statements
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
async getAvailableUrl (hostname, containerURI, { slug = uuid(), extension, container } = {}) {
|
|
594
798
|
let requestUrl = this.resourceMapper.resolveUrl(hostname, containerURI)
|
|
595
|
-
requestUrl = requestUrl.replace(/\/*$/, '/')
|
|
799
|
+
requestUrl = requestUrl.replace(/\/*$/, '/')
|
|
596
800
|
|
|
597
801
|
let itemName = slug.endsWith(extension) || slug.endsWith(this.suffixAcl) || slug.endsWith(this.suffixMeta) ? slug : slug + extension
|
|
598
802
|
try {
|
|
599
803
|
// check whether resource exists
|
|
600
804
|
const context = container ? '/' : ''
|
|
601
805
|
await this.resourceMapper.mapUrlToFile({ url: (requestUrl + itemName + context) })
|
|
602
|
-
itemName = `${uuid
|
|
806
|
+
itemName = `${uuid()}-${itemName}`
|
|
603
807
|
} catch (e) {
|
|
604
808
|
try {
|
|
605
809
|
// check whether resource with same name exists
|
|
606
810
|
const context = !container ? '/' : ''
|
|
607
811
|
await this.resourceMapper.mapUrlToFile({ url: (requestUrl + itemName + context) })
|
|
608
|
-
itemName = `${uuid
|
|
812
|
+
itemName = `${uuid()}-${itemName}`
|
|
609
813
|
} catch (e) {}
|
|
610
814
|
}
|
|
611
815
|
if (container) itemName += '/'
|
|
@@ -620,6 +824,10 @@ class LDP {
|
|
|
620
824
|
return trustedOrigins
|
|
621
825
|
}
|
|
622
826
|
|
|
827
|
+
static getRDFMimeTypes () {
|
|
828
|
+
return Array.from(RDF_MIME_TYPES)
|
|
829
|
+
}
|
|
830
|
+
|
|
623
831
|
static mimeTypeIsRdf (mimeType) {
|
|
624
832
|
return RDF_MIME_TYPES.has(mimeType)
|
|
625
833
|
}
|
|
@@ -628,4 +836,5 @@ class LDP {
|
|
|
628
836
|
return Array.from(RDF_MIME_TYPES)
|
|
629
837
|
}
|
|
630
838
|
}
|
|
631
|
-
|
|
839
|
+
|
|
840
|
+
export default LDP
|
package/lib/{lock.js → lock.mjs}
RENAMED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const lock = new AsyncLock({ timeout: 30 * 1000 })
|
|
4
|
-
|
|
5
|
-
// Obtains a lock on the path, and maintains it until the task finishes
|
|
6
|
-
async function withLock (path, executeTask) {
|
|
7
|
-
return await lock.acquire(path, executeTask)
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
import AsyncLock from 'async-lock'
|
|
2
|
+
|
|
3
|
+
const lock = new AsyncLock({ timeout: 30 * 1000 })
|
|
4
|
+
|
|
5
|
+
// Obtains a lock on the path, and maintains it until the task finishes
|
|
6
|
+
async function withLock (path, executeTask) {
|
|
7
|
+
return await lock.acquire(path, executeTask)
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export default withLock
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
this.
|
|
5
|
-
this.
|
|
6
|
-
this.
|
|
7
|
-
this.
|
|
8
|
-
this.
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}
|
|
1
|
+
export function Metadata () {
|
|
2
|
+
this.filename = ''
|
|
3
|
+
this.isResource = false
|
|
4
|
+
this.isSourceResource = false
|
|
5
|
+
this.isContainer = false
|
|
6
|
+
this.isBasicContainer = false
|
|
7
|
+
this.isDirectContainer = false
|
|
8
|
+
this.isStorage = false
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export default { Metadata }
|