solid-server 5.8.7 → 5.8.8-5fdbfa12
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 +0 -0
- package/CONTRIBUTING.md +0 -0
- package/CONTRIBUTORS.md +0 -0
- package/Dockerfile +0 -0
- package/LICENSE.md +0 -0
- package/README.md +0 -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 +6 -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 +0 -0
- package/common/js/auth-buttons.mjs +57 -0
- package/common/js/index-buttons.js +0 -0
- package/common/js/index-buttons.mjs +38 -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 +0 -0
- package/config/defaults.mjs +22 -0
- package/config/templates/emails/delete-account.js +49 -0
- package/config/templates/emails/delete-account.mjs +31 -0
- package/config/templates/emails/invalid-username.js +30 -0
- package/config/templates/emails/invalid-username.mjs +27 -0
- package/config/templates/emails/reset-password.js +49 -0
- package/config/templates/emails/reset-password.mjs +31 -0
- package/config/templates/emails/welcome.js +39 -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-2275-1766876301000-0.json +1 -0
- package/coverage/tmp/coverage-2276-1766876279735-0.json +1 -0
- package/default-templates/emails/delete-account.js +0 -0
- package/default-templates/emails/delete-account.mjs +31 -0
- package/default-templates/emails/invalid-username.js +0 -0
- package/default-templates/emails/invalid-username.mjs +27 -0
- package/default-templates/emails/reset-password.js +0 -0
- package/default-templates/emails/reset-password.mjs +31 -0
- package/default-templates/emails/welcome.js +0 -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 +0 -0
- 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} +8 -8
- package/lib/handlers/{copy.js → copy.mjs} +35 -39
- package/lib/handlers/{cors-proxy.js → cors-proxy.mjs} +11 -16
- 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} +286 -78
- 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 +75 -67
- package/renovate.json +0 -0
- package/robots.txt +0 -0
- package/robots.txt.acl +0 -0
- package/solid-server-5.8.8.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 +816 -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 +41 -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_abbf27de893abf7d05279547c22d9366.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/test/resources/accounts-acl/config/templates/emails/welcome-test.js +39 -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_931f2a0c999a8f0695573844341dde0e.json +1 -0
- package/test/resources/accounts-scenario/alice/db/oidc/op/provider.json +761 -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_8bdd350afbe0452a42fe6b3b3705d25f.json +1 -0
- package/test/resources/accounts-scenario/bob/db/oidc/op/provider.json +761 -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_e4ed74eed3926d2f8d4d1d9661be7aea.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_9d6b49e3a595c4942e1105545518362d.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_5f68117de7511ed2b2290d81c83a2d98.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/test/resources/acl-tls/config/templates/emails/delete-account.js +49 -0
- package/test/resources/acl-tls/config/templates/emails/invalid-username.js +30 -0
- package/test/resources/acl-tls/config/templates/emails/reset-password.js +49 -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/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') }
|
|
@@ -390,11 +381,11 @@ class LDP {
|
|
|
390
381
|
async fetchGraph (uri, options = {}) {
|
|
391
382
|
const response = await fetch(uri)
|
|
392
383
|
if (!response.ok) {
|
|
393
|
-
const
|
|
384
|
+
const err = new Error(
|
|
394
385
|
`Error fetching ${uri}: ${response.status} ${response.statusText}`
|
|
395
386
|
)
|
|
396
|
-
|
|
397
|
-
throw
|
|
387
|
+
err.statusCode = response.status || 400
|
|
388
|
+
throw err
|
|
398
389
|
}
|
|
399
390
|
const body = await response.text()
|
|
400
391
|
|
|
@@ -402,20 +393,19 @@ class LDP {
|
|
|
402
393
|
}
|
|
403
394
|
|
|
404
395
|
/**
|
|
405
|
-
*
|
|
396
|
+
* Remotely loads the graph at a given uri, parses it and and returns it.
|
|
406
397
|
* Usage:
|
|
407
398
|
*
|
|
408
399
|
* ```
|
|
409
|
-
* ldp.
|
|
400
|
+
* ldp.fetchGraph('https://example.com/contacts/card1.ttl')
|
|
410
401
|
* .then(graph => {
|
|
411
|
-
* //
|
|
402
|
+
* // const matches = graph.match(...)
|
|
412
403
|
* })
|
|
413
404
|
* ```
|
|
414
405
|
*
|
|
415
406
|
* @param uri {string} Fully qualified uri of the request.
|
|
416
|
-
*
|
|
417
|
-
*
|
|
418
|
-
* @param [contentType] {string}
|
|
407
|
+
*
|
|
408
|
+
* @param [options] {object} Options hashmap, passed through to fetchGraph
|
|
419
409
|
*
|
|
420
410
|
* @return {Promise<Graph>}
|
|
421
411
|
*/
|
|
@@ -439,11 +429,9 @@ class LDP {
|
|
|
439
429
|
// this /.meta has no functionality in actual NSS
|
|
440
430
|
// comment https://github.com/solid/node-solid-server/pull/1604#discussion_r652903546
|
|
441
431
|
async isOwner (webId, hostname) {
|
|
442
|
-
// const ldp = req.app.locals.ldp
|
|
443
432
|
const rootUrl = this.resourceMapper.resolveUrl(hostname)
|
|
444
433
|
let graph
|
|
445
434
|
try {
|
|
446
|
-
// TODO check for permission ?? Owner is a MUST
|
|
447
435
|
graph = await this.getGraph(rootUrl + '/.meta')
|
|
448
436
|
const SOLID = $rdf.Namespace('http://www.w3.org/ns/solid/terms#')
|
|
449
437
|
const owner = await graph.statementsMatching($rdf.sym(webId), SOLID('account'), $rdf.sym(rootUrl + '/'))
|
|
@@ -454,40 +442,34 @@ class LDP {
|
|
|
454
442
|
}
|
|
455
443
|
|
|
456
444
|
async get (options, searchIndex = true) {
|
|
457
|
-
let
|
|
445
|
+
let pathLocal, contentType, stats
|
|
458
446
|
try {
|
|
459
|
-
({ path, contentType } = await this.resourceMapper.mapUrlToFile({ url: options, searchIndex }))
|
|
460
|
-
stats = await this.stat(
|
|
447
|
+
({ path: pathLocal, contentType } = await this.resourceMapper.mapUrlToFile({ url: options, searchIndex }))
|
|
448
|
+
stats = await this.stat(pathLocal)
|
|
461
449
|
} catch (err) {
|
|
462
450
|
throw error(err.status || 500, err.message)
|
|
463
451
|
}
|
|
464
452
|
|
|
465
|
-
// Just return, since resource exists
|
|
466
453
|
if (!options.includeBody) {
|
|
467
454
|
return { stream: stats, contentType, container: stats.isDirectory() }
|
|
468
455
|
}
|
|
469
456
|
|
|
470
|
-
// Found a container
|
|
471
457
|
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
|
|
458
|
+
const { url: absContainerUri } = await this.resourceMapper.mapFileToUrl({ path: pathLocal, hostname: options.hostname })
|
|
459
|
+
const metaFile = await this.readContainerMeta(absContainerUri).catch(() => '')
|
|
476
460
|
let data
|
|
477
461
|
try {
|
|
478
|
-
data = await this.listContainer(
|
|
462
|
+
data = await this.listContainer(pathLocal, absContainerUri, metaFile, options.hostname)
|
|
479
463
|
} catch (err) {
|
|
480
464
|
debug.handlers('GET container -- Read error:' + err.message)
|
|
481
465
|
throw err
|
|
482
466
|
}
|
|
483
467
|
const stream = stringToStream(data)
|
|
484
|
-
// TODO contentType is defaultContainerContentType ('text/turtle'),
|
|
485
|
-
// This forces one translation turtle -> desired
|
|
486
468
|
return { stream, contentType, container: true }
|
|
487
469
|
} else {
|
|
488
470
|
let chunksize, contentRange, start, end
|
|
489
471
|
if (options.range) {
|
|
490
|
-
const total = fs.statSync(
|
|
472
|
+
const total = fs.statSync(pathLocal).size
|
|
491
473
|
const parts = options.range.replace(/bytes=/, '').split('-')
|
|
492
474
|
const partialstart = parts[0]
|
|
493
475
|
const partialend = parts[1]
|
|
@@ -496,15 +478,15 @@ class LDP {
|
|
|
496
478
|
chunksize = (end - start) + 1
|
|
497
479
|
contentRange = 'bytes ' + start + '-' + end + '/' + total
|
|
498
480
|
}
|
|
499
|
-
return withLock(
|
|
500
|
-
const stream = fs.createReadStream(
|
|
481
|
+
return withLock(pathLocal, () => new Promise((resolve, reject) => {
|
|
482
|
+
const stream = fs.createReadStream(pathLocal, start && end ? { start, end } : {})
|
|
501
483
|
stream
|
|
502
484
|
.on('error', function (err) {
|
|
503
|
-
debug.handlers(`GET -- error reading ${
|
|
485
|
+
debug.handlers(`GET -- error reading ${pathLocal}: ${err.message}`)
|
|
504
486
|
return reject(error(err, "Can't read file " + err))
|
|
505
487
|
})
|
|
506
488
|
.on('open', function () {
|
|
507
|
-
debug.handlers(`GET -- Reading ${
|
|
489
|
+
debug.handlers(`GET -- Reading ${pathLocal}`)
|
|
508
490
|
return resolve({ stream, contentType, container: false, contentRange, chunksize })
|
|
509
491
|
})
|
|
510
492
|
}))
|
|
@@ -544,9 +526,7 @@ class LDP {
|
|
|
544
526
|
}
|
|
545
527
|
|
|
546
528
|
async deleteContainer (directory) {
|
|
547
|
-
if (directory[directory.length - 1] !== '/')
|
|
548
|
-
directory += '/'
|
|
549
|
-
}
|
|
529
|
+
if (directory[directory.length - 1] !== '/') directory += '/'
|
|
550
530
|
|
|
551
531
|
// Ensure the container exists
|
|
552
532
|
let list
|
|
@@ -563,7 +543,7 @@ class LDP {
|
|
|
563
543
|
|
|
564
544
|
// Delete the directory recursively
|
|
565
545
|
try {
|
|
566
|
-
await
|
|
546
|
+
await rimraf(directory)
|
|
567
547
|
} catch (err) {
|
|
568
548
|
throw error(err, 'Failed to delete the container')
|
|
569
549
|
}
|
|
@@ -590,22 +570,245 @@ class LDP {
|
|
|
590
570
|
}
|
|
591
571
|
}
|
|
592
572
|
|
|
593
|
-
async
|
|
573
|
+
async copy (from, to, options) {
|
|
574
|
+
if (overQuota(this.quotaFile, this.quota)) {
|
|
575
|
+
debug.handlers('COPY -- Over quota')
|
|
576
|
+
throw error(413, 'Storage quota exceeded')
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
const originalParsedPath = urlModule.parse(from)
|
|
580
|
+
const parsedPath = urlModule.parse(to)
|
|
581
|
+
const fromPath = this.resourceMapper.resolveFilePath(
|
|
582
|
+
originalParsedPath.hostname,
|
|
583
|
+
decodeURIComponent(originalParsedPath.pathname)
|
|
584
|
+
)
|
|
585
|
+
const toPath = this.resourceMapper.resolveFilePath(
|
|
586
|
+
parsedPath.hostname,
|
|
587
|
+
decodeURIComponent(parsedPath.pathname)
|
|
588
|
+
)
|
|
589
|
+
|
|
590
|
+
// Check if file already exists
|
|
591
|
+
if (fs.existsSync(toPath)) {
|
|
592
|
+
throw error(412, 'Target file already exists')
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
let copyPromise
|
|
596
|
+
|
|
597
|
+
// create destination directory if not exists
|
|
598
|
+
mkdirp(dirname(toPath))
|
|
599
|
+
|
|
600
|
+
// If original is a single file
|
|
601
|
+
if (!fromPath.endsWith('/')) {
|
|
602
|
+
copyPromise = new Promise((resolve, reject) => {
|
|
603
|
+
const readStream = fs.createReadStream(fromPath)
|
|
604
|
+
const writeStream = fs.createWriteStream(toPath)
|
|
605
|
+
readStream.on('error', function (err) {
|
|
606
|
+
debug.handlers('Error reading file: ' + err)
|
|
607
|
+
reject(error(500, err))
|
|
608
|
+
})
|
|
609
|
+
writeStream.on('error', function (err) {
|
|
610
|
+
debug.handlers('Error writing file: ' + err)
|
|
611
|
+
reject(error(500, err))
|
|
612
|
+
})
|
|
613
|
+
writeStream.on('finish', function () {
|
|
614
|
+
debug.handlers('Finished copying file')
|
|
615
|
+
resolve()
|
|
616
|
+
})
|
|
617
|
+
readStream.pipe(writeStream)
|
|
618
|
+
})
|
|
619
|
+
} else {
|
|
620
|
+
// If original is a folder, copy recursively
|
|
621
|
+
copyPromise = new Promise((resolve, reject) => {
|
|
622
|
+
exec(`cp -r "${fromPath}" "${toPath}"`, function (err) {
|
|
623
|
+
if (err) {
|
|
624
|
+
debug.handlers('Error copying directory: ' + err)
|
|
625
|
+
reject(error(500, err))
|
|
626
|
+
} else {
|
|
627
|
+
debug.handlers('Finished copying directory')
|
|
628
|
+
resolve()
|
|
629
|
+
}
|
|
630
|
+
})
|
|
631
|
+
})
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
await copyPromise
|
|
635
|
+
// Copy ACL file if exists
|
|
636
|
+
if (fs.existsSync(fromPath + this.suffixAcl)) {
|
|
637
|
+
const readAclStream = fs.createReadStream(fromPath + this.suffixAcl)
|
|
638
|
+
const writeAclStream = fs.createWriteStream(toPath + this.suffixAcl)
|
|
639
|
+
await new Promise((resolve, reject) => {
|
|
640
|
+
readAclStream.on('error', function (err) {
|
|
641
|
+
debug.handlers('Error reading ACL file: ' + err)
|
|
642
|
+
reject(error(500, err))
|
|
643
|
+
})
|
|
644
|
+
writeAclStream.on('error', function (err) {
|
|
645
|
+
debug.handlers('Error writing ACL file: ' + err)
|
|
646
|
+
reject(error(500, err))
|
|
647
|
+
})
|
|
648
|
+
writeAclStream.on('finish', function () {
|
|
649
|
+
debug.handlers('Finished copying ACL file')
|
|
650
|
+
resolve()
|
|
651
|
+
})
|
|
652
|
+
readAclStream.pipe(writeAclStream)
|
|
653
|
+
})
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
// Copy meta file if exists
|
|
657
|
+
if (fs.existsSync(fromPath + this.suffixMeta)) {
|
|
658
|
+
const readMetaStream = fs.createReadStream(fromPath + this.suffixMeta)
|
|
659
|
+
const writeMetaStream = fs.createWriteStream(toPath + this.suffixMeta)
|
|
660
|
+
await new Promise((resolve, reject) => {
|
|
661
|
+
readMetaStream
|
|
662
|
+
.on('error', function (err) {
|
|
663
|
+
debug.handlers('Error reading meta file: ' + err)
|
|
664
|
+
reject(error(500, err))
|
|
665
|
+
})
|
|
666
|
+
.on('open', function () {
|
|
667
|
+
readMetaStream.pipe(writeMetaStream)
|
|
668
|
+
})
|
|
669
|
+
writeMetaStream.on('error', function (err) {
|
|
670
|
+
debug.handlers('Error writing meta file: ' + err)
|
|
671
|
+
reject(error(500, err))
|
|
672
|
+
})
|
|
673
|
+
writeMetaStream.on('finish', function () {
|
|
674
|
+
debug.handlers('Finished copying meta file')
|
|
675
|
+
resolve()
|
|
676
|
+
})
|
|
677
|
+
})
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
await clearAclCache()
|
|
681
|
+
|
|
682
|
+
debug.handlers('COPY -- Copied ' + fromPath + ' to ' + toPath)
|
|
683
|
+
}
|
|
684
|
+
|
|
685
|
+
async patch (uri, patchObject) {
|
|
686
|
+
if (overQuota(this.quotaFile, this.quota)) {
|
|
687
|
+
debug.handlers('PATCH -- Over quota')
|
|
688
|
+
throw error(413, 'Storage quota exceeded')
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
const url = uri
|
|
692
|
+
let path
|
|
693
|
+
try {
|
|
694
|
+
({ path } = await this.resourceMapper.mapUrlToFile({ url }))
|
|
695
|
+
} catch (err) {
|
|
696
|
+
throw error(err.status || 500, err.message)
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
await withLock(path, async () => {
|
|
700
|
+
let originalData = ''
|
|
701
|
+
|
|
702
|
+
try {
|
|
703
|
+
originalData = await promisify(fs.readFile)(path, { encoding: 'utf8' })
|
|
704
|
+
} catch (err) {
|
|
705
|
+
throw error(err, 'Cannot patch a file that does not exist')
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
const contentType = getContentType(path)
|
|
709
|
+
const patchedData = await this.applyPatch(originalData, patchObject, contentType, uri)
|
|
710
|
+
|
|
711
|
+
// Write patched data back to file
|
|
712
|
+
await promisify(fs.writeFile)(path, patchedData, 'utf8')
|
|
713
|
+
})
|
|
714
|
+
|
|
715
|
+
await clearAclCache()
|
|
716
|
+
|
|
717
|
+
debug.handlers('PATCH -- Patched:' + path)
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
async applyPatch (data, patchObject, contentType, uri) {
|
|
721
|
+
const baseGraph = $rdf.graph()
|
|
722
|
+
let patchedGraph
|
|
723
|
+
|
|
724
|
+
try {
|
|
725
|
+
$rdf.parse(data, baseGraph, uri, contentType)
|
|
726
|
+
} catch (err) {
|
|
727
|
+
throw error(500, 'Cannot parse file for patching: ' + uri)
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
// Apply patches
|
|
731
|
+
if (patchObject.updates) {
|
|
732
|
+
patchedGraph = await this.applyPatchUpdate(baseGraph, patchObject.updates, uri, contentType)
|
|
733
|
+
} else if (patchObject.deletes || patchObject.inserts) {
|
|
734
|
+
patchedGraph = await this.applyPatchInsertDelete(baseGraph, patchObject, uri, contentType)
|
|
735
|
+
} else {
|
|
736
|
+
throw error(422, 'Invalid patch object')
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
try {
|
|
740
|
+
return await serialize(patchedGraph, uri, contentType)
|
|
741
|
+
} catch (err) {
|
|
742
|
+
throw error(500, 'Cannot serialize patched file: ' + uri)
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
async applyPatchUpdate (baseGraph, updates, uri, contentType) {
|
|
747
|
+
const patchedGraph = baseGraph
|
|
748
|
+
|
|
749
|
+
for (const update of updates) {
|
|
750
|
+
if (update.operation === 'delete') {
|
|
751
|
+
const deleteQuads = this.parseQuads(update.where, uri, contentType)
|
|
752
|
+
for (const quad of deleteQuads) {
|
|
753
|
+
patchedGraph.removeMatches(quad.subject, quad.predicate, quad.object)
|
|
754
|
+
}
|
|
755
|
+
} else if (update.operation === 'insert') {
|
|
756
|
+
const insertQuads = this.parseQuads(update.quads, uri, contentType)
|
|
757
|
+
for (const quad of insertQuads) {
|
|
758
|
+
patchedGraph.add(quad.subject, quad.predicate, quad.object)
|
|
759
|
+
}
|
|
760
|
+
} else {
|
|
761
|
+
throw error(422, 'Unknown patch operation: ' + update.operation)
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
return patchedGraph
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
async applyPatchInsertDelete (baseGraph, patchObject, uri, contentType) {
|
|
769
|
+
const patchedGraph = baseGraph
|
|
770
|
+
|
|
771
|
+
// Apply deletes first
|
|
772
|
+
if (patchObject.deletes) {
|
|
773
|
+
const deleteQuads = this.parseQuads(patchObject.deletes, uri, contentType)
|
|
774
|
+
for (const quad of deleteQuads) {
|
|
775
|
+
patchedGraph.removeMatches(quad.subject, quad.predicate, quad.object)
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
// Apply inserts
|
|
780
|
+
if (patchObject.inserts) {
|
|
781
|
+
const insertQuads = this.parseQuads(patchObject.inserts, uri, contentType)
|
|
782
|
+
for (const quad of insertQuads) {
|
|
783
|
+
patchedGraph.add(quad.subject, quad.predicate, quad.object)
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
return patchedGraph
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
parseQuads (quads, uri, contentType) {
|
|
791
|
+
const graph = $rdf.graph()
|
|
792
|
+
$rdf.parse(quads, graph, uri, contentType)
|
|
793
|
+
return graph.statements
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
async getAvailableUrl (hostname, containerURI, { slug = uuid(), extension, container } = {}) {
|
|
594
797
|
let requestUrl = this.resourceMapper.resolveUrl(hostname, containerURI)
|
|
595
|
-
requestUrl = requestUrl.replace(/\/*$/, '/')
|
|
798
|
+
requestUrl = requestUrl.replace(/\/*$/, '/')
|
|
596
799
|
|
|
597
800
|
let itemName = slug.endsWith(extension) || slug.endsWith(this.suffixAcl) || slug.endsWith(this.suffixMeta) ? slug : slug + extension
|
|
598
801
|
try {
|
|
599
802
|
// check whether resource exists
|
|
600
803
|
const context = container ? '/' : ''
|
|
601
804
|
await this.resourceMapper.mapUrlToFile({ url: (requestUrl + itemName + context) })
|
|
602
|
-
itemName = `${uuid
|
|
805
|
+
itemName = `${uuid()}-${itemName}`
|
|
603
806
|
} catch (e) {
|
|
604
807
|
try {
|
|
605
808
|
// check whether resource with same name exists
|
|
606
809
|
const context = !container ? '/' : ''
|
|
607
810
|
await this.resourceMapper.mapUrlToFile({ url: (requestUrl + itemName + context) })
|
|
608
|
-
itemName = `${uuid
|
|
811
|
+
itemName = `${uuid()}-${itemName}`
|
|
609
812
|
} catch (e) {}
|
|
610
813
|
}
|
|
611
814
|
if (container) itemName += '/'
|
|
@@ -620,6 +823,10 @@ class LDP {
|
|
|
620
823
|
return trustedOrigins
|
|
621
824
|
}
|
|
622
825
|
|
|
826
|
+
static getRDFMimeTypes () {
|
|
827
|
+
return Array.from(RDF_MIME_TYPES)
|
|
828
|
+
}
|
|
829
|
+
|
|
623
830
|
static mimeTypeIsRdf (mimeType) {
|
|
624
831
|
return RDF_MIME_TYPES.has(mimeType)
|
|
625
832
|
}
|
|
@@ -628,4 +835,5 @@ class LDP {
|
|
|
628
835
|
return Array.from(RDF_MIME_TYPES)
|
|
629
836
|
}
|
|
630
837
|
}
|
|
631
|
-
|
|
838
|
+
|
|
839
|
+
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 }
|