solid-server 5.8.8 → 6.0.0-2caddca5

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 +16 -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 +3 -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-2248-1768127616589-0.json +1 -0
  77. package/coverage/tmp/coverage-2249-1768127595001-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_c763c1d56c6179805e5630cf727c1d90.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_b8a06d4b84bef0f9bdf119feb401a49b.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_04da74e0d809681d1fcd37c382cd3caf.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_d9b6aa7268c20e5f8ee272ded946258f.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_0a0dafa35f17f9f56e1b2d8858ffc4b6.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_367fd3187411d219f73956bcdd85bf64.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
package/CHANGELOG.md CHANGED
@@ -1,4 +1,20 @@
1
1
  # History
2
+ ## 6.0.0
3
+ - CommonJs to ESM (.mjs)
4
+ - support for mashlib >= 2.0.0
5
+ - support solid-OIDC with WebID scope, es256, and rfc9702
6
+
7
+ ## 6.0.0 Upgrade Notes
8
+
9
+ 1.0 Automatically recreated
10
+ - delete `.db/oidc/op/provider.json`
11
+ - delete `config/templates/emails`
12
+ If not recreated then copy from `default-emails`
13
+ If there was some personalisation these need to be redone
14
+
15
+ 2.0 Manuel update the `index.html` in server root `data/<serverOrigin>/index.html`
16
+ edit `common/js/index-buttons.js` to `index-buttons.mjs`
17
+
2
18
  ## 5.3.0
3
19
  - Support for webid-oidc with DPop tokens
4
20
 
package/CONTRIBUTING.md CHANGED
File without changes
package/CONTRIBUTORS.md CHANGED
File without changes
package/Dockerfile CHANGED
File without changes
package/LICENSE.md CHANGED
File without changes
package/README.md CHANGED
@@ -146,6 +146,9 @@ also add to `config.json`
146
146
  "emailAuthPass": "gmailPass"
