solid-server 5.8.6 → 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.
Files changed (686) hide show
  1. package/CHANGELOG.md +0 -0
  2. package/CONTRIBUTING.md +0 -0
  3. package/CONTRIBUTORS.md +0 -0
  4. package/Dockerfile +0 -0
  5. package/LICENSE.md +0 -0
  6. package/README.md +0 -0
  7. package/bin/config.json +0 -0
  8. package/bin/lib/cli-utils.mjs +54 -0
  9. package/bin/lib/cli.mjs +44 -0
  10. package/bin/lib/{init.js → init.mjs} +93 -94
  11. package/bin/lib/{invalidUsernames.js → invalidUsernames.mjs} +136 -148
  12. package/bin/lib/{migrateLegacyResources.js → migrateLegacyResources.mjs} +64 -69
  13. package/bin/lib/{options.js → options.mjs} +379 -405
  14. package/bin/lib/{start.js → start.mjs} +124 -148
  15. package/bin/lib/{updateIndex.js → updateIndex.mjs} +55 -56
  16. package/bin/solid +2 -2
  17. package/bin/solid-test +0 -0
  18. package/common/css/bootstrap.min.css +6 -0
  19. package/common/css/solid.css +0 -0
  20. package/common/fonts/glyphicons-halflings-regular.eot +0 -0
  21. package/common/fonts/glyphicons-halflings-regular.svg +0 -0
  22. package/common/fonts/glyphicons-halflings-regular.ttf +0 -0
  23. package/common/fonts/glyphicons-halflings-regular.woff +0 -0
  24. package/common/fonts/glyphicons-halflings-regular.woff2 +0 -0
  25. package/common/img/solid-emblem.svg +0 -0
  26. package/common/js/auth-buttons.js +0 -0
  27. package/common/js/auth-buttons.mjs +57 -0
  28. package/common/js/index-buttons.js +0 -0
  29. package/common/js/index-buttons.mjs +43 -0
  30. package/common/js/solid.js +0 -0
  31. package/common/js/solid.mjs +456 -0
  32. package/common/well-known/security.txt +0 -0
  33. package/config/defaults.js +0 -0
  34. package/config/defaults.mjs +22 -0
  35. package/config/templates/emails/delete-account.js +49 -0
  36. package/config/templates/emails/delete-account.mjs +31 -0
  37. package/config/templates/emails/invalid-username.js +30 -0
  38. package/config/templates/emails/invalid-username.mjs +27 -0
  39. package/config/templates/emails/reset-password.js +49 -0
  40. package/config/templates/emails/reset-password.mjs +31 -0
  41. package/config/templates/emails/welcome.js +39 -0
  42. package/config/templates/emails/welcome.mjs +23 -0
  43. package/config/templates/new-account/favicon.ico +0 -0
  44. package/config/templates/new-account/favicon.ico.acl +26 -0
  45. package/config/templates/new-account/profile/card$.ttl +26 -0
  46. package/config/templates/new-account/robots.txt +3 -0
  47. package/config/templates/new-account/robots.txt.acl +26 -0
  48. package/config/templates/new-account/settings/prefs.ttl +15 -0
  49. package/config/templates/new-account/settings/privateTypeIndex.ttl +4 -0
  50. package/config/templates/new-account/settings/publicTypeIndex.ttl +4 -0
  51. package/{default-templates/new-account/.meta.acl → config/templates/new-account/settings/publicTypeIndex.ttl.acl} +4 -4
  52. package/config/templates/new-account/settings/serverSide.ttl.acl +13 -0
  53. package/config/templates/new-account/settings/serverSide.ttl.inactive +12 -0
  54. package/config/templates/server/favicon.ico +0 -0
  55. package/{.well-known/.acl → config/templates/server/favicon.ico.acl} +2 -2
  56. package/config/templates/server/index.html +54 -0
  57. package/config/templates/server/robots.txt +3 -0
  58. package/{default-templates/server/.well-known/.acl → config/templates/server/robots.txt.acl} +2 -2
  59. package/config/usernames-blacklist.json +0 -0
  60. package/config/views/account/account-deleted.hbs +17 -0
  61. package/config/views/account/delete-confirm.hbs +51 -0
  62. package/config/views/account/delete-link-sent.hbs +17 -0
  63. package/config/views/account/delete.hbs +51 -0
  64. package/config/views/account/invalid-username.hbs +22 -0
  65. package/config/views/account/register-disabled.hbs +6 -0
  66. package/config/views/account/register-form.hbs +133 -0
  67. package/config/views/account/register.hbs +24 -0
  68. package/config/views/auth/auth-hidden-fields.hbs +8 -0
  69. package/config/views/auth/change-password.hbs +58 -0
  70. package/config/views/auth/goodbye.hbs +23 -0
  71. package/config/views/auth/login-required.hbs +34 -0
  72. package/config/views/auth/login-tls.hbs +11 -0
  73. package/config/views/auth/login-username-password.hbs +28 -0
  74. package/config/views/auth/login.hbs +55 -0
  75. package/config/views/auth/no-permission.hbs +29 -0
  76. package/config/views/auth/password-changed.hbs +27 -0
  77. package/config/views/auth/reset-link-sent.hbs +21 -0
  78. package/config/views/auth/reset-password.hbs +52 -0
  79. package/config/views/auth/sharing.hbs +49 -0
  80. package/config/views/shared/create-account.hbs +8 -0
  81. package/config/views/shared/error.hbs +5 -0
  82. package/config.json-default +0 -0
  83. package/coverage/tmp/coverage-2260-1766832656715-0.json +1 -0
  84. package/coverage/tmp/coverage-2261-1766832635310-0.json +1 -0
  85. package/default-templates/emails/delete-account.js +0 -0
  86. package/default-templates/emails/delete-account.mjs +31 -0
  87. package/default-templates/emails/invalid-username.js +0 -0
  88. package/default-templates/emails/invalid-username.mjs +27 -0
  89. package/default-templates/emails/reset-password.js +0 -0
  90. package/default-templates/emails/reset-password.mjs +31 -0
  91. package/default-templates/emails/welcome.js +0 -0
  92. package/default-templates/emails/welcome.mjs +23 -0
  93. package/default-templates/new-account/favicon.ico +0 -0
  94. package/default-templates/new-account/favicon.ico.acl +0 -0
  95. package/default-templates/new-account/profile/card$.ttl +0 -0
  96. package/default-templates/new-account/robots.txt +0 -0
  97. package/default-templates/new-account/robots.txt.acl +0 -0
  98. package/default-templates/new-account/settings/prefs.ttl +0 -0
  99. package/default-templates/new-account/settings/privateTypeIndex.ttl +0 -0
  100. package/default-templates/new-account/settings/publicTypeIndex.ttl +0 -0
  101. package/default-templates/new-account/settings/publicTypeIndex.ttl.acl +0 -0
  102. package/default-templates/new-account/settings/serverSide.ttl.acl +0 -0
  103. package/default-templates/new-account/settings/serverSide.ttl.inactive +0 -0
  104. package/default-templates/server/favicon.ico +0 -0
  105. package/default-templates/server/favicon.ico.acl +0 -0
  106. package/default-templates/server/index.html +0 -0
  107. package/default-templates/server/robots.txt +0 -0
  108. package/default-templates/server/robots.txt.acl +0 -0
  109. package/default-views/account/account-deleted.hbs +0 -0
  110. package/default-views/account/delete-confirm.hbs +0 -0
  111. package/default-views/account/delete-link-sent.hbs +0 -0
  112. package/default-views/account/delete.hbs +0 -0
  113. package/default-views/account/invalid-username.hbs +0 -0
  114. package/default-views/account/register-disabled.hbs +0 -0
  115. package/default-views/account/register-form.hbs +0 -0
  116. package/default-views/account/register.hbs +0 -0
  117. package/default-views/auth/auth-hidden-fields.hbs +0 -0
  118. package/default-views/auth/change-password.hbs +0 -0
  119. package/default-views/auth/goodbye.hbs +0 -0
  120. package/default-views/auth/login-required.hbs +0 -0
  121. package/default-views/auth/login-tls.hbs +0 -0
  122. package/default-views/auth/login-username-password.hbs +0 -0
  123. package/default-views/auth/login.hbs +0 -0
  124. package/default-views/auth/no-permission.hbs +0 -0
  125. package/default-views/auth/password-changed.hbs +0 -0
  126. package/default-views/auth/reset-link-sent.hbs +0 -0
  127. package/default-views/auth/reset-password.hbs +0 -0
  128. package/default-views/auth/sharing.hbs +0 -0
  129. package/default-views/shared/create-account.hbs +0 -0
  130. package/default-views/shared/error.hbs +0 -0
  131. package/docker-compose.yml +0 -0
  132. package/docker-image/CONTRIBUTING.md +33 -0
  133. package/docker-image/Makefile +32 -0
  134. package/docker-image/README.md +65 -0
  135. package/docker-image/examples/docker-compose.all-in-one.yml +76 -0
  136. package/docker-image/examples/docker-compose.nginx.yml +51 -0
  137. package/docker-image/examples/docker-compose.simple.yml +34 -0
  138. package/docker-image/src/Dockerfile +34 -0
  139. package/docker-image/src/checks.sh +56 -0
  140. package/docker-image/src/create-temporary-cert.sh +14 -0
  141. package/docker-image/src/entrypoint.sh +8 -0
  142. package/{common/img/.gitkeep → docker-image/test/__init__.py} +0 -0
  143. package/docker-image/test/conftest.py +15 -0
  144. package/docker-image/test/test_image_foundations.py +51 -0
  145. package/docker-image/test/test_non_accessible_key_cert.py +36 -0
  146. package/docker-image/test/test_precondition_checks.py +41 -0
  147. package/docker-image/test/test_solid_default_config.py +66 -0
  148. package/docker-image/test/test_volumes.py +55 -0
  149. package/docker-image/test/wait_for_container.py +8 -0
  150. package/docs/how-to-delete-your-account.md +0 -0
  151. package/docs/login-and-grant-access-to-application.md +0 -0
  152. package/examples/custom-error-handling.js +0 -0
  153. package/examples/custom-error-handling.mjs +29 -0
  154. package/examples/ldp-with-webid.js +0 -0
  155. package/examples/ldp-with-webid.mjs +12 -0
  156. package/examples/simple-express-app.js +0 -0
  157. package/examples/simple-express-app.mjs +20 -0
  158. package/examples/simple-ldp-server.js +0 -0
  159. package/examples/simple-ldp-server.mjs +8 -0
  160. package/favicon.ico +0 -0
  161. package/favicon.ico.acl +0 -0
  162. package/index.cjs +4 -0
  163. package/index.html +0 -0
  164. package/index.mjs +23 -0
  165. package/lib/{acl-checker.js → acl-checker.mjs} +13 -15
  166. package/lib/api/accounts/{user-accounts.js → user-accounts.mjs} +17 -16
  167. package/lib/api/authn/{force-user.js → force-user.mjs} +5 -4
  168. package/lib/api/authn/index.mjs +8 -0
  169. package/lib/api/authn/{webid-oidc.js → webid-oidc.mjs} +27 -20
  170. package/lib/api/authn/{webid-tls.js → webid-tls.mjs} +12 -11
  171. package/lib/api/index.mjs +7 -0
  172. package/lib/{capability-discovery.js → capability-discovery.mjs} +3 -6
  173. package/lib/common/{fs-utils.js → fs-utils.mjs} +35 -43
  174. package/lib/common/template-utils.mjs +29 -0
  175. package/lib/common/{user-utils.js → user-utils.mjs} +24 -28
  176. package/lib/{create-app.js → create-app.mjs} +372 -361
  177. package/lib/{create-server.js → create-server.mjs} +32 -11
  178. package/lib/debug.mjs +37 -0
  179. package/lib/handlers/{allow.js → allow.mjs} +79 -83
  180. package/lib/handlers/{auth-proxy.js → auth-proxy.mjs} +4 -5
  181. package/lib/handlers/{copy.js → copy.mjs} +37 -39
  182. package/lib/handlers/{cors-proxy.js → cors-proxy.mjs} +9 -11
  183. package/lib/handlers/{delete.js → delete.mjs} +20 -22
  184. package/lib/handlers/{error-pages.js → error-pages.mjs} +144 -212
  185. package/lib/handlers/{get.js → get.mjs} +254 -252
  186. package/lib/handlers/{index.js → index.mjs} +7 -8
  187. package/lib/handlers/{notify.js → notify.mjs} +8 -10
  188. package/lib/handlers/{options.js → options.mjs} +3 -5
  189. package/lib/handlers/patch/{n3-patch-parser.js → n3-patch-parser.mjs} +57 -59
  190. package/lib/handlers/patch/{sparql-update-parser.js → sparql-update-parser.mjs} +14 -16
  191. package/lib/handlers/{patch.js → patch.mjs} +241 -235
  192. package/lib/handlers/{post.js → post.mjs} +101 -99
  193. package/lib/handlers/{put.js → put.mjs} +101 -105
  194. package/lib/handlers/{restrict-to-top-domain.js → restrict-to-top-domain.mjs} +2 -2
  195. package/lib/{header.js → header.mjs} +138 -143
  196. package/lib/{http-error.js → http-error.mjs} +35 -34
  197. package/lib/{ldp-container.js → ldp-container.mjs} +10 -12
  198. package/lib/ldp-copy.mjs +82 -0
  199. package/lib/ldp-middleware.mjs +38 -0
  200. package/lib/{ldp.js → ldp.mjs} +286 -75
  201. package/lib/{lock.js → lock.mjs} +10 -10
  202. package/lib/{metadata.js → metadata.mjs} +11 -11
  203. package/lib/models/account-manager.mjs +297 -0
  204. package/lib/models/account-template.mjs +70 -0
  205. package/lib/models/authenticator.mjs +161 -0
  206. package/lib/models/oidc-manager.mjs +23 -0
  207. package/lib/models/solid-host.mjs +63 -0
  208. package/lib/models/user-account.mjs +50 -0
  209. package/lib/models/webid-tls-certificate.mjs +97 -0
  210. package/lib/{payment-pointer-discovery.js → payment-pointer-discovery.mjs} +5 -8
  211. package/lib/{rdf-notification-template.js → rdf-notification-template.mjs} +3 -5
  212. package/lib/requests/add-cert-request.mjs +70 -0
  213. package/lib/requests/auth-request.mjs +151 -0
  214. package/lib/requests/{create-account-request.js → create-account-request.mjs} +249 -452
  215. package/lib/requests/delete-account-confirm-request.mjs +85 -0
  216. package/lib/requests/{delete-account-request.js → delete-account-request.mjs} +73 -134
  217. package/lib/requests/login-request.mjs +89 -0
  218. package/lib/requests/{password-change-request.js → password-change-request.mjs} +132 -201
  219. package/lib/requests/{password-reset-email-request.js → password-reset-email-request.mjs} +123 -202
  220. package/lib/requests/password-reset-request.mjs +47 -0
  221. package/lib/requests/register-request.mjs +48 -0
  222. package/lib/requests/{sharing-request.js → sharing-request.mjs} +174 -261
  223. package/lib/{resource-mapper.js → resource-mapper.mjs} +7 -6
  224. package/lib/{server-config.js → server-config.mjs} +15 -20
  225. package/lib/services/{blacklist-service.js → blacklist-service.mjs} +36 -33
  226. package/lib/services/email-service.mjs +76 -0
  227. package/lib/services/{token-service.js → token-service.mjs} +36 -44
  228. package/lib/{utils.js → utils.mjs} +309 -254
  229. package/lib/webid/{index.js → index.mjs} +9 -13
  230. package/lib/webid/lib/get.mjs +31 -0
  231. package/lib/webid/lib/{parse.js → parse.mjs} +10 -12
  232. package/lib/webid/lib/verify.mjs +77 -0
  233. package/lib/webid/tls/generate.mjs +53 -0
  234. package/lib/webid/tls/index.mjs +7 -0
  235. package/package.json +61 -41
  236. package/renovate.json +0 -0
  237. package/robots.txt +0 -0
  238. package/robots.txt.acl +0 -0
  239. package/solid-server-5.8.8.tgz +0 -0
  240. package/static/account-recovery.html +0 -0
  241. package/static/popup-redirect.html +0 -0
  242. package/static/signup.html +0 -0
  243. package/static/signup.html.acl +0 -0
  244. package/test/index.mjs +168 -0
  245. package/test/integration/account-creation-tls-test.mjs +127 -0
  246. package/test/integration/account-manager-test.mjs +151 -0
  247. package/test/integration/account-template-test.mjs +136 -0
  248. package/test/integration/acl-oidc-test.mjs +1048 -0
  249. package/test/integration/acl-tls-test.mjs +964 -0
  250. package/test/integration/auth-proxy-test.mjs +144 -0
  251. package/test/integration/authentication-oidc-test.mjs +812 -0
  252. package/test/integration/authentication-oidc-with-strict-origins-turned-off-test.mjs +638 -0
  253. package/test/integration/capability-discovery-test.mjs +116 -0
  254. package/test/integration/cors-proxy-test.mjs +145 -0
  255. package/test/integration/errors-oidc-test.mjs +109 -0
  256. package/test/integration/errors-test.mjs +49 -0
  257. package/test/integration/formats-test.mjs +136 -0
  258. package/test/integration/header-test.mjs +101 -0
  259. package/test/integration/http-copy-test.mjs +109 -0
  260. package/test/integration/http-test.mjs +1197 -0
  261. package/test/integration/ldp-test.mjs +528 -0
  262. package/test/integration/oidc-manager-test.mjs +42 -0
  263. package/test/integration/params-test.mjs +192 -0
  264. package/test/integration/patch-sparql-update-test.mjs +195 -0
  265. package/test/integration/patch-test.mjs +590 -0
  266. package/test/integration/payment-pointer-test.mjs +155 -0
  267. package/test/integration/prep-test.mjs +314 -0
  268. package/test/integration/quota-test.mjs +51 -0
  269. package/test/integration/special-root-acl-handling-test.mjs +68 -0
  270. package/test/integration/validate-tts-test.mjs +57 -0
  271. package/test/integration/www-account-creation-oidc-test.mjs +311 -0
  272. package/test/keys/cert.pem +21 -0
  273. package/test/keys/client-cert.pem +19 -0
  274. package/test/keys/client-key.pem +27 -0
  275. package/test/keys/key.pem +27 -0
  276. package/test/keys/user1-cert.pem +23 -0
  277. package/test/keys/user1-key.pem +28 -0
  278. package/test/keys/user2-cert.pem +23 -0
  279. package/test/keys/user2-key.pem +27 -0
  280. package/test/mocha.opts +2 -0
  281. package/test/resources/Makefile +146 -0
  282. package/test/resources/accounts/alice.localhost/profile/card +0 -0
  283. package/test/resources/accounts/db/oidc/op/clients/_key_5319f8e8e4ea3214c2e92b252520d355.json +1 -0
  284. package/test/resources/accounts/db/oidc/op/provider.json +763 -0
  285. package/test/resources/accounts/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A3457.json +1 -0
  286. package/test/resources/accounts/localhost/samplePublicContainer/nicola.jpg +0 -0
  287. package/test/resources/accounts/tim.localhost/hello.html +9 -0
  288. package/test/resources/accounts/tim.localhost/profile/card +0 -0
  289. package/test/resources/accounts-acl/config/templates/emails/welcome-test.js +39 -0
  290. package/test/resources/accounts-acl/config/templates/new-account/favicon.ico +0 -0
  291. package/test/resources/accounts-acl/config/templates/new-account/favicon.ico.acl +26 -0
  292. package/test/resources/accounts-acl/config/templates/new-account/index.html +28 -0
  293. package/test/resources/accounts-acl/config/templates/new-account/index.html.acl +22 -0
  294. package/test/resources/accounts-acl/config/templates/new-account/profile/card +27 -0
  295. package/{default-templates/new-account/inbox/.acl → test/resources/accounts-acl/config/templates/new-account/profile/card.acl} +5 -6
  296. package/test/resources/accounts-acl/config/templates/new-account/settings/prefs.ttl +9 -0
  297. package/test/resources/accounts-acl/config/templates/new-account/settings/privateTypeIndex.ttl +4 -0
  298. package/test/resources/accounts-acl/config/templates/new-account/settings/publicTypeIndex.ttl +4 -0
  299. package/test/resources/accounts-acl/config/templates/new-account/settings/publicTypeIndex.ttl.acl +25 -0
  300. package/test/resources/accounts-acl/config/templates/new-account/settings/serverSide.ttl +14 -0
  301. package/test/resources/accounts-acl/config/templates/server/index.html +35 -0
  302. package/{.acl → test/resources/accounts-acl/config/templates/server/index.html.acl} +4 -3
  303. package/test/resources/accounts-acl/config/views/account/register.hbs +58 -0
  304. package/test/resources/accounts-acl/config/views/auth/consent.hbs +49 -0
  305. package/test/resources/accounts-acl/config/views/auth/goodbye.hbs +20 -0
  306. package/test/resources/accounts-acl/config/views/auth/login-required.hbs +0 -0
  307. package/test/resources/accounts-acl/config/views/auth/login.hbs +51 -0
  308. package/test/resources/accounts-acl/config/views/auth/no-permission.hbs +0 -0
  309. package/test/resources/accounts-acl/db/oidc/op/clients/_key_77bb3b35edb1f3f7b887c25d1211a491.json +1 -0
  310. package/test/resources/accounts-acl/db/oidc/op/provider.json +763 -0
  311. package/test/resources/accounts-acl/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A7777.json +1 -0
  312. package/test/resources/accounts-acl/localhost/favicon.ico +0 -0
  313. package/test/resources/accounts-acl/localhost/index.html +35 -0
  314. package/{default-templates/server/.acl → test/resources/accounts-acl/localhost/index.html.acl} +4 -3
  315. package/test/resources/accounts-acl/nicola.localhost/index.html +1 -0
  316. package/test/resources/accounts-acl/nicola.localhost/index.html.acl +10 -0
  317. package/test/resources/accounts-acl/quota/settings/serverSide.ttl +11 -0
  318. package/test/resources/accounts-acl/tim.localhost/append-acl/abc.ttl +1 -0
  319. package/test/resources/accounts-acl/tim.localhost/append-acl/abc.ttl.acl +8 -0
  320. package/test/resources/accounts-acl/tim.localhost/append-acl/abc2.ttl +1 -0
  321. package/test/resources/accounts-acl/tim.localhost/append-acl/abc2.ttl.acl +8 -0
  322. package/test/resources/accounts-acl/tim.localhost/fake-account/hello.html +9 -0
  323. package/test/resources/accounts-acl/tim.localhost/group/test-folder/group-listing-error.ttl +1 -0
  324. package/test/resources/accounts-acl/tim.localhost/group/test-folder/group-listing.ttl +14 -0
  325. package/test/resources/accounts-acl/tim.localhost/group/test-folder/some-other-file.txt +1 -0
  326. package/test/resources/accounts-acl/tim.localhost/multi-server/protected.txt +1 -0
  327. package/test/resources/accounts-acl/tim.localhost/multi-server/protected.txt.acl +8 -0
  328. package/test/resources/accounts-acl/tim.localhost/no-acl/test-file.html +1 -0
  329. package/test/resources/accounts-acl/tim.localhost/read-acl/deeper-tree/acls-only-on-top/example.ttl +1 -0
  330. package/test/resources/accounts-acl/tim.localhost/write-acl/test-file$.txt +1 -0
  331. package/test/resources/accounts-scenario/alice/db/oidc/op/clients/_key_9c0fd8442675a1afbe5115b9ae300c65.json +1 -0
  332. package/test/resources/accounts-scenario/alice/db/oidc/op/provider.json +761 -0
  333. package/test/resources/accounts-scenario/alice/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A7000.json +1 -0
  334. package/test/resources/accounts-scenario/alice/private-for-alice.txt +1 -0
  335. package/test/resources/accounts-scenario/alice/private-for-alice.txt.acl +12 -0
  336. package/test/resources/accounts-scenario/alice/profile/card$.ttl +10 -0
  337. package/test/resources/accounts-scenario/bob/db/oidc/op/clients/_key_f15f340b6dc71b68d20eca0d7e87a972.json +1 -0
  338. package/test/resources/accounts-scenario/bob/db/oidc/op/provider.json +761 -0
  339. package/test/resources/accounts-scenario/bob/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A7001.json +1 -0
  340. package/test/resources/accounts-scenario/bob/profile/card$.ttl +5 -0
  341. package/test/resources/accounts-scenario/bob/shared-with-alice.txt +1 -0
  342. package/test/resources/accounts-scenario/bob/shared-with-alice.txt.acl +15 -0
  343. package/test/resources/accounts-scenario/charlie/db/oidc/op/clients/_key_7c634dfe325475cc8750e19c72acf6d9.json +1 -0
  344. package/test/resources/accounts-scenario/charlie/db/oidc/op/provider.json +759 -0
  345. package/test/resources/accounts-scenario/charlie/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A5002.json +1 -0
  346. package/test/resources/accounts-scenario/charlie/profile/card$.ttl +5 -0
  347. package/test/resources/accounts-strict-origin-off/alice/db/oidc/op/clients/_key_3f1cecaefd21253767f6e047bd9b572f.json +1 -0
  348. package/test/resources/accounts-strict-origin-off/alice/db/oidc/op/provider.json +763 -0
  349. package/test/resources/accounts-strict-origin-off/alice/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A7010.json +1 -0
  350. package/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt +1 -0
  351. package/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt.acl +12 -0
  352. package/test/resources/accounts-strict-origin-off/alice/profile/card$.ttl +10 -0
  353. package/test/resources/accounts-strict-origin-off/bob/db/oidc/op/clients/_key_a17f603b5907c97a5fac61a2eea7ecb2.json +1 -0
  354. package/test/resources/accounts-strict-origin-off/bob/db/oidc/op/provider.json +763 -0
  355. package/test/resources/accounts-strict-origin-off/bob/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A7011.json +1 -0
  356. package/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt +1 -0
  357. package/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt.acl +15 -0
  358. package/test/resources/acl-tls/config/templates/emails/delete-account.js +49 -0
  359. package/test/resources/acl-tls/config/templates/emails/invalid-username.js +30 -0
  360. package/test/resources/acl-tls/config/templates/emails/reset-password.js +49 -0
  361. package/test/resources/acl-tls/config/templates/emails/welcome.js +39 -0
  362. package/test/resources/acl-tls/config/templates/new-account/favicon.ico +0 -0
  363. package/test/resources/acl-tls/config/templates/new-account/favicon.ico.acl +26 -0
  364. package/test/resources/acl-tls/config/templates/new-account/profile/card$.ttl +26 -0
  365. package/test/resources/acl-tls/config/templates/new-account/robots.txt +3 -0
  366. package/test/resources/acl-tls/config/templates/new-account/robots.txt.acl +26 -0
  367. package/test/resources/acl-tls/config/templates/new-account/settings/prefs.ttl +15 -0
  368. package/test/resources/acl-tls/config/templates/new-account/settings/privateTypeIndex.ttl +4 -0
  369. package/test/resources/acl-tls/config/templates/new-account/settings/publicTypeIndex.ttl +4 -0
  370. package/test/resources/acl-tls/config/templates/new-account/settings/publicTypeIndex.ttl.acl +25 -0
  371. package/test/resources/acl-tls/config/templates/new-account/settings/serverSide.ttl.acl +13 -0
  372. package/test/resources/acl-tls/config/templates/new-account/settings/serverSide.ttl.inactive +12 -0
  373. package/test/resources/acl-tls/config/templates/server/favicon.ico +0 -0
  374. package/test/resources/acl-tls/config/templates/server/favicon.ico.acl +15 -0
  375. package/test/resources/acl-tls/config/templates/server/index.html +55 -0
  376. package/test/resources/acl-tls/config/templates/server/robots.txt +3 -0
  377. package/test/resources/acl-tls/config/templates/server/robots.txt.acl +15 -0
  378. package/test/resources/acl-tls/config/views/account/account-deleted.hbs +17 -0
  379. package/test/resources/acl-tls/config/views/account/delete-confirm.hbs +51 -0
  380. package/test/resources/acl-tls/config/views/account/delete-link-sent.hbs +17 -0
  381. package/test/resources/acl-tls/config/views/account/delete.hbs +51 -0
  382. package/test/resources/acl-tls/config/views/account/invalid-username.hbs +22 -0
  383. package/test/resources/acl-tls/config/views/account/register-disabled.hbs +6 -0
  384. package/test/resources/acl-tls/config/views/account/register-form.hbs +147 -0
  385. package/test/resources/acl-tls/config/views/account/register.hbs +24 -0
  386. package/test/resources/acl-tls/config/views/auth/auth-hidden-fields.hbs +8 -0
  387. package/test/resources/acl-tls/config/views/auth/change-password.hbs +58 -0
  388. package/test/resources/acl-tls/config/views/auth/goodbye.hbs +23 -0
  389. package/test/resources/acl-tls/config/views/auth/login-required.hbs +34 -0
  390. package/test/resources/acl-tls/config/views/auth/login-tls.hbs +11 -0
  391. package/test/resources/acl-tls/config/views/auth/login-username-password.hbs +28 -0
  392. package/test/resources/acl-tls/config/views/auth/login.hbs +55 -0
  393. package/test/resources/acl-tls/config/views/auth/no-permission.hbs +29 -0
  394. package/test/resources/acl-tls/config/views/auth/password-changed.hbs +27 -0
  395. package/test/resources/acl-tls/config/views/auth/reset-link-sent.hbs +21 -0
  396. package/test/resources/acl-tls/config/views/auth/reset-password.hbs +52 -0
  397. package/test/resources/acl-tls/config/views/auth/sharing.hbs +49 -0
  398. package/test/resources/acl-tls/config/views/shared/create-account.hbs +8 -0
  399. package/test/resources/acl-tls/config/views/shared/error.hbs +5 -0
  400. package/test/resources/acl-tls/localhost/favicon.ico +0 -0
  401. package/test/resources/acl-tls/localhost/favicon.ico.acl +15 -0
  402. package/test/resources/acl-tls/localhost/index.html +48 -0
  403. package/test/resources/acl-tls/localhost/robots.txt +3 -0
  404. package/test/resources/acl-tls/localhost/robots.txt.acl +15 -0
  405. package/test/resources/acl-tls/tim.localhost/append-acl/abc.ttl +1 -0
  406. package/test/resources/acl-tls/tim.localhost/append-acl/abc.ttl.acl +8 -0
  407. package/test/resources/acl-tls/tim.localhost/append-acl/abc2.ttl +1 -0
  408. package/test/resources/acl-tls/tim.localhost/append-acl/abc2.ttl.acl +8 -0
  409. package/test/resources/acl-tls/tim.localhost/fake-account/hello.html +9 -0
  410. package/test/resources/acl-tls/tim.localhost/no-acl/test-file.html +1 -0
  411. package/test/resources/acl-tls/tim.localhost/profile/card$.ttl +17 -0
  412. package/test/resources/acl-tls/write-acl/test-file$.ttl +1 -0
  413. package/test/resources/auth-proxy/index.html +0 -0
  414. package/test/resources/auth-proxy/index.html.acl +0 -0
  415. package/test/resources/config/templates/emails/delete-account.js +49 -0
  416. package/test/resources/config/templates/emails/delete-account.mjs +31 -0
  417. package/test/resources/config/templates/emails/invalid-username.js +30 -0
  418. package/test/resources/config/templates/emails/invalid-username.mjs +27 -0
  419. package/test/resources/config/templates/emails/reset-password.js +49 -0
  420. package/test/resources/config/templates/emails/reset-password.mjs +31 -0
  421. package/test/resources/config/templates/emails/welcome.js +39 -0
  422. package/test/resources/config/templates/emails/welcome.mjs +23 -0
  423. package/test/resources/config/templates/new-account/favicon.ico +0 -0
  424. package/test/resources/config/templates/new-account/favicon.ico.acl +26 -0
  425. package/test/resources/config/templates/new-account/profile/card$.ttl +26 -0
  426. package/test/resources/config/templates/new-account/robots.txt +3 -0
  427. package/test/resources/config/templates/new-account/robots.txt.acl +26 -0
  428. package/test/resources/config/templates/new-account/settings/prefs.ttl +15 -0
  429. package/test/resources/config/templates/new-account/settings/privateTypeIndex.ttl +4 -0
  430. package/test/resources/config/templates/new-account/settings/publicTypeIndex.ttl +4 -0
  431. package/test/resources/config/templates/new-account/settings/publicTypeIndex.ttl.acl +25 -0
  432. package/test/resources/config/templates/new-account/settings/serverSide.ttl.acl +13 -0
  433. package/test/resources/config/templates/new-account/settings/serverSide.ttl.inactive +12 -0
  434. package/test/resources/config/templates/server/favicon.ico +0 -0
  435. package/test/resources/config/templates/server/favicon.ico.acl +15 -0
  436. package/test/resources/config/templates/server/index.html +54 -0
  437. package/test/resources/config/templates/server/robots.txt +3 -0
  438. package/test/resources/config/templates/server/robots.txt.acl +15 -0
  439. package/test/resources/config/views/account/account-deleted.hbs +17 -0
  440. package/test/resources/config/views/account/delete-confirm.hbs +51 -0
  441. package/test/resources/config/views/account/delete-link-sent.hbs +17 -0
  442. package/test/resources/config/views/account/delete.hbs +51 -0
  443. package/test/resources/config/views/account/invalid-username.hbs +22 -0
  444. package/test/resources/config/views/account/register-disabled.hbs +6 -0
  445. package/test/resources/config/views/account/register-form.hbs +133 -0
  446. package/test/resources/config/views/account/register.hbs +24 -0
  447. package/test/resources/config/views/auth/auth-hidden-fields.hbs +8 -0
  448. package/test/resources/config/views/auth/change-password.hbs +58 -0
  449. package/test/resources/config/views/auth/goodbye.hbs +23 -0
  450. package/test/resources/config/views/auth/login-required.hbs +34 -0
  451. package/test/resources/config/views/auth/login-tls.hbs +11 -0
  452. package/test/resources/config/views/auth/login-username-password.hbs +28 -0
  453. package/test/resources/config/views/auth/login.hbs +55 -0
  454. package/test/resources/config/views/auth/no-permission.hbs +29 -0
  455. package/test/resources/config/views/auth/password-changed.hbs +27 -0
  456. package/test/resources/config/views/auth/reset-link-sent.hbs +21 -0
  457. package/test/resources/config/views/auth/reset-password.hbs +52 -0
  458. package/test/resources/config/views/auth/sharing.hbs +49 -0
  459. package/test/resources/config/views/shared/create-account.hbs +8 -0
  460. package/test/resources/config/views/shared/error.hbs +5 -0
  461. package/test/resources/empty.spatch +0 -0
  462. package/test/resources/errorPages/401.html +5 -0
  463. package/test/resources/errorPages/403.html +5 -0
  464. package/test/resources/errorPages/404.html +5 -0
  465. package/test/resources/errorPages/405.html +5 -0
  466. package/test/resources/errorPages/415.html +5 -0
  467. package/test/resources/errorPages/500.html +5 -0
  468. package/test/resources/example_spkac.cnf +1 -0
  469. package/test/resources/external-servers/example.com/jwks.json +81 -0
  470. package/test/resources/external-servers/example.com/openid-configuration.json +53 -0
  471. package/test/resources/favicon.ico +0 -0
  472. package/test/resources/favicon.ico.acl +15 -0
  473. package/test/resources/headers/index.html +0 -0
  474. package/test/resources/headers/public-ra +0 -0
  475. package/test/resources/headers/public-ra.acl +7 -0
  476. package/test/resources/headers/user-rw-public-r +0 -0
  477. package/test/resources/headers/user-rw-public-r.acl +12 -0
  478. package/test/resources/headers/user-rwac-public-0 +0 -0
  479. package/test/resources/headers/user-rwac-public-0.acl +7 -0
  480. package/test/resources/hello.html +3 -0
  481. package/test/resources/invalid1.ttl +13 -0
  482. package/test/resources/invalid2.ttl +9 -0
  483. package/test/resources/ldpatch-example-final.ttl +23 -0
  484. package/test/resources/ldpatch-example-initial.ttl +22 -0
  485. package/test/resources/ldpatch-example-patch-1.spatch +8 -0
  486. package/test/resources/ldpatch-example-patch-2.spatch +12 -0
  487. package/test/resources/ldpatch-example-patch-3.spatch +14 -0
  488. package/test/resources/ldpatch-example-patch.ldpatch +25 -0
  489. package/test/resources/ldpatch-example-patch.spatch +24 -0
  490. package/test/resources/lennon.jsonld +7 -0
  491. package/test/resources/lfs-0.sparql +9 -0
  492. package/test/resources/lfs-1-final.json +10 -0
  493. package/test/resources/lfs-1.sparql +11 -0
  494. package/test/resources/messaging-scenario/user1.databox.me/profile/card +21 -0
  495. package/test/resources/nicola.jpg +0 -0
  496. package/test/resources/patch/append-only.ttl +2 -0
  497. package/test/resources/patch/append-only.ttl.acl +6 -0
  498. package/test/resources/patch/favicon.ico +0 -0
  499. package/test/resources/patch/favicon.ico.acl +15 -0
  500. package/test/resources/patch/index.html +0 -0
  501. package/test/resources/patch/read-append.ttl +2 -0
  502. package/test/resources/patch/read-append.ttl.acl +6 -0
  503. package/test/resources/patch/read-only.ttl +2 -0
  504. package/test/resources/patch/read-only.ttl.acl +6 -0
  505. package/test/resources/patch/read-write.ttl +2 -0
  506. package/test/resources/patch/read-write.ttl.acl +6 -0
  507. package/test/resources/patch/robots.txt +3 -0
  508. package/test/resources/patch/robots.txt.acl +15 -0
  509. package/test/resources/patch/write-only.ttl +2 -0
  510. package/test/resources/patch/write-only.ttl.acl +6 -0
  511. package/test/resources/patch-1-initial.ttl +3 -0
  512. package/test/resources/patch-2-final.ttl +2 -0
  513. package/test/resources/patch-2-initial.ttl +3 -0
  514. package/test/resources/patch-2.spatch +2 -0
  515. package/test/resources/patch-2n.spatch +2 -0
  516. package/test/resources/patch-3-final.ttl +28 -0
  517. package/test/resources/patch-4-final.ttl +29 -0
  518. package/test/resources/patch-5-final.ttl +1 -0
  519. package/test/resources/patch-5-initial.ttl +3 -0
  520. package/test/resources/patch-5.spatch +2 -0
  521. package/test/resources/put-input-2.html +13 -0
  522. package/test/resources/put-input.txt +6 -0
  523. package/test/resources/robots.txt +3 -0
  524. package/test/resources/robots.txt.acl +15 -0
  525. package/test/resources/sampleContainer/blank +0 -0
  526. package/test/resources/sampleContainer/cert.pkcs +0 -0
  527. package/test/resources/sampleContainer/example.ttl.old +1 -0
  528. package/test/resources/sampleContainer/example1.ttl +12 -0
  529. package/test/resources/sampleContainer/example2.ttl +3 -0
  530. package/test/resources/sampleContainer/example3.ttl +7 -0
  531. package/test/resources/sampleContainer/example4$.ttl +7 -0
  532. package/test/resources/sampleContainer/filename with spaces.txt +0 -0
  533. package/test/resources/sampleContainer/index.html +9 -0
  534. package/test/resources/sampleContainer/post2.ttl +6 -0
  535. package/test/resources/sampleContainer/put1.ttl +13 -0
  536. package/test/resources/sampleContainer/solid.png +0 -0
  537. package/test/resources/sampleContainer/user1.pfx +0 -0
  538. package/test/resources/sampleContainer/user2.pfx +0 -0
  539. package/test/resources/sampleContainer2/example1.ttl +10 -0
  540. package/test/resources/sampleContainer2/example2.ttl +7 -0
  541. package/test/resources/timbl.jpg +0 -0
  542. package/test/scenarios.md +23 -0
  543. package/test/surface/docker/cookie/Dockerfile +6 -0
  544. package/test/surface/docker/cookie/app/index.js +29 -0
  545. package/test/surface/docker/cookie/app/package-lock.json +13 -0
  546. package/test/surface/docker/cookie/app/package.json +14 -0
  547. package/test/surface/docker/server/Dockerfile +19 -0
  548. package/test/surface/docker/server/config/defaults.js +10 -0
  549. package/test/surface/docker/server/config/templates/emails/delete-account.js +49 -0
  550. package/test/surface/docker/server/config/templates/emails/invalid-username.js +30 -0
  551. package/test/surface/docker/server/config/templates/emails/reset-password.js +49 -0
  552. package/test/surface/docker/server/config/templates/emails/welcome.js +39 -0
  553. package/test/surface/docker/server/config/templates/new-account/favicon.ico +0 -0
  554. package/test/surface/docker/server/config/templates/new-account/favicon.ico.acl +26 -0
  555. package/test/surface/docker/server/config/templates/new-account/profile/card$.ttl +26 -0
  556. package/test/surface/docker/server/config/templates/new-account/robots.txt +3 -0
  557. package/test/surface/docker/server/config/templates/new-account/robots.txt.acl +26 -0
  558. package/test/surface/docker/server/config/templates/new-account/settings/prefs.ttl +15 -0
  559. package/test/surface/docker/server/config/templates/new-account/settings/privateTypeIndex.ttl +4 -0
  560. package/test/surface/docker/server/config/templates/new-account/settings/publicTypeIndex.ttl +4 -0
  561. package/test/surface/docker/server/config/templates/new-account/settings/publicTypeIndex.ttl.acl +25 -0
  562. package/test/surface/docker/server/config/templates/new-account/settings/serverSide.ttl.acl +13 -0
  563. package/test/surface/docker/server/config/templates/new-account/settings/serverSide.ttl.inactive +12 -0
  564. package/test/surface/docker/server/config/templates/server/favicon.ico +0 -0
  565. package/test/surface/docker/server/config/templates/server/favicon.ico.acl +15 -0
  566. package/test/surface/docker/server/config/templates/server/index.html +55 -0
  567. package/test/surface/docker/server/config/templates/server/robots.txt +3 -0
  568. package/test/surface/docker/server/config/templates/server/robots.txt.acl +15 -0
  569. package/test/surface/docker/server/config/usernames-blacklist.json +4 -0
  570. package/test/surface/docker/server/config/views/account/account-deleted.hbs +17 -0
  571. package/test/surface/docker/server/config/views/account/delete-confirm.hbs +51 -0
  572. package/test/surface/docker/server/config/views/account/delete-link-sent.hbs +17 -0
  573. package/test/surface/docker/server/config/views/account/delete.hbs +51 -0
  574. package/test/surface/docker/server/config/views/account/invalid-username.hbs +22 -0
  575. package/test/surface/docker/server/config/views/account/register-disabled.hbs +6 -0
  576. package/test/surface/docker/server/config/views/account/register-form.hbs +147 -0
  577. package/test/surface/docker/server/config/views/account/register.hbs +24 -0
  578. package/test/surface/docker/server/config/views/auth/auth-hidden-fields.hbs +8 -0
  579. package/test/surface/docker/server/config/views/auth/change-password.hbs +58 -0
  580. package/test/surface/docker/server/config/views/auth/goodbye.hbs +23 -0
  581. package/test/surface/docker/server/config/views/auth/login-required.hbs +34 -0
  582. package/test/surface/docker/server/config/views/auth/login-tls.hbs +11 -0
  583. package/test/surface/docker/server/config/views/auth/login-username-password.hbs +28 -0
  584. package/test/surface/docker/server/config/views/auth/login.hbs +55 -0
  585. package/test/surface/docker/server/config/views/auth/no-permission.hbs +29 -0
  586. package/test/surface/docker/server/config/views/auth/password-changed.hbs +27 -0
  587. package/test/surface/docker/server/config/views/auth/reset-link-sent.hbs +21 -0
  588. package/test/surface/docker/server/config/views/auth/reset-password.hbs +52 -0
  589. package/test/surface/docker/server/config/views/auth/sharing.hbs +49 -0
  590. package/test/surface/docker/server/config/views/shared/create-account.hbs +8 -0
  591. package/test/surface/docker/server/config/views/shared/error.hbs +5 -0
  592. package/test/surface/docker/server/config.json +22 -0
  593. package/test/surface/docker/server/data/favicon.ico +0 -0
  594. package/test/surface/docker/server/data/favicon.ico.acl +26 -0
  595. package/test/surface/docker/server/data/index.html +48 -0
  596. package/test/surface/docker/server/data/profile/card$.ttl +31 -0
  597. package/test/surface/docker/server/data/robots.txt +3 -0
  598. package/test/surface/docker/server/data/robots.txt.acl +26 -0
  599. package/test/surface/docker/server/data/settings/prefs.ttl +15 -0
  600. package/test/surface/docker/server/data/settings/privateTypeIndex.ttl +4 -0
  601. package/test/surface/docker/server/data/settings/publicTypeIndex.ttl +4 -0
  602. package/test/surface/docker/server/data/settings/publicTypeIndex.ttl.acl +25 -0
  603. package/test/surface/docker/server/data/settings/serverSide.ttl +0 -0
  604. package/test/surface/docker/server/data/settings/serverSide.ttl.acl +13 -0
  605. package/test/surface/docker/server/data/settings/serverSide.ttl.inactive +12 -0
  606. package/test/surface/docker/server/env.list +4 -0
  607. package/test/surface/docker/solid-crud/Dockerfile +4 -0
  608. package/test/surface/docker/web-access-control/Dockerfile +1 -0
  609. package/test/surface/docker/webid-provider/Dockerfile +1 -0
  610. package/test/surface/run-solid-test-suite.sh +75 -0
  611. package/test/surface/server-env.list +5 -0
  612. package/test/surface/solid-crud-tests-env.list +5 -0
  613. package/test/surface/thirdparty-config.json +23 -0
  614. package/test/surface/thirdparty-env.list +6 -0
  615. package/test/surface/web-access-control-tests-env.list +6 -0
  616. package/test/surface/webid-provider-tests-env.list +4 -0
  617. package/test/test-helpers.mjs +63 -0
  618. package/test/unit/account-manager-test.mjs +610 -0
  619. package/test/unit/account-template-test.mjs +59 -0
  620. package/test/unit/acl-checker-test.mjs +51 -0
  621. package/test/unit/add-cert-request-test.mjs +120 -0
  622. package/test/unit/auth-handlers-test.mjs +108 -0
  623. package/test/unit/auth-proxy-test.mjs +224 -0
  624. package/test/unit/auth-request-test.mjs +96 -0
  625. package/test/unit/authenticator-test.mjs +34 -0
  626. package/test/unit/blacklist-service-test.mjs +49 -0
  627. package/test/unit/create-account-request-test.mjs +306 -0
  628. package/test/unit/delete-account-confirm-request-test.mjs +234 -0
  629. package/test/unit/delete-account-request-test.mjs +180 -0
  630. package/test/unit/email-service-test.mjs +166 -0
  631. package/test/unit/email-welcome-test.mjs +81 -0
  632. package/test/unit/error-pages-test.mjs +100 -0
  633. package/test/unit/esm-imports.test.mjs +149 -0
  634. package/test/unit/force-user-test.mjs +73 -0
  635. package/test/unit/getAvailableUrl-test.mjs +30 -0
  636. package/test/unit/getTrustedOrigins-test.mjs +20 -0
  637. package/test/unit/login-request-test.mjs +246 -0
  638. package/test/unit/oidc-manager-test.mjs +50 -0
  639. package/test/unit/password-authenticator-test.mjs +125 -0
  640. package/test/unit/password-change-request-test.mjs +259 -0
  641. package/test/unit/password-reset-email-request-test.mjs +234 -0
  642. package/test/unit/resource-mapper-test.mjs +673 -0
  643. package/test/unit/solid-host-test.mjs +119 -0
  644. package/test/unit/tls-authenticator-test.mjs +174 -0
  645. package/test/unit/token-service-test.mjs +82 -0
  646. package/test/unit/user-account-test.mjs +38 -0
  647. package/test/unit/user-accounts-api-test.mjs +59 -0
  648. package/test/unit/user-utils-test.mjs +64 -0
  649. package/test/unit/utils-test.mjs +114 -0
  650. package/test/utils/index.mjs +167 -0
  651. package/test/utils.mjs +205 -0
  652. package/test/validate-turtle.mjs +43 -0
  653. package/.github/workflows/ci.yml +0 -113
  654. package/.nvmrc +0 -1
  655. package/.snyk +0 -35
  656. package/bin/lib/cli-utils.js +0 -85
  657. package/bin/lib/cli.js +0 -39
  658. package/bin/solid.js +0 -3
  659. package/default-templates/new-account/.acl +0 -26
  660. package/default-templates/new-account/.meta +0 -5
  661. package/default-templates/new-account/.well-known/.acl +0 -19
  662. package/default-templates/new-account/private/.acl +0 -10
  663. package/default-templates/new-account/profile/.acl +0 -19
  664. package/default-templates/new-account/public/.acl +0 -19
  665. package/default-templates/new-account/settings/.acl +0 -20
  666. package/index.js +0 -3
  667. package/lib/api/authn/index.js +0 -5
  668. package/lib/api/index.js +0 -6
  669. package/lib/common/template-utils.js +0 -50
  670. package/lib/debug.js +0 -18
  671. package/lib/ldp-copy.js +0 -73
  672. package/lib/ldp-middleware.js +0 -40
  673. package/lib/models/account-manager.js +0 -604
  674. package/lib/models/account-template.js +0 -156
  675. package/lib/models/authenticator.js +0 -337
  676. package/lib/models/oidc-manager.js +0 -53
  677. package/lib/models/solid-host.js +0 -131
  678. package/lib/models/user-account.js +0 -113
  679. package/lib/models/webid-tls-certificate.js +0 -184
  680. package/lib/requests/add-cert-request.js +0 -138
  681. package/lib/requests/auth-request.js +0 -234
  682. package/lib/requests/delete-account-confirm-request.js +0 -170
  683. package/lib/requests/login-request.js +0 -205
  684. package/lib/services/email-service.js +0 -162
  685. package/lib/webid/lib/get.js +0 -27
  686. package/lib/webid/tls/index.js +0 -185
