@geekity/cms 0.31.0 → 0.32.1

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 (759) hide show
  1. package/admin/components/badge.njk +4 -0
  2. package/admin/components/fields.njk +41 -24
  3. package/admin/components/job-status.njk +45 -0
  4. package/admin/components/setting-fields.njk +38 -0
  5. package/admin/layouts/settings-page.njk +16 -0
  6. package/admin/pages/comments/all.njk +1 -2
  7. package/admin/pages/documents/editor.njk +17 -15
  8. package/admin/pages/documents/syndication.njk +4 -4
  9. package/admin/pages/federation/followers.njk +56 -6
  10. package/admin/pages/federation/settings.njk +1 -1
  11. package/admin/pages/media/library.njk +52 -3
  12. package/admin/pages/navigation/menus.njk +2 -2
  13. package/admin/pages/plugins/screen.njk +5 -46
  14. package/admin/pages/settings/discussion.njk +76 -47
  15. package/admin/pages/settings/email.njk +75 -47
  16. package/admin/pages/settings/general.njk +15 -15
  17. package/admin/pages/settings/permalinks.njk +8 -8
  18. package/admin/pages/settings/privacy.njk +6 -6
  19. package/admin/pages/settings/reading.njk +36 -36
  20. package/admin/pages/tools/dev-mode.njk +29 -3
  21. package/admin/pages/tools/export.njk +89 -0
  22. package/admin/pages/tools/maintenance.njk +51 -0
  23. package/admin/pages/users/apps.njk +2 -2
  24. package/admin/pages/users/edit.njk +3 -3
  25. package/admin/pages/users/new.njk +2 -2
  26. package/admin/static/admin.css +80 -0
  27. package/dist/admin/app-activity.d.ts.map +1 -1
  28. package/dist/admin/app-activity.js +2 -3
  29. package/dist/admin/app-activity.js.map +1 -1
  30. package/dist/admin/appearance.d.ts +1 -5
  31. package/dist/admin/appearance.d.ts.map +1 -1
  32. package/dist/admin/appearance.js +9 -16
  33. package/dist/admin/appearance.js.map +1 -1
  34. package/dist/admin/comments.d.ts.map +1 -1
  35. package/dist/admin/comments.js +2 -3
  36. package/dist/admin/comments.js.map +1 -1
  37. package/dist/admin/confirm-password.d.ts +4 -0
  38. package/dist/admin/confirm-password.d.ts.map +1 -0
  39. package/dist/admin/confirm-password.js +11 -0
  40. package/dist/admin/confirm-password.js.map +1 -0
  41. package/dist/admin/connected-apps.d.ts.map +1 -1
  42. package/dist/admin/connected-apps.js +17 -22
  43. package/dist/admin/connected-apps.js.map +1 -1
  44. package/dist/admin/dev-mode.d.ts.map +1 -1
  45. package/dist/admin/dev-mode.js +35 -10
  46. package/dist/admin/dev-mode.js.map +1 -1
  47. package/dist/admin/documents.d.ts.map +1 -1
  48. package/dist/admin/documents.js +22 -10
  49. package/dist/admin/documents.js.map +1 -1
  50. package/dist/admin/editor-actions.d.ts.map +1 -1
  51. package/dist/admin/editor-actions.js +1 -2
  52. package/dist/admin/editor-actions.js.map +1 -1
  53. package/dist/admin/editor-layout.js +1 -1
  54. package/dist/admin/editor-layout.js.map +1 -1
  55. package/dist/admin/export.d.ts +10 -0
  56. package/dist/admin/export.d.ts.map +1 -0
  57. package/dist/admin/export.js +72 -0
  58. package/dist/admin/export.js.map +1 -0
  59. package/dist/admin/federation.d.ts +7 -14
  60. package/dist/admin/federation.d.ts.map +1 -1
  61. package/dist/admin/federation.js +48 -94
  62. package/dist/admin/federation.js.map +1 -1
  63. package/dist/admin/index.d.ts +2 -5
  64. package/dist/admin/index.d.ts.map +1 -1
  65. package/dist/admin/index.js +2 -4
  66. package/dist/admin/index.js.map +1 -1
  67. package/dist/admin/indieauth-consent.d.ts.map +1 -1
  68. package/dist/admin/indieauth-consent.js +5 -7
  69. package/dist/admin/indieauth-consent.js.map +1 -1
  70. package/dist/admin/job-status.d.ts +25 -0
  71. package/dist/admin/job-status.d.ts.map +1 -0
  72. package/dist/admin/job-status.js +53 -0
  73. package/dist/admin/job-status.js.map +1 -0
  74. package/dist/admin/legacy-migrations.d.ts.map +1 -1
  75. package/dist/admin/legacy-migrations.js +7 -6
  76. package/dist/admin/legacy-migrations.js.map +1 -1
  77. package/dist/admin/maintenance.d.ts +9 -0
  78. package/dist/admin/maintenance.d.ts.map +1 -0
  79. package/dist/admin/maintenance.js +42 -0
  80. package/dist/admin/maintenance.js.map +1 -0
  81. package/dist/admin/media.d.ts +4 -1
  82. package/dist/admin/media.d.ts.map +1 -1
  83. package/dist/admin/media.js +16 -1
  84. package/dist/admin/media.js.map +1 -1
  85. package/dist/admin/menu.d.ts.map +1 -1
  86. package/dist/admin/menu.js +4 -0
  87. package/dist/admin/menu.js.map +1 -1
  88. package/dist/admin/messages.d.ts.map +1 -1
  89. package/dist/admin/messages.js +2 -3
  90. package/dist/admin/messages.js.map +1 -1
  91. package/dist/admin/navigation.d.ts.map +1 -1
  92. package/dist/admin/navigation.js +27 -23
  93. package/dist/admin/navigation.js.map +1 -1
  94. package/dist/admin/plugins.d.ts.map +1 -1
  95. package/dist/admin/plugins.js +19 -66
  96. package/dist/admin/plugins.js.map +1 -1
  97. package/dist/admin/preview.d.ts.map +1 -1
  98. package/dist/admin/preview.js +5 -6
  99. package/dist/admin/preview.js.map +1 -1
  100. package/dist/admin/recovery.js +2 -2
  101. package/dist/admin/recovery.js.map +1 -1
  102. package/dist/admin/routes.d.ts.map +1 -1
  103. package/dist/admin/routes.js +6 -3
  104. package/dist/admin/routes.js.map +1 -1
  105. package/dist/admin/setting-overrides.d.ts +4 -0
  106. package/dist/admin/setting-overrides.d.ts.map +1 -0
  107. package/dist/admin/setting-overrides.js +24 -0
  108. package/dist/admin/setting-overrides.js.map +1 -0
  109. package/dist/admin/settings-discussion.d.ts +6 -4
  110. package/dist/admin/settings-discussion.d.ts.map +1 -1
  111. package/dist/admin/settings-discussion.js +75 -45
  112. package/dist/admin/settings-discussion.js.map +1 -1
  113. package/dist/admin/settings-email.d.ts +11 -8
  114. package/dist/admin/settings-email.d.ts.map +1 -1
  115. package/dist/admin/settings-email.js +88 -77
  116. package/dist/admin/settings-email.js.map +1 -1
  117. package/dist/admin/settings-federation.d.ts +0 -7
  118. package/dist/admin/settings-federation.d.ts.map +1 -1
  119. package/dist/admin/settings-federation.js +0 -36
  120. package/dist/admin/settings-federation.js.map +1 -1
  121. package/dist/admin/settings-fields.d.ts +32 -0
  122. package/dist/admin/settings-fields.d.ts.map +1 -0
  123. package/dist/admin/settings-fields.js +368 -0
  124. package/dist/admin/settings-fields.js.map +1 -0
  125. package/dist/admin/settings-general.d.ts.map +1 -1
  126. package/dist/admin/settings-general.js +10 -19
  127. package/dist/admin/settings-general.js.map +1 -1
  128. package/dist/admin/settings-page.d.ts +3 -29
  129. package/dist/admin/settings-page.d.ts.map +1 -1
  130. package/dist/admin/settings-page.js +38 -53
  131. package/dist/admin/settings-page.js.map +1 -1
  132. package/dist/admin/settings-permalinks.js +2 -2
  133. package/dist/admin/settings-permalinks.js.map +1 -1
  134. package/dist/admin/settings-privacy.js +1 -1
  135. package/dist/admin/settings-privacy.js.map +1 -1
  136. package/dist/admin/settings-reading.js +13 -13
  137. package/dist/admin/settings-reading.js.map +1 -1
  138. package/dist/admin/settings-renderer.d.ts +32 -0
  139. package/dist/admin/settings-renderer.d.ts.map +1 -0
  140. package/dist/admin/settings-renderer.js +79 -0
  141. package/dist/admin/settings-renderer.js.map +1 -0
  142. package/dist/admin/site-setting-edit.d.ts +4 -0
  143. package/dist/admin/site-setting-edit.d.ts.map +1 -0
  144. package/dist/admin/site-setting-edit.js +20 -0
  145. package/dist/admin/site-setting-edit.js.map +1 -0
  146. package/dist/admin/taxonomy.d.ts.map +1 -1
  147. package/dist/admin/taxonomy.js +10 -19
  148. package/dist/admin/taxonomy.js.map +1 -1
  149. package/dist/admin/templates.d.ts +2 -0
  150. package/dist/admin/templates.d.ts.map +1 -1
  151. package/dist/admin/templates.js +2 -0
  152. package/dist/admin/templates.js.map +1 -1
  153. package/dist/admin/users.js +1 -1
  154. package/dist/admin/users.js.map +1 -1
  155. package/dist/avatars/avatars.d.ts +0 -2
  156. package/dist/avatars/avatars.d.ts.map +1 -1
  157. package/dist/avatars/avatars.js +9 -10
  158. package/dist/avatars/avatars.js.map +1 -1
  159. package/dist/avatars/index.d.ts +1 -1
  160. package/dist/avatars/index.d.ts.map +1 -1
  161. package/dist/avatars/index.js +1 -1
  162. package/dist/avatars/index.js.map +1 -1
  163. package/dist/cache.d.ts +0 -2
  164. package/dist/cache.d.ts.map +1 -1
  165. package/dist/cache.js +2 -4
  166. package/dist/cache.js.map +1 -1
  167. package/dist/cli.d.ts +1 -1
  168. package/dist/cli.d.ts.map +1 -1
  169. package/dist/cli.js +500 -86
  170. package/dist/cli.js.map +1 -1
  171. package/dist/cms/app.d.ts +1 -1
  172. package/dist/cms/app.d.ts.map +1 -1
  173. package/dist/cms/app.js +13 -2
  174. package/dist/cms/app.js.map +1 -1
  175. package/dist/cms/boot.d.ts +12 -0
  176. package/dist/cms/boot.d.ts.map +1 -1
  177. package/dist/cms/boot.js +43 -17
  178. package/dist/cms/boot.js.map +1 -1
  179. package/dist/cms/create.d.ts +24 -0
  180. package/dist/cms/create.d.ts.map +1 -1
  181. package/dist/cms/create.js +14 -0
  182. package/dist/cms/create.js.map +1 -1
  183. package/dist/cms/services.d.ts +3 -1
  184. package/dist/cms/services.d.ts.map +1 -1
  185. package/dist/cms/services.js +83 -26
  186. package/dist/cms/services.js.map +1 -1
  187. package/dist/cms/site-records.d.ts.map +1 -1
  188. package/dist/cms/site-records.js +0 -2
  189. package/dist/cms/site-records.js.map +1 -1
  190. package/dist/comments/akismet.d.ts +13 -46
  191. package/dist/comments/akismet.d.ts.map +1 -1
  192. package/dist/comments/akismet.js +29 -68
  193. package/dist/comments/akismet.js.map +1 -1
  194. package/dist/comments/conversation.d.ts +14 -8
  195. package/dist/comments/conversation.d.ts.map +1 -1
  196. package/dist/comments/conversation.js.map +1 -1
  197. package/dist/comments/index.d.ts +4 -4
  198. package/dist/comments/index.d.ts.map +1 -1
  199. package/dist/comments/index.js +3 -3
  200. package/dist/comments/index.js.map +1 -1
  201. package/dist/comments/policy.d.ts +23 -26
  202. package/dist/comments/policy.d.ts.map +1 -1
  203. package/dist/comments/policy.js +13 -20
  204. package/dist/comments/policy.js.map +1 -1
  205. package/dist/comments/records.d.ts +0 -2
  206. package/dist/comments/records.d.ts.map +1 -1
  207. package/dist/comments/records.js +2 -3
  208. package/dist/comments/records.js.map +1 -1
  209. package/dist/comments/reply-notices.d.ts +5 -6
  210. package/dist/comments/reply-notices.d.ts.map +1 -1
  211. package/dist/comments/reply-notices.js +27 -15
  212. package/dist/comments/reply-notices.js.map +1 -1
  213. package/dist/comments/reply-post.d.ts.map +1 -1
  214. package/dist/comments/reply-post.js +2 -3
  215. package/dist/comments/reply-post.js.map +1 -1
  216. package/dist/comments/submission.d.ts +0 -2
  217. package/dist/comments/submission.d.ts.map +1 -1
  218. package/dist/comments/submission.js +1 -3
  219. package/dist/comments/submission.js.map +1 -1
  220. package/dist/config-loader.d.ts.map +1 -1
  221. package/dist/config-loader.js +2 -1
  222. package/dist/config-loader.js.map +1 -1
  223. package/dist/config.d.ts +27 -1
  224. package/dist/config.d.ts.map +1 -1
  225. package/dist/config.js +5 -1
  226. package/dist/config.js.map +1 -1
  227. package/dist/contact/delivery.d.ts +2 -4
  228. package/dist/contact/delivery.d.ts.map +1 -1
  229. package/dist/contact/delivery.js +1 -2
  230. package/dist/contact/delivery.js.map +1 -1
  231. package/dist/contact/index.d.ts +1 -1
  232. package/dist/contact/index.d.ts.map +1 -1
  233. package/dist/contact/index.js +1 -1
  234. package/dist/contact/index.js.map +1 -1
  235. package/dist/contact/records.d.ts +0 -2
  236. package/dist/contact/records.d.ts.map +1 -1
  237. package/dist/contact/records.js +3 -5
  238. package/dist/contact/records.js.map +1 -1
  239. package/dist/content/citation.d.ts +1 -0
  240. package/dist/content/citation.d.ts.map +1 -1
  241. package/dist/content/citation.js.map +1 -1
  242. package/dist/content/document-form.d.ts +3 -1
  243. package/dist/content/document-form.d.ts.map +1 -1
  244. package/dist/content/document-form.js.map +1 -1
  245. package/dist/content/enclosure-form.d.ts.map +1 -1
  246. package/dist/content/enclosure-form.js +5 -6
  247. package/dist/content/enclosure-form.js.map +1 -1
  248. package/dist/content/excerpt.d.ts +1 -0
  249. package/dist/content/excerpt.d.ts.map +1 -1
  250. package/dist/content/excerpt.js +3 -0
  251. package/dist/content/excerpt.js.map +1 -1
  252. package/dist/content/index.d.ts +3 -3
  253. package/dist/content/index.d.ts.map +1 -1
  254. package/dist/content/index.js +2 -2
  255. package/dist/content/index.js.map +1 -1
  256. package/dist/content/kept-properties.d.ts +0 -1
  257. package/dist/content/kept-properties.d.ts.map +1 -1
  258. package/dist/content/kept-properties.js +2 -2
  259. package/dist/content/kept-properties.js.map +1 -1
  260. package/dist/content/locations.d.ts +0 -1
  261. package/dist/content/locations.d.ts.map +1 -1
  262. package/dist/content/locations.js +2 -2
  263. package/dist/content/locations.js.map +1 -1
  264. package/dist/content/media.d.ts +7 -0
  265. package/dist/content/media.d.ts.map +1 -1
  266. package/dist/content/media.js +12 -1
  267. package/dist/content/media.js.map +1 -1
  268. package/dist/content/metadata/strip-job.d.ts +16 -0
  269. package/dist/content/metadata/strip-job.d.ts.map +1 -0
  270. package/dist/content/metadata/strip-job.js +24 -0
  271. package/dist/content/metadata/strip-job.js.map +1 -0
  272. package/dist/content/metadata/sweep.d.ts +13 -1
  273. package/dist/content/metadata/sweep.d.ts.map +1 -1
  274. package/dist/content/metadata/sweep.js +47 -25
  275. package/dist/content/metadata/sweep.js.map +1 -1
  276. package/dist/content/permalink-file.d.ts +2 -1
  277. package/dist/content/permalink-file.d.ts.map +1 -1
  278. package/dist/content/permalink-file.js +3 -3
  279. package/dist/content/permalink-file.js.map +1 -1
  280. package/dist/content/photo-form.d.ts +1 -0
  281. package/dist/content/photo-form.d.ts.map +1 -1
  282. package/dist/content/photo-form.js +8 -5
  283. package/dist/content/photo-form.js.map +1 -1
  284. package/dist/content/photo.d.ts +1 -0
  285. package/dist/content/photo.d.ts.map +1 -1
  286. package/dist/content/photo.js +1 -1
  287. package/dist/content/photo.js.map +1 -1
  288. package/dist/content/post-fields.d.ts.map +1 -1
  289. package/dist/content/post-fields.js +5 -9
  290. package/dist/content/post-fields.js.map +1 -1
  291. package/dist/content/read-form.d.ts +10 -3
  292. package/dist/content/read-form.d.ts.map +1 -1
  293. package/dist/content/read-form.js +67 -9
  294. package/dist/content/read-form.js.map +1 -1
  295. package/dist/content/read.d.ts +9 -2
  296. package/dist/content/read.d.ts.map +1 -1
  297. package/dist/content/read.js +22 -3
  298. package/dist/content/read.js.map +1 -1
  299. package/dist/content/store.d.ts +0 -1
  300. package/dist/content/store.d.ts.map +1 -1
  301. package/dist/content/store.js +0 -1
  302. package/dist/content/store.js.map +1 -1
  303. package/dist/content/uploads.d.ts +1 -1
  304. package/dist/content/uploads.d.ts.map +1 -1
  305. package/dist/content/uploads.js +6 -1
  306. package/dist/content/uploads.js.map +1 -1
  307. package/dist/content/write.d.ts +1 -1
  308. package/dist/content/write.d.ts.map +1 -1
  309. package/dist/content/write.js +7 -3
  310. package/dist/content/write.js.map +1 -1
  311. package/dist/dev-mode.d.ts +4 -26
  312. package/dist/dev-mode.d.ts.map +1 -1
  313. package/dist/dev-mode.js +4 -53
  314. package/dist/dev-mode.js.map +1 -1
  315. package/dist/export/export-archives.d.ts +29 -0
  316. package/dist/export/export-archives.d.ts.map +1 -0
  317. package/dist/export/export-archives.js +88 -0
  318. package/dist/export/export-archives.js.map +1 -0
  319. package/dist/export/export-job.d.ts +21 -0
  320. package/dist/export/export-job.d.ts.map +1 -0
  321. package/dist/export/export-job.js +63 -0
  322. package/dist/export/export-job.js.map +1 -0
  323. package/dist/export/site-export.d.ts +101 -0
  324. package/dist/export/site-export.d.ts.map +1 -0
  325. package/dist/export/site-export.js +243 -0
  326. package/dist/export/site-export.js.map +1 -0
  327. package/dist/export/site-import.d.ts +75 -0
  328. package/dist/export/site-import.d.ts.map +1 -0
  329. package/dist/export/site-import.js +492 -0
  330. package/dist/export/site-import.js.map +1 -0
  331. package/dist/exports.d.ts +9 -4
  332. package/dist/exports.d.ts.map +1 -1
  333. package/dist/exports.js +3 -1
  334. package/dist/exports.js.map +1 -1
  335. package/dist/federation/article.d.ts +5 -11
  336. package/dist/federation/article.d.ts.map +1 -1
  337. package/dist/federation/article.js +67 -35
  338. package/dist/federation/article.js.map +1 -1
  339. package/dist/federation/backfill.d.ts +3 -1
  340. package/dist/federation/backfill.d.ts.map +1 -1
  341. package/dist/federation/backfill.js +5 -3
  342. package/dist/federation/backfill.js.map +1 -1
  343. package/dist/federation/cited-post.d.ts +1 -1
  344. package/dist/federation/cited-post.d.ts.map +1 -1
  345. package/dist/federation/cited-post.js +1 -1
  346. package/dist/federation/cited-post.js.map +1 -1
  347. package/dist/federation/delivery.d.ts +5 -2
  348. package/dist/federation/delivery.d.ts.map +1 -1
  349. package/dist/federation/delivery.js +30 -14
  350. package/dist/federation/delivery.js.map +1 -1
  351. package/dist/federation/federation.d.ts +7 -7
  352. package/dist/federation/federation.d.ts.map +1 -1
  353. package/dist/federation/federation.js +6 -13
  354. package/dist/federation/federation.js.map +1 -1
  355. package/dist/federation/handles.d.ts +1 -1
  356. package/dist/federation/handles.d.ts.map +1 -1
  357. package/dist/federation/handles.js +1 -1
  358. package/dist/federation/handles.js.map +1 -1
  359. package/dist/federation/inbox.d.ts.map +1 -1
  360. package/dist/federation/inbox.js +5 -8
  361. package/dist/federation/inbox.js.map +1 -1
  362. package/dist/federation/index.d.ts +1 -0
  363. package/dist/federation/index.d.ts.map +1 -1
  364. package/dist/federation/index.js +1 -0
  365. package/dist/federation/index.js.map +1 -1
  366. package/dist/federation/keys.js +3 -3
  367. package/dist/federation/keys.js.map +1 -1
  368. package/dist/federation/object-ids.d.ts +50 -0
  369. package/dist/federation/object-ids.d.ts.map +1 -0
  370. package/dist/federation/object-ids.js +134 -0
  371. package/dist/federation/object-ids.js.map +1 -0
  372. package/dist/federation/profiles.d.ts +1 -1
  373. package/dist/federation/profiles.d.ts.map +1 -1
  374. package/dist/federation/profiles.js +1 -1
  375. package/dist/federation/profiles.js.map +1 -1
  376. package/dist/federation/queue.d.ts +32 -17
  377. package/dist/federation/queue.d.ts.map +1 -1
  378. package/dist/federation/queue.js +173 -39
  379. package/dist/federation/queue.js.map +1 -1
  380. package/dist/federation/relays.d.ts +6 -2
  381. package/dist/federation/relays.d.ts.map +1 -1
  382. package/dist/federation/relays.js +43 -36
  383. package/dist/federation/relays.js.map +1 -1
  384. package/dist/federation/resend-job.d.ts +44 -0
  385. package/dist/federation/resend-job.d.ts.map +1 -0
  386. package/dist/federation/resend-job.js +59 -0
  387. package/dist/federation/resend-job.js.map +1 -0
  388. package/dist/files/atomic.d.ts +9 -0
  389. package/dist/files/atomic.d.ts.map +1 -1
  390. package/dist/files/atomic.js +1 -1
  391. package/dist/files/atomic.js.map +1 -1
  392. package/dist/files/data-files.d.ts +104 -0
  393. package/dist/files/data-files.d.ts.map +1 -0
  394. package/dist/files/data-files.js +330 -0
  395. package/dist/files/data-files.js.map +1 -0
  396. package/dist/files/export-archives.d.ts +12 -0
  397. package/dist/files/export-archives.d.ts.map +1 -0
  398. package/dist/files/export-archives.js +67 -0
  399. package/dist/files/export-archives.js.map +1 -0
  400. package/dist/files/static-files.d.ts.map +1 -1
  401. package/dist/files/static-files.js +7 -22
  402. package/dist/files/static-files.js.map +1 -1
  403. package/dist/files/tar.d.ts +29 -0
  404. package/dist/files/tar.d.ts.map +1 -0
  405. package/dist/files/tar.js +206 -0
  406. package/dist/files/tar.js.map +1 -0
  407. package/dist/files/upload-types.d.ts +81 -0
  408. package/dist/files/upload-types.d.ts.map +1 -0
  409. package/dist/files/upload-types.js +234 -0
  410. package/dist/files/upload-types.js.map +1 -0
  411. package/dist/forms/protection.d.ts +0 -8
  412. package/dist/forms/protection.d.ts.map +1 -1
  413. package/dist/forms/protection.js +2 -10
  414. package/dist/forms/protection.js.map +1 -1
  415. package/dist/images/icons.d.ts.map +1 -1
  416. package/dist/images/icons.js +2 -0
  417. package/dist/images/icons.js.map +1 -1
  418. package/dist/images/index.d.ts +1 -1
  419. package/dist/images/index.d.ts.map +1 -1
  420. package/dist/images/index.js +1 -1
  421. package/dist/images/index.js.map +1 -1
  422. package/dist/images/markup.d.ts +4 -1
  423. package/dist/images/markup.d.ts.map +1 -1
  424. package/dist/images/markup.js +10 -6
  425. package/dist/images/markup.js.map +1 -1
  426. package/dist/images/paths.d.ts +1 -4
  427. package/dist/images/paths.d.ts.map +1 -1
  428. package/dist/images/paths.js +6 -12
  429. package/dist/images/paths.js.map +1 -1
  430. package/dist/images/variants.d.ts +4 -2
  431. package/dist/images/variants.d.ts.map +1 -1
  432. package/dist/images/variants.js +21 -21
  433. package/dist/images/variants.js.map +1 -1
  434. package/dist/index.d.ts +1 -0
  435. package/dist/index.d.ts.map +1 -1
  436. package/dist/index.js +1 -0
  437. package/dist/index.js.map +1 -1
  438. package/dist/indexnow.d.ts +4 -2
  439. package/dist/indexnow.d.ts.map +1 -1
  440. package/dist/indexnow.js +32 -20
  441. package/dist/indexnow.js.map +1 -1
  442. package/dist/indieauth/tokens.d.ts +0 -2
  443. package/dist/indieauth/tokens.d.ts.map +1 -1
  444. package/dist/indieauth/tokens.js +2 -4
  445. package/dist/indieauth/tokens.js.map +1 -1
  446. package/dist/jobs/file-records.d.ts +13 -0
  447. package/dist/jobs/file-records.d.ts.map +1 -0
  448. package/dist/jobs/file-records.js +104 -0
  449. package/dist/jobs/file-records.js.map +1 -0
  450. package/dist/jobs/in-process.d.ts +10 -0
  451. package/dist/jobs/in-process.d.ts.map +1 -0
  452. package/dist/jobs/in-process.js +45 -0
  453. package/dist/jobs/in-process.js.map +1 -0
  454. package/dist/jobs/lock-file.d.ts +13 -0
  455. package/dist/jobs/lock-file.d.ts.map +1 -0
  456. package/dist/jobs/lock-file.js +107 -0
  457. package/dist/jobs/lock-file.js.map +1 -0
  458. package/dist/jobs/processes.d.ts +11 -0
  459. package/dist/jobs/processes.d.ts.map +1 -0
  460. package/dist/jobs/processes.js +50 -0
  461. package/dist/jobs/processes.js.map +1 -0
  462. package/dist/jobs/queue.d.ts +18 -0
  463. package/dist/jobs/queue.d.ts.map +1 -0
  464. package/dist/jobs/queue.js +220 -0
  465. package/dist/jobs/queue.js.map +1 -0
  466. package/dist/jobs/types.d.ts +159 -0
  467. package/dist/jobs/types.d.ts.map +1 -0
  468. package/dist/jobs/types.js +22 -0
  469. package/dist/jobs/types.js.map +1 -0
  470. package/dist/mail/index.d.ts +0 -2
  471. package/dist/mail/index.d.ts.map +1 -1
  472. package/dist/mail/index.js +0 -1
  473. package/dist/mail/index.js.map +1 -1
  474. package/dist/maintenance.d.ts +5 -42
  475. package/dist/maintenance.d.ts.map +1 -1
  476. package/dist/maintenance.js +4 -67
  477. package/dist/maintenance.js.map +1 -1
  478. package/dist/media/library.d.ts +1 -1
  479. package/dist/media/library.d.ts.map +1 -1
  480. package/dist/media/library.js +4 -1
  481. package/dist/media/library.js.map +1 -1
  482. package/dist/media/uploads.d.ts +1 -1
  483. package/dist/media/uploads.d.ts.map +1 -1
  484. package/dist/media/uploads.js +1 -1
  485. package/dist/media/uploads.js.map +1 -1
  486. package/dist/micropub/endpoint.js +10 -10
  487. package/dist/micropub/endpoint.js.map +1 -1
  488. package/dist/micropub/media.d.ts +0 -2
  489. package/dist/micropub/media.d.ts.map +1 -1
  490. package/dist/micropub/media.js +5 -7
  491. package/dist/micropub/media.js.map +1 -1
  492. package/dist/notifications/comments.d.ts +4 -2
  493. package/dist/notifications/comments.d.ts.map +1 -1
  494. package/dist/notifications/comments.js +77 -65
  495. package/dist/notifications/comments.js.map +1 -1
  496. package/dist/notifications/digest.d.ts +2 -4
  497. package/dist/notifications/digest.d.ts.map +1 -1
  498. package/dist/notifications/digest.js +9 -10
  499. package/dist/notifications/digest.js.map +1 -1
  500. package/dist/notifications/index.d.ts +3 -3
  501. package/dist/notifications/index.d.ts.map +1 -1
  502. package/dist/notifications/index.js +3 -3
  503. package/dist/notifications/index.js.map +1 -1
  504. package/dist/notifications/mail-service.d.ts +10 -8
  505. package/dist/notifications/mail-service.d.ts.map +1 -1
  506. package/dist/notifications/mail-service.js +70 -70
  507. package/dist/notifications/mail-service.js.map +1 -1
  508. package/dist/notifications/optouts.d.ts +0 -2
  509. package/dist/notifications/optouts.d.ts.map +1 -1
  510. package/dist/notifications/optouts.js +2 -4
  511. package/dist/notifications/optouts.js.map +1 -1
  512. package/dist/notifications/tokens.d.ts +0 -2
  513. package/dist/notifications/tokens.d.ts.map +1 -1
  514. package/dist/notifications/tokens.js +2 -28
  515. package/dist/notifications/tokens.js.map +1 -1
  516. package/dist/notify.d.ts +4 -2
  517. package/dist/notify.d.ts.map +1 -1
  518. package/dist/notify.js +27 -15
  519. package/dist/notify.js.map +1 -1
  520. package/dist/plugin.d.ts +36 -16
  521. package/dist/plugin.d.ts.map +1 -1
  522. package/dist/plugin.js +1 -1
  523. package/dist/plugin.js.map +1 -1
  524. package/dist/plugins/changes.d.ts +0 -1
  525. package/dist/plugins/changes.d.ts.map +1 -1
  526. package/dist/plugins/changes.js +2 -3
  527. package/dist/plugins/changes.js.map +1 -1
  528. package/dist/plugins/data.d.ts +19 -0
  529. package/dist/plugins/data.d.ts.map +1 -0
  530. package/dist/plugins/data.js +117 -0
  531. package/dist/plugins/data.js.map +1 -0
  532. package/dist/plugins/enabled.d.ts +1 -13
  533. package/dist/plugins/enabled.d.ts.map +1 -1
  534. package/dist/plugins/enabled.js +11 -23
  535. package/dist/plugins/enabled.js.map +1 -1
  536. package/dist/plugins/install.d.ts +1 -1
  537. package/dist/plugins/install.d.ts.map +1 -1
  538. package/dist/plugins/install.js +7 -42
  539. package/dist/plugins/install.js.map +1 -1
  540. package/dist/plugins/migrate-settings.d.ts +7 -0
  541. package/dist/plugins/migrate-settings.d.ts.map +1 -0
  542. package/dist/plugins/migrate-settings.js +41 -0
  543. package/dist/plugins/migrate-settings.js.map +1 -0
  544. package/dist/plugins/registry.d.ts +10 -14
  545. package/dist/plugins/registry.d.ts.map +1 -1
  546. package/dist/plugins/registry.js +56 -36
  547. package/dist/plugins/registry.js.map +1 -1
  548. package/dist/plugins/settings.d.ts +5 -57
  549. package/dist/plugins/settings.d.ts.map +1 -1
  550. package/dist/plugins/settings.js +47 -180
  551. package/dist/plugins/settings.js.map +1 -1
  552. package/dist/plugins/site.d.ts +2 -1
  553. package/dist/plugins/site.d.ts.map +1 -1
  554. package/dist/plugins/site.js +5 -5
  555. package/dist/plugins/site.js.map +1 -1
  556. package/dist/privacy/retention.d.ts +4 -0
  557. package/dist/privacy/retention.d.ts.map +1 -1
  558. package/dist/privacy/retention.js +12 -5
  559. package/dist/privacy/retention.js.map +1 -1
  560. package/dist/settings/akismet.d.ts +9 -0
  561. package/dist/settings/akismet.d.ts.map +1 -0
  562. package/dist/settings/akismet.js +46 -0
  563. package/dist/settings/akismet.js.map +1 -0
  564. package/dist/settings/declare.d.ts +15 -0
  565. package/dist/settings/declare.d.ts.map +1 -0
  566. package/dist/settings/declare.js +20 -0
  567. package/dist/settings/declare.js.map +1 -0
  568. package/dist/settings/dev-mode.d.ts +29 -0
  569. package/dist/settings/dev-mode.d.ts.map +1 -0
  570. package/dist/settings/dev-mode.js +77 -0
  571. package/dist/settings/dev-mode.js.map +1 -0
  572. package/dist/settings/kinds.d.ts +13 -0
  573. package/dist/settings/kinds.d.ts.map +1 -0
  574. package/dist/settings/kinds.js +108 -0
  575. package/dist/settings/kinds.js.map +1 -0
  576. package/dist/settings/mail.d.ts +10 -0
  577. package/dist/settings/mail.d.ts.map +1 -0
  578. package/dist/settings/mail.js +92 -0
  579. package/dist/settings/mail.js.map +1 -0
  580. package/dist/settings/maintenance.d.ts +6 -0
  581. package/dist/settings/maintenance.d.ts.map +1 -0
  582. package/dist/settings/maintenance.js +33 -0
  583. package/dist/settings/maintenance.js.map +1 -0
  584. package/dist/settings/names.d.ts +7 -0
  585. package/dist/settings/names.d.ts.map +1 -0
  586. package/dist/settings/names.js +31 -0
  587. package/dist/settings/names.js.map +1 -0
  588. package/dist/settings/presence.d.ts +2 -0
  589. package/dist/settings/presence.d.ts.map +1 -0
  590. package/dist/settings/presence.js +7 -0
  591. package/dist/settings/presence.js.map +1 -0
  592. package/dist/settings/registry.d.ts +14 -0
  593. package/dist/settings/registry.d.ts.map +1 -0
  594. package/dist/settings/registry.js +369 -0
  595. package/dist/settings/registry.js.map +1 -0
  596. package/dist/settings/types.d.ts +176 -0
  597. package/dist/settings/types.d.ts.map +1 -0
  598. package/dist/settings/types.js +2 -0
  599. package/dist/settings/types.js.map +1 -0
  600. package/dist/site/namespace.d.ts +88 -0
  601. package/dist/site/namespace.d.ts.map +1 -0
  602. package/dist/site/namespace.js +471 -0
  603. package/dist/site/namespace.js.map +1 -0
  604. package/dist/site/setting-rows.d.ts +9 -10
  605. package/dist/site/setting-rows.d.ts.map +1 -1
  606. package/dist/site/setting-rows.js +109 -228
  607. package/dist/site/setting-rows.js.map +1 -1
  608. package/dist/site/settings-form.d.ts.map +1 -1
  609. package/dist/site/settings-form.js +6 -10
  610. package/dist/site/settings-form.js.map +1 -1
  611. package/dist/site/settings.d.ts +6 -322
  612. package/dist/site/settings.d.ts.map +1 -1
  613. package/dist/site/settings.js +13 -76
  614. package/dist/site/settings.js.map +1 -1
  615. package/dist/site/site-json.d.ts +0 -31
  616. package/dist/site/site-json.d.ts.map +1 -1
  617. package/dist/site/site-json.js +5 -49
  618. package/dist/site/site-json.js.map +1 -1
  619. package/dist/site/users.d.ts +0 -9
  620. package/dist/site/users.d.ts.map +1 -1
  621. package/dist/site/users.js +2 -11
  622. package/dist/site/users.js.map +1 -1
  623. package/dist/store/deliveries.d.ts +2 -0
  624. package/dist/store/deliveries.d.ts.map +1 -1
  625. package/dist/store/deliveries.js +7 -0
  626. package/dist/store/deliveries.js.map +1 -1
  627. package/dist/store/queue-database.d.ts +11 -0
  628. package/dist/store/queue-database.d.ts.map +1 -0
  629. package/dist/store/queue-database.js +39 -0
  630. package/dist/store/queue-database.js.map +1 -0
  631. package/dist/supervisor/control.d.ts +1 -0
  632. package/dist/supervisor/control.d.ts.map +1 -1
  633. package/dist/supervisor/control.js +10 -0
  634. package/dist/supervisor/control.js.map +1 -1
  635. package/dist/supervisor/primary.d.ts.map +1 -1
  636. package/dist/supervisor/primary.js +15 -3
  637. package/dist/supervisor/primary.js.map +1 -1
  638. package/dist/testing.d.ts +1 -1
  639. package/dist/testing.d.ts.map +1 -1
  640. package/dist/testing.js +1 -1
  641. package/dist/testing.js.map +1 -1
  642. package/dist/theme/site-data.d.ts +1 -1
  643. package/dist/theme/site-data.d.ts.map +1 -1
  644. package/dist/theme/site-data.js.map +1 -1
  645. package/dist/web/asset-routes.d.ts +6 -2
  646. package/dist/web/asset-routes.d.ts.map +1 -1
  647. package/dist/web/asset-routes.js +12 -4
  648. package/dist/web/asset-routes.js.map +1 -1
  649. package/dist/web/comment-routes.d.ts.map +1 -1
  650. package/dist/web/comment-routes.js +4 -4
  651. package/dist/web/comment-routes.js.map +1 -1
  652. package/dist/web/contact-routes.js +1 -1
  653. package/dist/web/contact-routes.js.map +1 -1
  654. package/dist/web/context.d.ts +5 -0
  655. package/dist/web/context.d.ts.map +1 -1
  656. package/dist/web/context.js +9 -4
  657. package/dist/web/context.js.map +1 -1
  658. package/dist/web/conversation.d.ts +1 -1
  659. package/dist/web/conversation.d.ts.map +1 -1
  660. package/dist/web/conversation.js +59 -43
  661. package/dist/web/conversation.js.map +1 -1
  662. package/dist/web/document-page.d.ts.map +1 -1
  663. package/dist/web/document-page.js +5 -4
  664. package/dist/web/document-page.js.map +1 -1
  665. package/dist/web/document-site.d.ts +1 -1
  666. package/dist/web/document-site.d.ts.map +1 -1
  667. package/dist/web/document-site.js +2 -1
  668. package/dist/web/document-site.js.map +1 -1
  669. package/dist/web/embed.js +1 -1
  670. package/dist/web/embed.js.map +1 -1
  671. package/dist/web/env.d.ts +9 -0
  672. package/dist/web/env.d.ts.map +1 -1
  673. package/dist/web/federation-routes.d.ts.map +1 -1
  674. package/dist/web/federation-routes.js +5 -2
  675. package/dist/web/federation-routes.js.map +1 -1
  676. package/dist/web/feed-item.js +1 -1
  677. package/dist/web/feed-item.js.map +1 -1
  678. package/dist/web/feed-routes.d.ts +3 -4
  679. package/dist/web/feed-routes.d.ts.map +1 -1
  680. package/dist/web/feed-routes.js +17 -15
  681. package/dist/web/feed-routes.js.map +1 -1
  682. package/dist/web/health.js +1 -1
  683. package/dist/web/health.js.map +1 -1
  684. package/dist/web/index.d.ts +1 -1
  685. package/dist/web/index.d.ts.map +1 -1
  686. package/dist/web/index.js.map +1 -1
  687. package/dist/web/indieauth-activity-log.d.ts +0 -2
  688. package/dist/web/indieauth-activity-log.d.ts.map +1 -1
  689. package/dist/web/indieauth-activity-log.js +2 -4
  690. package/dist/web/indieauth-activity-log.js.map +1 -1
  691. package/dist/web/indieauth-bearer.js +2 -2
  692. package/dist/web/indieauth-bearer.js.map +1 -1
  693. package/dist/web/indieauth-discovery.d.ts +0 -4
  694. package/dist/web/indieauth-discovery.d.ts.map +1 -1
  695. package/dist/web/indieauth-discovery.js +3 -10
  696. package/dist/web/indieauth-discovery.js.map +1 -1
  697. package/dist/web/indieauth-token.d.ts.map +1 -1
  698. package/dist/web/indieauth-token.js +3 -3
  699. package/dist/web/indieauth-token.js.map +1 -1
  700. package/dist/web/listing-pages.d.ts.map +1 -1
  701. package/dist/web/listing-pages.js +1 -2
  702. package/dist/web/listing-pages.js.map +1 -1
  703. package/dist/web/maintenance.js +3 -3
  704. package/dist/web/maintenance.js.map +1 -1
  705. package/dist/web/page-sources.d.ts +1 -2
  706. package/dist/web/page-sources.d.ts.map +1 -1
  707. package/dist/web/page-sources.js +6 -7
  708. package/dist/web/page-sources.js.map +1 -1
  709. package/dist/web/paths.js +1 -1
  710. package/dist/web/paths.js.map +1 -1
  711. package/dist/web/pingback-routes.d.ts.map +1 -1
  712. package/dist/web/pingback-routes.js +3 -3
  713. package/dist/web/pingback-routes.js.map +1 -1
  714. package/dist/web/plugin-federation.js +50 -40
  715. package/dist/web/plugin-federation.js.map +1 -1
  716. package/dist/web/render.d.ts +12 -5
  717. package/dist/web/render.d.ts.map +1 -1
  718. package/dist/web/render.js +36 -22
  719. package/dist/web/render.js.map +1 -1
  720. package/dist/web/request.js +1 -1
  721. package/dist/web/request.js.map +1 -1
  722. package/dist/web/routes.d.ts.map +1 -1
  723. package/dist/web/routes.js +8 -9
  724. package/dist/web/routes.js.map +1 -1
  725. package/dist/web/site-index.d.ts.map +1 -1
  726. package/dist/web/site-index.js +1 -2
  727. package/dist/web/site-index.js.map +1 -1
  728. package/dist/web/site-view.d.ts +0 -2
  729. package/dist/web/site-view.d.ts.map +1 -1
  730. package/dist/web/site-view.js +0 -2
  731. package/dist/web/site-view.js.map +1 -1
  732. package/dist/web/webmention-routes.d.ts.map +1 -1
  733. package/dist/web/webmention-routes.js +2 -2
  734. package/dist/web/webmention-routes.js.map +1 -1
  735. package/dist/web/well-known.d.ts.map +1 -1
  736. package/dist/web/well-known.js +6 -7
  737. package/dist/web/well-known.js.map +1 -1
  738. package/dist/webmention/cited-picture.js +1 -1
  739. package/dist/webmention/cited-picture.js.map +1 -1
  740. package/dist/webmention/pingback.d.ts +1 -8
  741. package/dist/webmention/pingback.d.ts.map +1 -1
  742. package/dist/webmention/pingback.js +2 -11
  743. package/dist/webmention/pingback.js.map +1 -1
  744. package/dist/webmention/receive.d.ts +3 -1
  745. package/dist/webmention/receive.d.ts.map +1 -1
  746. package/dist/webmention/receive.js +5 -3
  747. package/dist/webmention/receive.js.map +1 -1
  748. package/dist/webmention/reply-contexts.d.ts +14 -3
  749. package/dist/webmention/reply-contexts.d.ts.map +1 -1
  750. package/dist/webmention/reply-contexts.js +12 -10
  751. package/dist/webmention/reply-contexts.js.map +1 -1
  752. package/dist/webmention/service.d.ts +3 -1
  753. package/dist/webmention/service.d.ts.map +1 -1
  754. package/dist/webmention/service.js +66 -53
  755. package/dist/webmention/service.js.map +1 -1
  756. package/package.json +13 -11
  757. package/themes/default/partials/post-list.njk +19 -14
  758. package/themes/default/src/style.css +12 -0
  759. package/themes/default/static/style.css +19 -0
