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
@@ -1,361 +1,372 @@
1
- module.exports = createApp
2
-
3
- const express = require('express')
4
- const session = require('express-session')
5
- const handlebars = require('express-handlebars')
6
- const uuid = require('uuid')
7
- const cors = require('cors')
8
- const LDP = require('./ldp')
9
- const LdpMiddleware = require('./ldp-middleware')
10
- const corsProxy = require('./handlers/cors-proxy')
11
- const authProxy = require('./handlers/auth-proxy')
12
- const SolidHost = require('./models/solid-host')
13
- const AccountManager = require('./models/account-manager')
14
- const vhost = require('vhost')
15
- const EmailService = require('./services/email-service')
16
- const TokenService = require('./services/token-service')
17
- const capabilityDiscovery = require('./capability-discovery')
18
- const paymentPointerDiscovery = require('./payment-pointer-discovery')
19
- const API = require('./api')
20
- const errorPages = require('./handlers/error-pages')
21
- const config = require('./server-config')
22
- const defaults = require('../config/defaults')
23
- const options = require('./handlers/options')
24
- const debug = require('./debug')
25
- const path = require('path')
26
- const { routeResolvedFile } = require('./utils')
27
- const ResourceMapper = require('./resource-mapper')
28
- const aclCheck = require('@solid/acl-check')
29
- const { version } = require('../package.json')
30
-
31
- const acceptEvents = require('express-accept-events').default
32
- const events = require('express-negotiate-events').default
33
- const eventID = require('express-prep/event-id').default
34
- const prep = require('express-prep').default
35
-
36
- const corsSettings = cors({
37
- methods: [
38
- 'OPTIONS', 'HEAD', 'GET', 'PATCH', 'POST', 'PUT', 'DELETE'
39
- ],
40
- exposedHeaders: 'Authorization, User, Location, Link, Vary, Last-Modified, ETag, Accept-Patch, Accept-Post, Accept-Put, Updates-Via, Allow, WAC-Allow, Content-Length, WWW-Authenticate, MS-Author-Via, X-Powered-By',
41
- credentials: true,
42
- maxAge: 1728000,
43
- origin: true,
44
- preflightContinue: true
45
- })
46
-
47
- function createApp (argv = {}) {
48
- // Override default configs (defaults) with passed-in params (argv)
49
- argv = Object.assign({}, defaults, argv)
50
-
51
- argv.host = SolidHost.from(argv)
52
-
53
- argv.resourceMapper = new ResourceMapper({
54
- rootUrl: argv.serverUri,
55
- rootPath: path.resolve(argv.root || process.cwd()),
56
- includeHost: argv.multiuser,
57
- defaultContentType: argv.defaultContentType
58
- })
59
-
60
- const configPath = config.initConfigDir(argv)
61
- argv.templates = config.initTemplateDirs(configPath)
62
-
63
- config.printDebugInfo(argv)
64
-
65
- const ldp = new LDP(argv)
66
-
67
- const app = express()
68
-
69
- // Add PREP support
70
- if (argv.prep) {
71
- app.use(eventID)
72
- app.use(acceptEvents, events, prep)
73
- }
74
-
75
- initAppLocals(app, argv, ldp)
76
- initHeaders(app)
77
- initViews(app, configPath)
78
- initLoggers()
79
-
80
- // Serve the public 'common' directory (for shared CSS files, etc)
81
- app.use('/common', express.static(path.join(__dirname, '../common')))
82
- app.use('/', express.static(path.dirname(require.resolve('mashlib/dist/databrowser.html')), { index: false }))
83
- routeResolvedFile(app, '/common/js/', 'solid-auth-client/dist-lib/solid-auth-client.bundle.js')
84
- routeResolvedFile(app, '/common/js/', 'solid-auth-client/dist-lib/solid-auth-client.bundle.js.map')
85
- app.use('/.well-known', express.static(path.join(__dirname, '../common/well-known')))
86
-
87
- // Serve bootstrap from it's node_module directory
88
- routeResolvedFile(app, '/common/css/', 'bootstrap/dist/css/bootstrap.min.css')
89
- routeResolvedFile(app, '/common/css/', 'bootstrap/dist/css/bootstrap.min.css.map')
90
- routeResolvedFile(app, '/common/fonts/', 'bootstrap/dist/fonts/glyphicons-halflings-regular.eot')
91
- routeResolvedFile(app, '/common/fonts/', 'bootstrap/dist/fonts/glyphicons-halflings-regular.svg')
92
- routeResolvedFile(app, '/common/fonts/', 'bootstrap/dist/fonts/glyphicons-halflings-regular.ttf')
93
- routeResolvedFile(app, '/common/fonts/', 'bootstrap/dist/fonts/glyphicons-halflings-regular.woff')
94
- routeResolvedFile(app, '/common/fonts/', 'bootstrap/dist/fonts/glyphicons-halflings-regular.woff2')
95
-
96
- // Serve OWASP password checker from it's node_module directory
97
- routeResolvedFile(app, '/common/js/', 'owasp-password-strength-test/owasp-password-strength-test.js')
98
- // Serve the TextEncoder polyfill
99
- routeResolvedFile(app, '/common/js/', 'text-encoder-lite/text-encoder-lite.min.js')
100
-
101
- // Add CORS proxy
102
- if (argv.proxy) {
103
- console.warn('The proxy configuration option has been renamed to corsProxy.')
104
- argv.corsProxy = argv.corsProxy || argv.proxy
105
- delete argv.proxy
106
- }
107
- if (argv.corsProxy) {
108
- corsProxy(app, argv.corsProxy)
109
- }
110
-
111
- // Options handler
112
- app.options('/*', options)
113
-
114
- // Set up API
115
- if (argv.apiApps) {
116
- app.use('/api/apps', express.static(argv.apiApps))
117
- }
118
-
119
- // Authenticate the user
120
- if (argv.webid) {
121
- initWebId(argv, app, ldp)
122
- }
123
- // Add Auth proxy (requires authentication)
124
- if (argv.authProxy) {
125
- authProxy(app, argv.authProxy)
126
- }
127
-
128
- // Attach the LDP middleware
129
- app.use('/', LdpMiddleware(corsSettings, argv.prep))
130
-
131
- // https://stackoverflow.com/questions/51741383/nodejs-express-return-405-for-un-supported-method
132
- app.use(function (req, res, next) {
133
- const AllLayers = app._router.stack
134
- const Layers = AllLayers.filter(x => x.name === 'bound dispatch' && x.regexp.test(req.path))
135
-
136
- const Methods = []
137
- Layers.forEach(layer => {
138
- for (const method in layer.route.methods) {
139
- if (layer.route.methods[method] === true) {
140
- Methods.push(method.toUpperCase())
141
- }
142
- }
143
- })
144
-
145
- if (Layers.length !== 0 && !Methods.includes(req.method)) {
146
- // res.setHeader('Allow', Methods.join(','))
147
-
148
- if (req.method === 'OPTIONS') {
149
- return res.send(Methods.join(', '))
150
- } else {
151
- return res.status(405).send()
152
- }
153
- } else {
154
- next()
155
- }
156
- })
157
-
158
- // Errors
159
- app.use(errorPages.handler)
160
-
161
- return app
162
- }
163
-
164
- /**
165
- * Initializes `app.locals` parameters for downstream use (typically by route
166
- * handlers).
167
- *
168
- * @param app {Function} Express.js app instance
169
- * @param argv {Object} Config options hashmap
170
- * @param ldp {LDP}
171
- */
172
- function initAppLocals (app, argv, ldp) {
173
- app.locals.ldp = ldp
174
- app.locals.appUrls = argv.apps // used for service capability discovery
175
- app.locals.host = argv.host
176
- app.locals.authMethod = argv.auth
177
- app.locals.localAuth = argv.localAuth
178
- app.locals.tokenService = new TokenService()
179
- app.locals.enforceToc = argv.enforceToc
180
- app.locals.tocUri = argv.tocUri
181
- app.locals.disablePasswordChecks = argv.disablePasswordChecks
182
- app.locals.prep = argv.prep
183
-
184
- if (argv.email && argv.email.host) {
185
- app.locals.emailService = new EmailService(argv.templates.email, argv.email)
186
- }
187
- }
188
-
189
- /**
190
- * Sets up headers common to all Solid requests (CORS-related, Allow, etc).
191
- *
192
- * @param app {Function} Express.js app instance
193
- */
194
- function initHeaders (app) {
195
- app.use(corsSettings)
196
-
197
- app.use((req, res, next) => {
198
- res.set('X-Powered-By', 'solid-server/' + version)
199
-
200
- // Cors lib adds Vary: Origin automatically, but inreliably
201
- res.set('Vary', 'Accept, Authorization, Origin')
202
-
203
- // Set default Allow methods
204
- res.set('Allow', 'OPTIONS, HEAD, GET, PATCH, POST, PUT, DELETE')
205
- next()
206
- })
207
-
208
- app.use('/', capabilityDiscovery())
209
- app.use('/', paymentPointerDiscovery())
210
- }
211
-
212
- /**
213
- * Sets up the express rendering engine and views directory.
214
- *
215
- * @param app {Function} Express.js app
216
- * @param configPath {string}
217
- */
218
- function initViews (app, configPath) {
219
- const viewsPath = config.initDefaultViews(configPath)
220
-
221
- app.set('views', viewsPath)
222
- app.engine('.hbs', handlebars({
223
- extname: '.hbs',
224
- partialsDir: viewsPath,
225
- defaultLayout: null
226
- }))
227
- app.set('view engine', '.hbs')
228
- }
229
-
230
- /**
231
- * Sets up WebID-related functionality (account creation and authentication)
232
- *
233
- * @param argv {Object}
234
- * @param app {Function}
235
- * @param ldp {LDP}
236
- */
237
- function initWebId (argv, app, ldp) {
238
- config.ensureWelcomePage(argv)
239
-
240
- // Store the user's session key in a cookie
241
- // (for same-domain browsing by people only)
242
- const useSecureCookies = !!argv.sslKey // use secure cookies when over HTTPS
243
- const sessionHandler = session(sessionSettings(useSecureCookies, argv.host))
244
- app.use(sessionHandler)
245
- // Reject cookies from third-party applications.
246
- // Otherwise, when a user is logged in to their Solid server,
247
- // any third-party application could perform authenticated requests
248
- // without permission by including the credentials set by the Solid server.
249
- app.use((req, res, next) => {
250
- const origin = req.get('origin')
251
- const trustedOrigins = ldp.getTrustedOrigins(req)
252
- const userId = req.session.userId
253
- // Exception: allow logout requests from all third-party apps
254
- // such that OIDC client can log out via cookie auth
255
- // TODO: remove this exception when OIDC clients
256
- // use Bearer token to authenticate instead of cookie
257
- // (https://github.com/solid/node-solid-server/pull/835#issuecomment-426429003)
258
- //
259
- // Authentication cookies are an optimization:
260
- // instead of going through the process of
261
- // fully validating authentication on every request,
262
- // we go through this process once,
263
- // and store its successful result in a cookie
264
- // that will be reused upon the next request.
265
- // However, that cookie can then be sent by any server,
266
- // even servers that have not gone through the proper authentication mechanism.
267
- // However, if trusted origins are enabled,
268
- // then any origin is allowed to take the shortcut route,
269
- // since malicious origins will be banned at the ACL checking phase.
270
- // https://github.com/solid/node-solid-server/issues/1117
271
- if (!argv.strictOrigin && !argv.host.allowsSessionFor(userId, origin, trustedOrigins) && !isLogoutRequest(req)) {
272
- debug.authentication(`Rejecting session for ${userId} from ${origin}`)
273
- // Destroy session data
274
- delete req.session.userId
275
- // Ensure this modified session is not saved
276
- req.session.save = (done) => done()
277
- }
278
- if (isLogoutRequest(req)) {
279
- delete req.session.userId
280
- }
281
- next()
282
- })
283
-
284
- const accountManager = AccountManager.from({
285
- authMethod: argv.auth,
286
- emailService: app.locals.emailService,
287
- tokenService: app.locals.tokenService,
288
- host: argv.host,
289
- accountTemplatePath: argv.templates.account,
290
- store: ldp,
291
- multiuser: argv.multiuser
292
- })
293
- app.locals.accountManager = accountManager
294
-
295
- // Account Management API (create account, new cert)
296
- app.use('/', API.accounts.middleware(accountManager))
297
-
298
- // Set up authentication-related API endpoints and app.locals
299
- initAuthentication(app, argv)
300
-
301
- if (argv.multiuser) {
302
- app.use(vhost('*', LdpMiddleware(corsSettings, argv.prep)))
303
- }
304
- }
305
-
306
- function initLoggers () {
307
- aclCheck.configureLogger(debug.ACL)
308
- }
309
-
310
- /**
311
- * Determines whether the given request is a logout request
312
- */
313
- function isLogoutRequest (req) {
314
- // TODO: this is a hack that hard-codes OIDC paths,
315
- // this code should live in the OIDC module
316
- return req.path === '/logout' || req.path === '/goodbye'
317
- }
318
-
319
- /**
320
- * Sets up authentication-related routes and handlers for the app.
321
- *
322
- * @param app {Object} Express.js app instance
323
- * @param argv {Object} Config options hashmap
324
- */
325
- function initAuthentication (app, argv) {
326
- const auth = argv.forceUser ? 'forceUser' : argv.auth
327
- if (!(auth in API.authn)) {
328
- throw new Error(`Unsupported authentication scheme: ${auth}`)
329
- }
330
- API.authn[auth].initialize(app, argv)
331
- }
332
-
333
- /**
334
- * Returns a settings object for Express.js sessions.
335
- *
336
- * @param secureCookies {boolean}
337
- * @param host {SolidHost}
338
- *
339
- * @return {Object} `express-session` settings object
340
- */
341
- function sessionSettings (secureCookies, host) {
342
- const sessionSettings = {
343
- name: 'nssidp.sid',
344
- secret: uuid.v4(),
345
- saveUninitialized: false,
346
- resave: false,
347
- rolling: true,
348
- cookie: {
349
- maxAge: 24 * 60 * 60 * 1000
350
- }
351
- }
352
- // Cookies should set to be secure if https is on
353
- if (secureCookies) {
354
- sessionSettings.cookie.secure = true
355
- }
356
-
357
- // Determine the cookie domain
358
- sessionSettings.cookie.domain = host.cookieDomain
359
-
360
- return sessionSettings
361
- }
1
+ import express from 'express'
2
+ import session from 'express-session'
3
+ import handlebars from 'express-handlebars'
4
+ import { v4 as uuid } from 'uuid'
5
+ import cors from 'cors'
6
+ import vhost from 'vhost'
7
+ import path, { dirname } from 'path'
8
+ import aclCheck from '@solid/acl-check'
9
+ import fs from 'fs'
10
+ import { fileURLToPath } from 'url'
11
+
12
+ import acceptEvents from 'express-accept-events'
13
+ import events from 'express-negotiate-events'
14
+ import eventID from 'express-prep/event-id'
15
+ import prep from 'express-prep'
16
+
17
+ // Complex internal modules - keep as CommonJS for now except where ESM available
18
+ import LDP from './ldp.mjs'
19
+ import LdpMiddleware from './ldp-middleware.mjs'
20
+ import corsProxy from './handlers/cors-proxy.mjs'
21
+ import authProxy from './handlers/auth-proxy.mjs'
22
+ import SolidHost from './models/solid-host.mjs'
23
+ import AccountManager from './models/account-manager.mjs'
24
+ import EmailService from './services/email-service.mjs'
25
+ import TokenService from './services/token-service.mjs'
26
+ import capabilityDiscovery from './capability-discovery.mjs'
27
+ import paymentPointerDiscovery from './payment-pointer-discovery.mjs'
28
+ import * as API from './api/index.mjs'
29
+ import errorPages from './handlers/error-pages.mjs'
30
+ import * as config from './server-config.mjs'
31
+ import defaults from '../config/defaults.mjs'
32
+ import options from './handlers/options.mjs'
33
+ import debug from './debug.mjs'
34
+ import { routeResolvedFile } from './utils.mjs'
35
+ import ResourceMapper from './resource-mapper.mjs'
36
+
37
+ // ESM equivalents of __filename and __dirname
38
+ const __filename = fileURLToPath(import.meta.url)
39
+ const __dirname = dirname(__filename)
40
+
41
+ // Read package.json synchronously to avoid using require() for JSON
42
+ const { version } = JSON.parse(fs.readFileSync(path.join(__dirname, '../package.json'), 'utf8'))
43
+
44
+ const corsSettings = cors({
45
+ methods: [
46
+ 'OPTIONS', 'HEAD', 'GET', 'PATCH', 'POST', 'PUT', 'DELETE'
47
+ ],
48
+ exposedHeaders: 'Authorization, User, Location, Link, Vary, Last-Modified, ETag, Accept-Patch, Accept-Post, Accept-Put, Updates-Via, Allow, WAC-Allow, Content-Length, WWW-Authenticate, MS-Author-Via, X-Powered-By',
49
+ credentials: true,
50
+ maxAge: 1728000,
51
+ origin: true,
52
+ preflightContinue: true
53
+ })
54
+
55
+ function createApp (argv = {}) {
56
+ // Override default configs (defaults) with passed-in params (argv)
57
+ argv = Object.assign({}, defaults, argv)
58
+
59
+ argv.host = SolidHost.from(argv)
60
+
61
+ argv.resourceMapper = new ResourceMapper({
62
+ rootUrl: argv.serverUri,
63
+ rootPath: path.resolve(argv.root || process.cwd()),
64
+ includeHost: argv.multiuser,
65
+ defaultContentType: argv.defaultContentType
66
+ })
67
+
68
+ const configPath = config.initConfigDir(argv)
69
+ argv.templates = config.initTemplateDirs(configPath)
70
+
71
+ config.printDebugInfo(argv)
72
+
73
+ const ldp = new LDP(argv)
74
+
75
+ const app = express()
76
+
77
+ // Add PREP support
78
+ if (argv.prep) {
79
+ app.use(eventID)
80
+ app.use(acceptEvents, events, prep)
81
+ }
82
+
83
+ initAppLocals(app, argv, ldp)
84
+ initHeaders(app)
85
+ initViews(app, configPath)
86
+ initLoggers()
87
+
88
+ // Serve the public 'common' directory (for shared CSS files, etc)
89
+ app.use('/common', express.static(path.join(__dirname, '../common')))
90
+ app.use('/', express.static(path.dirname(fileURLToPath(import.meta.resolve('mashlib/dist/databrowser.html'))), { index: false }))
91
+ routeResolvedFile(app, '/common/js/', 'solid-auth-client/dist-lib/solid-auth-client.bundle.js')
92
+ routeResolvedFile(app, '/common/js/', 'solid-auth-client/dist-lib/solid-auth-client.bundle.js.map')
93
+ app.use('/.well-known', express.static(path.join(__dirname, '../common/well-known')))
94
+
95
+ // Serve bootstrap from it's node_module directory
96
+ routeResolvedFile(app, '/common/css/', 'bootstrap/dist/css/bootstrap.min.css')
97
+ routeResolvedFile(app, '/common/css/', 'bootstrap/dist/css/bootstrap.min.css.map')
98
+ routeResolvedFile(app, '/common/fonts/', 'bootstrap/dist/fonts/glyphicons-halflings-regular.eot')
99
+ routeResolvedFile(app, '/common/fonts/', 'bootstrap/dist/fonts/glyphicons-halflings-regular.svg')
100
+ routeResolvedFile(app, '/common/fonts/', 'bootstrap/dist/fonts/glyphicons-halflings-regular.ttf')
101
+ routeResolvedFile(app, '/common/fonts/', 'bootstrap/dist/fonts/glyphicons-halflings-regular.woff')
102
+ routeResolvedFile(app, '/common/fonts/', 'bootstrap/dist/fonts/glyphicons-halflings-regular.woff2')
103
+
104
+ // Serve OWASP password checker from it's node_module directory
105
+ routeResolvedFile(app, '/common/js/', 'owasp-password-strength-test/owasp-password-strength-test.js')
106
+ // Serve the TextEncoder polyfill
107
+ routeResolvedFile(app, '/common/js/', 'text-encoder-lite/text-encoder-lite.min.js')
108
+
109
+ // Add CORS proxy
110
+ if (argv.proxy) {
111
+ console.warn('The proxy configuration option has been renamed to corsProxy.')
112
+ argv.corsProxy = argv.corsProxy || argv.proxy
113
+ delete argv.proxy
114
+ }
115
+ if (argv.corsProxy) {
116
+ corsProxy(app, argv.corsProxy)
117
+ }
118
+
119
+ // Options handler
120
+ app.options('/*', options)
121
+
122
+ // Set up API
123
+ if (argv.apiApps) {
124
+ app.use('/api/apps', express.static(argv.apiApps))
125
+ }
126
+
127
+ // Authenticate the user
128
+ if (argv.webid) {
129
+ initWebId(argv, app, ldp)
130
+ }
131
+ // Add Auth proxy (requires authentication)
132
+ if (argv.authProxy) {
133
+ authProxy(app, argv.authProxy)
134
+ }
135
+
136
+ // Attach the LDP middleware
137
+ app.use('/', LdpMiddleware(corsSettings, argv.prep))
138
+
139
+ // https://stackoverflow.com/questions/51741383/nodejs-express-return-405-for-un-supported-method
140
+ app.use(function (req, res, next) {
141
+ const AllLayers = app._router.stack
142
+ const Layers = AllLayers.filter(x => x.name === 'bound dispatch' && x.regexp.test(req.path))
143
+
144
+ const Methods = []
145
+ Layers.forEach(layer => {
146
+ for (const method in layer.route.methods) {
147
+ if (layer.route.methods[method] === true) {
148
+ Methods.push(method.toUpperCase())
149
+ }
150
+ }
151
+ })
152
+
153
+ if (Layers.length !== 0 && !Methods.includes(req.method)) {
154
+ // res.setHeader('Allow', Methods.join(','))
155
+
156
+ if (req.method === 'OPTIONS') {
157
+ return res.send(Methods.join(', '))
158
+ } else {
159
+ return res.status(405).send()
160
+ }
161
+ } else {
162
+ next()
163
+ }
164
+ })
165
+
166
+ // Errors
167
+ app.use(errorPages.handler)
168
+
169
+ return app
170
+ }
171
+
172
+ /**
173
+ * Initializes `app.locals` parameters for downstream use (typically by route
174
+ * handlers).
175
+ *
176
+ * @param app {Function} Express.js app instance
177
+ * @param argv {Object} Config options hashmap
178
+ * @param ldp {LDP}
179
+ */
180
+ function initAppLocals (app, argv, ldp) {
181
+ app.locals.ldp = ldp
182
+ app.locals.appUrls = argv.apps // used for service capability discovery
183
+ app.locals.host = argv.host
184
+ app.locals.authMethod = argv.auth
185
+ app.locals.localAuth = argv.localAuth
186
+ app.locals.tokenService = new TokenService()
187
+ app.locals.enforceToc = argv.enforceToc
188
+ app.locals.tocUri = argv.tocUri
189
+ app.locals.disablePasswordChecks = argv.disablePasswordChecks
190
+ app.locals.prep = argv.prep
191
+
192
+ if (argv.email && argv.email.host) {
193
+ app.locals.emailService = new EmailService(argv.templates.email, argv.email)
194
+ }
195
+ }
196
+
197
+ /**
198
+ * Sets up headers common to all Solid requests (CORS-related, Allow, etc).
199
+ *
200
+ * @param app {Function} Express.js app instance
201
+ */
202
+ function initHeaders (app) {
203
+ app.use(corsSettings)
204
+
205
+ app.use((req, res, next) => {
206
+ res.set('X-Powered-By', 'solid-server/' + version)
207
+
208
+ // Cors lib adds Vary: Origin automatically, but inreliably
209
+ res.set('Vary', 'Accept, Authorization, Origin')
210
+
211
+ // Set default Allow methods
212
+ res.set('Allow', 'OPTIONS, HEAD, GET, PATCH, POST, PUT, DELETE')
213
+ next()
214
+ })
215
+
216
+ app.use('/', capabilityDiscovery())
217
+ app.use('/', paymentPointerDiscovery())
218
+ }
219
+
220
+ /**
221
+ * Sets up the express rendering engine and views directory.
222
+ *
223
+ * @param app {Function} Express.js app
224
+ * @param configPath {string}
225
+ */
226
+ function initViews (app, configPath) {
227
+ const viewsPath = config.initDefaultViews(configPath)
228
+
229
+ app.set('views', viewsPath)
230
+ app.engine('.hbs', handlebars({
231
+ extname: '.hbs',
232
+ partialsDir: viewsPath,
233
+ defaultLayout: null
234
+ }))
235
+ app.set('view engine', '.hbs')
236
+ }
237
+
238
+ /**
239
+ * Sets up WebID-related functionality (account creation and authentication)
240
+ *
241
+ * @param argv {Object}
242
+ * @param app {Function}
243
+ * @param ldp {LDP}
244
+ */
245
+ function initWebId (argv, app, ldp) {
246
+ config.ensureWelcomePage(argv)
247
+
248
+ // Store the user's session key in a cookie
249
+ // (for same-domain browsing by people only)
250
+ const useSecureCookies = !!argv.sslKey // use secure cookies when over HTTPS
251
+ const sessionHandler = session(sessionSettings(useSecureCookies, argv.host))
252
+ app.use(sessionHandler)
253
+ // Reject cookies from third-party applications.
254
+ // Otherwise, when a user is logged in to their Solid server,
255
+ // any third-party application could perform authenticated requests
256
+ // without permission by including the credentials set by the Solid server.
257
+ app.use((req, res, next) => {
258
+ const origin = req.get('origin')
259
+ const trustedOrigins = ldp.getTrustedOrigins(req)
260
+ const userId = req.session.userId
261
+ // Exception: allow logout requests from all third-party apps
262
+ // such that OIDC client can log out via cookie auth
263
+ // TODO: remove this exception when OIDC clients
264
+ // use Bearer token to authenticate instead of cookie
265
+ // (https://github.com/solid/node-solid-server/pull/835#issuecomment-426429003)
266
+ //
267
+ // Authentication cookies are an optimization:
268
+ // instead of going through the process of
269
+ // fully validating authentication on every request,
270
+ // we go through this process once,
271
+ // and store its successful result in a cookie
272
+ // that will be reused upon the next request.
273
+ // However, that cookie can then be sent by any server,
274
+ // even servers that have not gone through the proper authentication mechanism.
275
+ // However, if trusted origins are enabled,
276
+ // then any origin is allowed to take the shortcut route,
277
+ // since malicious origins will be banned at the ACL checking phase.
278
+ // https://github.com/solid/node-solid-server/issues/1117
279
+ if (!argv.strictOrigin && !argv.host.allowsSessionFor(userId, origin, trustedOrigins) && !isLogoutRequest(req)) {
280
+ debug.authentication(`Rejecting session for ${userId} from ${origin}`)
281
+ // Destroy session data
282
+ delete req.session.userId
283
+ // Ensure this modified session is not saved
284
+ req.session.save = (done) => done()
285
+ }
286
+ if (isLogoutRequest(req)) {
287
+ delete req.session.userId
288
+ }
289
+ next()
290
+ })
291
+
292
+ const accountManager = AccountManager.from({
293
+ authMethod: argv.auth,
294
+ emailService: app.locals.emailService,
295
+ tokenService: app.locals.tokenService,
296
+ host: argv.host,
297
+ accountTemplatePath: argv.templates.account,
298
+ store: ldp,
299
+ multiuser: argv.multiuser
300
+ })
301
+ app.locals.accountManager = accountManager
302
+
303
+ // Account Management API (create account, new cert)
304
+ app.use('/', API.accounts.middleware(accountManager))
305
+
306
+ // Set up authentication-related API endpoints and app.locals
307
+ initAuthentication(app, argv)
308
+
309
+ if (argv.multiuser) {
310
+ app.use(vhost('*', LdpMiddleware(corsSettings, argv.prep)))
311
+ }
312
+ }
313
+
314
+ function initLoggers () {
315
+ aclCheck.configureLogger(debug.ACL)
316
+ }
317
+
318
+ /**
319
+ * Determines whether the given request is a logout request
320
+ */
321
+ function isLogoutRequest (req) {
322
+ // TODO: this is a hack that hard-codes OIDC paths,
323
+ // this code should live in the OIDC module
324
+ return req.path === '/logout' || req.path === '/goodbye'
325
+ }
326
+
327
+ /**
328
+ * Sets up authentication-related routes and handlers for the app.
329
+ *
330
+ * @param app {Object} Express.js app instance
331
+ * @param argv {Object} Config options hashmap
332
+ * @return {Promise} Resolves when authentication initialization is complete
333
+ */
334
+ async function initAuthentication (app, argv) {
335
+ const auth = argv.forceUser ? 'forceUser' : argv.auth
336
+ if (!(auth in API.authn)) {
337
+ throw new Error(`Unsupported authentication scheme: ${auth}`)
338
+ }
339
+ await API.authn[auth].initialize(app, argv)
340
+ }
341
+
342
+ /**
343
+ * Returns a settings object for Express.js sessions.
344
+ *
345
+ * @param secureCookies {boolean}
346
+ * @param host {SolidHost}
347
+ *
348
+ * @return {Object} `express-session` settings object
349
+ */
350
+ function sessionSettings (secureCookies, host) {
351
+ const sessionSettings = {
352
+ name: 'nssidp.sid',
353
+ secret: uuid(),
354
+ saveUninitialized: false,
355
+ resave: false,
356
+ rolling: true,
357
+ cookie: {
358
+ maxAge: 24 * 60 * 60 * 1000
359
+ }
360
+ }
361
+ // Cookies should set to be secure if https is on
362
+ if (secureCookies) {
363
+ sessionSettings.cookie.secure = true
364
+ }
365
+
366
+ // Determine the cookie domain
367
+ sessionSettings.cookie.domain = host.cookieDomain
368
+
369
+ return sessionSettings
370
+ }
371
+
372
+ export default createApp