@@ -0,0 +1,964 @@
1
+ import { assert } from 'chai'
2
+ import fs from 'fs-extra'
3
+ import $rdf from 'rdflib'
4
+ import { httpRequest as request, cleanDir, rm } from '../utils.mjs'
5
+ import path from 'path'
6
+ import { fileURLToPath } from 'url'
7
+
8
+ /**
9
+ * Note: this test suite requires an internet connection, since it actually
10
+ * uses remote accounts https://user1.databox.me and https://user2.databox.me
11
+ */
12
+
13
+ // Helper functions for the FS
14
+ // import { rm } from '../../test/utils.js'
15
+ // var write = require('./utils').write
16
+ // var cp = require('./utils').cp
17
+ // var read = require('./utils').read
18
+
19
+ import ldnode from '../../index.mjs'
20
+ import solidNamespace from 'solid-namespace'
21
+
22
+ const __filename = fileURLToPath(import.meta.url)
23
+ const __dirname = path.dirname(__filename)
24
+ const ns = solidNamespace($rdf)
25
+
26
+ const port = 7777
27
+ const serverUri = 'https://localhost:7777'
28
+ const rootPath = path.normalize(path.join(__dirname, '../resources/acl-tls'))
29
+ const dbPath = path.join(rootPath, 'db')
30
+ const configPath = path.join(rootPath, 'config')
31
+
32
+ const aclExtension = '.acl'
33
+ const metaExtension = '.meta'
34
+
35
+ const testDir = 'acl-tls/testDir'
36
+ const testDirAclFile = testDir + '/' + aclExtension
37
+ const testDirMetaFile = testDir + '/' + metaExtension
38
+
39
+ const abcFile = testDir + '/abc.ttl'
40
+
41
+ const globFile = testDir + '/*'
42
+
43
+ const origin1 = 'http://example.org/'
44
+ const origin2 = 'http://example.com/'
45
+
46
+ const user1 = 'https://tim.localhost:7777/profile/card#me'
47
+ const user2 = 'https://nicola.localhost:7777/profile/card#me'
48
+ const address = 'https://tim.localhost:7777'
49
+ const userCredentials = {
50
+ user1: {
51
+ cert: fs.readFileSync(path.normalize(path.join(__dirname, '../keys/user1-cert.pem'))),
52
+ key: fs.readFileSync(path.normalize(path.join(__dirname, '../keys/user1-key.pem')))
53
+ },
54
+ user2: {
55
+ cert: fs.readFileSync(path.normalize(path.join(__dirname, '../keys/user2-cert.pem'))),
56
+ key: fs.readFileSync(path.normalize(path.join(__dirname, '../keys/user2-key.pem')))
57
+ }
58
+ }
59
+
60
+ // TODO Remove skip. TLS is currently broken, but is not a priority to fix since
61
+ // the current Solid spec does not require supporting webid-tls on the resource
62
+ // server. The current spec only requires the resource server to support webid-oidc,
63
+ // and it requires the IDP to support webid-tls as a log in method, so that users of
64
+ // a webid-tls client certificate can still use their certificate (and not a
65
+ // username/password pair or other login method) to "bridge" from webid-tls to
66
+ // webid-oidc.
67
+ describe.skip('ACL with WebID+TLS', function () {
68
+ let ldpHttpsServer
69
+ const serverConfig = {
70
+ root: rootPath,
71
+ serverUri,
72
+ dbPath,
73
+ port,
74
+ configPath,
75
+ sslKey: path.normalize(path.join(__dirname, '../keys/key.pem')),
76
+ sslCert: path.normalize(path.join(__dirname, '../keys/cert.pem')),
77
+ webid: true,
78
+ multiuser: true,
79
+ auth: 'tls',
80
+ rejectUnauthorized: false,
81
+ strictOrigin: true,
82
+ host: { serverUri }
83
+ }
84
+ const ldp = ldnode.createServer(serverConfig)
85
+
86
+ before(function (done) {
87
+ ldpHttpsServer = ldp.listen(port, () => {
88
+ setTimeout(() => {
89
+ done()
90
+ }, 0)
91
+ })
92
+ })
93
+
94
+ after(function () {
95
+ if (ldpHttpsServer) ldpHttpsServer.close()
96
+ cleanDir(rootPath)
97
+ })
98
+
99
+ function createOptions (path, user) {
100
+ const options = {
101
+ url: address + path,
102
+ headers: {
103
+ accept: 'text/turtle',
104
+ 'content-type': 'text/plain'
105
+ }
106
+ }
107
+ if (user) {
108
+ options.agentOptions = userCredentials[user]
109
+ }
110
+ return options
111
+ }
112
+
113
+ describe('no ACL', function () {
114
+ it('should return 500 for any resource', function (done) {
115
+ rm('.acl')
116
+ const options = createOptions('/acl-tls/no-acl/', 'user1')
117
+ request(options, function (error, response, body) {
118
+ assert.equal(error, null)
119
+ assert.equal(response.statusCode, 500)
120
+ done()
121
+ })
122
+ })
123
+
124
+ it('should have `User` set in the Response Header', function (done) {
125
+ rm('.acl')
126
+ const options = createOptions('/acl-tls/no-acl/', 'user1')
127
+ request(options, function (error, response, body) {
128
+ assert.equal(error, null)
129
+ assert.equal(response.headers.user, 'https://user1.databox.me/profile/card#me')
130
+ done()
131
+ })
132
+ })
133
+
134
+ it.skip('should return a 401 and WWW-Authenticate header without credentials', (done) => {
135
+ rm('.acl')
136
+ const options = {
137
+ url: address + '/acl-tls/no-acl/',
138
+ headers: { accept: 'text/turtle' }
139
+ }
140
+
141
+ request(options, (error, response, body) => {
142
+ assert.equal(error, null)
143
+ assert.equal(response.statusCode, 401)
144
+ assert.equal(response.headers['www-authenticate'], 'WebID-TLS realm="https://localhost:8443"')
145
+ done()
146
+ })
147
+ })
148
+ })
149
+
150
+ describe('empty .acl', function () {
151
+ describe('with no default in parent path', function () {
152
+ it('should give no access', function (done) {
153
+ const options = createOptions('/acl-tls/empty-acl/test-folder', 'user1')
154
+ options.body = ''
155
+ request.put(options, function (error, response, body) {
156
+ assert.equal(error, null)
157
+ assert.equal(response.statusCode, 403)
158
+ done()
159
+ })
160
+ })
161
+ it('should not let edit the .acl', function (done) {
162
+ const options = createOptions('/acl-tls/empty-acl/.acl', 'user1')
163
+ options.headers = {
164
+ 'content-type': 'text/turtle'
165
+ }
166
+ options.body = ''
167
+ request.put(options, function (error, response, body) {
168
+ assert.equal(error, null)
169
+ assert.equal(response.statusCode, 403)
170
+ done()
171
+ })
172
+ })
173
+ it('should not let read the .acl', function (done) {
174
+ const options = createOptions('/acl-tls/empty-acl/.acl', 'user1')
175
+ options.headers = {
176
+ accept: 'text/turtle'
177
+ }
178
+ request.get(options, function (error, response, body) {
179
+ assert.equal(error, null)
180
+ assert.equal(response.statusCode, 403)
181
+ done()
182
+ })
183
+ })
184
+ })
185
+ describe('with default in parent path', function () {
186
+ before(function () {
187
+ rm('/acl-tls/write-acl/empty-acl/another-empty-folder/test-file.acl')
188
+ rm('/acl-tls/write-acl/empty-acl/test-folder/test-file')
189
+ rm('/acl-tls/write-acl/empty-acl/test-file')
190
+ rm('/acl-tls/write-acl/test-file')
191
+ rm('/acl-tls/write-acl/test-file.acl')
192
+ })
193
+
194
+ it('should fail to create a container', function (done) {
195
+ const options = createOptions('/acl-tls/write-acl/empty-acl/test-folder/', 'user1')
196
+ options.body = ''
197
+ request.put(options, function (error, response, body) {
198
+ assert.equal(error, null)
199
+ assert.equal(response.statusCode, 403) // TODO: SHOULD THIS RETURN A 409?
200
+ done()
201
+ })
202
+ })
203
+ it('should not allow creation of new files', function (done) {
204
+ const options = createOptions('/acl-tls/write-acl/empty-acl/test-file', 'user1')
205
+ options.body = ''
206
+ request.put(options, function (error, response, body) {
207
+ assert.equal(error, null)
208
+ assert.equal(response.statusCode, 403)
209
+ done()
210
+ })
211
+ })
212
+ it('should not allow creation of new files in deeper paths', function (done) {
213
+ const options = createOptions('/acl-tls/write-acl/empty-acl/test-folder/test-file', 'user1')
214
+ options.body = ''
215
+ request.put(options, function (error, response, body) {
216
+ assert.equal(error, null)
217
+ assert.equal(response.statusCode, 403)
218
+ done()
219
+ })
220
+ })
221
+ it('Should not create empty acl file', function (done) {
222
+ const options = createOptions('/acl-tls/write-acl/empty-acl/another-empty-folder/test-file.acl', 'user1')
223
+ options.headers = {
224
+ 'content-type': 'text/turtle'
225
+ }
226
+ options.body = ''
227
+ request.put(options, function (error, response, body) {
228
+ assert.equal(error, null)
229
+ assert.equal(response.statusCode, 403)
230
+ done()
231
+ })
232
+ })
233
+ it('should not return text/turtle for the acl file', function (done) {
234
+ const options = createOptions('/acl-tls/write-acl/.acl', 'user1')
235
+ options.headers = {
236
+ accept: 'text/turtle'
237
+ }
238
+ request.get(options, function (error, response, body) {
239
+ assert.equal(error, null)
240
+ assert.equal(response.statusCode, 403)
241
+ // assert.match(response.headers['content-type'], /text\/turtle/)
242
+ done()
243
+ })
244
+ })
245
+ it('should create test file', function (done) {
246
+ const options = createOptions('/acl-tls/write-acl/test-file', 'user1')
247
+ options.headers = {
248
+ 'content-type': 'text/turtle'
249
+ }
250
+ options.body = '<a> <b> <c> .'
251
+ request.put(options, function (error, response, body) {
252
+ assert.equal(error, null)
253
+ assert.equal(response.statusCode, 201)
254
+ done()
255
+ })
256
+ })
257
+ it("should create test file's acl file", function (done) {
258
+ const options = createOptions('/acl-tls/write-acl/test-file.acl', 'user1')
259
+ options.headers = {
260
+ 'content-type': 'text/turtle'
261
+ }
262
+ options.body = ''
263
+ request.put(options, function (error, response, body) {
264
+ assert.equal(error, null)
265
+ assert.equal(response.statusCode, 201)
266
+ done()
267
+ })
268
+ })
269
+ it("should not access test file's acl file", function (done) {
270
+ const options = createOptions('/acl-tls/write-acl/test-file.acl', 'user1')
271
+ options.headers = {
272
+ accept: 'text/turtle'
273
+ }
274
+ request.get(options, function (error, response, body) {
275
+ assert.equal(error, null)
276
+ assert.equal(response.statusCode, 403)
277
+ // assert.match(response.headers['content-type'], /text\/turtle/)
278
+ done()
279
+ })
280
+ })
281
+
282
+ after(function () {
283
+ rm('/acl-tls/write-acl/empty-acl/another-empty-folder/test-file.acl')
284
+ rm('/acl-tls/write-acl/empty-acl/test-folder/test-file')
285
+ rm('/acl-tls/write-acl/empty-acl/test-file')
286
+ rm('/acl-tls/write-acl/test-file')
287
+ rm('/acl-tls/write-acl/test-file.acl')
288
+ })
289
+ })
290
+ })
291
+
292
+ describe('Origin', function () {
293
+ before(function () {
294
+ rm('acl-tls/origin/test-folder/.acl')
295
+ })
296
+
297
+ it('should PUT new ACL file', function (done) {
298
+ const options = createOptions('/acl-tls/origin/test-folder/.acl', 'user1', 'text/turtle')
299
+ options.headers = {
300
+ 'content-type': 'text/turtle'
301
+ }
302
+ options.body = '<#Owner> a <http://www.w3.org/ns/auth/acl#Authorization>;\n' +
303
+ ' <http://www.w3.org/ns/auth/acl#accessTo> <https://localhost:3456/test/acl-tls/origin/test-folder/>;\n' +
304
+ ' <http://www.w3.org/ns/auth/acl#agent> <' + user1 + '>;\n' +
305
+ ' <http://www.w3.org/ns/auth/acl#origin> <' + origin1 + '>;\n' +
306
+ ' <http://www.w3.org/ns/auth/acl#mode> <http://www.w3.org/ns/auth/acl#Read>, <http://www.w3.org/ns/auth/acl#Write>, <http://www.w3.org/ns/auth/acl#Control> .\n' +
307
+ '<#Public> a <http://www.w3.org/ns/auth/acl#Authorization>;\n' +
308
+ ' <http://www.w3.org/ns/auth/acl#accessTo> <./>;\n' +
309
+ ' <http://www.w3.org/ns/auth/acl#agentClass> <http://www.w3.org/ns/auth/acl#AuthenticatedAgent>;\n' +
310
+ ' <http://www.w3.org/ns/auth/acl#origin> <' + origin1 + '>;\n' +
311
+ ' <http://www.w3.org/ns/auth/acl#mode> <http://www.w3.org/ns/auth/acl#Read> .\n'
312
+ request.put(options, function (error, response, body) {
313
+ assert.equal(error, null)
314
+ assert.equal(response.statusCode, 201)
315
+ done()
316
+ // TODO triple header
317
+ // TODO user header
318
+ })
319
+ })
320
+ it('user1 should be able to access test directory', function (done) {
321
+ const options = createOptions('/acl-tls/origin/test-folder/', 'user1')
322
+ options.headers.origin = origin1
323
+
324
+ request.head(options, function (error, response, body) {
325
+ assert.equal(error, null)
326
+ assert.equal(response.statusCode, 200)
327
+ done()
328
+ })
329
+ })
330
+ it('user1 should be able to access to test directory when origin is valid',
331
+ function (done) {
332
+ const options = createOptions('/acl-tls/origin/test-folder/', 'user1')
333
+ options.headers.origin = origin1
334
+
335
+ request.head(options, function (error, response, body) {
336
+ assert.equal(error, null)
337
+ assert.equal(response.statusCode, 200)
338
+ done()
339
+ })
340
+ })
341
+ it('user1 should not be able to access test directory when origin is invalid',
342
+ function (done) {
343
+ const options = createOptions('/acl-tls/origin/test-folder/', 'user1')
344
+ options.headers.origin = origin2
345
+
346
+ request.head(options, function (error, response, body) {
347
+ assert.equal(error, null)
348
+ assert.equal(response.statusCode, 403)
349
+ done()
350
+ })
351
+ })
352
+ it('agent not should be able to access test directory', function (done) {
353
+ const options = createOptions('/acl-tls/origin/test-folder/')
354
+ options.headers.origin = origin1
355
+
356
+ request.head(options, function (error, response, body) {
357
+ assert.equal(error, null)
358
+ assert.equal(response.statusCode, 401)
359
+ done()
360
+ })
361
+ })
362
+ it('agent should be able to access to test directory when origin is valid',
363
+ function (done) {
364
+ const options = createOptions('/acl-tls/origin/test-folder/', 'user1')
365
+ options.headers.origin = origin1
366
+
367
+ request.head(options, function (error, response, body) {
368
+ assert.equal(error, null)
369
+ assert.equal(response.statusCode, 200)
370
+ done()
371
+ })
372
+ })
373
+ it('agent should not be able to access test directory when origin is invalid',
374
+ function (done) {
375
+ const options = createOptions('/acl-tls/origin/test-folder/')
376
+ options.headers.origin = origin2
377
+
378
+ request.head(options, function (error, response, body) {
379
+ assert.equal(error, null)
380
+ assert.equal(response.statusCode, 401)
381
+ done()
382
+ })
383
+ })
384
+
385
+ after(function () {
386
+ rm('acl-tls/origin/test-folder/.acl')
387
+ })
388
+ })
389
+
390
+ describe('Mixed statement Origin', function () {
391
+ before(function () {
392
+ rm('acl-tls/origin/test-folder/.acl')
393
+ })
394
+
395
+ it('should PUT new ACL file', function (done) {
396
+ const options = createOptions('/acl-tls/origin/test-folder/.acl', 'user1', 'text/turtle')
397
+ options.headers = {
398
+ 'content-type': 'text/turtle'
399
+ }
400
+ options.body = '<#Owner1> a <http://www.w3.org/ns/auth/acl#Authorization>;\n' +
401
+ ' <http://www.w3.org/ns/auth/acl#accessTo> <https://localhost:3456/test/acl-tls/origin/test-folder/>;\n' +
402
+ ' <http://www.w3.org/ns/auth/acl#agent> <' + user1 + '>;\n' +
403
+ ' <http://www.w3.org/ns/auth/acl#mode> <http://www.w3.org/ns/auth/acl#Read>, <http://www.w3.org/ns/auth/acl#Write>, <http://www.w3.org/ns/auth/acl#Control> .\n' +
404
+ '<#Owner2> a <http://www.w3.org/ns/auth/acl#Authorization>;\n' +
405
+ ' <http://www.w3.org/ns/auth/acl#accessTo> <https://localhost:3456/test/acl-tls/origin/test-folder/>;\n' +
406
+ ' <http://www.w3.org/ns/auth/acl#origin> <' + origin1 + '>;\n' +
407
+ ' <http://www.w3.org/ns/auth/acl#mode> <http://www.w3.org/ns/auth/acl#Read>, <http://www.w3.org/ns/auth/acl#Write>, <http://www.w3.org/ns/auth/acl#Control> .\n' +
408
+ '<#Public> a <http://www.w3.org/ns/auth/acl#Authorization>;\n' +
409
+ ' <http://www.w3.org/ns/auth/acl#accessTo> <./>;\n' +
410
+ ' <http://www.w3.org/ns/auth/acl#agentClass> <http://www.w3.org/ns/auth/acl#AuthenticatedAgent>;\n' +
411
+ ' <http://www.w3.org/ns/auth/acl#origin> <' + origin1 + '>;\n' +
412
+ ' <http://www.w3.org/ns/auth/acl#mode> <http://www.w3.org/ns/auth/acl#Read> .\n'
413
+ request.put(options, function (error, response, body) {
414
+ assert.equal(error, null)
415
+ assert.equal(response.statusCode, 201)
416
+ done()
417
+ // TODO triple header
418
+ // TODO user header
419
+ })
420
+ })
421
+ it('user1 should be able to access test directory', function (done) {
422
+ const options = createOptions('/acl-tls/origin/test-folder/', 'user1')
423
+ options.headers.origin = origin1
424
+
425
+ request.head(options, function (error, response, body) {
426
+ assert.equal(error, null)
427
+ assert.equal(response.statusCode, 200)
428
+ done()
429
+ })
430
+ })
431
+ it('user1 should be able to access to test directory when origin is valid',
432
+ function (done) {
433
+ const options = createOptions('/acl-tls/origin/test-folder/', 'user1')
434
+ options.headers.origin = origin1
435
+
436
+ request.head(options, function (error, response, body) {
437
+ assert.equal(error, null)
438
+ assert.equal(response.statusCode, 200)
439
+ done()
440
+ })
441
+ })
442
+ it('user1 should not be able to access test directory when origin is invalid',
443
+ function (done) {
444
+ const options = createOptions('/acl-tls/origin/test-folder/', 'user1')
445
+ options.headers.origin = origin2
446
+
447
+ request.head(options, function (error, response, body) {
448
+ assert.equal(error, null)
449
+ assert.equal(response.statusCode, 403)
450
+ done()
451
+ })
452
+ })
453
+ it('agent should not be able to access test directory for logged in users', function (done) {
454
+ const options = createOptions('/acl-tls/origin/test-folder/')
455
+ options.headers.origin = origin1
456
+
457
+ request.head(options, function (error, response, body) {
458
+ assert.equal(error, null)
459
+ assert.equal(response.statusCode, 401)
460
+ done()
461
+ })
462
+ })
463
+ it('agent should be able to access to test directory when origin is valid',
464
+ function (done) {
465
+ const options = createOptions('/acl-tls/origin/test-folder/', 'user1')
466
+ options.headers.origin = origin1
467
+
468
+ request.head(options, function (error, response, body) {
469
+ assert.equal(error, null)
470
+ assert.equal(response.statusCode, 200)
471
+ done()
472
+ })
473
+ })
474
+ it('agent should not be able to access test directory when origin is invalid',
475
+ function (done) {
476
+ const options = createOptions('/acl-tls/origin/test-folder/')
477
+ options.headers.origin = origin2
478
+
479
+ request.head(options, function (error, response, body) {
480
+ assert.equal(error, null)
481
+ assert.equal(response.statusCode, 401)
482
+ done()
483
+ })
484
+ })
485
+
486
+ after(function () {
487
+ rm('acl-tls/origin/test-folder/.acl')
488
+ })
489
+ })
490
+
491
+ describe('Read-only', function () {
492
+ const body = fs.readFileSync(path.join(__dirname, '../resources/acl-tls/tim.localhost/read-acl/.acl'))
493
+ it('user1 should be able to access ACL file', function (done) {
494
+ const options = createOptions('/acl-tls/read-acl/.acl', 'user1')
495
+ request.head(options, function (error, response, body) {
496
+ assert.equal(error, null)
497
+ assert.equal(response.statusCode, 200)
498
+ done()
499
+ })
500
+ })
501
+ it('user1 should be able to access test directory', function (done) {
502
+ const options = createOptions('/acl-tls/read-acl/', 'user1')
503
+ request.head(options, function (error, response, body) {
504
+ assert.equal(error, null)
505
+ assert.equal(response.statusCode, 200)
506
+ done()
507
+ })
508
+ })
509
+ it('user1 should be able to modify ACL file', function (done) {
510
+ const options = createOptions('/acl-tls/read-acl/.acl', 'user1')
511
+ options.headers = {
512
+ 'content-type': 'text/turtle'
513
+ }
514
+ options.body = body
515
+ request.put(options, function (error, response, body) {
516
+ assert.equal(error, null)
517
+ assert.equal(response.statusCode, 201)
518
+ done()
519
+ })
520
+ })
521
+ it('user2 should be able to access test directory', function (done) {
522
+ const options = createOptions('/acl-tls/read-acl/', 'user2')
523
+ request.head(options, function (error, response, body) {
524
+ assert.equal(error, null)
525
+ assert.equal(response.statusCode, 200)
526
+ done()
527
+ })
528
+ })
529
+ it('user2 should not be able to access ACL file', function (done) {
530
+ const options = createOptions('/acl-tls/read-acl/.acl', 'user2')
531
+ request.head(options, function (error, response, body) {
532
+ assert.equal(error, null)
533
+ assert.equal(response.statusCode, 403)
534
+ done()
535
+ })
536
+ })
537
+ it('user2 should not be able to modify ACL file', function (done) {
538
+ const options = createOptions('/acl-tls/read-acl/.acl', 'user2')
539
+ options.headers = {
540
+ 'content-type': 'text/turtle'
541
+ }
542
+ options.body = '<d> <e> <f> .'
543
+ request.put(options, function (error, response, body) {
544
+ assert.equal(error, null)
545
+ assert.equal(response.statusCode, 403)
546
+ done()
547
+ })
548
+ })
549
+ it('agent should be able to access test direcotory', function (done) {
550
+ const options = createOptions('/acl-tls/read-acl/')
551
+ request.head(options, function (error, response, body) {
552
+ assert.equal(error, null)
553
+ assert.equal(response.statusCode, 200)
554
+ done()
555
+ })
556
+ })
557
+ it('agent should not be able to modify ACL file', function (done) {
558
+ const options = createOptions('/acl-tls/read-acl/.acl')
559
+ options.headers = {
560
+ 'content-type': 'text/turtle'
561
+ }
562
+ options.body = '<d> <e> <f> .'
563
+ request.put(options, function (error, response, body) {
564
+ assert.equal(error, null)
565
+ assert.equal(response.statusCode, 401)
566
+ done()
567
+ })
568
+ })
569
+ })
570
+
571
+ describe.skip('Glob', function () {
572
+ it('user2 should be able to send glob request', function (done) {
573
+ const options = createOptions(globFile, 'user2')
574
+ request.get(options, function (error, response, body) {
575
+ assert.equal(error, null)
576
+ assert.equal(response.statusCode, 200)
577
+ const globGraph = $rdf.graph()
578
+ $rdf.parse(body, globGraph, address + testDir + '/', 'text/turtle')
579
+ const authz = globGraph.the(undefined, undefined, ns.acl('Authorization'))
580
+ assert.equal(authz, null)
581
+ done()
582
+ })
583
+ })
584
+ it('user1 should be able to send glob request', function (done) {
585
+ const options = createOptions(globFile, 'user1')
586
+ request.get(options, function (error, response, body) {
587
+ assert.equal(error, null)
588
+ assert.equal(response.statusCode, 200)
589
+ const globGraph = $rdf.graph()
590
+ $rdf.parse(body, globGraph, address + testDir + '/', 'text/turtle')
591
+ const authz = globGraph.the(undefined, undefined, ns.acl('Authorization'))
592
+ assert.equal(authz, null)
593
+ done()
594
+ })
595
+ })
596
+ it('user1 should be able to delete ACL file', function (done) {
597
+ const options = createOptions(testDirAclFile, 'user1')
598
+ request.del(options, function (error, response, body) {
599
+ assert.equal(error, null)
600
+ assert.equal(response.statusCode, 200)
601
+ done()
602
+ })
603
+ })
604
+ })
605
+
606
+ describe('Append-only', function () {
607
+ // var body = fs.readFileSync(__dirname + '/resources/acl-tls/append-acl/abc.ttl.acl')
608
+ it("user1 should be able to access test file's ACL file", function (done) {
609
+ const options = createOptions('/acl-tls/append-acl/abc.ttl.acl', 'user1')
610
+ request.head(options, function (error, response) {
611
+ assert.equal(error, null)
612
+ assert.equal(response.statusCode, 200)
613
+ done()
614
+ })
615
+ })
616
+ it.skip('user1 should be able to PATCH a resource', function (done) {
617
+ const options = createOptions('/acl-tls/append-inherited/test.ttl', 'user1')
618
+ options.headers = {
619
+ 'content-type': 'application/sparql-update'
620
+ }
621
+ options.body = 'INSERT DATA { :test :hello 456 .}'
622
+ request.patch(options, function (error, response, body) {
623
+ assert.equal(error, null)
624
+ assert.equal(response.statusCode, 200)
625
+ done()
626
+ })
627
+ })
628
+ it('user1 should be able to access test file', function (done) {
629
+ const options = createOptions('/acl-tls/append-acl/abc.ttl', 'user1')
630
+ request.head(options, function (error, response, body) {
631
+ assert.equal(error, null)
632
+ assert.equal(response.statusCode, 200)
633
+ done()
634
+ })
635
+ })
636
+ // TODO POST instead of PUT
637
+ it('user1 should be able to modify test file', function (done) {
638
+ const options = createOptions('/acl-tls/append-acl/abc.ttl', 'user1')
639
+ options.headers = {
640
+ 'content-type': 'text/turtle'
641
+ }
642
+ options.body = '<a> <b> <c> .\n'
643
+ request.put(options, function (error, response, body) {
644
+ assert.equal(error, null)
645
+ assert.equal(response.statusCode, 201)
646
+ done()
647
+ })
648
+ })
649
+ it("user2 should not be able to access test file's ACL file", function (done) {
650
+ const options = createOptions('/acl-tls/append-acl/abc.ttl.acl', 'user2')
651
+ request.head(options, function (error, response, body) {
652
+ assert.equal(error, null)
653
+ assert.equal(response.statusCode, 403)
654
+ done()
655
+ })
656
+ })
657
+ it('user2 should not be able to access test file', function (done) {
658
+ const options = createOptions('/acl-tls/append-acl/abc.ttl', 'user2')
659
+ request.head(options, function (error, response, body) {
660
+ assert.equal(error, null)
661
+ assert.equal(response.statusCode, 403)
662
+ done()
663
+ })
664
+ })
665
+ it('user2 (with append permission) cannot use PUT to append', function (done) {
666
+ const options = createOptions('/acl-tls/append-acl/abc.ttl', 'user2')
667
+ options.headers = {
668
+ 'content-type': 'text/turtle'
669
+ }
670
+ options.body = '<d> <e> <f> .\n'
671
+ request.put(options, function (error, response, body) {
672
+ assert.equal(error, null)
673
+ assert.equal(response.statusCode, 403)
674
+ done()
675
+ })
676
+ })
677
+ it('agent should not be able to access test file', function (done) {
678
+ const options = createOptions('/acl-tls/append-acl/abc.ttl')
679
+ request.head(options, function (error, response, body) {
680
+ assert.equal(error, null)
681
+ assert.equal(response.statusCode, 401)
682
+ done()
683
+ })
684
+ })
685
+ it('agent (with append permissions) should not PUT', function (done) {
686
+ const options = createOptions('/acl-tls/append-acl/abc.ttl')
687
+ options.headers = {
688
+ 'content-type': 'text/turtle'
689
+ }
690
+ options.body = '<g> <h> <i> .\n'
691
+ request.put(options, function (error, response, body) {
692
+ assert.equal(error, null)
693
+ assert.equal(response.statusCode, 401)
694
+ done()
695
+ })
696
+ })
697
+ after(function () {
698
+ rm('acl-tls/append-inherited/test.ttl')
699
+ })
700
+ })
701
+
702
+ describe('Restricted', function () {
703
+ const body = '<#Owner> a <http://www.w3.org/ns/auth/acl#Authorization>;\n' +
704
+ ' <http://www.w3.org/ns/auth/acl#accessTo> <./abc2.ttl>;\n' +
705
+ ' <http://www.w3.org/ns/auth/acl#agent> <' + user1 + '>;\n' +
706
+ ' <http://www.w3.org/ns/auth/acl#mode> <http://www.w3.org/ns/auth/acl#Read>, <http://www.w3.org/ns/auth/acl#Write>, <http://www.w3.org/ns/auth/acl#Control> .\n' +
707
+ '<#Restricted> a <http://www.w3.org/ns/auth/acl#Authorization>;\n' +
708
+ ' <http://www.w3.org/ns/auth/acl#accessTo> <./abc2.ttl>;\n' +
709
+ ' <http://www.w3.org/ns/auth/acl#agent> <' + user2 + '>;\n' +
710
+ ' <http://www.w3.org/ns/auth/acl#mode> <http://www.w3.org/ns/auth/acl#Read>, <http://www.w3.org/ns/auth/acl#Write>.\n'
711
+ it("user1 should be able to modify test file's ACL file", function (done) {
712
+ const options = createOptions('/acl-tls/append-acl/abc2.ttl.acl', 'user1')
713
+ options.headers = {
714
+ 'content-type': 'text/turtle'
715
+ }
716
+ options.body = body
717
+ request.put(options, function (error, response, body) {
718
+ assert.equal(error, null)
719
+ assert.equal(response.statusCode, 201)
720
+ done()
721
+ })
722
+ })
723
+ it("user1 should be able to access test file's ACL file", function (done) {
724
+ const options = createOptions('/acl-tls/append-acl/abc2.ttl.acl', 'user1')
725
+ request.head(options, function (error, response, body) {
726
+ assert.equal(error, null)
727
+ assert.equal(response.statusCode, 200)
728
+ done()
729
+ })
730
+ })
731
+ it('user1 should be able to access test file', function (done) {
732
+ const options = createOptions('/acl-tls/append-acl/abc2.ttl', 'user1')
733
+ request.head(options, function (error, response, body) {
734
+ assert.equal(error, null)
735
+ assert.equal(response.statusCode, 200)
736
+ done()
737
+ })
738
+ })
739
+ it('user1 should be able to modify test file', function (done) {
740
+ const options = createOptions('/acl-tls/append-acl/abc2.ttl', 'user1')
741
+ options.headers = {
742
+ 'content-type': 'text/turtle'
743
+ }
744
+ options.body = '<a> <b> <c> .\n'
745
+ request.put(options, function (error, response, body) {
746
+ assert.equal(error, null)
747
+ assert.equal(response.statusCode, 201)
748
+ done()
749
+ })
750
+ })
751
+ it('user2 should be able to access test file', function (done) {
752
+ const options = createOptions('/acl-tls/append-acl/abc2.ttl', 'user2')
753
+ request.head(options, function (error, response, body) {
754
+ assert.equal(error, null)
755
+ assert.equal(response.statusCode, 200)
756
+ done()
757
+ })
758
+ })
759
+ it("user2 should not be able to access test file's ACL file", function (done) {
760
+ const options = createOptions('/acl-tls/append-acl/abc2.ttl.acl', 'user2')
761
+ request.head(options, function (error, response, body) {
762
+ assert.equal(error, null)
763
+ assert.equal(response.statusCode, 403)
764
+ done()
765
+ })
766
+ })
767
+ it('user2 should be able to modify test file', function (done) {
768
+ const options = createOptions('/acl-tls/append-acl/abc2.ttl', 'user2')
769
+ options.headers = {
770
+ 'content-type': 'text/turtle'
771
+ }
772
+ options.body = '<d> <e> <f> .\n'
773
+ request.put(options, function (error, response, body) {
774
+ assert.equal(error, null)
775
+ assert.equal(response.statusCode, 201)
776
+ done()
777
+ })
778
+ })
779
+ it('agent should not be able to access test file', function (done) {
780
+ const options = createOptions('/acl-tls/append-acl/abc2.ttl')
781
+ request.head(options, function (error, response, body) {
782
+ assert.equal(error, null)
783
+ assert.equal(response.statusCode, 401)
784
+ done()
785
+ })
786
+ })
787
+ it('agent should not be able to modify test file', function (done) {
788
+ const options = createOptions('/acl-tls/append-acl/abc2.ttl')
789
+ options.headers = {
790
+ 'content-type': 'text/turtle'
791
+ }
792
+ options.body = '<d> <e> <f> .\n'
793
+ request.put(options, function (error, response, body) {
794
+ assert.equal(error, null)
795
+ assert.equal(response.statusCode, 401)
796
+ done()
797
+ })
798
+ })
799
+ })
800
+
801
+ describe('default', function () {
802
+ before(function () {
803
+ rm('/acl-tls/write-acl/default-for-new/.acl')
804
+ rm('/acl-tls/write-acl/default-for-new/test-file.ttl')
805
+ })
806
+
807
+ const body = '<#Owner> a <http://www.w3.org/ns/auth/acl#Authorization>;\n' +
808
+ ' <http://www.w3.org/ns/auth/acl#accessTo> <./>;\n' +
809
+ ' <http://www.w3.org/ns/auth/acl#agent> <' + user1 + '>;\n' +
810
+ ' <http://www.w3.org/ns/auth/acl#default> <./>;\n' +
811
+ ' <http://www.w3.org/ns/auth/acl#mode> <http://www.w3.org/ns/auth/acl#Read>, <http://www.w3.org/ns/auth/acl#Write>, <http://www.w3.org/ns/auth/acl#Control> .\n' +
812
+ '<#Default> a <http://www.w3.org/ns/auth/acl#Authorization>;\n' +
813
+ ' <http://www.w3.org/ns/auth/acl#accessTo> <./>;\n' +
814
+ ' <http://www.w3.org/ns/auth/acl#default> <./>;\n' +
815
+ ' <http://www.w3.org/ns/auth/acl#agentClass> <http://xmlns.com/foaf/0.1/Agent>;\n' +
816
+ ' <http://www.w3.org/ns/auth/acl#mode> <http://www.w3.org/ns/auth/acl#Read> .\n'
817
+ it("user1 should be able to modify test directory's ACL file", function (done) {
818
+ const options = createOptions('/acl-tls/write-acl/default-for-new/.acl', 'user1')
819
+ options.headers = {
820
+ 'content-type': 'text/turtle'
821
+ }
822
+ options.body = body
823
+ request.put(options, function (error, response, body) {
824
+ assert.equal(error, null)
825
+ assert.equal(response.statusCode, 201)
826
+ done()
827
+ })
828
+ })
829
+ it("user1 should be able to access test direcotory's ACL file", function (done) {
830
+ const options = createOptions('/acl-tls/write-acl/default-for-new/.acl', 'user1')
831
+ request.head(options, function (error, response, body) {
832
+ assert.equal(error, null)
833
+ assert.equal(response.statusCode, 200)
834
+ done()
835
+ })
836
+ })
837
+ it('user1 should be able to create new test file', function (done) {
838
+ const options = createOptions('/acl-tls/write-acl/default-for-new/test-file.ttl', 'user1')
839
+ options.headers = {
840
+ 'content-type': 'text/turtle'
841
+ }
842
+ options.body = '<a> <b> <c> .\n'
843
+ request.put(options, function (error, response, body) {
844
+ assert.equal(error, null)
845
+ assert.equal(response.statusCode, 201)
846
+ done()
847
+ })
848
+ })
849
+ it('user1 should be able to access new test file', function (done) {
850
+ const options = createOptions('/acl-tls/write-acl/default-for-new/test-file.ttl', 'user1')
851
+ request.head(options, function (error, response, body) {
852
+ assert.equal(error, null)
853
+ assert.equal(response.statusCode, 200)
854
+ done()
855
+ })
856
+ })
857
+ it("user2 should not be able to access test direcotory's ACL file", function (done) {
858
+ const options = createOptions('/acl-tls/write-acl/default-for-new/.acl', 'user2')
859
+ request.head(options, function (error, response, body) {
860
+ assert.equal(error, null)
861
+ assert.equal(response.statusCode, 403)
862
+ done()
863
+ })
864
+ })
865
+ it('user2 should be able to access new test file', function (done) {
866
+ const options = createOptions('/acl-tls/write-acl/default-for-new/test-file.ttl', 'user2')
867
+ request.head(options, function (error, response, body) {
868
+ assert.equal(error, null)
869
+ assert.equal(response.statusCode, 200)
870
+ done()
871
+ })
872
+ })
873
+ it('user2 should not be able to modify new test file', function (done) {
874
+ const options = createOptions('/acl-tls/write-acl/default-for-new/test-file.ttl', 'user2')
875
+ options.headers = {
876
+ 'content-type': 'text/turtle'
877
+ }
878
+ options.body = '<d> <e> <f> .\n'
879
+ request.put(options, function (error, response, body) {
880
+ assert.equal(error, null)
881
+ assert.equal(response.statusCode, 403)
882
+ done()
883
+ })
884
+ })
885
+ it('agent should be able to access new test file', function (done) {
886
+ const options = createOptions('/acl-tls/write-acl/default-for-new/test-file.ttl')
887
+ request.head(options, function (error, response, body) {
888
+ assert.equal(error, null)
889
+ assert.equal(response.statusCode, 200)
890
+ done()
891
+ })
892
+ })
893
+ it('agent should not be able to modify new test file', function (done) {
894
+ const options = createOptions('/acl-tls/write-acl/default-for-new/test-file.ttl')
895
+ options.headers = {
896
+ 'content-type': 'text/turtle'
897
+ }
898
+ options.body = '<d> <e> <f> .\n'
899
+ request.put(options, function (error, response, body) {
900
+ assert.equal(error, null)
901
+ assert.equal(response.statusCode, 401)
902
+ done()
903
+ })
904
+ })
905
+
906
+ after(function () {
907
+ rm('/acl-tls/write-acl/default-for-new/.acl')
908
+ rm('/acl-tls/write-acl/default-for-new/test-file.ttl')
909
+ })
910
+ })
911
+
912
+ describe('WebID delegation tests', function () {
913
+ it('user1 should be able delegate to user2', function (done) {
914
+ // var body = '<' + user1 + '> <http://www.w3.org/ns/auth/acl#delegates> <' + user2 + '> .'
915
+ const options = {
916
+ url: user1,
917
+ headers: {
918
+ 'content-type': 'text/turtle'
919
+ },
920
+ agentOptions: {
921
+ key: userCredentials.user1.key,
922
+ cert: userCredentials.user1.cert
923
+ }
924
+ }
925
+ request.post(options, function (error, response, body) {
926
+ assert.equal(error, null)
927
+ assert.equal(response.statusCode, 200)
928
+ done()
929
+ })
930
+ })
931
+ // it("user2 should be able to make requests on behalf of user1", function(done) {
932
+ // var options = createOptions(abcdFile, 'user2')
933
+ // options.headers = {
934
+ // 'content-type': 'text/turtle',
935
+ // 'On-Behalf-Of': '<' + user1 + '>'
936
+ // }
937
+ // options.body = "<d> <e> <f> ."
938
+ // request.post(options, function(error, response, body) {
939
+ // assert.equal(error, null)
940
+ // assert.equal(response.statusCode, 200)
941
+ // done()
942
+ // })
943
+ // })
944
+ })
945
+
946
+ describe.skip('Cleanup', function () {
947
+ it('should remove all files and dirs created', function (done) {
948
+ try {
949
+ // must remove the ACLs in sync
950
+ fs.unlinkSync(path.join(__dirname, '../resources/' + testDir + '/dir1/dir2/abcd.ttl'))
951
+ fs.rmdirSync(path.join(__dirname, '../resources/' + testDir + '/dir1/dir2/'))
952
+ fs.rmdirSync(path.join(__dirname, '../resources/' + testDir + '/dir1/'))
953
+ fs.unlinkSync(path.join(__dirname, '../resources/' + abcFile))
954
+ fs.unlinkSync(path.join(__dirname, '../resources/' + testDirAclFile))
955
+ fs.unlinkSync(path.join(__dirname, '../resources/' + testDirMetaFile))
956
+ fs.rmdirSync(path.join(__dirname, '../resources/' + testDir))
957
+ fs.rmdirSync(path.join(__dirname, '../resources/acl-tls/'))
958
+ done()
959
+ } catch (e) {
960
+ done(e)
961
+ }
962
+ })
963
+ })
964
+ })