@@ -5,20 +5,21 @@
5
5
  * one arriving is a comment by another road, and the spam checker is here
6
6
  * because it is what decides whether either is shown.
7
7
  */
8
- import { readAkismetKey, removeAkismetKey, verifyAkismetKey, writeAkismetKey, } from '../comments/akismet.js';
8
+ import { verifyAkismetKey } from '../comments/akismet.js';
9
+ import { AKISMET } from '../settings/akismet.js';
9
10
  import { effectiveBaseUrl } from '../site/settings.js';
10
- import { readSiteSettings } from '../site/site-json.js';
11
11
  import { stringOrEmpty } from '../util/forms.js';
12
12
  import { flash } from './flash.js';
13
+ import { forgetStored, setElsewhere } from './setting-overrides.js';
13
14
  import { SETTINGS_PATH } from './settings.js';
14
15
  import { settingsPagePath } from './settings-page.js';
15
16
  import { ADMIN_TEMPLATES } from './templates.js';
16
17
  /**
17
18
  * Where the Akismet key's form and its Remove button post.
18
19
  *
19
- * Its own endpoint, for the reason the avatar has one: the key is a credential
20
- * that lives in `data/akismet.json` rather than a setting that lives in
21
- * `content/_data/site.json` (TASK-52), so it is not a field of the Discussion
20
+ * Its own endpoint, for the reason the avatar has one: the key is a credential,
21
+ * the secret `akismet.key` setting in `data/akismet.json`, rather than a
22
+ * setting that lives in `content/_data/site.json` (TASK-52), so it is not a field of the Discussion
22
23
  * form, and a key Akismet will not take must not lose an edit to the closing
23
24
  * window beside it.
24
25
  */
