solid-server 5.8.8 → 6.0.0-e470e61c

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 (676) 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 +0 -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 → auth-buttons.mjs} +57 -67
  27. package/common/js/index-buttons.mjs +44 -0
  28. package/common/js/solid.js +0 -0
  29. package/common/js/solid.mjs +456 -0
  30. package/common/well-known/security.txt +0 -0
  31. package/config/{defaults.js → defaults.mjs} +22 -25
  32. package/config/templates/emails/delete-account.mjs +31 -0
  33. package/config/templates/emails/invalid-username.mjs +27 -0
  34. package/config/templates/emails/reset-password.mjs +31 -0
  35. package/config/templates/emails/welcome.mjs +23 -0
  36. package/config/templates/new-account/favicon.ico +0 -0
  37. package/config/templates/new-account/favicon.ico.acl +26 -0
  38. package/config/templates/new-account/profile/card$.ttl +26 -0
  39. package/config/templates/new-account/robots.txt +3 -0
  40. package/config/templates/new-account/robots.txt.acl +26 -0
  41. package/config/templates/new-account/settings/prefs.ttl +15 -0
  42. package/config/templates/new-account/settings/privateTypeIndex.ttl +4 -0
  43. package/config/templates/new-account/settings/publicTypeIndex.ttl +4 -0
  44. package/{default-templates/new-account/.meta.acl → config/templates/new-account/settings/publicTypeIndex.ttl.acl} +4 -4
  45. package/config/templates/new-account/settings/serverSide.ttl.acl +13 -0
  46. package/config/templates/new-account/settings/serverSide.ttl.inactive +12 -0
  47. package/config/templates/server/favicon.ico +0 -0
  48. package/{.well-known/.acl → config/templates/server/favicon.ico.acl} +2 -2
  49. package/config/templates/server/index.html +54 -0
  50. package/config/templates/server/robots.txt +3 -0
  51. package/{default-templates/server/.well-known/.acl → config/templates/server/robots.txt.acl} +2 -2
  52. package/config/usernames-blacklist.json +0 -0
  53. package/config/views/account/account-deleted.hbs +17 -0
  54. package/config/views/account/delete-confirm.hbs +51 -0
  55. package/config/views/account/delete-link-sent.hbs +17 -0
  56. package/config/views/account/delete.hbs +51 -0
  57. package/config/views/account/invalid-username.hbs +22 -0
  58. package/config/views/account/register-disabled.hbs +6 -0
  59. package/config/views/account/register-form.hbs +133 -0
  60. package/config/views/account/register.hbs +24 -0
  61. package/config/views/auth/auth-hidden-fields.hbs +8 -0
  62. package/config/views/auth/change-password.hbs +58 -0
  63. package/config/views/auth/goodbye.hbs +23 -0
  64. package/config/views/auth/login-required.hbs +34 -0
  65. package/config/views/auth/login-tls.hbs +11 -0
  66. package/config/views/auth/login-username-password.hbs +28 -0
  67. package/config/views/auth/login.hbs +55 -0
  68. package/config/views/auth/no-permission.hbs +29 -0
  69. package/config/views/auth/password-changed.hbs +27 -0
  70. package/config/views/auth/reset-link-sent.hbs +21 -0
  71. package/config/views/auth/reset-password.hbs +52 -0
  72. package/config/views/auth/sharing.hbs +49 -0
  73. package/config/views/shared/create-account.hbs +8 -0
  74. package/config/views/shared/error.hbs +5 -0
  75. package/config.json-default +0 -0
  76. package/coverage/tmp/coverage-2273-1767793711380-0.json +1 -0
  77. package/coverage/tmp/coverage-2274-1767793690515-0.json +1 -0
  78. package/default-templates/emails/delete-account.mjs +31 -0
  79. package/default-templates/emails/invalid-username.mjs +27 -0
  80. package/default-templates/emails/reset-password.mjs +31 -0
  81. package/default-templates/emails/welcome.mjs +23 -0
  82. package/default-templates/new-account/favicon.ico +0 -0
  83. package/default-templates/new-account/favicon.ico.acl +0 -0
  84. package/default-templates/new-account/profile/card$.ttl +0 -0
  85. package/default-templates/new-account/robots.txt +0 -0
  86. package/default-templates/new-account/robots.txt.acl +0 -0
  87. package/default-templates/new-account/settings/prefs.ttl +0 -0
  88. package/default-templates/new-account/settings/privateTypeIndex.ttl +0 -0
  89. package/default-templates/new-account/settings/publicTypeIndex.ttl +0 -0
  90. package/default-templates/new-account/settings/publicTypeIndex.ttl.acl +0 -0
  91. package/default-templates/new-account/settings/serverSide.ttl.acl +0 -0
  92. package/default-templates/new-account/settings/serverSide.ttl.inactive +0 -0
  93. package/default-templates/server/favicon.ico +0 -0
  94. package/default-templates/server/favicon.ico.acl +0 -0
  95. package/default-templates/server/index.html +1 -1
  96. package/default-templates/server/robots.txt +0 -0
  97. package/default-templates/server/robots.txt.acl +0 -0
  98. package/default-views/account/account-deleted.hbs +0 -0
  99. package/default-views/account/delete-confirm.hbs +0 -0
  100. package/default-views/account/delete-link-sent.hbs +0 -0
  101. package/default-views/account/delete.hbs +0 -0
  102. package/default-views/account/invalid-username.hbs +0 -0
  103. package/default-views/account/register-disabled.hbs +0 -0
  104. package/default-views/account/register-form.hbs +0 -0
  105. package/default-views/account/register.hbs +0 -0
  106. package/default-views/auth/auth-hidden-fields.hbs +0 -0
  107. package/default-views/auth/change-password.hbs +0 -0
  108. package/default-views/auth/goodbye.hbs +0 -0
  109. package/default-views/auth/login-required.hbs +0 -0
  110. package/default-views/auth/login-tls.hbs +0 -0
  111. package/default-views/auth/login-username-password.hbs +0 -0
  112. package/default-views/auth/login.hbs +0 -0
  113. package/default-views/auth/no-permission.hbs +0 -0
  114. package/default-views/auth/password-changed.hbs +0 -0
  115. package/default-views/auth/reset-link-sent.hbs +0 -0
  116. package/default-views/auth/reset-password.hbs +0 -0
  117. package/default-views/auth/sharing.hbs +0 -0
  118. package/default-views/shared/create-account.hbs +0 -0
  119. package/default-views/shared/error.hbs +0 -0
  120. package/docker-compose.yml +0 -0
  121. package/docker-image/CONTRIBUTING.md +33 -0
  122. package/docker-image/Makefile +32 -0
  123. package/docker-image/README.md +65 -0
  124. package/docker-image/examples/docker-compose.all-in-one.yml +76 -0
  125. package/docker-image/examples/docker-compose.nginx.yml +51 -0
  126. package/docker-image/examples/docker-compose.simple.yml +34 -0
  127. package/docker-image/src/Dockerfile +34 -0
  128. package/docker-image/src/checks.sh +56 -0
  129. package/docker-image/src/create-temporary-cert.sh +14 -0
  130. package/docker-image/src/entrypoint.sh +8 -0
  131. package/{common/img/.gitkeep → docker-image/test/__init__.py} +0 -0
  132. package/docker-image/test/conftest.py +15 -0
  133. package/docker-image/test/test_image_foundations.py +51 -0
  134. package/docker-image/test/test_non_accessible_key_cert.py +36 -0
  135. package/docker-image/test/test_precondition_checks.py +41 -0
  136. package/docker-image/test/test_solid_default_config.py +66 -0
  137. package/docker-image/test/test_volumes.py +55 -0
  138. package/docker-image/test/wait_for_container.py +8 -0
  139. package/docs/how-to-delete-your-account.md +0 -0
  140. package/docs/login-and-grant-access-to-application.md +0 -0
  141. package/eslint.config.mjs +102 -0
  142. package/examples/custom-error-handling.js +0 -0
  143. package/examples/custom-error-handling.mjs +29 -0
  144. package/examples/ldp-with-webid.js +0 -0
  145. package/examples/ldp-with-webid.mjs +12 -0
  146. package/examples/simple-express-app.js +0 -0
  147. package/examples/simple-express-app.mjs +20 -0
  148. package/examples/simple-ldp-server.js +0 -0
  149. package/examples/simple-ldp-server.mjs +8 -0
  150. package/favicon.ico +0 -0
  151. package/favicon.ico.acl +0 -0
  152. package/index.cjs +4 -0
  153. package/index.html +0 -0
  154. package/index.mjs +23 -0
  155. package/lib/{acl-checker.js → acl-checker.mjs} +13 -17
  156. package/lib/api/accounts/{user-accounts.js → user-accounts.mjs} +17 -16
  157. package/lib/api/authn/{force-user.js → force-user.mjs} +5 -4
  158. package/lib/api/authn/index.mjs +8 -0
  159. package/lib/api/authn/{webid-oidc.js → webid-oidc.mjs} +27 -20
  160. package/lib/api/authn/{webid-tls.js → webid-tls.mjs} +12 -11
  161. package/lib/api/index.mjs +7 -0
  162. package/lib/{capability-discovery.js → capability-discovery.mjs} +3 -6
  163. package/lib/common/{fs-utils.js → fs-utils.mjs} +35 -43
  164. package/lib/common/template-utils.mjs +29 -0
  165. package/lib/common/{user-utils.js → user-utils.mjs} +24 -28
  166. package/lib/{create-app.js → create-app.mjs} +372 -361
  167. package/lib/{create-server.js → create-server.mjs} +32 -11
  168. package/lib/debug.mjs +37 -0
  169. package/lib/handlers/{allow.js → allow.mjs} +79 -83
  170. package/lib/handlers/{auth-proxy.js → auth-proxy.mjs} +4 -5
  171. package/lib/handlers/{copy.js → copy.mjs} +35 -39
  172. package/lib/handlers/{cors-proxy.js → cors-proxy.mjs} +10 -14
  173. package/lib/handlers/{delete.js → delete.mjs} +20 -22
  174. package/lib/handlers/{error-pages.js → error-pages.mjs} +144 -212
  175. package/lib/handlers/{get.js → get.mjs} +258 -252
  176. package/lib/handlers/{index.js → index.mjs} +7 -10
  177. package/lib/handlers/{notify.js → notify.mjs} +8 -10
  178. package/lib/handlers/{options.js → options.mjs} +3 -7
  179. package/lib/handlers/patch/{n3-patch-parser.js → n3-patch-parser.mjs} +57 -59
  180. package/lib/handlers/patch/{sparql-update-parser.js → sparql-update-parser.mjs} +14 -16
  181. package/lib/handlers/{patch.js → patch.mjs} +241 -235
  182. package/lib/handlers/{post.js → post.mjs} +101 -99
  183. package/lib/handlers/{put.js → put.mjs} +101 -105
  184. package/lib/handlers/{restrict-to-top-domain.js → restrict-to-top-domain.mjs} +2 -2
  185. package/lib/{header.js → header.mjs} +138 -143
  186. package/lib/{http-error.js → http-error.mjs} +35 -34
  187. package/lib/{ldp-container.js → ldp-container.mjs} +10 -12
  188. package/lib/ldp-copy.mjs +82 -0
  189. package/lib/ldp-middleware.mjs +38 -0
  190. package/lib/{ldp.js → ldp.mjs} +285 -77
  191. package/lib/{lock.js → lock.mjs} +10 -10
  192. package/lib/{metadata.js → metadata.mjs} +11 -11
  193. package/lib/models/account-manager.mjs +297 -0
  194. package/lib/models/account-template.mjs +70 -0
  195. package/lib/models/authenticator.mjs +161 -0
  196. package/lib/models/oidc-manager.mjs +22 -0
  197. package/lib/models/solid-host.mjs +63 -0
  198. package/lib/models/user-account.mjs +50 -0
  199. package/lib/models/webid-tls-certificate.mjs +97 -0
  200. package/lib/{payment-pointer-discovery.js → payment-pointer-discovery.mjs} +5 -8
  201. package/lib/{rdf-notification-template.js → rdf-notification-template.mjs} +3 -5
  202. package/lib/requests/add-cert-request.mjs +70 -0
  203. package/lib/requests/auth-request.mjs +151 -0
  204. package/lib/requests/{create-account-request.js → create-account-request.mjs} +249 -452
  205. package/lib/requests/delete-account-confirm-request.mjs +85 -0
  206. package/lib/requests/{delete-account-request.js → delete-account-request.mjs} +73 -134
  207. package/lib/requests/login-request.mjs +89 -0
  208. package/lib/requests/{password-change-request.js → password-change-request.mjs} +132 -201
  209. package/lib/requests/{password-reset-email-request.js → password-reset-email-request.mjs} +123 -202
  210. package/lib/requests/password-reset-request.mjs +47 -0
  211. package/lib/requests/register-request.mjs +48 -0
  212. package/lib/requests/{sharing-request.js → sharing-request.mjs} +174 -261
  213. package/lib/{resource-mapper.js → resource-mapper.mjs} +8 -9
  214. package/lib/{server-config.js → server-config.mjs} +15 -20
  215. package/lib/services/{blacklist-service.js → blacklist-service.mjs} +36 -33
  216. package/lib/services/email-service.mjs +76 -0
  217. package/lib/services/{token-service.js → token-service.mjs} +36 -44
  218. package/lib/{utils.js → utils.mjs} +307 -254
  219. package/lib/webid/{index.js → index.mjs} +9 -13
  220. package/lib/webid/lib/{get.js → get.mjs} +30 -35
  221. package/lib/webid/lib/{parse.js → parse.mjs} +10 -12
  222. package/lib/webid/lib/verify.mjs +77 -0
  223. package/lib/webid/tls/generate.mjs +53 -0
  224. package/lib/webid/tls/index.mjs +6 -0
  225. package/package.json +76 -55
  226. package/renovate.json +0 -0
  227. package/robots.txt +0 -0
  228. package/robots.txt.acl +0 -0
  229. package/solid-server-6.0.0.tgz +0 -0
  230. package/static/account-recovery.html +0 -0
  231. package/static/popup-redirect.html +0 -0
  232. package/static/signup.html +0 -0
  233. package/static/signup.html.acl +0 -0
  234. package/test/index.mjs +167 -0
  235. package/test/integration/account-creation-tls-test.mjs +127 -0
  236. package/test/integration/account-manager-test.mjs +150 -0
  237. package/test/integration/account-template-test.mjs +135 -0
  238. package/test/integration/acl-oidc-test.mjs +1047 -0
  239. package/test/integration/acl-tls-test.mjs +964 -0
  240. package/test/integration/auth-proxy-test.mjs +144 -0
  241. package/test/integration/authentication-oidc-test.mjs +817 -0
  242. package/test/integration/authentication-oidc-with-strict-origins-turned-off-test.mjs +643 -0
  243. package/test/integration/capability-discovery-test.mjs +115 -0
  244. package/test/integration/cors-proxy-test.mjs +145 -0
  245. package/test/integration/errors-oidc-test.mjs +109 -0
  246. package/test/integration/errors-test.mjs +49 -0
  247. package/test/integration/formats-test.mjs +136 -0
  248. package/test/integration/header-test.mjs +101 -0
  249. package/test/integration/http-copy-test.mjs +109 -0
  250. package/test/integration/http-test.mjs +1197 -0
  251. package/test/integration/ldp-test.mjs +528 -0
  252. package/test/integration/oidc-manager-test.mjs +135 -0
  253. package/test/integration/params-test.mjs +192 -0
  254. package/test/integration/patch-sparql-update-test.mjs +195 -0
  255. package/test/integration/patch-test.mjs +590 -0
  256. package/test/integration/payment-pointer-test.mjs +155 -0
  257. package/test/integration/prep-test.mjs +314 -0
  258. package/test/integration/quota-test.mjs +50 -0
  259. package/test/integration/special-root-acl-handling-test.mjs +68 -0
  260. package/test/integration/validate-tts-test.mjs +57 -0
  261. package/test/integration/www-account-creation-oidc-test.mjs +310 -0
  262. package/test/keys/cert.pem +21 -0
  263. package/test/keys/client-cert.pem +19 -0
  264. package/test/keys/client-key.pem +27 -0
  265. package/test/keys/key.pem +27 -0
  266. package/test/keys/user1-cert.pem +23 -0
  267. package/test/keys/user1-key.pem +28 -0
  268. package/test/keys/user2-cert.pem +23 -0
  269. package/test/keys/user2-key.pem +27 -0
  270. package/test/mocha.opts +2 -0
  271. package/test/resources/Makefile +146 -0
  272. package/test/resources/accounts/alice.localhost/profile/card +0 -0
  273. package/test/resources/accounts/db/oidc/op/clients/_key_6aad39f3d978108cbce0c1aac2a4ef7e.json +1 -0
  274. package/test/resources/accounts/db/oidc/op/provider.json +763 -0
  275. package/test/resources/accounts/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A3457.json +1 -0
  276. package/test/resources/accounts/localhost/samplePublicContainer/nicola.jpg +0 -0
  277. package/test/resources/accounts/tim.localhost/hello.html +9 -0
  278. package/test/resources/accounts/tim.localhost/profile/card +0 -0
  279. package/{default-templates/emails/welcome.js → test/resources/accounts-acl/config/templates/emails/welcome-test.js} +0 -0
  280. package/test/resources/accounts-acl/config/templates/new-account/favicon.ico +0 -0
  281. package/test/resources/accounts-acl/config/templates/new-account/favicon.ico.acl +26 -0
  282. package/test/resources/accounts-acl/config/templates/new-account/index.html +28 -0
  283. package/test/resources/accounts-acl/config/templates/new-account/index.html.acl +22 -0
  284. package/test/resources/accounts-acl/config/templates/new-account/profile/card +27 -0
  285. package/{default-templates/new-account/inbox/.acl → test/resources/accounts-acl/config/templates/new-account/profile/card.acl} +5 -6
  286. package/test/resources/accounts-acl/config/templates/new-account/settings/prefs.ttl +9 -0
  287. package/test/resources/accounts-acl/config/templates/new-account/settings/privateTypeIndex.ttl +4 -0
  288. package/test/resources/accounts-acl/config/templates/new-account/settings/publicTypeIndex.ttl +4 -0
  289. package/test/resources/accounts-acl/config/templates/new-account/settings/publicTypeIndex.ttl.acl +25 -0
  290. package/test/resources/accounts-acl/config/templates/new-account/settings/serverSide.ttl +14 -0
  291. package/test/resources/accounts-acl/config/templates/server/index.html +35 -0
  292. package/{.acl → test/resources/accounts-acl/config/templates/server/index.html.acl} +4 -3
  293. package/test/resources/accounts-acl/config/views/account/register.hbs +58 -0
  294. package/test/resources/accounts-acl/config/views/auth/consent.hbs +49 -0
  295. package/test/resources/accounts-acl/config/views/auth/goodbye.hbs +20 -0
  296. package/test/resources/accounts-acl/config/views/auth/login-required.hbs +0 -0
  297. package/test/resources/accounts-acl/config/views/auth/login.hbs +51 -0
  298. package/test/resources/accounts-acl/config/views/auth/no-permission.hbs +0 -0
  299. package/test/resources/accounts-acl/db/oidc/op/clients/_key_77bb3b35edb1f3f7b887c25d1211a491.json +1 -0
  300. package/test/resources/accounts-acl/db/oidc/op/provider.json +763 -0
  301. package/test/resources/accounts-acl/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A7777.json +1 -0
  302. package/test/resources/accounts-acl/localhost/favicon.ico +0 -0
  303. package/test/resources/accounts-acl/localhost/index.html +35 -0
  304. package/{default-templates/server/.acl → test/resources/accounts-acl/localhost/index.html.acl} +4 -3
  305. package/test/resources/accounts-acl/nicola.localhost/index.html +1 -0
  306. package/test/resources/accounts-acl/nicola.localhost/index.html.acl +10 -0
  307. package/test/resources/accounts-acl/quota/settings/serverSide.ttl +11 -0
  308. package/test/resources/accounts-acl/tim.localhost/append-acl/abc.ttl +1 -0
  309. package/test/resources/accounts-acl/tim.localhost/append-acl/abc.ttl.acl +8 -0
  310. package/test/resources/accounts-acl/tim.localhost/append-acl/abc2.ttl +1 -0
  311. package/test/resources/accounts-acl/tim.localhost/append-acl/abc2.ttl.acl +8 -0
  312. package/test/resources/accounts-acl/tim.localhost/fake-account/hello.html +9 -0
  313. package/test/resources/accounts-acl/tim.localhost/group/test-folder/group-listing-error.ttl +1 -0
  314. package/test/resources/accounts-acl/tim.localhost/group/test-folder/group-listing.ttl +14 -0
  315. package/test/resources/accounts-acl/tim.localhost/group/test-folder/some-other-file.txt +1 -0
  316. package/test/resources/accounts-acl/tim.localhost/multi-server/protected.txt +1 -0
  317. package/test/resources/accounts-acl/tim.localhost/multi-server/protected.txt.acl +8 -0
  318. package/test/resources/accounts-acl/tim.localhost/no-acl/test-file.html +1 -0
  319. package/test/resources/accounts-acl/tim.localhost/read-acl/deeper-tree/acls-only-on-top/example.ttl +1 -0
  320. package/test/resources/accounts-acl/tim.localhost/write-acl/test-file$.txt +1 -0
  321. package/test/resources/accounts-scenario/alice/db/oidc/op/clients/_key_15640f5da80370c26dd61c7727104d05.json +1 -0
  322. package/test/resources/accounts-scenario/alice/db/oidc/op/provider.json +986 -0
  323. package/test/resources/accounts-scenario/alice/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A7000.json +1 -0
  324. package/test/resources/accounts-scenario/alice/private-for-alice.txt +1 -0
  325. package/test/resources/accounts-scenario/alice/private-for-alice.txt.acl +12 -0
  326. package/test/resources/accounts-scenario/alice/profile/card$.ttl +10 -0
  327. package/test/resources/accounts-scenario/bob/db/oidc/op/clients/_key_81e2f26ac5754742d201dfb1fa4d9c26.json +1 -0
  328. package/test/resources/accounts-scenario/bob/db/oidc/op/provider.json +986 -0
  329. package/test/resources/accounts-scenario/bob/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A7001.json +1 -0
  330. package/test/resources/accounts-scenario/bob/profile/card$.ttl +5 -0
  331. package/test/resources/accounts-scenario/bob/shared-with-alice.txt +1 -0
  332. package/test/resources/accounts-scenario/bob/shared-with-alice.txt.acl +15 -0
  333. package/test/resources/accounts-scenario/charlie/db/oidc/op/clients/_key_f2c171731a6d4c08f1a7b8e8f9426efc.json +1 -0
  334. package/test/resources/accounts-scenario/charlie/db/oidc/op/provider.json +759 -0
  335. package/test/resources/accounts-scenario/charlie/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A5002.json +1 -0
  336. package/test/resources/accounts-scenario/charlie/profile/card$.ttl +5 -0
  337. package/test/resources/accounts-strict-origin-off/alice/db/oidc/op/clients/_key_684df5f80bd067e4421b8176881d6430.json +1 -0
  338. package/test/resources/accounts-strict-origin-off/alice/db/oidc/op/provider.json +763 -0
  339. package/test/resources/accounts-strict-origin-off/alice/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A7010.json +1 -0
  340. package/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt +1 -0
  341. package/test/resources/accounts-strict-origin-off/alice/private-for-alice.txt.acl +12 -0
  342. package/test/resources/accounts-strict-origin-off/alice/profile/card$.ttl +10 -0
  343. package/test/resources/accounts-strict-origin-off/bob/db/oidc/op/clients/_key_b910d7c3ffdd3c3e9cd710e81a9fe85a.json +1 -0
  344. package/test/resources/accounts-strict-origin-off/bob/db/oidc/op/provider.json +763 -0
  345. package/test/resources/accounts-strict-origin-off/bob/db/oidc/rp/clients/_key_https%3A%2F%2Flocalhost%3A7011.json +1 -0
  346. package/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt +1 -0
  347. package/test/resources/accounts-strict-origin-off/bob/shared-with-alice.txt.acl +15 -0
  348. package/{default-templates → test/resources/acl-tls/config/templates}/emails/delete-account.js +0 -0
  349. package/{default-templates → test/resources/acl-tls/config/templates}/emails/invalid-username.js +0 -0
  350. package/{default-templates → test/resources/acl-tls/config/templates}/emails/reset-password.js +0 -0
  351. package/test/resources/acl-tls/config/templates/emails/welcome.js +39 -0
  352. package/test/resources/acl-tls/config/templates/new-account/favicon.ico +0 -0
  353. package/test/resources/acl-tls/config/templates/new-account/favicon.ico.acl +26 -0
  354. package/test/resources/acl-tls/config/templates/new-account/profile/card$.ttl +26 -0
  355. package/test/resources/acl-tls/config/templates/new-account/robots.txt +3 -0
  356. package/test/resources/acl-tls/config/templates/new-account/robots.txt.acl +26 -0
  357. package/test/resources/acl-tls/config/templates/new-account/settings/prefs.ttl +15 -0
  358. package/test/resources/acl-tls/config/templates/new-account/settings/privateTypeIndex.ttl +4 -0
  359. package/test/resources/acl-tls/config/templates/new-account/settings/publicTypeIndex.ttl +4 -0
  360. package/test/resources/acl-tls/config/templates/new-account/settings/publicTypeIndex.ttl.acl +25 -0
  361. package/test/resources/acl-tls/config/templates/new-account/settings/serverSide.ttl.acl +13 -0
  362. package/test/resources/acl-tls/config/templates/new-account/settings/serverSide.ttl.inactive +12 -0
  363. package/test/resources/acl-tls/config/templates/server/favicon.ico +0 -0
  364. package/test/resources/acl-tls/config/templates/server/favicon.ico.acl +15 -0
  365. package/test/resources/acl-tls/config/templates/server/index.html +55 -0
  366. package/test/resources/acl-tls/config/templates/server/robots.txt +3 -0
  367. package/test/resources/acl-tls/config/templates/server/robots.txt.acl +15 -0
  368. package/test/resources/acl-tls/config/views/account/account-deleted.hbs +17 -0
  369. package/test/resources/acl-tls/config/views/account/delete-confirm.hbs +51 -0
  370. package/test/resources/acl-tls/config/views/account/delete-link-sent.hbs +17 -0
  371. package/test/resources/acl-tls/config/views/account/delete.hbs +51 -0
  372. package/test/resources/acl-tls/config/views/account/invalid-username.hbs +22 -0
  373. package/test/resources/acl-tls/config/views/account/register-disabled.hbs +6 -0
  374. package/test/resources/acl-tls/config/views/account/register-form.hbs +147 -0
  375. package/test/resources/acl-tls/config/views/account/register.hbs +24 -0
  376. package/test/resources/acl-tls/config/views/auth/auth-hidden-fields.hbs +8 -0
  377. package/test/resources/acl-tls/config/views/auth/change-password.hbs +58 -0
  378. package/test/resources/acl-tls/config/views/auth/goodbye.hbs +23 -0
  379. package/test/resources/acl-tls/config/views/auth/login-required.hbs +34 -0
  380. package/test/resources/acl-tls/config/views/auth/login-tls.hbs +11 -0
  381. package/test/resources/acl-tls/config/views/auth/login-username-password.hbs +28 -0
  382. package/test/resources/acl-tls/config/views/auth/login.hbs +55 -0
  383. package/test/resources/acl-tls/config/views/auth/no-permission.hbs +29 -0
  384. package/test/resources/acl-tls/config/views/auth/password-changed.hbs +27 -0
  385. package/test/resources/acl-tls/config/views/auth/reset-link-sent.hbs +21 -0
  386. package/test/resources/acl-tls/config/views/auth/reset-password.hbs +52 -0
  387. package/test/resources/acl-tls/config/views/auth/sharing.hbs +49 -0
  388. package/test/resources/acl-tls/config/views/shared/create-account.hbs +8 -0
  389. package/test/resources/acl-tls/config/views/shared/error.hbs +5 -0
  390. package/test/resources/acl-tls/localhost/favicon.ico +0 -0
  391. package/test/resources/acl-tls/localhost/favicon.ico.acl +15 -0
  392. package/test/resources/acl-tls/localhost/index.html +48 -0
  393. package/test/resources/acl-tls/localhost/robots.txt +3 -0
  394. package/test/resources/acl-tls/localhost/robots.txt.acl +15 -0
  395. package/test/resources/acl-tls/tim.localhost/append-acl/abc.ttl +1 -0
  396. package/test/resources/acl-tls/tim.localhost/append-acl/abc.ttl.acl +8 -0
  397. package/test/resources/acl-tls/tim.localhost/append-acl/abc2.ttl +1 -0
  398. package/test/resources/acl-tls/tim.localhost/append-acl/abc2.ttl.acl +8 -0
  399. package/test/resources/acl-tls/tim.localhost/fake-account/hello.html +9 -0
  400. package/test/resources/acl-tls/tim.localhost/no-acl/test-file.html +1 -0
  401. package/test/resources/acl-tls/tim.localhost/profile/card$.ttl +17 -0
  402. package/test/resources/acl-tls/write-acl/test-file$.ttl +1 -0
  403. package/test/resources/auth-proxy/index.html +0 -0
  404. package/test/resources/auth-proxy/index.html.acl +0 -0
  405. package/test/resources/config/templates/emails/delete-account.js +49 -0
  406. package/test/resources/config/templates/emails/delete-account.mjs +31 -0
  407. package/test/resources/config/templates/emails/invalid-username.js +30 -0
  408. package/test/resources/config/templates/emails/invalid-username.mjs +27 -0
  409. package/test/resources/config/templates/emails/reset-password.js +49 -0
  410. package/test/resources/config/templates/emails/reset-password.mjs +31 -0
  411. package/test/resources/config/templates/emails/welcome.js +39 -0
  412. package/test/resources/config/templates/emails/welcome.mjs +23 -0
  413. package/test/resources/config/templates/new-account/favicon.ico +0 -0
  414. package/test/resources/config/templates/new-account/favicon.ico.acl +26 -0
  415. package/test/resources/config/templates/new-account/profile/card$.ttl +26 -0
  416. package/test/resources/config/templates/new-account/robots.txt +3 -0
  417. package/test/resources/config/templates/new-account/robots.txt.acl +26 -0
  418. package/test/resources/config/templates/new-account/settings/prefs.ttl +15 -0
  419. package/test/resources/config/templates/new-account/settings/privateTypeIndex.ttl +4 -0
  420. package/test/resources/config/templates/new-account/settings/publicTypeIndex.ttl +4 -0
  421. package/test/resources/config/templates/new-account/settings/publicTypeIndex.ttl.acl +25 -0
  422. package/test/resources/config/templates/new-account/settings/serverSide.ttl.acl +13 -0
  423. package/test/resources/config/templates/new-account/settings/serverSide.ttl.inactive +12 -0
  424. package/test/resources/config/templates/server/favicon.ico +0 -0
  425. package/test/resources/config/templates/server/favicon.ico.acl +15 -0
  426. package/test/resources/config/templates/server/index.html +54 -0
  427. package/test/resources/config/templates/server/robots.txt +3 -0
  428. package/test/resources/config/templates/server/robots.txt.acl +15 -0
  429. package/test/resources/config/views/account/account-deleted.hbs +17 -0
  430. package/test/resources/config/views/account/delete-confirm.hbs +51 -0
  431. package/test/resources/config/views/account/delete-link-sent.hbs +17 -0
  432. package/test/resources/config/views/account/delete.hbs +51 -0
  433. package/test/resources/config/views/account/invalid-username.hbs +22 -0
  434. package/test/resources/config/views/account/register-disabled.hbs +6 -0
  435. package/test/resources/config/views/account/register-form.hbs +133 -0
  436. package/test/resources/config/views/account/register.hbs +24 -0
  437. package/test/resources/config/views/auth/auth-hidden-fields.hbs +8 -0
  438. package/test/resources/config/views/auth/change-password.hbs +58 -0
  439. package/test/resources/config/views/auth/goodbye.hbs +23 -0
  440. package/test/resources/config/views/auth/login-required.hbs +34 -0
  441. package/test/resources/config/views/auth/login-tls.hbs +11 -0
  442. package/test/resources/config/views/auth/login-username-password.hbs +28 -0
  443. package/test/resources/config/views/auth/login.hbs +55 -0
  444. package/test/resources/config/views/auth/no-permission.hbs +29 -0
  445. package/test/resources/config/views/auth/password-changed.hbs +27 -0
  446. package/test/resources/config/views/auth/reset-link-sent.hbs +21 -0
  447. package/test/resources/config/views/auth/reset-password.hbs +52 -0
  448. package/test/resources/config/views/auth/sharing.hbs +49 -0
  449. package/test/resources/config/views/shared/create-account.hbs +8 -0
  450. package/test/resources/config/views/shared/error.hbs +5 -0
  451. package/test/resources/empty.spatch +0 -0
  452. package/test/resources/errorPages/401.html +5 -0
  453. package/test/resources/errorPages/403.html +5 -0
  454. package/test/resources/errorPages/404.html +5 -0
  455. package/test/resources/errorPages/405.html +5 -0
  456. package/test/resources/errorPages/415.html +5 -0
  457. package/test/resources/errorPages/500.html +5 -0
  458. package/test/resources/example_spkac.cnf +1 -0
  459. package/test/resources/external-servers/example.com/jwks.json +81 -0
  460. package/test/resources/external-servers/example.com/openid-configuration.json +53 -0
  461. package/test/resources/favicon.ico +0 -0
  462. package/test/resources/favicon.ico.acl +15 -0
  463. package/test/resources/headers/index.html +0 -0
  464. package/test/resources/headers/public-ra +0 -0
  465. package/test/resources/headers/public-ra.acl +7 -0
  466. package/test/resources/headers/user-rw-public-r +0 -0
  467. package/test/resources/headers/user-rw-public-r.acl +12 -0
  468. package/test/resources/headers/user-rwac-public-0 +0 -0
  469. package/test/resources/headers/user-rwac-public-0.acl +7 -0
  470. package/test/resources/hello.html +3 -0
  471. package/test/resources/invalid1.ttl +13 -0
  472. package/test/resources/invalid2.ttl +9 -0
  473. package/test/resources/ldpatch-example-final.ttl +23 -0
  474. package/test/resources/ldpatch-example-initial.ttl +22 -0
  475. package/test/resources/ldpatch-example-patch-1.spatch +8 -0
  476. package/test/resources/ldpatch-example-patch-2.spatch +12 -0
  477. package/test/resources/ldpatch-example-patch-3.spatch +14 -0
  478. package/test/resources/ldpatch-example-patch.ldpatch +25 -0
  479. package/test/resources/ldpatch-example-patch.spatch +24 -0
  480. package/test/resources/lennon.jsonld +7 -0
  481. package/test/resources/lfs-0.sparql +9 -0
  482. package/test/resources/lfs-1-final.json +10 -0
  483. package/test/resources/lfs-1.sparql +11 -0
  484. package/test/resources/messaging-scenario/user1.databox.me/profile/card +21 -0
  485. package/test/resources/nicola.jpg +0 -0
  486. package/test/resources/patch/append-only.ttl +2 -0
  487. package/test/resources/patch/append-only.ttl.acl +6 -0
  488. package/test/resources/patch/favicon.ico +0 -0
  489. package/test/resources/patch/favicon.ico.acl +15 -0
  490. package/test/resources/patch/index.html +0 -0
  491. package/test/resources/patch/read-append.ttl +2 -0
  492. package/test/resources/patch/read-append.ttl.acl +6 -0
  493. package/test/resources/patch/read-only.ttl +2 -0
  494. package/test/resources/patch/read-only.ttl.acl +6 -0
  495. package/test/resources/patch/read-write.ttl +2 -0
  496. package/test/resources/patch/read-write.ttl.acl +6 -0
  497. package/test/resources/patch/robots.txt +3 -0
  498. package/test/resources/patch/robots.txt.acl +15 -0
  499. package/test/resources/patch/write-only.ttl +2 -0
  500. package/test/resources/patch/write-only.ttl.acl +6 -0
  501. package/test/resources/patch-1-initial.ttl +3 -0
  502. package/test/resources/patch-2-final.ttl +2 -0
  503. package/test/resources/patch-2-initial.ttl +3 -0
  504. package/test/resources/patch-2.spatch +2 -0
  505. package/test/resources/patch-2n.spatch +2 -0
  506. package/test/resources/patch-3-final.ttl +28 -0
  507. package/test/resources/patch-4-final.ttl +29 -0
  508. package/test/resources/patch-5-final.ttl +1 -0
  509. package/test/resources/patch-5-initial.ttl +3 -0
  510. package/test/resources/patch-5.spatch +2 -0
  511. package/test/resources/put-input-2.html +13 -0
  512. package/test/resources/put-input.txt +6 -0
  513. package/test/resources/robots.txt +3 -0
  514. package/test/resources/robots.txt.acl +15 -0
  515. package/test/resources/sampleContainer/blank +0 -0
  516. package/test/resources/sampleContainer/cert.pkcs +0 -0
  517. package/test/resources/sampleContainer/example.ttl.old +1 -0
  518. package/test/resources/sampleContainer/example1.ttl +12 -0
  519. package/test/resources/sampleContainer/example2.ttl +3 -0
  520. package/test/resources/sampleContainer/example3.ttl +7 -0
  521. package/test/resources/sampleContainer/example4$.ttl +7 -0
  522. package/test/resources/sampleContainer/filename with spaces.txt +0 -0
  523. package/test/resources/sampleContainer/index.html +9 -0
  524. package/test/resources/sampleContainer/post2.ttl +6 -0
  525. package/test/resources/sampleContainer/put1.ttl +13 -0
  526. package/test/resources/sampleContainer/solid.png +0 -0
  527. package/test/resources/sampleContainer/user1.pfx +0 -0
  528. package/test/resources/sampleContainer/user2.pfx +0 -0
  529. package/test/resources/sampleContainer2/example1.ttl +10 -0
  530. package/test/resources/sampleContainer2/example2.ttl +7 -0
  531. package/test/resources/timbl.jpg +0 -0
  532. package/test/scenarios.md +23 -0
  533. package/test/surface/docker/cookie/Dockerfile +6 -0
  534. package/test/surface/docker/cookie/app/index.js +29 -0
  535. package/test/surface/docker/cookie/app/package-lock.json +13 -0
  536. package/test/surface/docker/cookie/app/package.json +14 -0
  537. package/test/surface/docker/server/Dockerfile +19 -0
  538. package/test/surface/docker/server/config/defaults.js +10 -0
  539. package/test/surface/docker/server/config/templates/emails/delete-account.js +49 -0
  540. package/test/surface/docker/server/config/templates/emails/invalid-username.js +30 -0
  541. package/test/surface/docker/server/config/templates/emails/reset-password.js +49 -0
  542. package/test/surface/docker/server/config/templates/emails/welcome.js +39 -0
  543. package/test/surface/docker/server/config/templates/new-account/favicon.ico +0 -0
  544. package/test/surface/docker/server/config/templates/new-account/favicon.ico.acl +26 -0
  545. package/test/surface/docker/server/config/templates/new-account/profile/card$.ttl +26 -0
  546. package/test/surface/docker/server/config/templates/new-account/robots.txt +3 -0
  547. package/test/surface/docker/server/config/templates/new-account/robots.txt.acl +26 -0
  548. package/test/surface/docker/server/config/templates/new-account/settings/prefs.ttl +15 -0
  549. package/test/surface/docker/server/config/templates/new-account/settings/privateTypeIndex.ttl +4 -0
  550. package/test/surface/docker/server/config/templates/new-account/settings/publicTypeIndex.ttl +4 -0
  551. package/test/surface/docker/server/config/templates/new-account/settings/publicTypeIndex.ttl.acl +25 -0
  552. package/test/surface/docker/server/config/templates/new-account/settings/serverSide.ttl.acl +13 -0
  553. package/test/surface/docker/server/config/templates/new-account/settings/serverSide.ttl.inactive +12 -0
  554. package/test/surface/docker/server/config/templates/server/favicon.ico +0 -0
  555. package/test/surface/docker/server/config/templates/server/favicon.ico.acl +15 -0
  556. package/test/surface/docker/server/config/templates/server/index.html +55 -0
  557. package/test/surface/docker/server/config/templates/server/robots.txt +3 -0
  558. package/test/surface/docker/server/config/templates/server/robots.txt.acl +15 -0
  559. package/test/surface/docker/server/config/usernames-blacklist.json +4 -0
  560. package/test/surface/docker/server/config/views/account/account-deleted.hbs +17 -0
  561. package/test/surface/docker/server/config/views/account/delete-confirm.hbs +51 -0
  562. package/test/surface/docker/server/config/views/account/delete-link-sent.hbs +17 -0
  563. package/test/surface/docker/server/config/views/account/delete.hbs +51 -0
  564. package/test/surface/docker/server/config/views/account/invalid-username.hbs +22 -0
  565. package/test/surface/docker/server/config/views/account/register-disabled.hbs +6 -0
  566. package/test/surface/docker/server/config/views/account/register-form.hbs +147 -0
  567. package/test/surface/docker/server/config/views/account/register.hbs +24 -0
  568. package/test/surface/docker/server/config/views/auth/auth-hidden-fields.hbs +8 -0
  569. package/test/surface/docker/server/config/views/auth/change-password.hbs +58 -0
  570. package/test/surface/docker/server/config/views/auth/goodbye.hbs +23 -0
  571. package/test/surface/docker/server/config/views/auth/login-required.hbs +34 -0
  572. package/test/surface/docker/server/config/views/auth/login-tls.hbs +11 -0
  573. package/test/surface/docker/server/config/views/auth/login-username-password.hbs +28 -0
  574. package/test/surface/docker/server/config/views/auth/login.hbs +55 -0
  575. package/test/surface/docker/server/config/views/auth/no-permission.hbs +29 -0
  576. package/test/surface/docker/server/config/views/auth/password-changed.hbs +27 -0
  577. package/test/surface/docker/server/config/views/auth/reset-link-sent.hbs +21 -0
  578. package/test/surface/docker/server/config/views/auth/reset-password.hbs +52 -0
  579. package/test/surface/docker/server/config/views/auth/sharing.hbs +49 -0
  580. package/test/surface/docker/server/config/views/shared/create-account.hbs +8 -0
  581. package/test/surface/docker/server/config/views/shared/error.hbs +5 -0
  582. package/test/surface/docker/server/config.json +22 -0
  583. package/test/surface/docker/server/data/favicon.ico +0 -0
  584. package/test/surface/docker/server/data/favicon.ico.acl +26 -0
  585. package/test/surface/docker/server/data/index.html +48 -0
  586. package/test/surface/docker/server/data/profile/card$.ttl +31 -0
  587. package/test/surface/docker/server/data/robots.txt +3 -0
  588. package/test/surface/docker/server/data/robots.txt.acl +26 -0
  589. package/test/surface/docker/server/data/settings/prefs.ttl +15 -0
  590. package/test/surface/docker/server/data/settings/privateTypeIndex.ttl +4 -0
  591. package/test/surface/docker/server/data/settings/publicTypeIndex.ttl +4 -0
  592. package/test/surface/docker/server/data/settings/publicTypeIndex.ttl.acl +25 -0
  593. package/test/surface/docker/server/data/settings/serverSide.ttl +0 -0
  594. package/test/surface/docker/server/data/settings/serverSide.ttl.acl +13 -0
  595. package/test/surface/docker/server/data/settings/serverSide.ttl.inactive +12 -0
  596. package/test/surface/docker/server/env.list +4 -0
  597. package/test/surface/docker/solid-crud/Dockerfile +4 -0
  598. package/test/surface/docker/web-access-control/Dockerfile +1 -0
  599. package/test/surface/docker/webid-provider/Dockerfile +1 -0
  600. package/test/surface/run-solid-test-suite.sh +75 -0
  601. package/test/surface/server-env.list +5 -0
  602. package/test/surface/solid-crud-tests-env.list +5 -0
  603. package/test/surface/thirdparty-config.json +23 -0
  604. package/test/surface/thirdparty-env.list +6 -0
  605. package/test/surface/web-access-control-tests-env.list +6 -0
  606. package/test/surface/webid-provider-tests-env.list +4 -0
  607. package/test/test-helpers.mjs +63 -0
  608. package/test/unit/account-manager-test.mjs +610 -0
  609. package/test/unit/account-template-test.mjs +58 -0
  610. package/test/unit/acl-checker-test.mjs +51 -0
  611. package/test/unit/add-cert-request-test.mjs +119 -0
  612. package/test/unit/auth-handlers-test.mjs +108 -0
  613. package/test/unit/auth-proxy-test.mjs +224 -0
  614. package/test/unit/auth-request-test.mjs +96 -0
  615. package/test/unit/authenticator-test.mjs +34 -0
  616. package/test/unit/blacklist-service-test.mjs +49 -0
  617. package/test/unit/create-account-request-test.mjs +306 -0
  618. package/test/unit/delete-account-confirm-request-test.mjs +234 -0
  619. package/test/unit/delete-account-request-test.mjs +180 -0
  620. package/test/unit/email-service-test.mjs +165 -0
  621. package/test/unit/email-welcome-test.mjs +80 -0
  622. package/test/unit/error-pages-test.mjs +100 -0
  623. package/test/unit/esm-imports.test.mjs +148 -0
  624. package/test/unit/force-user-test.mjs +73 -0
  625. package/test/unit/getAvailableUrl-test.mjs +30 -0
  626. package/test/unit/getTrustedOrigins-test.mjs +20 -0
  627. package/test/unit/login-request-test.mjs +246 -0
  628. package/test/unit/oidc-manager-test.mjs +49 -0
  629. package/test/unit/password-authenticator-test.mjs +125 -0
  630. package/test/unit/password-change-request-test.mjs +259 -0
  631. package/test/unit/password-reset-email-request-test.mjs +234 -0
  632. package/test/unit/resource-mapper-test.mjs +673 -0
  633. package/test/unit/solid-host-test.mjs +118 -0
  634. package/test/unit/tls-authenticator-test.mjs +174 -0
  635. package/test/unit/token-service-test.mjs +82 -0
  636. package/test/unit/user-account-test.mjs +37 -0
  637. package/test/unit/user-accounts-api-test.mjs +59 -0
  638. package/test/unit/user-utils-test.mjs +64 -0
  639. package/test/unit/utils-test.mjs +112 -0
  640. package/test/utils/index.mjs +166 -0
  641. package/test/utils.mjs +204 -0
  642. package/test/validate-turtle.mjs +42 -0
  643. package/.github/workflows/ci.yml +0 -113
  644. package/.nvmrc +0 -1
  645. package/.snyk +0 -35
  646. package/bin/lib/cli-utils.js +0 -85
  647. package/bin/lib/cli.js +0 -39
  648. package/bin/solid.js +0 -3
  649. package/common/js/index-buttons.js +0 -44
  650. package/default-templates/new-account/.acl +0 -26
  651. package/default-templates/new-account/.meta +0 -5
  652. package/default-templates/new-account/.well-known/.acl +0 -19
  653. package/default-templates/new-account/private/.acl +0 -10
  654. package/default-templates/new-account/profile/.acl +0 -19
  655. package/default-templates/new-account/public/.acl +0 -19
  656. package/default-templates/new-account/settings/.acl +0 -20
  657. package/index.js +0 -3
  658. package/lib/api/authn/index.js +0 -5
  659. package/lib/api/index.js +0 -6
  660. package/lib/common/template-utils.js +0 -50
  661. package/lib/debug.js +0 -18
  662. package/lib/ldp-copy.js +0 -73
  663. package/lib/ldp-middleware.js +0 -40
  664. package/lib/models/account-manager.js +0 -604
  665. package/lib/models/account-template.js +0 -156
  666. package/lib/models/authenticator.js +0 -337
  667. package/lib/models/oidc-manager.js +0 -53
  668. package/lib/models/solid-host.js +0 -131
  669. package/lib/models/user-account.js +0 -113
  670. package/lib/models/webid-tls-certificate.js +0 -184
  671. package/lib/requests/add-cert-request.js +0 -138
  672. package/lib/requests/auth-request.js +0 -234
  673. package/lib/requests/delete-account-confirm-request.js +0 -170
  674. package/lib/requests/login-request.js +0 -205
  675. package/lib/services/email-service.js +0 -162
  676. package/lib/webid/tls/index.js +0 -185