147
147
  ```
148
148
 
149
+ ### Upgrading from version <6.0.0
150
+ Please take into account the [v6.0.0 upgrade notes](https://github.com/solid/node-solid-server/blob/master/CHANGELOG.md#600-upgrade-notes).
151
+
149
152
  ### Upgrading from version <5.3
150
153
  Please take into account the [v5.3 upgrade notes](https://github.com/solid/node-solid-server/blob/master/CHANGELOG.md#530-upgrade-notes).
151
154
 
package/bin/config.json CHANGED
File without changes
@@ -0,0 +1,54 @@
1
+ import fs from 'fs-extra'
2
+ import { red, cyan, bold } from 'colorette'
3
+ import { URL } from 'url'
4
+ import LDP from '../../lib/ldp.mjs'
5
+ import AccountManager from '../../lib/models/account-manager.mjs'
6
+ import SolidHost from '../../lib/models/solid-host.mjs'
7
+
8
+ export function getAccountManager (config, options = {}) {
9
+ const ldp = options.ldp || new LDP(config)
10
+ const host = options.host || SolidHost.from({ port: config.port, serverUri: config.serverUri })
11
+ return AccountManager.from({
12
+ host,
13
+ store: ldp,
14
+ multiuser: config.multiuser
15
+ })
16
+ }
17
+
18
+ export function loadConfig (program, options) {
19
+ let argv = {
20
+ ...options,
21
+ version: program.version()
22
+ }
23
+ const configFile = argv.configFile || './config.json'
24
+ try {
25
+ const file = fs.readFileSync(configFile)
26
+ const config = JSON.parse(file)
27
+ argv = { ...config, ...argv }
28
+ } catch (err) {
29
+ if (typeof argv.configFile !== 'undefined') {
30
+ if (!fs.existsSync(configFile)) {
31
+ console.log(red(bold('ERR')), 'Config file ' + configFile + " doesn't exist.")
32
+ process.exit(1)
33
+ }
34
+ }
35
+ if (fs.existsSync(configFile)) {
36
+ console.log(red(bold('ERR')), 'config file ' + configFile + " couldn't be parsed: " + err)
37
+ process.exit(1)
38
+ }
39
+ console.log(cyan(bold('TIP')), 'create a config.json: `$ solid init`')
40
+ }
41
+ return argv
42
+ }
43
+
44
+ export function loadAccounts ({ root, serverUri, hostname }) {
45
+ const files = fs.readdirSync(root)
46
+ hostname = hostname || new URL(serverUri).hostname
47
+ const isUserDirectory = new RegExp(`.${hostname}$`)
48
+ return files.filter(file => isUserDirectory.test(file))
49
+ }
50
+
51
+ export function loadUsernames ({ root, serverUri }) {
52
+ const hostname = new URL(serverUri).hostname
53
+ return loadAccounts({ root, hostname }).map(userDirectory => userDirectory.substr(0, userDirectory.length - hostname.length - 1))
54
+ }
@@ -0,0 +1,44 @@
1
+ import { Command } from 'commander'
2
+ import loadInit from './init.mjs'
3
+ import loadStart from './start.mjs'
4
+ import loadInvalidUsernames from './invalidUsernames.mjs'
5
+ import loadMigrateLegacyResources from './migrateLegacyResources.mjs'
6
+ import loadUpdateIndex from './updateIndex.mjs'
7
+ import { spawnSync } from 'child_process'
8
+ import path from 'path'
9
+ import fs from 'fs'
10
+ import { fileURLToPath } from 'url'
11
+
12
+ const __filename = fileURLToPath(import.meta.url)
13
+ const __dirname = path.dirname(__filename)
14
+
15
+ export default function startCli (server) {
16
+ const program = new Command()
17
+ program.version(getVersion())
18
+
19
+ loadInit(program)
20
+ loadStart(program, server)
21
+ loadInvalidUsernames(program)
22
+ loadMigrateLegacyResources(program)
23
+ loadUpdateIndex(program)
24
+
25
+ program.parse(process.argv)
26
+ if (program.args.length === 0) program.help()
27
+ }
28
+
29
+ function getVersion () {
30
+ try {
31
+ const options = { cwd: __dirname, encoding: 'utf8' }
32
+ const { stdout } = spawnSync('git', ['describe', '--tags'], options)
33
+ const { stdout: gitStatusStdout } = spawnSync('git', ['status'], options)
34
+ const version = stdout.trim()
35
+ if (version === '' || gitStatusStdout.match('Not currently on any branch')) {
36
+ throw new Error('No git version here')
37
+ }
38
+ return version
39
+ } catch (e) {
40
+ const pkgPath = path.join(__dirname, '../../package.json')
41
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'))
42
+ return pkg.version
43
+ }
44
+ }
@@ -1,94 +1,93 @@
1
- const inquirer = require('inquirer')
2
- const fs = require('fs')
3
- const options = require('./options')
4
- const camelize = require('camelize')
5
-
6
- let questions = options
7
- .map((option) => {
8
- if (!option.type) {
9
- if (option.flag) {
10
- option.type = 'confirm'
11
- } else {
12
- option.type = 'input'
13
- }
14
- }
15
-
16
- option.message = option.question || option.help
17
- return option
18
- })
19
-
20
- module.exports = function (program) {
21
- program
22
- .command('init')
23
- .option('--advanced', 'Ask for all the settings')
24
- .description('create solid server configurations')
25
- .action((opts) => {
26
- // Filter out advanced commands
27
- if (!opts.advanced) {
28
- questions = questions.filter((option) => option.prompt)
29
- }
30
-
31
- // Prompt to the user
32
- inquirer.prompt(questions)
33
- .then((answers) => {
34
- manipulateEmailSection(answers)
35
- manipulateServerSection(answers)
36
- cleanupAnswers(answers)
37
-
38
- // write config file
39
- const config = JSON.stringify(camelize(answers), null, ' ')
40
- const configPath = process.cwd() + '/config.json'
41
-
42
- fs.writeFile(configPath, config, (err) => {
43
- if (err) {
44
- return console.log('failed to write config.json')
45
- }
46
- console.log('config created on', configPath)
47
- })
48
- })
49
- .catch((err) => {
50
- console.log('Error:', err)
51
- })
52
- })
53
- }
54
-
55
- function cleanupAnswers (answers) {
56
- // clean answers
57
- Object.keys(answers).forEach((answer) => {
58
- if (answer.startsWith('use')) {
59
- delete answers[answer]
60
- }
61
- })
62
- }
63
-
64
- function manipulateEmailSection (answers) {
65
- // setting email
66
- if (answers.useEmail) {
67
- answers.email = {
68
- host: answers['email-host'],
69
- port: answers['email-port'],
70
- secure: true,
71
- auth: {
72
- user: answers['email-auth-user'],
73
- pass: answers['email-auth-pass']
74
- }
75
- }
76
- delete answers['email-host']
77
- delete answers['email-port']
78
- delete answers['email-auth-user']
79
- delete answers['email-auth-pass']
80
- }
81
- }
82
-
83
- function manipulateServerSection (answers) {
84
- answers.server = {
85
- name: answers['server-info-name'],
86
- description: answers['server-info-description'],
87
- logo: answers['server-info-logo']
88
- }
89
- Object.keys(answers).forEach((answer) => {
90
- if (answer.startsWith('server-info-')) {
91
- delete answers[answer]
92
- }
93
- })
94
- }
1
+ import inquirer from 'inquirer'
2
+ import fs from 'fs'
3
+ import options from './options.mjs'
4
+ import camelize from 'camelize'
5
+
6
+ const questions = options
7
+ .map((option) => {
8
+ if (!option.type) {
9
+ if (option.flag) {
10
+ option.type = 'confirm'
11
+ } else {
12
+ option.type = 'input'
13
+ }
14
+ }
15
+
16
+ option.message = option.question || option.help
17
+ return option
18
+ })
19
+
20
+ export default function (program) {
21
+ program
22
+ .command('init')
23
+ .option('--advanced', 'Ask for all the settings')
24
+ .description('create solid server configurations')
25
+ .action((opts) => {
26
+ // Filter out advanced commands
27
+ let filtered = questions
28
+ if (!opts.advanced) {
29
+ filtered = filtered.filter((option) => option.prompt)
30
+ }
31
+
32
+ // Prompt to the user
33
+ inquirer.prompt(filtered)
34
+ .then((answers) => {
35
+ manipulateEmailSection(answers)
36
+ manipulateServerSection(answers)
37
+ cleanupAnswers(answers)
38
+
39
+ // write config file
40
+ const config = JSON.stringify(camelize(answers), null, ' ')
41
+ const configPath = process.cwd() + '/config.json'
42
+
43
+ fs.writeFile(configPath, config, (err) => {
44
+ if (err) {
45
+ return console.log('failed to write config.json')
46
+ }
47
+ console.log('config created on', configPath)
48
+ })
49
+ })
50
+ .catch((err) => {
51
+ console.log('Error:', err)
52
+ })
53
+ })
54
+ }
55
+
56
+ function cleanupAnswers (answers) {
57
+ Object.keys(answers).forEach((answer) => {
58
+ if (answer.startsWith('use')) {
59
+ delete answers[answer]
60
+ }
61
+ })
62
+ }
63
+
64
+ function manipulateEmailSection (answers) {
65
+ if (answers.useEmail) {
66
+ answers.email = {
67
+ host: answers['email-host'],
68
+ port: answers['email-port'],
69
+ secure: true,
70
+ auth: {
71
+ user: answers['email-auth-user'],
72
+ pass: answers['email-auth-pass']
73
+ }
74
+ }
75
+ delete answers['email-host']
76
+ delete answers['email-port']
77
+ delete answers['email-auth-user']
78
+ delete answers['email-auth-pass']
79
+ }
80
+ }
81
+
82
+ function manipulateServerSection (answers) {
83
+ answers.server = {
84
+ name: answers['server-info-name'],
85
+ description: answers['server-info-description'],
86
+ logo: answers['server-info-logo']
87
+ }
88
+ Object.keys(answers).forEach((answer) => {
89
+ if (answer.startsWith('server-info-')) {
90
+ delete answers[answer]
91
+ }
92
+ })
93
+ }
@@ -1,148 +1,136 @@
1
- const fs = require('fs-extra')
2
- const Handlebars = require('handlebars')
3
- const path = require('path')
4
-
5
- const { getAccountManager, loadConfig, loadUsernames } = require('./cli-utils')
6
- const { isValidUsername } = require('../../lib/common/user-utils')
7
- const blacklistService = require('../../lib/services/blacklist-service')
8
- const { initConfigDir, initTemplateDirs } = require('../../lib/server-config')
9
- const { fromServerConfig } = require('../../lib/models/oidc-manager')
10
-
11
- const EmailService = require('../../lib/services/email-service')
12
- const SolidHost = require('../../lib/models/solid-host')
13
-
14
- module.exports = function (program) {
15
- program
16
- .command('invalidusernames')
17
- .option('--notify', 'Will notify users with usernames that are invalid')
18
- .option('--delete', 'Will delete users with usernames that are invalid')
19
- .description('Manage usernames that are invalid')
20
- .action(async (options) => {
21
- const config = loadConfig(program, options)
22
- if (!config.multiuser) {
23
- return console.error('You are running a single user server, no need to check for invalid usernames')
24
- }
25
-
26
- const invalidUsernames = getInvalidUsernames(config)
27
- const host = SolidHost.from({ port: config.port, serverUri: config.serverUri })
28
- const accountManager = getAccountManager(config, { host })
29
-
30
- if (options.notify) {
31
- return notifyUsers(invalidUsernames, accountManager, config)
32
- }
33
-
34
- if (options.delete) {
35
- return deleteUsers(invalidUsernames, accountManager, config, host)
36
- }
37
-
38
- listUsernames(invalidUsernames)
39
- })
40
- }
41
-
42
- function backupIndexFile (username, accountManager, invalidUsernameTemplate, dateOfRemoval, supportEmail) {
43
- const userDirectory = accountManager.accountDirFor(username)
44
- const currentIndex = path.join(userDirectory, 'index.html')
45
- const currentIndexExists = fs.existsSync(currentIndex)
46
- const backupIndex = path.join(userDirectory, 'index.backup.html')
47
- const backupIndexExists = fs.existsSync(backupIndex)
48
- if (currentIndexExists && !backupIndexExists) {
49
- fs.renameSync(currentIndex, backupIndex)
50
- createNewIndexAcl(userDirectory)
51
- createNewIndex(username, invalidUsernameTemplate, dateOfRemoval, supportEmail, currentIndex)
52
- console.info(`index.html updated for user ${username}`)
53
- }
54
- }
55
-
56
- function createNewIndex (username, invalidUsernameTemplate, dateOfRemoval, supportEmail, currentIndex) {
57
- const newIndexSource = invalidUsernameTemplate({
58
- username,
59
- dateOfRemoval,
60
- supportEmail
61
- })
62
- fs.writeFileSync(currentIndex, newIndexSource, 'utf-8')
63
- }
64
-
65
- function createNewIndexAcl (userDirectory) {
66
- const currentIndexAcl = path.join(userDirectory, 'index.html.acl')
67
- const backupIndexAcl = path.join(userDirectory, 'index.backup.html.acl')
68
- const currentIndexSource = fs.readFileSync(currentIndexAcl, 'utf-8')
69
- const backupIndexSource = currentIndexSource.replace(/index.html/g, 'index.backup.html')
70
- fs.writeFileSync(backupIndexAcl, backupIndexSource, 'utf-8')
71
- }
72
-
73
- async function deleteUsers (usernames, accountManager, config, host) {
74
- const oidcManager = fromServerConfig({
75
- ...config,
76
- host
77
- })
78
- const deletingUsers = usernames
79
- .map(async username => {
80
- try {
81
- const user = accountManager.userAccountFrom({ username })
82
- await oidcManager.users.deleteUser(user)
83
- } catch (error) {
84
- if (error.message !== 'No email given') {
85
- // 'No email given' is an expected error that we want to ignore
86
- throw error
87
- }
88
- }
89
- const userDirectory = accountManager.accountDirFor(username)
90
- await fs.remove(userDirectory)
91
- })
92
- await Promise.all(deletingUsers)
93
- console.info(`Deleted ${deletingUsers.length} users succeeded`)
94
- }
95
-
96
- function getInvalidUsernames (config) {
97
- const usernames = loadUsernames(config)
98
- return usernames.filter(username => !isValidUsername(username) || !blacklistService.validate(username))
99
- }
100
-
101
- function listUsernames (usernames) {
102
- if (usernames.length === 0) {
103
- return console.info('No invalid usernames was found')
104
- }
105
- console.info(`${usernames.length} invalid usernames were found:${usernames.map(username => `\n- ${username}`)}`)
106
- }
107
-
108
- async function notifyUsers (usernames, accountManager, config) {
109
- const twoWeeksFromNow = Date.now() + 14 * 24 * 60 * 60 * 1000
110
- const dateOfRemoval = (new Date(twoWeeksFromNow)).toLocaleDateString()
111
- const { supportEmail } = config
112
-
113
- updateIndexFiles(usernames, accountManager, dateOfRemoval, supportEmail)
114
- await sendEmails(config, usernames, accountManager, dateOfRemoval, supportEmail)
115
- }
116
-
117
- async function sendEmails (config, usernames, accountManager, dateOfRemoval, supportEmail) {
118
- if (config.email && config.email.host) {
119
- const configPath = initConfigDir(config)
120
- const templates = initTemplateDirs(configPath)
121
- const users = await Promise.all(await usernames.map(async username => {
122
- const emailAddress = await accountManager.loadAccountRecoveryEmail({ username })
123
- const accountUri = accountManager.accountUriFor(username)
124
- return { username, emailAddress, accountUri }
125
- }))
126
- const emailService = new EmailService(templates.email, config.email)
127
- const sendingEmails = users
128
- .filter(user => !!user.emailAddress)
129
- .map(user => emailService.sendWithTemplate('invalid-username', {
130
- to: user.emailAddress,
131
- accountUri: user.accountUri,
132
- dateOfRemoval,
133
- supportEmail
134
- }))
135
- const emailsSent = await Promise.all(sendingEmails)
136
- console.info(`${emailsSent.length} emails sent to users with invalid usernames`)
137
- return
138
- }
139
- console.info('You have not configured an email service.')
140
- console.info('Please set it up to send users email about their accounts')
141
- }
142
-
143
- function updateIndexFiles (usernames, accountManager, dateOfRemoval, supportEmail) {
144
- const invalidUsernameFilePath = path.join(process.cwd(), 'default-views', 'account', 'invalid-username.hbs')
145
- const source = fs.readFileSync(invalidUsernameFilePath, 'utf-8')
146
- const invalidUsernameTemplate = Handlebars.compile(source)
147
- usernames.forEach(username => backupIndexFile(username, accountManager, invalidUsernameTemplate, dateOfRemoval, supportEmail))
148
- }
1
+ import fs from 'fs-extra'
2
+ import Handlebars from 'handlebars'
3
+ import path from 'path'
4
+ import { getAccountManager, loadConfig, loadUsernames } from './cli-utils.mjs'
5
+ import { isValidUsername } from '../../lib/common/user-utils.mjs'
6
+ import blacklistService from '../../lib/services/blacklist-service.mjs'
7
+ import { initConfigDir, initTemplateDirs } from '../../lib/server-config.mjs'
8
+ import { fromServerConfig } from '../../lib/models/oidc-manager.mjs'
9
+ import EmailService from '../../lib/services/email-service.mjs'
10
+ import SolidHost from '../../lib/models/solid-host.mjs'
11
+
12
+ export default function (program) {
13
+ program
14
+ .command('invalidusernames')
15
+ .option('--notify', 'Will notify users with usernames that are invalid')
16
+ .option('--delete', 'Will delete users with usernames that are invalid')
17
+ .description('Manage usernames that are invalid')
18
+ .action(async (options) => {
19
+ const config = loadConfig(program, options)
20
+ if (!config.multiuser) {
21
+ return console.error('You are running a single user server, no need to check for invalid usernames')
22
+ }
23
+ const invalidUsernames = getInvalidUsernames(config)
24
+ const host = SolidHost.from({ port: config.port, serverUri: config.serverUri })
25
+ const accountManager = getAccountManager(config, { host })
26
+ if (options.notify) {
27
+ return notifyUsers(invalidUsernames, accountManager, config)
28
+ }
29
+ if (options.delete) {
30
+ return deleteUsers(invalidUsernames, accountManager, config, host)
31
+ }
32
+ listUsernames(invalidUsernames)
33
+ })
34
+ }
35
+
36
+ function backupIndexFile (username, accountManager, invalidUsernameTemplate, dateOfRemoval, supportEmail) {
37
+ const userDirectory = accountManager.accountDirFor(username)
38
+ const currentIndex = path.join(userDirectory, 'index.html')
39
+ const currentIndexExists = fs.existsSync(currentIndex)
40
+ const backupIndex = path.join(userDirectory, 'index.backup.html')
41
+ const backupIndexExists = fs.existsSync(backupIndex)
42
+ if (currentIndexExists && !backupIndexExists) {
43
+ fs.renameSync(currentIndex, backupIndex)
44
+ createNewIndexAcl(userDirectory)
45
+ createNewIndex(username, invalidUsernameTemplate, dateOfRemoval, supportEmail, currentIndex)
46
+ console.info(`index.html updated for user ${username}`)
47
+ }
48
+ }
49
+
50
+ function createNewIndex (username, invalidUsernameTemplate, dateOfRemoval, supportEmail, currentIndex) {
51
+ const newIndexSource = invalidUsernameTemplate({
52
+ username,
53
+ dateOfRemoval,
54
+ supportEmail
55
+ })
56
+ fs.writeFileSync(currentIndex, newIndexSource, 'utf-8')
57
+ }
58
+
59
+ function createNewIndexAcl (userDirectory) {
60
+ const currentIndexAcl = path.join(userDirectory, 'index.html.acl')
61
+ const backupIndexAcl = path.join(userDirectory, 'index.backup.html.acl')
62
+ const currentIndexSource = fs.readFileSync(currentIndexAcl, 'utf-8')
63
+ const backupIndexSource = currentIndexSource.replace(/index.html/g, 'index.backup.html')
64
+ fs.writeFileSync(backupIndexAcl, backupIndexSource, 'utf-8')
65
+ }
66
+
67
+ async function deleteUsers (usernames, accountManager, config, host) {
68
+ const oidcManager = fromServerConfig({ ...config, host })
69
+ const deletingUsers = usernames.map(async username => {
70
+ try {
71
+ const user = accountManager.userAccountFrom({ username })
72
+ await oidcManager.users.deleteUser(user)
73
+ } catch (error) {
74
+ if (error.message !== 'No email given') {
75
+ throw error
76
+ }
77
+ }
78
+ const userDirectory = accountManager.accountDirFor(username)
79
+ await fs.remove(userDirectory)
80
+ })
81
+ await Promise.all(deletingUsers)
82
+ console.info(`Deleted ${deletingUsers.length} users succeeded`)
83
+ }
84
+
85
+ function getInvalidUsernames (config) {
86
+ const usernames = loadUsernames(config)
87
+ return usernames.filter(username => !isValidUsername(username) || !blacklistService.validate(username))
88
+ }
89
+
90
+ function listUsernames (usernames) {
91
+ if (usernames.length === 0) {
92
+ return console.info('No invalid usernames was found')
93
+ }
94
+ console.info(`${usernames.length} invalid usernames were found:${usernames.map(username => `\n- ${username}`)}`)
95
+ }
96
+
97
+ async function notifyUsers (usernames, accountManager, config) {
98
+ const twoWeeksFromNow = Date.now() + 14 * 24 * 60 * 60 * 1000
99
+ const dateOfRemoval = (new Date(twoWeeksFromNow)).toLocaleDateString()
100
+ const { supportEmail } = config
101
+ updateIndexFiles(usernames, accountManager, dateOfRemoval, supportEmail)
102
+ await sendEmails(config, usernames, accountManager, dateOfRemoval, supportEmail)
103
+ }
104
+
105
+ async function sendEmails (config, usernames, accountManager, dateOfRemoval, supportEmail) {
106
+ if (config.email && config.email.host) {
107
+ const configPath = initConfigDir(config)
108
+ const templates = initTemplateDirs(configPath)
109
+ const users = await Promise.all(await usernames.map(async username => {
110
+ const emailAddress = await accountManager.loadAccountRecoveryEmail({ username })
111
+ const accountUri = accountManager.accountUriFor(username)
112
+ return { username, emailAddress, accountUri }
113
+ }))
114
+ const emailService = new EmailService(templates.email, config.email)
115
+ const sendingEmails = users
116
+ .filter(user => !!user.emailAddress)
117
+ .map(user => emailService.sendWithTemplate('invalid-username.mjs', {
118
+ to: user.emailAddress,
119
+ accountUri: user.accountUri,
120
+ dateOfRemoval,
121
+ supportEmail
122
+ }))
123
+ const emailsSent = await Promise.all(sendingEmails)
124
+ console.info(`${emailsSent.length} emails sent to users with invalid usernames`)
125
+ return
126
+ }
127
+ console.info('You have not configured an email service.')
128
+ console.info('Please set it up to send users email about their accounts')
129
+ }
130
+
131
+ function updateIndexFiles (usernames, accountManager, dateOfRemoval, supportEmail) {
132
+ const invalidUsernameFilePath = path.join(process.cwd(), 'default-views', 'account', 'invalid-username.hbs')
133
+ const source = fs.readFileSync(invalidUsernameFilePath, 'utf-8')
134
+ const invalidUsernameTemplate = Handlebars.compile(source)
135
+ usernames.forEach(username => backupIndexFile(username, accountManager, invalidUsernameTemplate, dateOfRemoval, supportEmail))
136
+ }