@@ -27,6 +28,7 @@ export const AKISMET_PATH = `${SETTINGS_PATH}/akismet`;
27
28
  export const AKISMET_FIELDS = { key: 'akismet_key', action: 'action' };
28
29
  /** The {@link AKISMET_FIELDS.action} that forgets the key again. */
29
30
  export const AKISMET_REMOVE = 'remove';
31
+ export const AKISMET_VERIFY = 'verify';
30
32
  /** The Discussion settings page. */
31
33
  export const DISCUSSION_SETTINGS = {
32
34
  child: 'discussion',
@@ -35,14 +37,16 @@ export const DISCUSSION_SETTINGS = {
35
37
  template: ADMIN_TEMPLATES.settingsDiscussion,
36
38
  fields: [
37
39
  'comments',
38
- 'commentsCloseAfterDays',
39
- 'webmentionsSend',
40
- 'webmentionsReceive',
41
- 'commentEmailRetentionDays',
42
- 'addressHashRetentionDays',
43
- 'contactMessageRetentionDays',
40
+ 'comments_on_posts',
41
+ 'comments_on_pages',
42
+ 'comments_close_after_days',
43
+ 'webmentions_send',
44
+ 'webmentions_receive',
45
+ 'comment_email_retention_days',
46
+ 'address_hash_retention_days',
47
+ 'contact_message_retention_days',
44
48
  ],
45
- panels: (c) => akismetPanel(c.var.config.dataDir),
49
+ panels: (c) => akismetPanel(c.var.settings),
46
50
  endpoints: mountAkismet,
47
51
  };
48
52
  /**
@@ -64,32 +68,54 @@ function mountAkismet(app, _options) {
64
68
  const here = DISCUSSION_SETTINGS.path;
65
69
  app.post(AKISMET_PATH, async (c) => {
66
70
  const body = await c.req.parseBody();
67
- const { config } = c.var;
68
- if (stringOrEmpty(body[AKISMET_FIELDS.action]) === AKISMET_REMOVE) {
69
- await removeAkismetKey(config.dataDir);
71
+ const { settings } = c.var;
72
+ const action = stringOrEmpty(body[AKISMET_FIELDS.action]);
73
+ if (action === AKISMET_REMOVE) {
74
+ await forgetStored(settings, AKISMET, 'admin');
70
75
  flash(c, 'notice', 'The Akismet key is gone. Nothing is sent to Akismet any more.');
71
76
  return c.redirect(here, 303);
72
77
  }
73
- const key = stringOrEmpty(body[AKISMET_FIELDS.key]).trim();
74
- if (key === '') {
75
- flash(c, 'error', 'An Akismet key cannot be empty. Use Remove key to turn Akismet off.');
76
- return c.redirect(here, 303);
78
+ if (action !== AKISMET_VERIFY) {
79
+ const key = stringOrEmpty(body[AKISMET_FIELDS.key]).trim();
80
+ if (key === '') {
81
+ flash(c, 'error', 'An Akismet key cannot be empty. Use Remove key to turn Akismet off.');
82
+ return c.redirect(here, 303);
83
+ }
84
+ const saved = await settings.set('akismet', new Map([
85
+ ['key', key],
86
+ ['status', 'unchecked'],
87
+ ['checked_at', ''],
88
+ ]), 'admin');
89
+ if (!saved.ok) {
90
+ flash(c, 'error', `${Object.values(saved.problems).join(' ')} Nothing was saved.`);
91
+ return c.redirect(here, 303);
92
+ }
77
93
  }
78
- const blog = effectiveBaseUrl(config, readSiteSettings(config.contentDir));
79
- const status = await verifyAkismetKey({ key, blog });
80
- await writeAkismetKey(config.dataDir, {
81
- key,
82
- status,
83
- checkedAt: config.now().toISOString(),
94
+ const status = await verifyAkismetKey({
95
+ settings,
96
+ blog: blogOf(c),
97
+ at: c.var.config.now(),
98
+ by: 'admin',
84
99
  });
85
- flash(c, status === 'valid' ? 'notice' : 'error', status === 'valid'
86
- ? 'Akismet is connected. Comments and webmentions are checked from now on.'
87
- : status === 'invalid'
88
- ? 'The key is stored, but Akismet does not recognise it, so nothing it says will be believed.'
89
- : 'The key is stored, but Akismet could not be reached to check it. Save it again to try.');
100
+ flash(c, status === 'valid' ? 'notice' : 'error', verifiedSentence(status));
90
101
  return c.redirect(here, 303);
91
102
  });
92
103
  }
104
+ function blogOf(c) {
105
+ return effectiveBaseUrl(c.var.config, c.var.siteAtRequestStart);
106
+ }
107
+ function verifiedSentence(status) {
108
+ switch (status) {
109
+ case 'valid':
110
+ return 'Akismet is connected. Comments and webmentions are checked from now on.';
111
+ case 'invalid':
112
+ return 'The key is stored, but Akismet does not recognise it, so nothing it says will be believed.';
113
+ case 'unchecked':
114
+ return 'The key is stored, but Akismet could not be reached to check it. Save it again to try.';
115
+ case undefined:
116
+ return 'There is no Akismet key to check.';
117
+ }
118
+ }
93
119
  /**
94
120
  * What the page says about Akismet: connected, refused, unchecked, or off.
95
121
  *
@@ -98,31 +124,35 @@ function mountAkismet(app, _options) {
98
124
  * last four characters are enough for somebody to recognise which key is in
99
125
  * there without being handed it.
100
126
  */
101
- export function akismetPanel(dataDir) {
102
- const stored = readAkismetKey(dataDir);
103
- if (stored === undefined) {
127
+ export async function akismetPanel(settings) {
128
+ const akismet = await settings.values(AKISMET);
129
+ const setBy = (await setElsewhere(settings, AKISMET))['key'];
130
+ const forms = {
131
+ akismetUrl: AKISMET_PATH,
132
+ akismetFields: AKISMET_FIELDS,
133
+ akismetRemove: AKISMET_REMOVE,
134
+ akismetVerify: AKISMET_VERIFY,
135
+ akismetSetBy: setBy,
136
+ };
137
+ if (akismet.key === '') {
104
138
  return {
105
- akismetUrl: AKISMET_PATH,
106
- akismetFields: AKISMET_FIELDS,
107
- akismetRemove: AKISMET_REMOVE,
139
+ ...forms,
108
140
  akismetPresent: false,
109
141
  akismetState: 'none',
110
142
  akismetHint: 'Not connected: no key, so no comment is sent to Akismet.',
111
143
  };
112
144
  }
113
145
  return {
114
- akismetUrl: AKISMET_PATH,
115
- akismetFields: AKISMET_FIELDS,
116
- akismetRemove: AKISMET_REMOVE,
146
+ ...forms,
117
147
  akismetPresent: true,
118
- akismetState: stored.status,
119
- akismetKeyHint: `…${stored.key.slice(-4)}`,
120
- akismetCheckedAt: stored.checkedAt,
121
- akismetHint: stored.status === 'valid'
148
+ akismetState: akismet.status,
149
+ akismetKeyHint: setBy === undefined ? `…${akismet.key.slice(-4)}` : `set by ${setBy}`,
150
+ akismetCheckedAt: akismet.checked_at,
151
+ akismetHint: akismet.status === 'valid'
122
152
  ? 'Connected. Every comment and every incoming webmention is checked.'
123
- : stored.status === 'invalid'
153
+ : akismet.status === 'invalid'
124
154
  ? 'Akismet does not recognise this key, so nothing it says is believed and every comment queues as it would without one.'
125
- : 'Akismet could not be reached the last time this key was checked. Save it again to try.',
155
+ : 'Akismet could not be reached the last time this key was checked. Check it again to try.',
126
156
  };
127
157
  }
128
158
  //# sourceMappingURL=settings-discussion.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings-discussion.js","sourceRoot":"","sources":["../../src/admin/settings-discussion.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,aAAa,UAAU,CAAC;AAEvD,yCAAyC;AACzC,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAW,CAAC;AAEhF,oEAAoE;AACpE,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,CAAC;AAEvC,oCAAoC;AACpC,MAAM,CAAC,MAAM,mBAAmB,GAAiB;IAC/C,KAAK,EAAE,YAAY;IACnB,KAAK,EAAE,YAAY;IACnB,IAAI,EAAE,gBAAgB,CAAC,YAAY,CAAC;IACpC,QAAQ,EAAE,eAAe,CAAC,kBAAkB;IAC5C,MAAM,EAAE;QACN,UAAU;QACV,wBAAwB;QACxB,iBAAiB;QACjB,oBAAoB;QACpB,2BAA2B;QAC3B,0BAA0B;QAC1B,6BAA6B;KAC9B;IAED,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;IAEjD,SAAS,EAAE,YAAY;CACxB,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,SAAS,YAAY,CAAC,GAAqB,EAAE,QAA8B;IACzE,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC;IAEtC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACjC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QACrC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC;QAEzB,IAAI,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,cAAc,EAAE,CAAC;YAClE,MAAM,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACvC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,+DAA+D,CAAC,CAAC;YACpF,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3D,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;YACf,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,qEAAqE,CAAC,CAAC;YACzF,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QAC3E,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAErD,MAAM,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE;YACpC,GAAG;YACH,MAAM;YACN,SAAS,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;SACtC,CAAC,CAAC;QAEH,KAAK,CACH,CAAC,EACD,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EACvC,MAAM,KAAK,OAAO;YAChB,CAAC,CAAC,yEAAyE;YAC3E,CAAC,CAAC,MAAM,KAAK,SAAS;gBACpB,CAAC,CAAC,4FAA4F;gBAC9F,CAAC,CAAC,wFAAwF,CAC/F,CAAC;QACF,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,MAAM,GAAiC,cAAc,CAAC,OAAO,CAAC,CAAC;IAErE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO;YACL,UAAU,EAAE,YAAY;YACxB,aAAa,EAAE,cAAc;YAC7B,aAAa,EAAE,cAAc;YAC7B,cAAc,EAAE,KAAK;YACrB,YAAY,EAAE,MAAM;YACpB,WAAW,EAAE,0DAA0D;SACxE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,UAAU,EAAE,YAAY;QACxB,aAAa,EAAE,cAAc;QAC7B,aAAa,EAAE,cAAc;QAC7B,cAAc,EAAE,IAAI;QACpB,YAAY,EAAE,MAAM,CAAC,MAAM;QAC3B,cAAc,EAAE,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;QAC1C,gBAAgB,EAAE,MAAM,CAAC,SAAS;QAClC,WAAW,EACT,MAAM,CAAC,MAAM,KAAK,OAAO;YACvB,CAAC,CAAC,oEAAoE;YACtE,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS;gBAC3B,CAAC,CAAC,uHAAuH;gBACzH,CAAC,CAAC,wFAAwF;KACjG,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"settings-discussion.js","sourceRoot":"","sources":["../../src/admin/settings-discussion.ts"],"names":[],"mappings":"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"}
@@ -2,17 +2,19 @@
2
2
  * Email: how the site sends mail, and where a message written to it goes.
3
3
  *
4
4
  * The settings are here and the credentials are not: an API key and an SMTP
5
- * password live in `data/mail.json` at mode 0600, never in the public
6
- * `site.json`, and they are their own pair of forms so a credential typed wrong
7
- * cannot lose an edit to the From line beside it.
5
+ * connection are the `mail` settings namespace, kept in `data/mail.json` at
6
+ * mode 0600 or set by `GEEKITY_MAIL__*`, never in the public `site.json`, and
7
+ * they are their own pair of forms so a credential typed wrong cannot lose an
8
+ * edit to the From line beside it.
8
9
  */
10
+ import type { SettingsRegistry } from '../settings/types.ts';
9
11
  import type { SiteSettings } from '../site/settings.ts';
10
12
  import type { SettingsPage } from './settings-page.ts';
11
13
  /**
12
14
  * Where the mail credential's form and its Remove button post.
13
15
  *
14
16
  * Its own endpoint for the reason the Akismet key has one: an API key and an
15
- * SMTP password are credentials, they live in `data/mail.json` rather than in
17
+ * SMTP password are credentials, they are the `mail` namespace rather than
16
18
  * `content/_data/site.json`, and a credential typed wrong must not lose an edit
17
19
  * to the From line. Which provider is in use and who mail is from are settings
18
20
  * and stay on the Email form.
@@ -46,9 +48,10 @@ export declare const EMAIL_SETTINGS: SettingsPage;
46
48
  *
47
49
  * Nothing here ever prints a key or a password. A settings screen that echoed
48
50
  * one would put a credential in every browser cache, every screenshot and every
49
- * `view-source`; the last four characters of an API key and the host and user
50
- * of an SMTP connection are enough for somebody to tell what is stored without
51
- * being handed the means to use it.
51
+ * `view-source`; the last four characters of a stored API key and the host and
52
+ * user of an SMTP connection are enough for somebody to tell what is stored
53
+ * without being handed the means to use it. A secret the environment sets is
54
+ * named by its variable and not even that.
52
55
  */
53
- export declare function mailPanel(dataDir: string, settings: SiteSettings): Record<string, unknown>;
56
+ export declare function mailPanel(registry: SettingsRegistry, settings: SiteSettings): Promise<Record<string, unknown>>;
54
57
  //# sourceMappingURL=settings-email.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings-email.d.ts","sourceRoot":"","sources":["../../src/admin/settings-email.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAaH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMxD,OAAO,KAAK,EAAwB,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAG7E;;;;;;;;GAQG;AACH,eAAO,MAAM,SAAS,yBAA0B,CAAC;AAEjD,mEAAmE;AACnE,eAAO,MAAM,WAAW;aACtB,WAAW,EAAE,eAAe;aAC5B,QAAQ,EAAE,WAAW;aACrB,QAAQ,EAAE,WAAW;aACrB,UAAU,EAAE,aAAa;aACzB,QAAQ,EAAE,WAAW;aACrB,YAAY,EAAE,eAAe;aAC7B,MAAM,EAAE,QAAQ;CACR,CAAC;AAEX,yEAAyE;AACzE,eAAO,MAAM,WAAW,WAAW,CAAC;AAEpC,8CAA8C;AAC9C,eAAO,MAAM,cAAc,8BAA+B,CAAC;AAE3D,mEAAmE;AACnE,eAAO,MAAM,gBAAgB;aAAK,EAAE,EAAE,IAAI;CAAW,CAAC;AAEtD,2EAA2E;AAC3E,eAAO,MAAM,kBAAkB,SAAS,CAAC;AAEzC,+BAA+B;AAC/B,eAAO,MAAM,cAAc,EAAE,YAmB5B,CAAC;AAmHF;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA2C1F"}
1
+ {"version":3,"file":"settings-email.d.ts","sourceRoot":"","sources":["../../src/admin/settings-email.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMxD,OAAO,KAAK,EAAwB,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAG7E;;;;;;;;GAQG;AACH,eAAO,MAAM,SAAS,yBAA0B,CAAC;AAEjD,mEAAmE;AACnE,eAAO,MAAM,WAAW;aACtB,WAAW,EAAE,eAAe;aAC5B,QAAQ,EAAE,WAAW;aACrB,QAAQ,EAAE,WAAW;aACrB,UAAU,EAAE,aAAa;aACzB,QAAQ,EAAE,WAAW;aACrB,YAAY,EAAE,eAAe;aAC7B,MAAM,EAAE,QAAQ;CACR,CAAC;AAEX,yEAAyE;AACzE,eAAO,MAAM,WAAW,WAAW,CAAC;AAEpC,8CAA8C;AAC9C,eAAO,MAAM,cAAc,8BAA+B,CAAC;AAE3D,mEAAmE;AACnE,eAAO,MAAM,gBAAgB;aAAK,EAAE,EAAE,IAAI;CAAW,CAAC;AAEtD,2EAA2E;AAC3E,eAAO,MAAM,kBAAkB,SAAS,CAAC;AAEzC,+BAA+B;AAC/B,eAAO,MAAM,cAAc,EAAE,YAmB5B,CAAC;AA+HF;;;;;;;;;;GAUG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,gBAAgB,EAC1B,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA4ClC"}
@@ -2,16 +2,17 @@
2
2
  * Email: how the site sends mail, and where a message written to it goes.
3
3
  *
4
4
  * The settings are here and the credentials are not: an API key and an SMTP
5
- * password live in `data/mail.json` at mode 0600, never in the public
6
- * `site.json`, and they are their own pair of forms so a credential typed wrong
7
- * cannot lose an edit to the From line beside it.
5
+ * connection are the `mail` settings namespace, kept in `data/mail.json` at
6
+ * mode 0600 or set by `GEEKITY_MAIL__*`, never in the public `site.json`, and
7
+ * they are their own pair of forms so a credential typed wrong cannot lose an
8
+ * edit to the From line beside it.
8
9
  */
9
- import { readMailCredentials, removeMailCredentials, writeMailCredentials, } from '../mail/credentials.js';
10
10
  import { MAIL_PROVIDERS } from '../mail/provider.js';
11
+ import { MAIL } from '../settings/mail.js';
11
12
  import { EMAIL_PATTERN } from '../site/setting-values.js';
12
- import { readSiteSettings } from '../site/site-json.js';
13
13
  import { stringOrEmpty } from '../util/forms.js';
14
14
  import { flash } from './flash.js';
15
+ import { forgetStored, setElsewhere } from './setting-overrides.js';
15
16
  import { SETTINGS_PATH } from './settings.js';
16
17
  import { settingsPagePath } from './settings-page.js';
17
18
  import { ADMIN_TEMPLATES } from './templates.js';
@@ -19,7 +20,7 @@ import { ADMIN_TEMPLATES } from './templates.js';
19
20
  * Where the mail credential's form and its Remove button post.
20
21
  *
21
22
  * Its own endpoint for the reason the Akismet key has one: an API key and an
22
- * SMTP password are credentials, they live in `data/mail.json` rather than in
23
+ * SMTP password are credentials, they are the `mail` namespace rather than
23
24
  * `content/_data/site.json`, and a credential typed wrong must not lose an edit
24
25
  * to the From line. Which provider is in use and who mail is from are settings
25
26
  * and stay on the Email form.
@@ -50,16 +51,16 @@ export const EMAIL_SETTINGS = {
50
51
  path: settingsPagePath('email'),
51
52
  template: ADMIN_TEMPLATES.settingsEmail,
52
53
  fields: [
53
- 'mailProvider',
54
- 'mailFromName',
55
- 'mailFromAddress',
56
- 'mailReplyTo',
57
- 'contactEmail',
58
- 'securityContacts',
59
- 'securityPolicy',
60
- 'securityLanguages',
54
+ 'mail_provider',
55
+ 'mail_from_name',
56
+ 'mail_from_address',
57
+ 'mail_reply_to',
58
+ 'contact_email',
59
+ 'security_contacts',
60
+ 'security_policy',
61
+ 'security_languages',
61
62
  ],
62
- panels: (c, settings) => mailPanel(c.var.config.dataDir, settings),
63
+ panels: (c, settings) => mailPanel(c.var.settings, settings),
63
64
  endpoints: mountMail,
64
65
  };
65
66
  /** The mail credential's endpoints: save it, forget it, and prove it works. */
@@ -77,47 +78,27 @@ function mountMail(app, _options) {
77
78
  */
78
79
  app.post(MAIL_PATH, async (c) => {
79
80
  const body = await c.req.parseBody();
80
- const { config } = c.var;
81
- const stored = readMailCredentials(config.dataDir);
81
+ const { settings } = c.var;
82
82
  if (stringOrEmpty(body[MAIL_FIELDS.action]) === MAIL_REMOVE) {
83
- await removeMailCredentials(config.dataDir);
84
- flash(c, 'notice', 'The mail credentials are gone. No email is sent any more.');
83
+ const forgotten = await forgetStored(settings, MAIL, 'admin');
84
+ if (!forgotten.ok) {
85
+ flash(c, 'error', `${Object.values(forgotten.problems).join(' ')} Nothing was removed.`);
86
+ return c.redirect(here, 303);
87
+ }
88
+ const elsewhere = Object.entries(await setElsewhere(settings, MAIL));
89
+ flash(c, 'notice', elsewhere.length === 0
90
+ ? 'The mail credentials are gone. No email is sent any more.'
91
+ : `The stored mail credentials are gone. ${elsewhere
92
+ .map(([key, source]) => `${source} still sets mail.${key}.`)
93
+ .join(' ')}`);
85
94
  return c.redirect(here, 303);
86
95
  }
87
- const apiKey = stringOrEmpty(body[MAIL_FIELDS.brevoApiKey]).trim();
88
- const host = stringOrEmpty(body[MAIL_FIELDS.smtpHost]).trim();
89
- const port = Number(stringOrEmpty(body[MAIL_FIELDS.smtpPort]).trim());
90
- const password = stringOrEmpty(body[MAIL_FIELDS.smtpPassword]);
91
- if (host !== '' && (!Number.isInteger(port) || port < 1 || port > 65535)) {
92
- flash(c, 'error', 'An SMTP port is a whole number between 1 and 65535. Nothing was saved.');
96
+ const result = await settings.set('mail', await submittedCredentials(settings, body), 'admin');
97
+ if (!result.ok) {
98
+ flash(c, 'error', `${Object.values(result.problems).join(' ')} Nothing was saved.`);
93
99
  return c.redirect(here, 303);
94
100
  }
95
- const credentials = {
96
- ...(apiKey === ''
97
- ? stored.brevo === undefined
98
- ? {}
99
- : { brevo: stored.brevo }
100
- : { brevo: { apiKey } }),
101
- ...(host === ''
102
- ? stored.smtp === undefined
103
- ? {}
104
- : { smtp: stored.smtp }
105
- : {
106
- smtp: {
107
- host,
108
- port,
109
- secure: stringOrEmpty(body[MAIL_FIELDS.smtpSecure]) !== '',
110
- user: stringOrEmpty(body[MAIL_FIELDS.smtpUser]).trim(),
111
- // A blank password keeps the stored one, so the port and the user
112
- // can be edited without retyping a secret the form was never
113
- // allowed to show.
114
- password: password === '' ? (stored.smtp?.password ?? '') : password,
115
- },
116
- }),
117
- };
118
- await writeMailCredentials(config.dataDir, credentials);
119
- const settings = readSiteSettings(config.contentDir);
120
- flash(c, 'notice', settings.mailProvider === 'none'
101
+ flash(c, 'notice', c.var.siteAtRequestStart.mail_provider === 'none'
121
102
  ? 'Saved. Choose a provider above and save the settings to start sending.'
122
103
  : 'Saved. Send a test message to prove it reaches you.');
123
104
  return c.redirect(here, 303);
@@ -151,19 +132,50 @@ function mountMail(app, _options) {
151
132
  return c.redirect(here, 303);
152
133
  });
153
134
  }
135
+ async function submittedCredentials(settings, body) {
136
+ const elsewhere = await setElsewhere(settings, MAIL);
137
+ const changes = new Map();
138
+ const typed = (field) => stringOrEmpty(body[field]);
139
+ const apiKey = typed(MAIL_FIELDS.brevoApiKey).trim();
140
+ if (apiKey !== '')
141
+ changes.set('brevo_api_key', apiKey);
142
+ const host = typed(MAIL_FIELDS.smtpHost).trim();
143
+ if (host === '' && elsewhere['smtp_host'] === undefined)
144
+ return changes;
145
+ const portText = typed(MAIL_FIELDS.smtpPort).trim();
146
+ const portNumber = Number(portText);
147
+ const connection = [
148
+ ['smtp_host', host],
149
+ ['smtp_port', portText === '' || Number.isNaN(portNumber) ? portText : portNumber],
150
+ ['smtp_secure', typed(MAIL_FIELDS.smtpSecure) !== ''],
151
+ ['smtp_user', typed(MAIL_FIELDS.smtpUser).trim()],
152
+ ];
153
+ for (const [key, value] of connection) {
154
+ if (elsewhere[key] === undefined)
155
+ changes.set(key, value);
156
+ }
157
+ const password = typed(MAIL_FIELDS.smtpPassword);
158
+ if (password !== '')
159
+ changes.set('smtp_password', password);
160
+ return changes;
161
+ }
154
162
  /**
155
163
  * What the page says about email: which provider is chosen, whether the
156
164
  * credential it needs is there, and enough of it to recognise which one.
157
165
  *
158
166
  * Nothing here ever prints a key or a password. A settings screen that echoed
159
167
  * one would put a credential in every browser cache, every screenshot and every
160
- * `view-source`; the last four characters of an API key and the host and user
161
- * of an SMTP connection are enough for somebody to tell what is stored without
162
- * being handed the means to use it.
168
+ * `view-source`; the last four characters of a stored API key and the host and
169
+ * user of an SMTP connection are enough for somebody to tell what is stored
170
+ * without being handed the means to use it. A secret the environment sets is
171
+ * named by its variable and not even that.
163
172
  */
164
- export function mailPanel(dataDir, settings) {
165
- const stored = readMailCredentials(dataDir);
166
- const present = settings.mailProvider === 'brevo' ? stored.brevo !== undefined : stored.smtp !== undefined;
173
+ export async function mailPanel(registry, settings) {
174
+ const mail = await registry.values(MAIL);
175
+ const setBy = await setElsewhere(registry, MAIL);
176
+ const brevoPresent = mail.brevo_api_key !== '';
177
+ const smtpPresent = mail.smtp_host !== '';
178
+ const present = settings.mail_provider === 'brevo' ? brevoPresent : smtpPresent;
167
179
  return {
168
180
  mailUrl: MAIL_PATH,
169
181
  mailFields: MAIL_FIELDS,
@@ -171,33 +183,32 @@ export function mailPanel(dataDir, settings) {
171
183
  mailTestUrl: MAIL_TEST_PATH,
172
184
  mailTestFields: MAIL_TEST_FIELDS,
173
185
  mailProviders: MAIL_PROVIDERS,
174
- mailProvider: settings.mailProvider,
186
+ mailProvider: settings.mail_provider,
187
+ mailSetBy: setBy,
175
188
  // Whether the chosen provider has what it needs. A key stored for the
176
189
  // provider that is not chosen is not "configured": nothing would use it.
177
- mailConfigured: settings.mailProvider !== 'none' && present,
178
- mailBrevoPresent: stored.brevo !== undefined,
179
- mailSmtpPresent: stored.smtp !== undefined,
180
- ...(stored.brevo === undefined
181
- ? {}
182
- : { mailBrevoKeyHint: `…${stored.brevo.apiKey.slice(-4)}` }),
183
- ...(stored.smtp === undefined
184
- ? {}
185
- : {
190
+ mailConfigured: settings.mail_provider !== 'none' && present,
191
+ mailBrevoPresent: brevoPresent,
192
+ mailSmtpPresent: smtpPresent,
193
+ ...(brevoPresent && setBy['brevo_api_key'] === undefined
194
+ ? { mailBrevoKeyHint: `…${mail.brevo_api_key.slice(-4)}` }
195
+ : {}),
196
+ ...(smtpPresent
197
+ ? {
186
198
  mailSmtp: {
187
- host: stored.smtp.host,
188
- port: stored.smtp.port,
189
- secure: stored.smtp.secure,
190
- user: stored.smtp.user,
191
- // Not the password. Whether there is one at all is all the screen
192
- // needs to say.
193
- hasPassword: stored.smtp.password !== '',
199
+ host: mail.smtp_host,
200
+ port: mail.smtp_port,
201
+ secure: mail.smtp_secure,
202
+ user: mail.smtp_user,
203
+ hasPassword: mail.smtp_password !== '',
194
204
  },
195
- }),
196
- mailHint: settings.mailProvider === 'none'
205
+ }
206
+ : {}),
207
+ mailHint: settings.mail_provider === 'none'
197
208
  ? 'This site sends no email. Password resets, moderation notices and contact messages are still recorded; they are simply not sent.'
198
209
  : present
199
210
  ? 'Mail is configured. Send a test message to prove it reaches you.'
200
- : settings.mailProvider === 'brevo'
211
+ : settings.mail_provider === 'brevo'
201
212
  ? 'Brevo is chosen but there is no API key, so nothing is sent.'
202
213
  : 'SMTP is chosen but there is no server, so nothing is sent.',
203
214
  };
@@ -1 +1 @@
1
- {"version":3,"file":"settings-email.js","sourceRoot":"","sources":["../../src/admin/settings-email.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"settings-email.js","sourceRoot":"","sources":["../../src/admin/settings-email.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,6 @@
1
1
  /**
2
2
  * Federation: which relays the site subscribes to.
3
3
  *
4
- * There is nothing else on this page any more. decision-14 replaced the site
5
- * actor with one actor per user, so the handle, the type and the picture a
6
- * site used to federate under are a user's profile, edited on the users
7
- * screen; what is left here is the one setting that is an instruction as well
8
- * as a value — a line added is a `Follow` to send and a line removed is an
9
- * `Undo` — so a save of this page reconciles them.
10
- *
11
4
  * It is a settings page filed under Federation rather than under Settings
12
5
  * (TASK-109). The admin used to have two menu entries called Federation,
13
6
  * neither saying the other existed, and a person looking for the relays had no
@@ -1 +1 @@
1
- {"version":3,"file":"settings-federation.d.ts","sourceRoot":"","sources":["../../src/admin/settings-federation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,2DAA2D;AAC3D,eAAO,MAAM,mBAAmB,EAAE,YAuBjC,CAAC"}
1
+ {"version":3,"file":"settings-federation.d.ts","sourceRoot":"","sources":["../../src/admin/settings-federation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,2DAA2D;AAC3D,eAAO,MAAM,mBAAmB,EAAE,YAiBjC,CAAC"}
@@ -1,13 +1,6 @@
1
1
  /**
2
2
  * Federation: which relays the site subscribes to.
3
3
  *
4
- * There is nothing else on this page any more. decision-14 replaced the site
5
- * actor with one actor per user, so the handle, the type and the picture a
6
- * site used to federate under are a user's profile, edited on the users
7
- * screen; what is left here is the one setting that is an instruction as well
8
- * as a value — a line added is a `Follow` to send and a line removed is an
9
- * `Undo` — so a save of this page reconciles them.
10
- *
11
4
  * It is a settings page filed under Federation rather than under Settings
12
5
  * (TASK-109). The admin used to have two menu entries called Federation,
13
6
  * neither saying the other existed, and a person looking for the relays had no
@@ -31,11 +24,6 @@ export const FEDERATION_SETTINGS = {
31
24
  path: FEDERATION_SETTINGS_PATH,
32
25
  template: ADMIN_TEMPLATES.federationSettings,
33
26
  fields: ['relays'],
34
- saved: (c) => {
35
- // The reconciliation reads the settings that were just written, so it has
36
- // to come after the save rather than be derived from the form.
37
- return toldRelays(c.var.relays.sync());
38
- },
39
27
  endpoints: (app) => {
40
28
  // Where this page was until TASK-109. A bookmark points at it, and so do
41
29
  // the older editions of the README, so it moves somebody along rather than
@@ -43,28 +31,4 @@ export const FEDERATION_SETTINGS = {
43
31
  app.get(settingsPagePath('federation'), (c) => c.redirect(FEDERATION_SETTINGS_PATH, 301));
44
32
  },
45
33
  };
46
- /**
47
- * The sentence a flash adds about the relays a save subscribed to or left.
48
- *
49
- * A relay does not answer at once — FEP-ae0c allows a human to approve the
50
- * subscription days later — so the message says a follow was sent rather than
51
- * that the site is now on the relay, and points at the screen that will say.
52
- */
53
- function toldRelays(report) {
54
- const parts = [];
55
- if (report.followed.length > 0) {
56
- parts.push(report.followed.length === 1
57
- ? 'A follow has been sent to one new relay'
58
- : `Follows have been sent to ${String(report.followed.length)} new relays`);
59
- }
60
- if (report.unfollowed.length > 0) {
61
- parts.push(report.unfollowed.length === 1
62
- ? 'one relay has been unfollowed'
63
- : `${String(report.unfollowed.length)} relays have been unfollowed`);
64
- }
65
- if (parts.length === 0)
66
- return '';
67
- const sentence = parts.join(', and ');
68
- return ` ${sentence.charAt(0).toUpperCase()}${sentence.slice(1)}; the Followers screen says where each stands.`;
69
- }
70
34
  //# sourceMappingURL=settings-federation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings-federation.js","sourceRoot":"","sources":["../../src/admin/settings-federation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,2DAA2D;AAC3D,MAAM,CAAC,MAAM,mBAAmB,GAAiB;IAC/C,OAAO,EAAE,YAAY;IACrB,KAAK,EAAE,UAAU;IACjB,wEAAwE;IACxE,uEAAuE;IACvE,KAAK,EAAE,UAAU;IACjB,OAAO,EAAE,YAAY;IACrB,IAAI,EAAE,wBAAwB;IAC9B,QAAQ,EAAE,eAAe,CAAC,kBAAkB;IAC5C,MAAM,EAAE,CAAC,QAAQ,CAAC;IAElB,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE;QACX,0EAA0E;QAC1E,+DAA+D;QAC/D,OAAO,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;QACjB,yEAAyE;QACzE,2EAA2E;QAC3E,6CAA6C;QAC7C,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC,CAAC;IAC5F,CAAC;CACF,CAAC;AAEF;;;;;;GAMG;AACH,SAAS,UAAU,CAAC,MAAuB;IACzC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CACR,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAC1B,CAAC,CAAC,yCAAyC;YAC3C,CAAC,CAAC,6BAA6B,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAC7E,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CACR,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;YAC5B,CAAC,CAAC,+BAA+B;YACjC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,8BAA8B,CACtE,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAElC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtC,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,gDAAgD,CAAC;AAClH,CAAC"}
1
+ {"version":3,"file":"settings-federation.js","sourceRoot":"","sources":["../../src/admin/settings-federation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,2DAA2D;AAC3D,MAAM,CAAC,MAAM,mBAAmB,GAAiB;IAC/C,OAAO,EAAE,YAAY;IACrB,KAAK,EAAE,UAAU;IACjB,wEAAwE;IACxE,uEAAuE;IACvE,KAAK,EAAE,UAAU;IACjB,OAAO,EAAE,YAAY;IACrB,IAAI,EAAE,wBAAwB;IAC9B,QAAQ,EAAE,eAAe,CAAC,kBAAkB;IAC5C,MAAM,EAAE,CAAC,QAAQ,CAAC;IAElB,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;QACjB,yEAAyE;QACzE,2EAA2E;QAC3E,6CAA6C;QAC7C,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC,CAAC;IAC5F,CAAC;CACF,CAAC"}