solid-server 5.8.7 → 5.8.8-22f4cfec
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 +43 -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-2260-1766832656715-0.json +1 -0
- package/coverage/tmp/coverage-2261-1766832635310-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/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 -15
- 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} +32 -11
- 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} +37 -39
- package/lib/handlers/{cors-proxy.js → cors-proxy.mjs} +9 -11
- 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} +254 -252
- package/lib/handlers/{index.js → index.mjs} +7 -8
- package/lib/handlers/{notify.js → notify.mjs} +8 -10
- package/lib/handlers/{options.js → options.mjs} +3 -5
- 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 -75
- 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 +23 -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} +7 -6
- 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} +309 -254
- package/lib/webid/{index.js → index.mjs} +9 -13
- package/lib/webid/lib/{get.js → get.mjs} +31 -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 +7 -0
- package/package.json +60 -40
- 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 +168 -0
- package/test/integration/account-creation-tls-test.mjs +127 -0
- package/test/integration/account-manager-test.mjs +151 -0
- package/test/integration/account-template-test.mjs +136 -0
- package/test/integration/acl-oidc-test.mjs +1048 -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 +812 -0
- package/test/integration/authentication-oidc-with-strict-origins-turned-off-test.mjs +638 -0
- package/test/integration/capability-discovery-test.mjs +116 -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 +42 -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 +51 -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 +311 -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_5319f8e8e4ea3214c2e92b252520d355.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_9c0fd8442675a1afbe5115b9ae300c65.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_f15f340b6dc71b68d20eca0d7e87a972.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_7c634dfe325475cc8750e19c72acf6d9.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_3f1cecaefd21253767f6e047bd9b572f.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_a17f603b5907c97a5fac61a2eea7ecb2.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 +59 -0
- package/test/unit/acl-checker-test.mjs +51 -0
- package/test/unit/add-cert-request-test.mjs +120 -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 +166 -0
- package/test/unit/email-welcome-test.mjs +81 -0
- package/test/unit/error-pages-test.mjs +100 -0
- package/test/unit/esm-imports.test.mjs +149 -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 +50 -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 +119 -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 +38 -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 +114 -0
- package/test/utils/index.mjs +167 -0
- package/test/utils.mjs +205 -0
- package/test/validate-turtle.mjs +43 -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,23 @@
|
|
|
1
1
|
/* eslint-disable node/no-deprecated-api */
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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')
|
|
3
|
+
import utilPath, { join, dirname } from 'path'
|
|
4
|
+
import intoStream from 'into-stream'
|
|
5
|
+
import urlModule from 'url'
|
|
6
|
+
import fs from 'fs'
|
|
7
|
+
import $rdf from 'rdflib'
|
|
8
|
+
import { mkdirp } from 'fs-extra'
|
|
9
|
+
import { v4 as uuid } from 'uuid' // there seem to be an esm module
|
|
10
|
+
import debug from './debug.mjs'
|
|
11
|
+
import error from './http-error.mjs'
|
|
12
|
+
import { stringToStream, serialize, overQuota, getContentType, parse } from './utils.mjs'
|
|
13
|
+
import extend from 'extend'
|
|
14
|
+
import rimraf from 'rimraf'
|
|
15
|
+
import { exec } from 'child_process'
|
|
16
|
+
import * as ldpContainer from './ldp-container.mjs'
|
|
17
|
+
import fetch from 'node-fetch'
|
|
18
|
+
import { promisify } from 'util'
|
|
19
|
+
import withLock from './lock.mjs'
|
|
20
|
+
import { clearAclCache } from './acl-checker.mjs'
|
|
26
21
|
|
|
27
22
|
const RDF_MIME_TYPES = new Set([
|
|
28
23
|
'text/turtle', // .ttl
|
|
@@ -149,6 +144,7 @@ class LDP {
|
|
|
149
144
|
extension = ''
|
|
150
145
|
}
|
|
151
146
|
// pepare slug
|
|
147
|
+
debug.handlers('POST -- Slug: ' + slug) // alain
|
|
152
148
|
if (slug) {
|
|
153
149
|
slug = decodeURIComponent(slug)
|
|
154
150
|
|
|
@@ -170,7 +166,8 @@ class LDP {
|
|
|
170
166
|
debug.handlers('POST -- Will create at: ' + resourceUrl)
|
|
171
167
|
|
|
172
168
|
await ldp.put(resourceUrl, stream, contentType)
|
|
173
|
-
return
|
|
169
|
+
// return urlModule.parse(resourceUrl).path
|
|
170
|
+
return new URL(resourceUrl).pathname
|
|
174
171
|
}
|
|
175
172
|
|
|
176
173
|
isAuxResource (slug, extension) {
|
|
@@ -200,10 +197,9 @@ class LDP {
|
|
|
200
197
|
* @return {Promise<Graph>}
|
|
201
198
|
*/
|
|
202
199
|
async putGraph (graph, uri, contentType) {
|
|
203
|
-
const { path } = url.parse(uri)
|
|
204
200
|
const content = await serialize(graph, uri, contentType)
|
|
205
201
|
const stream = stringToStream(content)
|
|
206
|
-
return await this.put(
|
|
202
|
+
return await this.put(uri, stream, contentType)
|
|
207
203
|
}
|
|
208
204
|
|
|
209
205
|
isValidRdf (body, requestUri, contentType) {
|
|
@@ -211,7 +207,7 @@ class LDP {
|
|
|
211
207
|
try {
|
|
212
208
|
$rdf.parse(body, resourceGraph, requestUri, contentType)
|
|
213
209
|
} catch (err) {
|
|
214
|
-
debug.ldp('VALIDATE -- Error parsing data: ' + err)
|
|
210
|
+
if (debug && debug.ldp) debug.ldp('VALIDATE -- Error parsing data: ' + err)
|
|
215
211
|
return false
|
|
216
212
|
}
|
|
217
213
|
return true
|
|
@@ -225,7 +221,7 @@ class LDP {
|
|
|
225
221
|
'PUT request requires a content-type via the Content-Type header')
|
|
226
222
|
}
|
|
227
223
|
// reject resource with percent-encoded $ extension
|
|
228
|
-
const dollarExtensionRegex = /%(?:24)\.[^%(?:24)]*$/
|
|
224
|
+
const dollarExtensionRegex = /%(?:24)\.[^%(?:24)]*$/
|
|
229
225
|
if ((url.url || url).match(dollarExtensionRegex)) {
|
|
230
226
|
throw error(400, 'Resource with a $.ext is not allowed by the server')
|
|
231
227
|
}
|
|
@@ -233,7 +229,7 @@ class LDP {
|
|
|
233
229
|
let isOverQuota
|
|
234
230
|
// Someone had a reason to make url actually a req sometimes but not
|
|
235
231
|
// all the time. So now we have to account for that, as done below.
|
|
236
|
-
const hostname = typeof url !== 'string' ? url.hostname :
|
|
232
|
+
const hostname = typeof url !== 'string' ? url.hostname : urlModule.parse(url).hostname
|
|
237
233
|
try {
|
|
238
234
|
isOverQuota = await overQuota(this.resourceMapper.resolveFilePath(hostname), this.serverUri)
|
|
239
235
|
} catch (err) {
|
|
@@ -251,7 +247,6 @@ class LDP {
|
|
|
251
247
|
})
|
|
252
248
|
|
|
253
249
|
if (container) { path += suffixMeta }
|
|
254
|
-
// debug.handlers(container + ' item ' + (url.url || url) + ' ' + contentType + ' ' + path)
|
|
255
250
|
// check if file exists, and in that case that it has the same extension
|
|
256
251
|
if (!container) { await this.checkFileExtension(url, path) }
|
|
257
252
|
// Create the enclosing directory, if necessary, do not create pubsub if PUT create container
|
|
@@ -266,7 +261,7 @@ class LDP {
|
|
|
266
261
|
return withLock(path, () => new Promise((resolve, reject) => {
|
|
267
262
|
// HACK: the middleware in webid-oidc.js uses body-parser, thus ending the stream of data
|
|
268
263
|
// for JSON bodies. So, the stream needs to be reset
|
|
269
|
-
if (contentType.includes('application/json')) {
|
|
264
|
+
if (contentType && contentType.includes && contentType.includes('application/json')) {
|
|
270
265
|
stream = intoStream(JSON.stringify(stream.body))
|
|
271
266
|
}
|
|
272
267
|
const file = stream.pipe(fs.createWriteStream(path))
|
|
@@ -288,9 +283,9 @@ class LDP {
|
|
|
288
283
|
* @param {*} hostname
|
|
289
284
|
* @param {*} nonContainer
|
|
290
285
|
*/
|
|
291
|
-
async createDirectory (
|
|
286
|
+
async createDirectory (pathArg, hostname, nonContainer = true) {
|
|
292
287
|
try {
|
|
293
|
-
const dirName = dirname(
|
|
288
|
+
const dirName = dirname(pathArg)
|
|
294
289
|
if (!fs.existsSync(dirName)) {
|
|
295
290
|
await promisify(mkdirp)(dirName)
|
|
296
291
|
if (this.live && nonContainer) {
|
|
@@ -303,20 +298,19 @@ class LDP {
|
|
|
303
298
|
hostname
|
|
304
299
|
})).url
|
|
305
300
|
// Update websockets
|
|
306
|
-
this.live(
|
|
301
|
+
this.live(urlModule.parse(parentDirectoryUrl).pathname)
|
|
307
302
|
}
|
|
308
303
|
}
|
|
309
304
|
} catch (err) {
|
|
310
305
|
debug.handlers('PUT -- Error creating directory: ' + err)
|
|
311
|
-
throw error(err,
|
|
312
|
-
'Failed to create the path to the new resource')
|
|
306
|
+
throw error(err, 'Failed to create the path to the new resource')
|
|
313
307
|
}
|
|
314
308
|
}
|
|
315
309
|
|
|
316
|
-
async checkFileExtension (
|
|
310
|
+
async checkFileExtension (urlArg, pathArg) {
|
|
317
311
|
try {
|
|
318
|
-
const { path: existingPath } = await this.resourceMapper.mapUrlToFile({ url })
|
|
319
|
-
if (
|
|
312
|
+
const { path: existingPath } = await this.resourceMapper.mapUrlToFile({ url: urlArg })
|
|
313
|
+
if (pathArg !== existingPath) {
|
|
320
314
|
try {
|
|
321
315
|
await withLock(existingPath, () => promisify(fs.unlink)(existingPath))
|
|
322
316
|
} catch (err) { throw error(err, 'Failed to delete resource') }
|
|
@@ -390,11 +384,11 @@ class LDP {
|
|
|
390
384
|
async fetchGraph (uri, options = {}) {
|
|
391
385
|
const response = await fetch(uri)
|
|
392
386
|
if (!response.ok) {
|
|
393
|
-
const
|
|
387
|
+
const err = new Error(
|
|
394
388
|
`Error fetching ${uri}: ${response.status} ${response.statusText}`
|
|
395
389
|
)
|
|
396
|
-
|
|
397
|
-
throw
|
|
390
|
+
err.statusCode = response.status || 400
|
|
391
|
+
throw err
|
|
398
392
|
}
|
|
399
393
|
const body = await response.text()
|
|
400
394
|
|
|
@@ -402,20 +396,19 @@ class LDP {
|
|
|
402
396
|
}
|
|
403
397
|
|
|
404
398
|
/**
|
|
405
|
-
*
|
|
399
|
+
* Remotely loads the graph at a given uri, parses it and and returns it.
|
|
406
400
|
* Usage:
|
|
407
401
|
*
|
|
408
402
|
* ```
|
|
409
|
-
* ldp.
|
|
403
|
+
* ldp.fetchGraph('https://example.com/contacts/card1.ttl')
|
|
410
404
|
* .then(graph => {
|
|
411
|
-
* //
|
|
405
|
+
* // const matches = graph.match(...)
|
|
412
406
|
* })
|
|
413
407
|
* ```
|
|
414
408
|
*
|
|
415
409
|
* @param uri {string} Fully qualified uri of the request.
|
|
416
|
-
*
|
|
417
|
-
*
|
|
418
|
-
* @param [contentType] {string}
|
|
410
|
+
*
|
|
411
|
+
* @param [options] {object} Options hashmap, passed through to fetchGraph
|
|
419
412
|
*
|
|
420
413
|
* @return {Promise<Graph>}
|
|
421
414
|
*/
|
|
@@ -439,11 +432,9 @@ class LDP {
|
|
|
439
432
|
// this /.meta has no functionality in actual NSS
|
|
440
433
|
// comment https://github.com/solid/node-solid-server/pull/1604#discussion_r652903546
|
|
441
434
|
async isOwner (webId, hostname) {
|
|
442
|
-
// const ldp = req.app.locals.ldp
|
|
443
435
|
const rootUrl = this.resourceMapper.resolveUrl(hostname)
|
|
444
436
|
let graph
|
|
445
437
|
try {
|
|
446
|
-
// TODO check for permission ?? Owner is a MUST
|
|
447
438
|
graph = await this.getGraph(rootUrl + '/.meta')
|
|
448
439
|
const SOLID = $rdf.Namespace('http://www.w3.org/ns/solid/terms#')
|
|
449
440
|
const owner = await graph.statementsMatching($rdf.sym(webId), SOLID('account'), $rdf.sym(rootUrl + '/'))
|
|
@@ -454,40 +445,34 @@ class LDP {
|
|
|
454
445
|
}
|
|
455
446
|
|
|
456
447
|
async get (options, searchIndex = true) {
|
|
457
|
-
let
|
|
448
|
+
let pathLocal, contentType, stats
|
|
458
449
|
try {
|
|
459
|
-
({ path, contentType } = await this.resourceMapper.mapUrlToFile({ url: options, searchIndex }))
|
|
460
|
-
stats = await this.stat(
|
|
450
|
+
({ path: pathLocal, contentType } = await this.resourceMapper.mapUrlToFile({ url: options, searchIndex }))
|
|
451
|
+
stats = await this.stat(pathLocal)
|
|
461
452
|
} catch (err) {
|
|
462
453
|
throw error(err.status || 500, err.message)
|
|
463
454
|
}
|
|
464
455
|
|
|
465
|
-
// Just return, since resource exists
|
|
466
456
|
if (!options.includeBody) {
|
|
467
457
|
return { stream: stats, contentType, container: stats.isDirectory() }
|
|
468
458
|
}
|
|
469
459
|
|
|
470
|
-
// Found a container
|
|
471
460
|
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
|
|
461
|
+
const { url: absContainerUri } = await this.resourceMapper.mapFileToUrl({ path: pathLocal, hostname: options.hostname })
|
|
462
|
+
const metaFile = await this.readContainerMeta(absContainerUri).catch(() => '')
|
|
476
463
|
let data
|
|
477
464
|
try {
|
|
478
|
-
data = await this.listContainer(
|
|
465
|
+
data = await this.listContainer(pathLocal, absContainerUri, metaFile, options.hostname)
|
|
479
466
|
} catch (err) {
|
|
480
467
|
debug.handlers('GET container -- Read error:' + err.message)
|
|
481
468
|
throw err
|
|
482
469
|
}
|
|
483
470
|
const stream = stringToStream(data)
|
|
484
|
-
// TODO contentType is defaultContainerContentType ('text/turtle'),
|
|
485
|
-
// This forces one translation turtle -> desired
|
|
486
471
|
return { stream, contentType, container: true }
|
|
487
472
|
} else {
|
|
488
473
|
let chunksize, contentRange, start, end
|
|
489
474
|
if (options.range) {
|
|
490
|
-
const total = fs.statSync(
|
|
475
|
+
const total = fs.statSync(pathLocal).size
|
|
491
476
|
const parts = options.range.replace(/bytes=/, '').split('-')
|
|
492
477
|
const partialstart = parts[0]
|
|
493
478
|
const partialend = parts[1]
|
|
@@ -496,15 +481,15 @@ class LDP {
|
|
|
496
481
|
chunksize = (end - start) + 1
|
|
497
482
|
contentRange = 'bytes ' + start + '-' + end + '/' + total
|
|
498
483
|
}
|
|
499
|
-
return withLock(
|
|
500
|
-
const stream = fs.createReadStream(
|
|
484
|
+
return withLock(pathLocal, () => new Promise((resolve, reject) => {
|
|
485
|
+
const stream = fs.createReadStream(pathLocal, start && end ? { start, end } : {})
|
|
501
486
|
stream
|
|
502
487
|
.on('error', function (err) {
|
|
503
|
-
debug.handlers(`GET -- error reading ${
|
|
488
|
+
debug.handlers(`GET -- error reading ${pathLocal}: ${err.message}`)
|
|
504
489
|
return reject(error(err, "Can't read file " + err))
|
|
505
490
|
})
|
|
506
491
|
.on('open', function () {
|
|
507
|
-
debug.handlers(`GET -- Reading ${
|
|
492
|
+
debug.handlers(`GET -- Reading ${pathLocal}`)
|
|
508
493
|
return resolve({ stream, contentType, container: false, contentRange, chunksize })
|
|
509
494
|
})
|
|
510
495
|
}))
|
|
@@ -544,9 +529,7 @@ class LDP {
|
|
|
544
529
|
}
|
|
545
530
|
|
|
546
531
|
async deleteContainer (directory) {
|
|
547
|
-
if (directory[directory.length - 1] !== '/')
|
|
548
|
-
directory += '/'
|
|
549
|
-
}
|
|
532
|
+
if (directory[directory.length - 1] !== '/') directory += '/'
|
|
550
533
|
|
|
551
534
|
// Ensure the container exists
|
|
552
535
|
let list
|
|
@@ -590,22 +573,245 @@ class LDP {
|
|
|
590
573
|
}
|
|
591
574
|
}
|
|
592
575
|
|
|
593
|
-
async
|
|
576
|
+
async copy (from, to, options) {
|
|
577
|
+
if (overQuota(this.quotaFile, this.quota)) {
|
|
578
|
+
debug.handlers('COPY -- Over quota')
|
|
579
|
+
throw error(413, 'Storage quota exceeded')
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
const originalParsedPath = urlModule.parse(from)
|
|
583
|
+
const parsedPath = urlModule.parse(to)
|
|
584
|
+
const fromPath = this.resourceMapper.resolveFilePath(
|
|
585
|
+
originalParsedPath.hostname,
|
|
586
|
+
decodeURIComponent(originalParsedPath.pathname)
|
|
587
|
+
)
|
|
588
|
+
const toPath = this.resourceMapper.resolveFilePath(
|
|
589
|
+
parsedPath.hostname,
|
|
590
|
+
decodeURIComponent(parsedPath.pathname)
|
|
591
|
+
)
|
|
592
|
+
|
|
593
|
+
// Check if file already exists
|
|
594
|
+
if (fs.existsSync(toPath)) {
|
|
595
|
+
throw error(412, 'Target file already exists')
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
let copyPromise
|
|
599
|
+
|
|
600
|
+
// create destination directory if not exists
|
|
601
|
+
mkdirp(dirname(toPath))
|
|
602
|
+
|
|
603
|
+
// If original is a single file
|
|
604
|
+
if (!fromPath.endsWith('/')) {
|
|
605
|
+
copyPromise = new Promise((resolve, reject) => {
|
|
606
|
+
const readStream = fs.createReadStream(fromPath)
|
|
607
|
+
const writeStream = fs.createWriteStream(toPath)
|
|
608
|
+
readStream.on('error', function (err) {
|
|
609
|
+
debug.handlers('Error reading file: ' + err)
|
|
610
|
+
reject(error(500, err))
|
|
611
|
+
})
|
|
612
|
+
writeStream.on('error', function (err) {
|
|
613
|
+
debug.handlers('Error writing file: ' + err)
|
|
614
|
+
reject(error(500, err))
|
|
615
|
+
})
|
|
616
|
+
writeStream.on('finish', function () {
|
|
617
|
+
debug.handlers('Finished copying file')
|
|
618
|
+
resolve()
|
|
619
|
+
})
|
|
620
|
+
readStream.pipe(writeStream)
|
|
621
|
+
})
|
|
622
|
+
} else {
|
|
623
|
+
// If original is a folder, copy recursively
|
|
624
|
+
copyPromise = new Promise((resolve, reject) => {
|
|
625
|
+
exec(`cp -r "${fromPath}" "${toPath}"`, function (err) {
|
|
626
|
+
if (err) {
|
|
627
|
+
debug.handlers('Error copying directory: ' + err)
|
|
628
|
+
reject(error(500, err))
|
|
629
|
+
} else {
|
|
630
|
+
debug.handlers('Finished copying directory')
|
|
631
|
+
resolve()
|
|
632
|
+
}
|
|
633
|
+
})
|
|
634
|
+
})
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
await copyPromise
|
|
638
|
+
// Copy ACL file if exists
|
|
639
|
+
if (fs.existsSync(fromPath + this.suffixAcl)) {
|
|
640
|
+
const readAclStream = fs.createReadStream(fromPath + this.suffixAcl)
|
|
641
|
+
const writeAclStream = fs.createWriteStream(toPath + this.suffixAcl)
|
|
642
|
+
await new Promise((resolve, reject) => {
|
|
643
|
+
readAclStream.on('error', function (err) {
|
|
644
|
+
debug.handlers('Error reading ACL file: ' + err)
|
|
645
|
+
reject(error(500, err))
|
|
646
|
+
})
|
|
647
|
+
writeAclStream.on('error', function (err) {
|
|
648
|
+
debug.handlers('Error writing ACL file: ' + err)
|
|
649
|
+
reject(error(500, err))
|
|
650
|
+
})
|
|
651
|
+
writeAclStream.on('finish', function () {
|
|
652
|
+
debug.handlers('Finished copying ACL file')
|
|
653
|
+
resolve()
|
|
654
|
+
})
|
|
655
|
+
readAclStream.pipe(writeAclStream)
|
|
656
|
+
})
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
// Copy meta file if exists
|
|
660
|
+
if (fs.existsSync(fromPath + this.suffixMeta)) {
|
|
661
|
+
const readMetaStream = fs.createReadStream(fromPath + this.suffixMeta)
|
|
662
|
+
const writeMetaStream = fs.createWriteStream(toPath + this.suffixMeta)
|
|
663
|
+
await new Promise((resolve, reject) => {
|
|
664
|
+
readMetaStream
|
|
665
|
+
.on('error', function (err) {
|
|
666
|
+
debug.handlers('Error reading meta file: ' + err)
|
|
667
|
+
reject(error(500, err))
|
|
668
|
+
})
|
|
669
|
+
.on('open', function () {
|
|
670
|
+
readMetaStream.pipe(writeMetaStream)
|
|
671
|
+
})
|
|
672
|
+
writeMetaStream.on('error', function (err) {
|
|
673
|
+
debug.handlers('Error writing meta file: ' + err)
|
|
674
|
+
reject(error(500, err))
|
|
675
|
+
})
|
|
676
|
+
writeMetaStream.on('finish', function () {
|
|
677
|
+
debug.handlers('Finished copying meta file')
|
|
678
|
+
resolve()
|
|
679
|
+
})
|
|
680
|
+
})
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
await clearAclCache()
|
|
684
|
+
|
|
685
|
+
debug.handlers('COPY -- Copied ' + fromPath + ' to ' + toPath)
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
async patch (uri, patchObject) {
|
|
689
|
+
if (overQuota(this.quotaFile, this.quota)) {
|
|
690
|
+
debug.handlers('PATCH -- Over quota')
|
|
691
|
+
throw error(413, 'Storage quota exceeded')
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
const url = uri
|
|
695
|
+
let path
|
|
696
|
+
try {
|
|
697
|
+
({ path } = await this.resourceMapper.mapUrlToFile({ url }))
|
|
698
|
+
} catch (err) {
|
|
699
|
+
throw error(err.status || 500, err.message)
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
await withLock(path, async () => {
|
|
703
|
+
let originalData = ''
|
|
704
|
+
|
|
705
|
+
try {
|
|
706
|
+
originalData = await promisify(fs.readFile)(path, { encoding: 'utf8' })
|
|
707
|
+
} catch (err) {
|
|
708
|
+
throw error(err, 'Cannot patch a file that does not exist')
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
const contentType = getContentType(path)
|
|
712
|
+
const patchedData = await this.applyPatch(originalData, patchObject, contentType, uri)
|
|
713
|
+
|
|
714
|
+
// Write patched data back to file
|
|
715
|
+
await promisify(fs.writeFile)(path, patchedData, 'utf8')
|
|
716
|
+
})
|
|
717
|
+
|
|
718
|
+
await clearAclCache()
|
|
719
|
+
|
|
720
|
+
debug.handlers('PATCH -- Patched:' + path)
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
async applyPatch (data, patchObject, contentType, uri) {
|
|
724
|
+
const baseGraph = $rdf.graph()
|
|
725
|
+
let patchedGraph
|
|
726
|
+
|
|
727
|
+
try {
|
|
728
|
+
$rdf.parse(data, baseGraph, uri, contentType)
|
|
729
|
+
} catch (err) {
|
|
730
|
+
throw error(500, 'Cannot parse file for patching: ' + uri)
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
// Apply patches
|
|
734
|
+
if (patchObject.updates) {
|
|
735
|
+
patchedGraph = await this.applyPatchUpdate(baseGraph, patchObject.updates, uri, contentType)
|
|
736
|
+
} else if (patchObject.deletes || patchObject.inserts) {
|
|
737
|
+
patchedGraph = await this.applyPatchInsertDelete(baseGraph, patchObject, uri, contentType)
|
|
738
|
+
} else {
|
|
739
|
+
throw error(422, 'Invalid patch object')
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
try {
|
|
743
|
+
return await serialize(patchedGraph, uri, contentType)
|
|
744
|
+
} catch (err) {
|
|
745
|
+
throw error(500, 'Cannot serialize patched file: ' + uri)
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
async applyPatchUpdate (baseGraph, updates, uri, contentType) {
|
|
750
|
+
const patchedGraph = baseGraph
|
|
751
|
+
|
|
752
|
+
for (const update of updates) {
|
|
753
|
+
if (update.operation === 'delete') {
|
|
754
|
+
const deleteQuads = this.parseQuads(update.where, uri, contentType)
|
|
755
|
+
for (const quad of deleteQuads) {
|
|
756
|
+
patchedGraph.removeMatches(quad.subject, quad.predicate, quad.object)
|
|
757
|
+
}
|
|
758
|
+
} else if (update.operation === 'insert') {
|
|
759
|
+
const insertQuads = this.parseQuads(update.quads, uri, contentType)
|
|
760
|
+
for (const quad of insertQuads) {
|
|
761
|
+
patchedGraph.add(quad.subject, quad.predicate, quad.object)
|
|
762
|
+
}
|
|
763
|
+
} else {
|
|
764
|
+
throw error(422, 'Unknown patch operation: ' + update.operation)
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
return patchedGraph
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
async applyPatchInsertDelete (baseGraph, patchObject, uri, contentType) {
|
|
772
|
+
const patchedGraph = baseGraph
|
|
773
|
+
|
|
774
|
+
// Apply deletes first
|
|
775
|
+
if (patchObject.deletes) {
|
|
776
|
+
const deleteQuads = this.parseQuads(patchObject.deletes, uri, contentType)
|
|
777
|
+
for (const quad of deleteQuads) {
|
|
778
|
+
patchedGraph.removeMatches(quad.subject, quad.predicate, quad.object)
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
|
|
782
|
+
// Apply inserts
|
|
783
|
+
if (patchObject.inserts) {
|
|
784
|
+
const insertQuads = this.parseQuads(patchObject.inserts, uri, contentType)
|
|
785
|
+
for (const quad of insertQuads) {
|
|
786
|
+
patchedGraph.add(quad.subject, quad.predicate, quad.object)
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
return patchedGraph
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
parseQuads (quads, uri, contentType) {
|
|
794
|
+
const graph = $rdf.graph()
|
|
795
|
+
$rdf.parse(quads, graph, uri, contentType)
|
|
796
|
+
return graph.statements
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
async getAvailableUrl (hostname, containerURI, { slug = uuid(), extension, container } = {}) {
|
|
594
800
|
let requestUrl = this.resourceMapper.resolveUrl(hostname, containerURI)
|
|
595
|
-
requestUrl = requestUrl.replace(/\/*$/, '/')
|
|
801
|
+
requestUrl = requestUrl.replace(/\/*$/, '/')
|
|
596
802
|
|
|
597
803
|
let itemName = slug.endsWith(extension) || slug.endsWith(this.suffixAcl) || slug.endsWith(this.suffixMeta) ? slug : slug + extension
|
|
598
804
|
try {
|
|
599
805
|
// check whether resource exists
|
|
600
806
|
const context = container ? '/' : ''
|
|
601
807
|
await this.resourceMapper.mapUrlToFile({ url: (requestUrl + itemName + context) })
|
|
602
|
-
itemName = `${uuid
|
|
808
|
+
itemName = `${uuid()}-${itemName}`
|
|
603
809
|
} catch (e) {
|
|
604
810
|
try {
|
|
605
811
|
// check whether resource with same name exists
|
|
606
812
|
const context = !container ? '/' : ''
|
|
607
813
|
await this.resourceMapper.mapUrlToFile({ url: (requestUrl + itemName + context) })
|
|
608
|
-
itemName = `${uuid
|
|
814
|
+
itemName = `${uuid()}-${itemName}`
|
|
609
815
|
} catch (e) {}
|
|
610
816
|
}
|
|
611
817
|
if (container) itemName += '/'
|
|
@@ -620,6 +826,10 @@ class LDP {
|
|
|
620
826
|
return trustedOrigins
|
|
621
827
|
}
|
|
622
828
|
|
|
829
|
+
static getRDFMimeTypes () {
|
|
830
|
+
return Array.from(RDF_MIME_TYPES)
|
|
831
|
+
}
|
|
832
|
+
|
|
623
833
|
static mimeTypeIsRdf (mimeType) {
|
|
624
834
|
return RDF_MIME_TYPES.has(mimeType)
|
|
625
835
|
}
|
|
@@ -628,4 +838,5 @@ class LDP {
|
|
|
628
838
|
return Array.from(RDF_MIME_TYPES)
|
|
629
839
|
}
|
|
630
840
|
}
|
|
631
|
-
|
|
841
|
+
|
|
842
|
+
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 }
|