@@ -0,0 +1,528 @@
1
+ import { fileURLToPath } from 'url'
2
+ import path from 'path'
3
+ import fs from 'fs'
4
+ import $rdf from 'rdflib'
5
+ import { stringToStream } from '../../lib/utils.mjs'
6
+
7
+ // Import utility functions from the ESM utils
8
+ // const { rm, read } = await import('../utils.mjs')
9
+ import { rm, read } from '../utils.mjs'
10
+ import chai from 'chai'
11
+ import chaiAsPromised from 'chai-as-promised'
12
+ import LDP from '../../lib/ldp.mjs'
13
+ import { randomBytes } from 'node:crypto'
14
+ import ResourceMapper from '../../lib/resource-mapper.mjs'
15
+ import intoStream from 'into-stream'
16
+ import nsImport from 'solid-namespace'
17
+ const ns = nsImport($rdf)
18
+
19
+ const __filename = fileURLToPath(import.meta.url)
20
+ const __dirname = path.dirname(__filename)
21
+
22
+ chai.use(chaiAsPromised)
23
+ const assert = chai.assert
24
+
25
+ describe('LDP', function () {
26
+ const root = path.join(__dirname, '../../test/resources/ldp-test/')
27
+
28
+ const resourceMapper = new ResourceMapper({
29
+ rootUrl: 'https://localhost:8443/',
30
+ rootPath: root,
31
+ includeHost: false
32
+ })
33
+
34
+ const ldp = new LDP({
35
+ resourceMapper,
36
+ serverUri: 'https://localhost/',
37
+ multiuser: true,
38
+ webid: false
39
+ })
40
+
41
+ const rootQuota = path.join(__dirname, '../../test/resources/ldp-test-quota/')
42
+ const resourceMapperQuota = new ResourceMapper({
43
+ rootUrl: 'https://localhost:8444/',
44
+ rootPath: rootQuota,
45
+ includeHost: false
46
+ })
47
+
48
+ const ldpQuota = new LDP({
49
+ resourceMapper: resourceMapperQuota,
50
+ serverUri: 'https://localhost/',
51
+ multiuser: true,
52
+ webid: false
53
+ })
54
+
55
+ this.beforeAll(() => {
56
+ const metaData = `# Root Meta resource for the user account
57
+ # Used to discover the account's WebID URI, given the account URI
58
+ <https://tim.localhost:7777/profile/card#me>
59
+ <http://www.w3.org/ns/solid/terms#account>
60
+ </>.`
61
+
62
+ const example1TurtleData = `@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
63
+ @prefix dc: <http://purl.org/dc/elements/1.1/> .
64
+ @prefix ex: <http://example.org/stuff/1.0/> .
65
+
66
+ <#this> dc:title "Test title" .
67
+
68
+ <http://www.w3.org/TR/rdf-syntax-grammar>
69
+ dc:title "RDF/XML Syntax Specification (Revised)" ;
70
+ ex:editor [
71
+ ex:fullname "Dave Beckett";
72
+ ex:homePage <http://purl.org/net/dajobe/>
73
+ ] .`
74
+ fs.mkdirSync(root, { recursive: true })
75
+ fs.mkdirSync(path.join(root, '/resources/'), { recursive: true })
76
+ fs.mkdirSync(path.join(root, '/resources/sampleContainer/'), { recursive: true })
77
+ fs.writeFileSync(path.join(root, '.meta'), metaData)
78
+ fs.writeFileSync(path.join(root, 'resources/sampleContainer/example1.ttl'), example1TurtleData)
79
+
80
+ const settingsTtlData = `@prefix dct: <http://purl.org/dc/terms/>.
81
+ @prefix pim: <http://www.w3.org/ns/pim/space#>.
82
+ @prefix solid: <http://www.w3.org/ns/solid/terms#>.
83
+ @prefix unit: <http://www.w3.invalid/ns#>.
84
+
85
+ <>
86
+ a pim:ConfigurationFile;
87
+
88
+ dct:description "Administrative settings for the server that are only readable to the user." .
89
+
90
+ </>
91
+ solid:storageQuota "1230" .`
92
+
93
+ fs.mkdirSync(rootQuota, { recursive: true })
94
+ fs.mkdirSync(path.join(rootQuota, 'settings/'), { recursive: true })
95
+ fs.writeFileSync(path.join(rootQuota, 'settings/serverSide.ttl'), settingsTtlData)
96
+ })
97
+
98
+ this.afterAll(() => {
99
+ fs.rmSync(root, { recursive: true, force: true })
100
+ fs.rmSync(rootQuota, { recursive: true, force: true })
101
+ })
102
+
103
+ describe('cannot delete podRoot', function () {
104
+ it('should error 405 when deleting podRoot', () => {
105
+ return ldp.delete('/').catch(err => {
106
+ assert.equal(err.status, 405)
107
+ })
108
+ })
109
+ it('should error 405 when deleting podRoot/.acl', async () => {
110
+ await ldp.put('/.acl', intoStream(''), 'text/turtle')
111
+ return ldp.delete('/.acl').catch(err => {
112
+ assert.equal(err.status, 405)
113
+ })
114
+ })
115
+ })
116
+
117
+ describe('readResource', function () {
118
+ it('return 404 if file does not exist', () => {
119
+ // had to create the resources folder beforehand, otherwise throws 500 error
120
+ return ldp.readResource('/resources/unexistent.ttl').catch(err => {
121
+ assert.equal(err.status, 404)
122
+ })
123
+ })
124
+
125
+ it('return file if file exists', () => {
126
+ // file can be empty as well
127
+ fs.writeFileSync(path.join(root, '/resources/fileExists.txt'), 'hello world')
128
+ return ldp.readResource('/resources/fileExists.txt').then(file => {
129
+ assert.equal(file, 'hello world')
130
+ })
131
+ })
132
+ })
133
+
134
+ describe('readContainerMeta', () => {
135
+ it('should return 404 if .meta is not found', () => {
136
+ return ldp.readContainerMeta('/resources/sampleContainer/').catch(err => {
137
+ assert.equal(err.status, 404)
138
+ })
139
+ })
140
+
141
+ it('should return content if metaFile exists', () => {
142
+ // file can be empty as well
143
+ // write('This function just reads this, does not parse it', 'sampleContainer/.meta')
144
+ fs.writeFileSync(path.join(root, 'resources/sampleContainer/.meta'), 'This function just reads this, does not parse it')
145
+ return ldp.readContainerMeta('/resources/sampleContainer/').then(metaFile => {
146
+ // rm('sampleContainer/.meta')
147
+ assert.equal(metaFile, 'This function just reads this, does not parse it')
148
+ })
149
+ })
150
+
151
+ it('should work also if trailing `/` is not passed', () => {
152
+ // file can be empty as well
153
+ // write('This function just reads this, does not parse it', 'sampleContainer/.meta')
154
+ fs.writeFileSync(path.join(root, 'resources/sampleContainer/.meta'), 'This function just reads this, does not parse it')
155
+ return ldp.readContainerMeta('/resources/sampleContainer').then(metaFile => {
156
+ // rm('sampleContainer/.meta')
157
+ assert.equal(metaFile, 'This function just reads this, does not parse it')
158
+ })
159
+ })
160
+ })
161
+
162
+ describe('isOwner', () => {
163
+ it('should return acl:owner true', () => {
164
+ const owner = 'https://tim.localhost:7777/profile/card#me'
165
+ return ldp.isOwner(owner, '/resources/')
166
+ .then(isOwner => {
167
+ assert.equal(isOwner, true)
168
+ })
169
+ })
170
+ it('should return acl:owner false', () => {
171
+ const owner = 'https://tim.localhost:7777/profile/card'
172
+ return ldp.isOwner(owner, '/resources/')
173
+ .then(isOwner => {
174
+ assert.equal(isOwner, false)
175
+ })
176
+ })
177
+ })
178
+
179
+ describe('getGraph', () => {
180
+ it('should read and parse an existing file', () => {
181
+ const uri = 'https://localhost:8443/resources/sampleContainer/example1.ttl'
182
+ return ldp.getGraph(uri)
183
+ .then(graph => {
184
+ assert.ok(graph)
185
+ const fullname = $rdf.namedNode('http://example.org/stuff/1.0/fullname')
186
+ const match = graph.match(null, fullname)
187
+ assert.equal(match[0].object.value, 'Dave Beckett')
188
+ })
189
+ })
190
+
191
+ it('should throw a 404 error on a non-existing file', (done) => {
192
+ const uri = 'https://localhost:8443/resources/nonexistent.ttl'
193
+ ldp.getGraph(uri)
194
+ .catch(error => {
195
+ assert.ok(error)
196
+ assert.equal(error.status, 404)
197
+ done()
198
+ })
199
+ })
200
+ })
201
+
202
+ describe('putGraph', () => {
203
+ it('should serialize and write a graph to a file', () => {
204
+ const originalResource = '/resources/sampleContainer/example1.ttl'
205
+ const newResource = '/resources/sampleContainer/example1-copy.ttl'
206
+
207
+ const uri = 'https://localhost:8443' + originalResource
208
+ return ldp.getGraph(uri)
209
+ .then(graph => {
210
+ const newUri = 'https://localhost:8443' + newResource
211
+ return ldp.putGraph(graph, newUri)
212
+ })
213
+ .then(() => {
214
+ // Graph serialized and written
215
+ const written = read('ldp-test/resources/sampleContainer/example1-copy.ttl')
216
+ assert.ok(written)
217
+ })
218
+ // cleanup
219
+ .then(() => { rm('ldp-test/resources/sampleContainer/example1-copy.ttl') })
220
+ .catch(() => { rm('ldp-test/resources/sampleContainer/example1-copy.ttl') })
221
+ })
222
+ })
223
+
224
+ describe('put', function () {
225
+ it('should write a file in an existing dir', () => {
226
+ const stream = stringToStream('hello world')
227
+ return ldp.put('/resources/testPut.txt', stream, 'text/plain').then(() => {
228
+ const found = fs.readFileSync(path.join(root, '/resources/testPut.txt'))
229
+ assert.equal(found, 'hello world')
230
+ })
231
+ })
232
+
233
+ /// BELOW HERE IS NOT WORKING
234
+ it.skip('should fail if a trailing `/` is passed', () => {
235
+ const stream = stringToStream('hello world')
236
+ return ldp.put('/resources/', stream, 'text/plain').catch(err => {
237
+ assert.equal(err, 409)
238
+ })
239
+ })
240
+
241
+ it.skip('with a larger file to exceed allowed quota', function () {
242
+ const randstream = stringToStream(randomBytes(300000).toString())
243
+ return ldp.put('/resources/testQuota.txt', randstream, 'text/plain').catch((err) => {
244
+ assert.notOk(err)
245
+ assert.equal(err.status, 413)
246
+ })
247
+ })
248
+
249
+ it.skip('should fail if a over quota', function () {
250
+ const hellostream = stringToStream('hello world')
251
+ return ldpQuota.put('/resources/testOverQuota.txt', hellostream, 'text/plain').catch((err) => {
252
+ assert.equal(err.status, 413)
253
+ })
254
+ })
255
+
256
+ it.skip('should fail if a trailing `/` is passed without content type', () => {
257
+ const stream = stringToStream('hello world')
258
+ return ldp.put('/resources/', stream, null).catch(err => {
259
+ assert.equal(err.status, 419)
260
+ })
261
+ })
262
+ /// ABOVE HERE IS BUGGED
263
+
264
+ it('should fail if no content type is passed', () => {
265
+ const stream = stringToStream('hello world')
266
+ return ldp.put('/resources/testPut.txt', stream, null).catch(err => {
267
+ assert.equal(err.status, 400)
268
+ })
269
+ })
270
+ })
271
+
272
+ describe('delete', function () {
273
+ // FIXME: https://github.com/solid/node-solid-server/issues/1502
274
+ // has to be changed from testPut.txt because depending on
275
+ // other files in tests is bad practice.
276
+ it('should error when deleting a non-existing file', () => {
277
+ return assert.isRejected(ldp.delete('/resources/testPut2.txt'))
278
+ })
279
+
280
+ it('should delete a file with ACL in an existing dir', async () => {
281
+ // First create a dummy file
282
+ const stream = stringToStream('hello world')
283
+ await ldp.put('/resources/testPut.txt', stream, 'text/plain')
284
+ await ldp.put('/resources/testPut.txt.acl', stream, 'text/turtle')
285
+ // Make sure it exists
286
+ fs.stat(ldp.resourceMapper._rootPath + '/resources/testPut.txt', function (err) {
287
+ if (err) {
288
+ throw err
289
+ }
290
+ })
291
+ fs.stat(ldp.resourceMapper._rootPath + '/resources/testPut.txt.acl', function (err) {
292
+ if (err) {
293
+ throw err
294
+ }
295
+ })
296
+
297
+ // Now delete the dummy file
298
+ await ldp.delete('/resources/testPut.txt')
299
+ // Make sure it does not exist anymore
300
+ fs.stat(ldp.resourceMapper._rootPath + '/resources/testPut.txt', function (err, s) {
301
+ if (!err) {
302
+ throw new Error('file still exists')
303
+ }
304
+ })
305
+ fs.stat(ldp.resourceMapper._rootPath + '/resources/testPut.txt.acl', function (err, s) {
306
+ if (!err) {
307
+ throw new Error('file still exists')
308
+ }
309
+ })
310
+ })
311
+
312
+ it('should fail to delete a non-empty folder', async () => {
313
+ // First create a dummy file
314
+ const stream = stringToStream('hello world')
315
+ await ldp.put('/resources/dummy/testPutBlocking.txt', stream, 'text/plain')
316
+ // Make sure it exists
317
+ fs.stat(ldp.resourceMapper._rootPath + '/resources/dummy/testPutBlocking.txt', function (err) {
318
+ if (err) {
319
+ throw err
320
+ }
321
+ })
322
+
323
+ // Now try to delete its folder
324
+ return assert.isRejected(ldp.delete('/resources/dummy/'))
325
+ })
326
+
327
+ it('should fail to delete nested non-empty folders', async () => {
328
+ // First create a dummy file
329
+ const stream = stringToStream('hello world')
330
+ await ldp.put('/resources/dummy/dummy2/testPutBlocking.txt', stream, 'text/plain')
331
+ // Make sure it exists
332
+ fs.stat(ldp.resourceMapper._rootPath + '/resources/dummy/dummy2/testPutBlocking.txt', function (err) {
333
+ if (err) {
334
+ throw err
335
+ }
336
+ })
337
+
338
+ // Now try to delete its parent folder
339
+ return assert.isRejected(ldp.delete('/resources/dummy/'))
340
+ })
341
+
342
+ after(async function () {
343
+ // Clean up after delete tests
344
+ try {
345
+ await ldp.delete('/resources/dummy/testPutBlocking.txt')
346
+ await ldp.delete('/resources/dummy/dummy2/testPutBlocking.txt')
347
+ await ldp.delete('/resources/dummy/dummy2/')
348
+ await ldp.delete('/resources/dummy/')
349
+ } catch (err) {
350
+
351
+ }
352
+ })
353
+ })
354
+
355
+ describe('listContainer', function () {
356
+ beforeEach(() => {
357
+ // Clean up any test files before each test
358
+ try {
359
+ fs.unlinkSync(path.join(root, 'resources/sampleContainer/containerFile.ttl'))
360
+ } catch (e) { /* ignore */ }
361
+ try {
362
+ fs.unlinkSync(path.join(root, 'resources/sampleContainer/basicContainerFile.ttl'))
363
+ } catch (e) { /* ignore */ }
364
+ })
365
+
366
+ /*
367
+ it('should inherit type if file is .ttl', function (done) {
368
+ write('@prefix dcterms: <http://purl.org/dc/terms/>.' +
369
+ '@prefix o: <http://example.org/ontology>.' +
370
+ '<> a <http://www.w3.org/ns/ldp#MagicType> ;' +
371
+ ' dcterms:title "This is a magic type" ;' +
372
+ ' o:limit 500000.00 .', 'sampleContainer/magicType.ttl')
373
+
374
+ ldp.listContainer(path.join(__dirname, '../../test/resources/sampleContainer/'), 'https://server.tld/resources/sampleContainer/', 'https://server.tld', '', 'application/octet-stream', function (err, data) {
375
+ if (err) done(err)
376
+ var graph = $rdf.graph()
377
+ $rdf.parse(
378
+ data,
379
+ graph,
380
+ 'https://server.tld/sampleContainer',
381
+ 'text/turtle')
382
+
383
+ var statements = graph
384
+ .each(
385
+ $rdf.sym('https://server.tld/magicType.ttl'),
386
+ ns.rdf('type'),
387
+ undefined)
388
+ .map(function (d) {
389
+ return d.uri
390
+ })
391
+ // statements should be:
392
+ // [ 'http://www.w3.org/ns/iana/media-types/text/turtle#Resource',
393
+ // 'http://www.w3.org/ns/ldp#MagicType',
394
+ // 'http://www.w3.org/ns/ldp#Resource' ]
395
+ assert.equal(statements.length, 3)
396
+ assert.isAbove(statements.indexOf('http://www.w3.org/ns/ldp#MagicType'), -1)
397
+ assert.isAbove(statements.indexOf('http://www.w3.org/ns/ldp#Resource'), -1)
398
+
399
+ rm('sampleContainer/magicType.ttl')
400
+ done()
401
+ })
402
+ })
403
+ */
404
+ it('should not inherit type of BasicContainer/Container if type is File', () => {
405
+ const containerFileData = `@prefix dcterms: <http://purl.org/dc/terms/>.
406
+ @prefix o: <http://example.org/ontology>.
407
+ <> a <http://www.w3.org/ns/ldp#Container> ;
408
+ dcterms:title "This is a container" ;
409
+ o:limit 500000.00 .`
410
+ fs.writeFileSync(path.join(root, '/resources/sampleContainer/containerFile.ttl'), containerFileData)
411
+ const basicContainerFileData = `@prefix dcterms: <http://purl.org/dc/terms/>.
412
+ @prefix o: <http://example.org/ontology>.
413
+ <> a <http://www.w3.org/ns/ldp#BasicContainer> ;
414
+ dcterms:title "This is a container" ;
415
+ o:limit 500000.00 .`
416
+ fs.writeFileSync(path.join(root, '/resources/sampleContainer/basicContainerFile.ttl'), basicContainerFileData)
417
+
418
+ return ldp.listContainer(path.join(root, '/resources/sampleContainer/'), 'https://server.tld/resources/sampleContainer/', '', 'server.tld')
419
+ .then(data => {
420
+ const graph = $rdf.graph()
421
+ $rdf.parse(
422
+ data,
423
+ graph,
424
+ 'https://localhost:8443/resources/sampleContainer',
425
+ 'text/turtle')
426
+
427
+ // Find the basicContainerFile.ttl resource and get its type statements
428
+ // Use direct graph.statements filtering for maximum compatibility
429
+ const targetFile = 'basicContainerFile.ttl'
430
+ let basicContainerStatements = []
431
+
432
+ // Find the subject URL that ends with our target file
433
+ const matchingSubjects = graph.statements
434
+ .map(stmt => stmt.subject.value)
435
+ .filter(subject => subject.endsWith(targetFile))
436
+
437
+ if (matchingSubjects.length > 0) {
438
+ const subjectUrl = matchingSubjects[0]
439
+
440
+ // Get all type statements for this subject
441
+ basicContainerStatements = graph.statements
442
+ .filter(stmt =>
443
+ stmt.subject.value === subjectUrl &&
444
+ stmt.predicate.value === 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type'
445
+ )
446
+ .map(stmt => stmt.object.value)
447
+ }
448
+
449
+ const expectedStatements = [
450
+ 'http://www.w3.org/ns/iana/media-types/text/turtle#Resource',
451
+ 'http://www.w3.org/ns/ldp#Resource'
452
+ ]
453
+
454
+ assert.deepEqual(basicContainerStatements.sort(), expectedStatements)
455
+
456
+ // Also check containerFile.ttl using the same robust approach
457
+ const containerFile = 'containerFile.ttl'
458
+ const containerMatchingSubjects = graph.statements
459
+ .map(stmt => stmt.subject.value)
460
+ .filter(subject => subject.endsWith(containerFile))
461
+
462
+ let containerStatements = []
463
+ if (containerMatchingSubjects.length > 0) {
464
+ const containerSubjectUrl = containerMatchingSubjects[0]
465
+ containerStatements = graph.statements
466
+ .filter(stmt =>
467
+ stmt.subject.value === containerSubjectUrl &&
468
+ stmt.predicate.value === 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type'
469
+ )
470
+ .map(stmt => stmt.object.value)
471
+ }
472
+
473
+ assert.deepEqual(containerStatements.sort(), expectedStatements)
474
+
475
+ // Clean up synchronously
476
+ try {
477
+ fs.unlinkSync(path.join(root, 'resources/sampleContainer/containerFile.ttl'))
478
+ fs.unlinkSync(path.join(root, 'resources/sampleContainer/basicContainerFile.ttl'))
479
+ } catch (e) { /* ignore cleanup errors */ }
480
+ })
481
+ })
482
+
483
+ it('should ldp:contains the same files in dir', (done) => {
484
+ ldp.listContainer(path.join(__dirname, '../../test/resources/ldp-test/resources/sampleContainer/'), 'https://server.tld/resources/sampleContainer/', '', 'server.tld')
485
+ .then(data => {
486
+ fs.readdir(path.join(__dirname, '../../test/resources/ldp-test/resources/sampleContainer/'), function (err, expectedFiles) {
487
+ try {
488
+ if (err) {
489
+ return done(err)
490
+ }
491
+
492
+ // Filter out empty strings and strip dollar extension
493
+ // Also filter out .meta files since LDP doesn't list auxiliary files
494
+ expectedFiles = expectedFiles
495
+ .filter(file => file !== '')
496
+ .filter(file => !file.startsWith('.meta'))
497
+ .map(ldp.resourceMapper._removeDollarExtension)
498
+
499
+ const graph = $rdf.graph()
500
+ $rdf.parse(data, graph, 'https://localhost:8443/resources/sampleContainer/', 'text/turtle')
501
+ const statements = graph.match(null, ns.ldp('contains'), null)
502
+ const files = statements
503
+ .map(s => {
504
+ const url = s.object.value
505
+ const filename = url.replace(/.*\//, '')
506
+ // For directories, the URL ends with '/' so after regex we get empty string
507
+ // In this case, get the directory name from before the final '/'
508
+ if (filename === '' && url.endsWith('/')) {
509
+ return url.replace(/\/$/, '').replace(/.*\//, '')
510
+ }
511
+ return filename
512
+ })
513
+ .map(decodeURIComponent)
514
+ .filter(file => file !== '')
515
+
516
+ files.sort()
517
+ expectedFiles.sort()
518
+ assert.deepEqual(files, expectedFiles)
519
+ done()
520
+ } catch (error) {
521
+ done(error)
522
+ }
523
+ })
524
+ })
525
+ .catch(done)
526
+ })
527
+ })
528
+ })
@@ -0,0 +1,135 @@
1
+ import { fileURLToPath } from 'url'
2
+ import path from 'path'
3
+ import { URL } from 'url'
4
+ import chai from 'chai'
5
+ import fs from 'fs-extra'
6
+ import { fromServerConfig } from '../../lib/models/oidc-manager.mjs'
7
+ import SolidHost from '../../lib/models/solid-host.mjs'
8
+
9
+ const { expect } = chai
10
+
11
+ const __filename = fileURLToPath(import.meta.url)
12
+ const __dirname = path.dirname(__filename)
13
+
14
+ const dbPath = path.join(__dirname, '../resources/.db')
15
+
16
+ describe('OidcManager', () => {
17
+ beforeEach(() => {
18
+ fs.removeSync(dbPath)
19
+ })
20
+
21
+ describe('fromServerConfig()', () => {
22
+ it('should result in an initialized oidc object', () => {
23
+ const providerUri = 'https://localhost:8443'
24
+ const host = SolidHost.from({ providerUri })
25
+
26
+ const saltRounds = 5
27
+ const argv = {
28
+ host,
29
+ dbPath,
30
+ saltRounds
31
+ }
32
+
33
+ const oidc = fromServerConfig(argv)
34
+
35
+ expect(oidc.rs.defaults.query).to.be.true
36
+ expect(oidc.clients.store.backend.path.endsWith('db/oidc/rp/clients'))
37
+ expect(oidc.provider.issuer).to.equal(providerUri)
38
+ expect(oidc.users.backend.path.endsWith('db/oidc/users'))
39
+ expect(oidc.users.saltRounds).to.equal(saltRounds)
40
+ })
41
+
42
+ it('should set the provider issuer which is used for iss claim in tokens', () => {
43
+ const providerUri = 'https://pivot-test.solidproject.org:8443'
44
+ const host = SolidHost.from({ serverUri: providerUri })
45
+
46
+ const saltRounds = 5
47
+ const argv = {
48
+ host,
49
+ dbPath,
50
+ saltRounds
51
+ }
52
+
53
+ const oidc = fromServerConfig(argv)
54
+
55
+ // Verify the issuer is set correctly for RFC 9207 compliance
56
+ // The iss claim in tokens should match this issuer value
57
+ expect(oidc.provider.issuer).to.exist
58
+ expect(oidc.provider.issuer).to.not.be.null
59
+ expect(oidc.provider.issuer).to.equal(providerUri)
60
+ console.log('Provider issuer (used for iss claim):', oidc.provider.issuer)
61
+ })
62
+ })
63
+
64
+ describe('RFC 9207 - Authorization redirect with iss parameter', () => {
65
+ it('should include iss parameter when redirecting after authorization', async () => {
66
+ const providerUri = 'https://localhost:8443'
67
+ const host = SolidHost.from({ providerUri })
68
+
69
+ const argv = {
70
+ host,
71
+ dbPath,
72
+ saltRounds: 5
73
+ }
74
+
75
+ const oidc = fromServerConfig(argv)
76
+
77
+ // Dynamically import BaseRequest from oidc-op
78
+ const { default: BaseRequest } = await import('@solid/oidc-op/src/handlers/BaseRequest.js')
79
+
80
+ // Create a mock request/response to test the redirect behavior
81
+ const mockReq = {
82
+ method: 'GET',
83
+ query: {
84
+ response_type: 'code',
85
+ redirect_uri: 'https://app.example.com/callback',
86
+ client_id: 'https://app.example.com',
87
+ state: 'test-state'
88
+ }
89
+ }
90
+
91
+ const mockRes = {
92
+ redirectCalled: false,
93
+ redirectUrl: '',
94
+ redirect (url) {
95
+ this.redirectCalled = true
96
+ this.redirectUrl = url
97
+ }
98
+ }
99
+
100
+ const request = new BaseRequest(mockReq, mockRes, oidc.provider)
101
+ request.params = mockReq.query
102
+
103
+ // Simulate a successful authorization by calling redirect with auth data
104
+ try {
105
+ request.redirect({ code: 'test-auth-code' })
106
+ } catch (err) {
107
+ // The redirect throws a HandledError, which is expected behavior
108
+ // We just need to check that the redirect was called with the right URL
109
+ }
110
+
111
+ expect(mockRes.redirectCalled).to.be.true
112
+ expect(mockRes.redirectUrl).to.exist
113
+
114
+ // Parse the redirect URL to check for iss parameter
115
+ const redirectUrl = new URL(mockRes.redirectUrl)
116
+
117
+ // The iss parameter can be in either the query string or hash fragment
118
+ // depending on the response_mode (query or fragment)
119
+ let issParam = redirectUrl.searchParams.get('iss')
120
+ if (!issParam && redirectUrl.hash) {
121
+ // Check in the hash fragment
122
+ const hashParams = new URLSearchParams(redirectUrl.hash.substring(1))
123
+ issParam = hashParams.get('iss')
124
+ }
125
+
126
+ console.log('Redirect URL:', mockRes.redirectUrl)
127
+ console.log('RFC 9207 - iss parameter in redirect:', issParam)
128
+
129
+ // RFC 9207: The iss parameter MUST be present and match the provider issuer
130
+ expect(issParam, 'RFC 9207: iss parameter must be present in authorization response').to.exist
131
+ expect(issParam).to.not.be.null
132
+ expect(issParam).to.equal(providerUri)
133
+ })
134
+ })
135
+ })