@geekity/cms 0.7.0 → 0.9.0

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 (216) hide show
  1. package/README.md +445 -63
  2. package/admin/layouts/shell.njk +13 -6
  3. package/admin/pages/comments/all.njk +3 -0
  4. package/admin/pages/error.njk +11 -0
  5. package/admin/pages/settings/discussion.njk +53 -0
  6. package/admin/pages/settings/email.njk +20 -0
  7. package/admin/pages/tools/personal-data.njk +67 -0
  8. package/admin/pages/users/edit.njk +1 -1
  9. package/admin/static/admin.css +69 -15
  10. package/dist/admin/comments.d.ts +5 -0
  11. package/dist/admin/comments.d.ts.map +1 -1
  12. package/dist/admin/comments.js +13 -0
  13. package/dist/admin/comments.js.map +1 -1
  14. package/dist/admin/documents.d.ts.map +1 -1
  15. package/dist/admin/documents.js +58 -31
  16. package/dist/admin/documents.js.map +1 -1
  17. package/dist/admin/headers.d.ts +14 -5
  18. package/dist/admin/headers.d.ts.map +1 -1
  19. package/dist/admin/headers.js +18 -6
  20. package/dist/admin/headers.js.map +1 -1
  21. package/dist/admin/index.d.ts +1 -1
  22. package/dist/admin/index.d.ts.map +1 -1
  23. package/dist/admin/index.js +1 -1
  24. package/dist/admin/index.js.map +1 -1
  25. package/dist/admin/menu.d.ts.map +1 -1
  26. package/dist/admin/menu.js +5 -1
  27. package/dist/admin/menu.js.map +1 -1
  28. package/dist/admin/personal-data.d.ts +35 -0
  29. package/dist/admin/personal-data.d.ts.map +1 -0
  30. package/dist/admin/personal-data.js +90 -0
  31. package/dist/admin/personal-data.js.map +1 -0
  32. package/dist/admin/routes.d.ts.map +1 -1
  33. package/dist/admin/routes.js +23 -4
  34. package/dist/admin/routes.js.map +1 -1
  35. package/dist/admin/session.d.ts +42 -1
  36. package/dist/admin/session.d.ts.map +1 -1
  37. package/dist/admin/session.js +74 -4
  38. package/dist/admin/session.js.map +1 -1
  39. package/dist/admin/settings-discussion.d.ts.map +1 -1
  40. package/dist/admin/settings-discussion.js +9 -1
  41. package/dist/admin/settings-discussion.js.map +1 -1
  42. package/dist/admin/settings-email.d.ts.map +1 -1
  43. package/dist/admin/settings-email.js +10 -1
  44. package/dist/admin/settings-email.js.map +1 -1
  45. package/dist/admin/settings.d.ts +39 -0
  46. package/dist/admin/settings.d.ts.map +1 -1
  47. package/dist/admin/settings.js +144 -0
  48. package/dist/admin/settings.js.map +1 -1
  49. package/dist/admin/store.d.ts +30 -0
  50. package/dist/admin/store.d.ts.map +1 -1
  51. package/dist/admin/store.js +68 -5
  52. package/dist/admin/store.js.map +1 -1
  53. package/dist/admin/templates.d.ts +2 -0
  54. package/dist/admin/templates.d.ts.map +1 -1
  55. package/dist/admin/templates.js +2 -0
  56. package/dist/admin/templates.js.map +1 -1
  57. package/dist/avatars/avatars.d.ts +112 -0
  58. package/dist/avatars/avatars.d.ts.map +1 -0
  59. package/dist/avatars/avatars.js +259 -0
  60. package/dist/avatars/avatars.js.map +1 -0
  61. package/dist/avatars/index.d.ts +4 -0
  62. package/dist/avatars/index.d.ts.map +1 -0
  63. package/dist/avatars/index.js +3 -0
  64. package/dist/avatars/index.js.map +1 -0
  65. package/dist/avatars/routes.d.ts +11 -0
  66. package/dist/avatars/routes.d.ts.map +1 -0
  67. package/dist/avatars/routes.js +33 -0
  68. package/dist/avatars/routes.js.map +1 -0
  69. package/dist/cli.d.ts +1 -1
  70. package/dist/cli.d.ts.map +1 -1
  71. package/dist/cli.js +128 -3
  72. package/dist/cli.js.map +1 -1
  73. package/dist/comments/records.d.ts +15 -0
  74. package/dist/comments/records.d.ts.map +1 -1
  75. package/dist/comments/records.js +51 -1
  76. package/dist/comments/records.js.map +1 -1
  77. package/dist/comments/routes.d.ts.map +1 -1
  78. package/dist/comments/routes.js +7 -1
  79. package/dist/comments/routes.js.map +1 -1
  80. package/dist/config.d.ts +37 -0
  81. package/dist/config.d.ts.map +1 -1
  82. package/dist/config.js +58 -0
  83. package/dist/config.js.map +1 -1
  84. package/dist/contact/index.d.ts +1 -1
  85. package/dist/contact/index.d.ts.map +1 -1
  86. package/dist/contact/index.js +1 -1
  87. package/dist/contact/index.js.map +1 -1
  88. package/dist/contact/records.d.ts +8 -2
  89. package/dist/contact/records.d.ts.map +1 -1
  90. package/dist/contact/records.js +13 -6
  91. package/dist/contact/records.js.map +1 -1
  92. package/dist/content/document.d.ts +10 -2
  93. package/dist/content/document.d.ts.map +1 -1
  94. package/dist/content/document.js +1 -0
  95. package/dist/content/document.js.map +1 -1
  96. package/dist/content/parser.d.ts.map +1 -1
  97. package/dist/content/parser.js +13 -0
  98. package/dist/content/parser.js.map +1 -1
  99. package/dist/content/store.d.ts +13 -2
  100. package/dist/content/store.d.ts.map +1 -1
  101. package/dist/content/store.js +45 -1
  102. package/dist/content/store.js.map +1 -1
  103. package/dist/content/writer.d.ts.map +1 -1
  104. package/dist/content/writer.js +4 -0
  105. package/dist/content/writer.js.map +1 -1
  106. package/dist/env.d.ts +18 -0
  107. package/dist/env.d.ts.map +1 -1
  108. package/dist/federation/article.d.ts +9 -0
  109. package/dist/federation/article.d.ts.map +1 -1
  110. package/dist/federation/article.js +24 -2
  111. package/dist/federation/article.js.map +1 -1
  112. package/dist/federation/federation.d.ts.map +1 -1
  113. package/dist/federation/federation.js +24 -6
  114. package/dist/federation/federation.js.map +1 -1
  115. package/dist/federation/inbox.d.ts +17 -3
  116. package/dist/federation/inbox.d.ts.map +1 -1
  117. package/dist/federation/inbox.js +72 -6
  118. package/dist/federation/inbox.js.map +1 -1
  119. package/dist/federation/mount.d.ts.map +1 -1
  120. package/dist/federation/mount.js +8 -3
  121. package/dist/federation/mount.js.map +1 -1
  122. package/dist/federation/paths.d.ts +5 -0
  123. package/dist/federation/paths.d.ts.map +1 -1
  124. package/dist/federation/paths.js +5 -0
  125. package/dist/federation/paths.js.map +1 -1
  126. package/dist/federation/quotes.d.ts +58 -0
  127. package/dist/federation/quotes.d.ts.map +1 -0
  128. package/dist/federation/quotes.js +89 -0
  129. package/dist/federation/quotes.js.map +1 -0
  130. package/dist/federation/replies.d.ts +23 -0
  131. package/dist/federation/replies.d.ts.map +1 -1
  132. package/dist/federation/replies.js +47 -10
  133. package/dist/federation/replies.js.map +1 -1
  134. package/dist/federation/wordpress.d.ts.map +1 -1
  135. package/dist/federation/wordpress.js +5 -4
  136. package/dist/federation/wordpress.js.map +1 -1
  137. package/dist/index.d.ts +23 -2
  138. package/dist/index.d.ts.map +1 -1
  139. package/dist/index.js +64 -7
  140. package/dist/index.js.map +1 -1
  141. package/dist/maintenance.d.ts +47 -0
  142. package/dist/maintenance.d.ts.map +1 -0
  143. package/dist/maintenance.js +78 -0
  144. package/dist/maintenance.js.map +1 -0
  145. package/dist/notifications/index.d.ts +1 -1
  146. package/dist/notifications/index.d.ts.map +1 -1
  147. package/dist/notifications/index.js +1 -1
  148. package/dist/notifications/index.js.map +1 -1
  149. package/dist/notifications/optouts.d.ts +6 -0
  150. package/dist/notifications/optouts.d.ts.map +1 -1
  151. package/dist/notifications/optouts.js +17 -0
  152. package/dist/notifications/optouts.js.map +1 -1
  153. package/dist/privacy/erase.d.ts +45 -0
  154. package/dist/privacy/erase.d.ts.map +1 -0
  155. package/dist/privacy/erase.js +77 -0
  156. package/dist/privacy/erase.js.map +1 -0
  157. package/dist/privacy/policy.d.ts +32 -0
  158. package/dist/privacy/policy.d.ts.map +1 -0
  159. package/dist/privacy/policy.js +37 -0
  160. package/dist/privacy/policy.js.map +1 -0
  161. package/dist/privacy/retention.d.ts +79 -0
  162. package/dist/privacy/retention.d.ts.map +1 -0
  163. package/dist/privacy/retention.js +133 -0
  164. package/dist/privacy/retention.js.map +1 -0
  165. package/dist/web/conversation.d.ts +9 -1
  166. package/dist/web/conversation.d.ts.map +1 -1
  167. package/dist/web/conversation.js +69 -39
  168. package/dist/web/conversation.js.map +1 -1
  169. package/dist/web/documents.d.ts +9 -0
  170. package/dist/web/documents.d.ts.map +1 -1
  171. package/dist/web/documents.js +31 -0
  172. package/dist/web/documents.js.map +1 -1
  173. package/dist/web/errors.d.ts +19 -0
  174. package/dist/web/errors.d.ts.map +1 -0
  175. package/dist/web/errors.js +93 -0
  176. package/dist/web/errors.js.map +1 -0
  177. package/dist/web/health.d.ts +6 -0
  178. package/dist/web/health.d.ts.map +1 -1
  179. package/dist/web/health.js +5 -1
  180. package/dist/web/health.js.map +1 -1
  181. package/dist/web/index.d.ts +5 -0
  182. package/dist/web/index.d.ts.map +1 -1
  183. package/dist/web/index.js +4 -0
  184. package/dist/web/index.js.map +1 -1
  185. package/dist/web/maintenance.d.ts +18 -0
  186. package/dist/web/maintenance.d.ts.map +1 -0
  187. package/dist/web/maintenance.js +113 -0
  188. package/dist/web/maintenance.js.map +1 -0
  189. package/dist/web/redirects.d.ts +75 -0
  190. package/dist/web/redirects.d.ts.map +1 -0
  191. package/dist/web/redirects.js +200 -0
  192. package/dist/web/redirects.js.map +1 -0
  193. package/dist/web/render.d.ts +9 -0
  194. package/dist/web/render.d.ts.map +1 -1
  195. package/dist/web/render.js +19 -0
  196. package/dist/web/render.js.map +1 -1
  197. package/dist/web/routes.d.ts.map +1 -1
  198. package/dist/web/routes.js +57 -0
  199. package/dist/web/routes.js.map +1 -1
  200. package/dist/web/well-known.d.ts +21 -0
  201. package/dist/web/well-known.d.ts.map +1 -0
  202. package/dist/web/well-known.js +66 -0
  203. package/dist/web/well-known.js.map +1 -0
  204. package/dist/webmention/fetch-public.d.ts +34 -0
  205. package/dist/webmention/fetch-public.d.ts.map +1 -0
  206. package/dist/webmention/fetch-public.js +101 -0
  207. package/dist/webmention/fetch-public.js.map +1 -0
  208. package/dist/webmention/reply-context.d.ts.map +1 -1
  209. package/dist/webmention/reply-context.js +12 -89
  210. package/dist/webmention/reply-context.js.map +1 -1
  211. package/package.json +1 -1
  212. package/templates/site/content/_data/site.json +7 -1
  213. package/templates/site/content/pages/privacy.md +127 -0
  214. package/themes/default/README.md +58 -19
  215. package/themes/default/layouts/500.njk +8 -0
  216. package/themes/default/layouts/503.njk +8 -0
@@ -7,12 +7,19 @@
7
7
  <a class="admin-bar-site" href="{{ adminUrl }}">{{ site.title }}</a>
8
8
  <a href="{{ siteUrl }}">View site</a>
9
9
  <span class="admin-bar-spacer"></span>
10
- {% if user %}
11
- <span class="admin-bar-user">Signed in as {{ user.username }}</span>
12
- <form method="post" action="{{ logoutUrl }}">
13
- <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
14
- <button type="submit">Log out</button>
15
- </form>
10
+ {% if me %}
11
+ {# WordPress's "Howdy," menu, greeting the way this site's owner does.
12
+ A popover rather than a script: the browser opens and closes it,
13
+ shuts it on Escape or a click elsewhere, and tells a screen reader
14
+ whether it is expanded, all under the CSP's script-src 'self'. #}
15
+ <button type="button" class="admin-bar-account" popovertarget="admin-account-menu">Hoopla! {{ me.name }}</button>
16
+ <div id="admin-account-menu" class="admin-account-menu" popover>
17
+ <a href="{{ me.url }}">Edit profile</a>
18
+ <form method="post" action="{{ logoutUrl }}">
19
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
20
+ <button type="submit">Log out</button>
21
+ </form>
22
+ </div>
16
23
  {% endif %}
17
24
  </header>
18
25
  {% endblock %}
@@ -60,6 +60,9 @@
60
60
  {% if row.address %}
61
61
  &middot; <code title="A salted hash of the address it came from">{{ row.address }}</code>
62
62
  {% endif %}
63
+ {% if row.removed %}
64
+ &middot; {{ row.removed }}
65
+ {% endif %}
63
66
  </p>
64
67
 
65
68
  <div class="admin-comment-body">{{ row.html | safe }}</div>
@@ -0,0 +1,11 @@
1
+ {% extends "layouts/base.njk" %}
2
+
3
+ {% block title %}Something went wrong{% endblock %}
4
+
5
+ {% block content %}
6
+ {# The page an admin request that threw answers with. It extends the bare
7
+ layout rather than the shell because the shell reads the session, the
8
+ menu and the site, and any of those may be what failed. #}
9
+ <h1>Something went wrong</h1>
10
+ <p>This screen could not be shown because of a problem on the server. The error has been logged. Try again in a moment, or go back to the <a href="{{ adminUrl }}">dashboard</a>.</p>
11
+ {% endblock %}
@@ -2,6 +2,17 @@
2
2
  {% extends "layouts/settings-page.njk" %}
3
3
  {% import "components/fields.njk" as field %}
4
4
 
5
+ {# What a retention field says about the period as it stands: kept forever at
6
+ 0, removed after so many days otherwise. Nothing for a value the form is
7
+ about to refuse, which has its own error line. #}
8
+ {% macro retention(days) %}
9
+ {%- if days == '0' -%}
10
+ <strong>Kept forever.</strong>
11
+ {%- elif days | int > 0 -%}
12
+ <strong>Removed after {{ days }} day{% if days != '1' %}s{% endif %}.</strong>
13
+ {%- endif -%}
14
+ {% endmacro %}
15
+
5
16
  {% block settingsFields %}
6
17
  <h2>Comments</h2>
7
18
 
@@ -41,6 +52,48 @@
41
52
  {% endset %}
42
53
  {{ field.checkbox('settings-webmentions-receive', fields.webmentionsReceive,
43
54
  'Accept webmentions sent here', checked=form.webmentionsReceive, hint=receiveHint) }}
55
+
56
+ <h2>Keeping personal data</h2>
57
+
58
+ <p class="admin-hint">
59
+ How long the site keeps what commenters and people writing through the
60
+ contact form hand it, in days from when it arrived; <code>0</code> keeps
61
+ it forever. A site that has never set these keeps everything, so upgrading
62
+ removes nothing. The recommended periods are 180 days for emails, 30 for
63
+ address hashes and 365 for contact messages, which is what a new site
64
+ starts with. A sweep removes whatever has outlived its period every few
65
+ hours. Tools &rsaquo; Personal data erases one person's data on request.
66
+ </p>
67
+
68
+ {% set emailHint %}
69
+ {{ retention(form.commentEmailRetentionDays) }}
70
+ Past this a comment loses its author's email. The comment, its place in
71
+ the thread and its moderation status stay; the author is no longer told
72
+ about replies, and their next comment waits for a moderator. Recommended:
73
+ <code>180</code>.
74
+ {% endset %}
75
+ {{ field.text('settings-comment-email-retention', fields.commentEmailRetentionDays,
76
+ 'Keep commenter emails for', form.commentEmailRetentionDays, type='number', min='0',
77
+ step='1', error=problems.commentEmailRetentionDays, hint=emailHint) }}
78
+
79
+ {% set hashHint %}
80
+ {{ retention(form.addressHashRetentionDays) }}
81
+ The salted hash of the address a comment, webmention or contact message
82
+ came from, which shows a moderator that two came from one place.
83
+ Recommended: <code>30</code>.
84
+ {% endset %}
85
+ {{ field.text('settings-address-hash-retention', fields.addressHashRetentionDays,
86
+ 'Keep address hashes for', form.addressHashRetentionDays, type='number', min='0',
87
+ step='1', error=problems.addressHashRetentionDays, hint=hashHint) }}
88
+
89
+ {% set contactHint %}
90
+ {{ retention(form.contactMessageRetentionDays) }}
91
+ Past this a contact message is deleted from the Messages screen and from
92
+ <code>data/contact/</code>. Recommended: <code>365</code>.
93
+ {% endset %}
94
+ {{ field.text('settings-contact-message-retention', fields.contactMessageRetentionDays,
95
+ 'Keep contact messages for', form.contactMessageRetentionDays, type='number', min='0',
96
+ step='1', error=problems.contactMessageRetentionDays, hint=contactHint) }}
44
97
  {% endblock %}
45
98
 
46
99
  {% block settingsPanels %}
@@ -39,6 +39,26 @@
39
39
  {% endset %}
40
40
  {{ field.text('settings-contact-email', fields.contactEmail, 'Contact address',
41
41
  form.contactEmail, error=problems.contactEmail, hint=contactHint, inputmode='email') }}
42
+
43
+ <h2>Security contact</h2>
44
+
45
+ {% set securityContactsHint %}
46
+ Where somebody who finds a vulnerability in this site should report it, one per line:
47
+ an email address, an <code>https://</code> URL or a <code>tel:</code> number. They are
48
+ published at <a href="/.well-known/security.txt"><code>/.well-known/security.txt</code></a>,
49
+ which is not served at all while this is empty.
50
+ {% endset %}
51
+ {{ field.textarea('settings-security-contacts', fields.securityContacts, 'Contacts',
52
+ form.securityContacts, error=problems.securityContacts, hint=securityContactsHint,
53
+ rows='2', spellcheck='false') }}
54
+
55
+ {{ field.text('settings-security-policy', fields.securityPolicy, 'Disclosure policy',
56
+ form.securityPolicy, error=problems.securityPolicy, inputmode='url',
57
+ hint='Optional. An https:// URL for the page that says how reports are handled.') }}
58
+
59
+ {{ field.text('settings-security-languages', fields.securityLanguages, 'Preferred languages',
60
+ form.securityLanguages, error=problems.securityLanguages,
61
+ hint='Optional. The languages a report may be written in, such as en, fr.') }}
42
62
  {% endblock %}
43
63
 
44
64
  {% block settingsPanels %}
@@ -0,0 +1,67 @@
1
+ {# /admin/tools/personal-data: erasing one person's data when they ask
2
+ (TASK-135). Looking is a step of its own because erasing cannot be undone. #}
3
+ {% extends "layouts/shell.njk" %}
4
+ {% import "components/fields.njk" as field %}
5
+
6
+ {% block title %}{{ heading }}{% endblock %}
7
+
8
+ {% block content %}
9
+ <h1>{{ heading }}</h1>
10
+
11
+ <p>
12
+ When somebody asks for what this site holds about them to be erased, type
13
+ the email address they commented or wrote in under. Their comments stay in
14
+ their threads, with their words and their moderation status, signed
15
+ <strong>{{ erasedName }}</strong> and with their email, website and address
16
+ hash removed. Their contact messages are deleted, and the address comes off
17
+ the list of people who asked not to be emailed about replies.
18
+ </p>
19
+
20
+ {% if found %}
21
+ <form class="admin-settings" method="post" action="{{ actionUrl }}">
22
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
23
+ <input type="hidden" name="{{ fields.email }}" value="{{ email }}" />
24
+ <input type="hidden" name="{{ fields.confirm }}" value="1" />
25
+
26
+ <h2>What this site holds for {{ email }}</h2>
27
+
28
+ <ul>
29
+ <li>{{ found.comments }}</li>
30
+ <li>{{ found.messages }}</li>
31
+ <li>
32
+ {% if found.optedOut %}On{% else %}Not on{% endif %} the list of addresses not
33
+ to email about replies
34
+ </li>
35
+ </ul>
36
+
37
+ {% if found.anything %}
38
+ <p>
39
+ Erasing cannot be undone. A copy of a comment file in git history or in a
40
+ backup keeps what it held; this changes the site as it is now.
41
+ </p>
42
+ <p class="admin-settings-buttons">
43
+ <button type="submit">Erase it</button>
44
+ <a href="{{ actionUrl }}">Cancel</a>
45
+ </p>
46
+ {% else %}
47
+ <p>There is nothing to erase for that address.</p>
48
+ <p class="admin-settings-buttons"><a href="{{ actionUrl }}">Look for another</a></p>
49
+ {% endif %}
50
+ </form>
51
+ {% else %}
52
+ <form class="admin-settings" method="post" action="{{ actionUrl }}">
53
+ <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
54
+ {{ field.text('personal-data-email', fields.email, 'Email address', email,
55
+ type='email', error=problem) }}
56
+ <p class="admin-settings-buttons">
57
+ <button type="submit">Look for it</button>
58
+ </p>
59
+ </form>
60
+ {% endif %}
61
+
62
+ <p class="admin-hint">
63
+ Comments are found by the email they carry, so a comment whose email the
64
+ retention sweep has already removed, a webmention and a fediverse reply are
65
+ not found here. Delete those one by one from the Comments screen.
66
+ </p>
67
+ {% endblock %}
@@ -213,7 +213,7 @@
213
213
  Resetting a colleague's password from under them is deliberately not
214
214
  offered — a fresh account is what that is for. #}
215
215
  {% if account.you %}
216
- <form class="admin-settings" method="post" action="{{ changePasswordUrl }}">
216
+ <form class="admin-settings" id="change-password" method="post" action="{{ changePasswordUrl }}">
217
217
  <input type="hidden" name="csrf_token" value="{{ csrfToken }}" />
218
218
 
219
219
  <h2>Change your password</h2>
@@ -54,11 +54,13 @@ a {
54
54
  min-height: 2.5rem;
55
55
  background: var(--admin-bar);
56
56
  color: var(--admin-nav-text);
57
+ anchor-name: --admin-bar;
57
58
  }
58
59
 
59
60
  .admin-bar a {
60
61
  color: var(--admin-nav-text);
61
62
  text-decoration: none;
63
+ white-space: nowrap;
62
64
  }
63
65
 
64
66
  .admin-bar a:hover,
@@ -74,22 +76,71 @@ a {
74
76
  flex: 1;
75
77
  }
76
78
 
77
- .admin-bar-user {
78
- color: #c3c4c7;
79
+ .admin-bar-account {
80
+ padding: 0;
81
+ border: 0;
82
+ background: none;
83
+ color: var(--admin-nav-text);
84
+ font: inherit;
85
+ text-align: right;
86
+ cursor: pointer;
87
+ anchor-name: --admin-account;
79
88
  }
80
89
 
81
- .admin-bar form {
82
- display: inline;
90
+ .admin-bar-account:hover,
91
+ .admin-bar-account:focus-visible,
92
+ .admin-bar-account:popover-open {
93
+ color: #72aee6;
83
94
  }
84
95
 
85
- .admin-bar button {
86
- padding: 0;
96
+ .admin-bar-account::after {
97
+ content: ' \25BE' / '';
98
+ }
99
+
100
+ /* The menu is in the top layer, so it is placed rather than laid out: under
101
+ the greeting where anchor positioning exists, at the bar's right edge
102
+ where it does not. */
103
+
104
+ .admin-account-menu {
105
+ inset: 2.5rem 0 auto auto;
106
+ margin: 0;
107
+ min-width: 10rem;
108
+ padding: 0.25rem 0;
109
+ border: 0;
110
+ background: var(--admin-nav);
111
+ color: var(--admin-nav-text);
112
+ box-shadow: 0 3px 5px rgb(0 0 0 / 20%);
113
+ }
114
+
115
+ @supports (top: anchor(--admin-bar bottom)) {
116
+ .admin-account-menu {
117
+ inset: anchor(--admin-bar bottom) anchor(--admin-account right) auto auto;
118
+ }
119
+ }
120
+
121
+ .admin-account-menu a,
122
+ .admin-account-menu button[type='submit'] {
123
+ display: block;
124
+ box-sizing: border-box;
125
+ width: 100%;
126
+ margin: 0;
127
+ padding: 0.5rem 1rem;
87
128
  border: 0;
129
+ border-radius: 0;
88
130
  background: none;
89
131
  color: var(--admin-nav-text);
90
132
  font: inherit;
133
+ text-align: left;
134
+ text-decoration: none;
91
135
  cursor: pointer;
92
- text-decoration: underline;
136
+ }
137
+
138
+ .admin-account-menu a:hover,
139
+ .admin-account-menu a:focus-visible,
140
+ .admin-account-menu button[type='submit']:hover,
141
+ .admin-account-menu button[type='submit']:focus-visible {
142
+ background: var(--admin-bar);
143
+ color: #72aee6;
93
144
  }
94
145
 
95
146
  /* The shell: navigation column beside the screen itself. */
@@ -331,6 +382,8 @@ label {
331
382
  input[type='text'],
332
383
  input[type='password'],
333
384
  input[type='email'],
385
+ input[type='url'],
386
+ select,
334
387
  textarea {
335
388
  width: 100%;
336
389
  padding: 0.4rem 0.5rem;
@@ -346,6 +399,13 @@ textarea {
346
399
  resize: vertical;
347
400
  }
348
401
 
402
+ /* A select lays its text out at line-height: normal whatever it inherits, so
403
+ it is given the height a text box reaches: the body's 1.6 line, the padding
404
+ and the border. */
405
+ select {
406
+ min-height: calc(1.6em + 0.8rem + 2px);
407
+ }
408
+
349
409
  button[type='submit'],
350
410
  .admin-button {
351
411
  margin-top: 1rem;
@@ -477,6 +537,7 @@ button[type='submit']:hover,
477
537
 
478
538
  .admin-check input {
479
539
  width: auto;
540
+ margin: 0;
480
541
  }
481
542
 
482
543
  .admin-editor-buttons {
@@ -659,14 +720,6 @@ button[type='submit']:hover,
659
720
  border-top: 0;
660
721
  }
661
722
 
662
- .admin-settings select {
663
- padding: 0.4rem 0.5rem;
664
- border: 1px solid #8c8f94;
665
- background: var(--admin-surface);
666
- color: inherit;
667
- font: inherit;
668
- }
669
-
670
723
  .admin-settings input:disabled {
671
724
  background: var(--admin-field);
672
725
  color: var(--admin-muted);
@@ -877,6 +930,7 @@ button[type='submit']:hover,
877
930
  switches and windows still reads as one column rather than as a form. */
878
931
 
879
932
  .admin-inline select {
933
+ width: auto;
880
934
  margin: 0;
881
935
  }
882
936
 
@@ -67,6 +67,11 @@ export interface CommentRow {
67
67
  submitted: string;
68
68
  /** A short form of the address hash, for spotting one machine's run of them. */
69
69
  address: string | null;
70
+ /**
71
+ * What privacy took off it, in a few words, or `null` when nothing was
72
+ * (TASK-135): so a moderator can tell an email removed from one never given.
73
+ */
74
+ removed: string | null;
70
75
  /** The post's title, or its slug when the post is not in the index. */
71
76
  post: string;
72
77
  /** Where the post can be read, or `null` when it is not published. */
@@ -1 +1 @@
1
- {"version":3,"file":"comments.d.ts","sourceRoot":"","sources":["../../src/admin/comments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,MAAM,CAAC;AAO1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAOlD,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAe,MAAM,YAAY,CAAC;AAGzE;;;;;;;;;;;;;;GAcG;AAEH,uCAAuC;AACvC,eAAO,MAAM,aAAa,oBAA6B,CAAC;AAExD,kDAAkD;AAClD,eAAO,MAAM,gBAAgB,aAAa,CAAC;AAE3C,kCAAkC;AAClC,eAAO,MAAM,sBAAsB,6BAA8B,CAAC;AAElE,kCAAkC;AAClC,eAAO,MAAM,mBAAmB,0BAA2B,CAAC;AAE5D,kDAAkD;AAClD,eAAO,MAAM,oBAAoB;IAC/B,uCAAuC;aACvC,EAAE,EAAE,IAAI;IACR,gEAAgE;aAChE,MAAM,EAAE,QAAQ;IAChB,+CAA+C;aAC/C,IAAI,EAAE,MAAM;IACZ,2CAA2C;aAC3C,MAAM,EAAE,QAAQ;CACR,CAAC;AAEX,mCAAmC;AACnC,eAAO,MAAM,eAAe,YAAI,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAU,CAAC;AAEtE,sCAAsC;AACtC,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,qDAAqD;AACrD,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC,4DAA4D;AAC5D,eAAO,MAAM,YAAY,EAAE,SAAS;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAI3E,CAAC;AAEF,0CAA0C;AAC1C,MAAM,WAAW,UAAU;IACzB,uCAAuC;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,uBAAuB;IACvB,MAAM,EAAE,aAAa,CAAC;IACtB,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,sDAAsD;IACtD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,sEAAsE;IACtE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,uEAAuE;AACvE,MAAM,WAAW,0BAA0B;IACzC,oFAAoF;IACpF,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,sCAAsC;AACtC,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,EACrB,OAAO,EAAE,0BAA0B,GAClC,IAAI,CA+IN;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAEzD;AAED,yCAAyC;AACzC,wBAAgB,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,SAAI,GAAG,MAAM,CAG/D"}
1
+ {"version":3,"file":"comments.d.ts","sourceRoot":"","sources":["../../src/admin/comments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,MAAM,CAAC;AAO1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAOlD,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAe,MAAM,YAAY,CAAC;AAGzE;;;;;;;;;;;;;;GAcG;AAEH,uCAAuC;AACvC,eAAO,MAAM,aAAa,oBAA6B,CAAC;AAExD,kDAAkD;AAClD,eAAO,MAAM,gBAAgB,aAAa,CAAC;AAE3C,kCAAkC;AAClC,eAAO,MAAM,sBAAsB,6BAA8B,CAAC;AAElE,kCAAkC;AAClC,eAAO,MAAM,mBAAmB,0BAA2B,CAAC;AAE5D,kDAAkD;AAClD,eAAO,MAAM,oBAAoB;IAC/B,uCAAuC;aACvC,EAAE,EAAE,IAAI;IACR,gEAAgE;aAChE,MAAM,EAAE,QAAQ;IAChB,+CAA+C;aAC/C,IAAI,EAAE,MAAM;IACZ,2CAA2C;aAC3C,MAAM,EAAE,QAAQ;CACR,CAAC;AAEX,mCAAmC;AACnC,eAAO,MAAM,eAAe,YAAI,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAU,CAAC;AAEtE,sCAAsC;AACtC,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,qDAAqD;AACrD,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC,4DAA4D;AAC5D,eAAO,MAAM,YAAY,EAAE,SAAS;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAI3E,CAAC;AAEF,0CAA0C;AAC1C,MAAM,WAAW,UAAU;IACzB,uCAAuC;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,uBAAuB;IACvB,MAAM,EAAE,aAAa,CAAC;IACtB,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,sDAAsD;IACtD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB;;;OAGG;IACH,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,sEAAsE;IACtE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,uEAAuE;AACvE,MAAM,WAAW,0BAA0B;IACzC,oFAAoF;IACpF,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,sCAAsC;AACtC,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,EACrB,OAAO,EAAE,0BAA0B,GAClC,IAAI,CA+IN;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAEzD;AAED,yCAAyC;AACzC,wBAAgB,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,SAAI,GAAG,MAAM,CAG/D"}
@@ -194,6 +194,18 @@ export function listUrl(status, page = 1) {
194
194
  function statusOf(value) {
195
195
  return COMMENT_STATUSES.includes(value) ? value : 'pending';
196
196
  }
197
+ /** What a moderator is told was removed from a comment for privacy. */
198
+ function removedNote(redacted) {
199
+ if (redacted === undefined)
200
+ return null;
201
+ if (redacted.includes('author'))
202
+ return 'author erased on request';
203
+ if (redacted.includes('email'))
204
+ return 'email removed after the retention period';
205
+ if (redacted.includes('addressHash'))
206
+ return 'address hash removed after the retention period';
207
+ return null;
208
+ }
197
209
  /** The files and the index this request writes through. */
198
210
  function recordsOf(c) {
199
211
  return { admin: c.var.admin, contentDir: c.var.config.contentDir };
@@ -214,6 +226,7 @@ function commentRow(c, comment) {
214
226
  // The first eight characters are enough to see that two comments came from
215
227
  // one place, which is the only question the hash is there to answer.
216
228
  address: comment.addressHash === null ? null : comment.addressHash.slice(0, 8),
229
+ removed: removedNote(comment.redacted),
217
230
  post: document === undefined ? comment.slug : postLabel(document),
218
231
  postUrl: comment.permalink === '' ? null : comment.permalink,
219
232
  editUrl: document === undefined
@@ -1 +1 @@
1
- {"version":3,"file":"comments.js","sourceRoot":"","sources":["../../src/admin/comments.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"comments.js","sourceRoot":"","sources":["../../src/admin/comments.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../src/admin/documents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../src/admin/documents.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,7 @@ import { DuplicatePermalinkError, isTrashedPath, TRASH_DIRECTORY } from '../cont
11
11
  import { calendarDayIn, DEFAULT_TIMEZONE, toUtcInstant, wallClockIn, zoneLabel, } from '../content/time.js';
12
12
  import { normalizeBody, serializeDocument } from '../content/writer.js';
13
13
  import { isPublicDocument } from '../web/documents.js';
14
+ import { absoluteUrl } from '../web/negotiate.js';
14
15
  import { COMMENTS_FRONT_MATTER_KEY } from '../comments/policy.js';
15
16
  import { CONTACT_FRONT_MATTER_KEY } from '../contact/form.js';
16
17
  import { userForAuthor } from '../web/authors.js';
@@ -258,27 +259,17 @@ async function saveFromForm(c, options) {
258
259
  const finalSlug = document === undefined
259
260
  ? await freeSlug({ contentDir, store, type: kind.type, slug, date: filed })
260
261
  : slug;
261
- // decision-13: a published post's permalink is its name in the fediverse as
262
- // well as on the web, and the two are one promise. Moving it hands every
263
- // follower a second object and breaks every link somebody already shared, so
264
- // the editor refuses. A draft has promised nothing yet and may still move;
265
- // a site that really means to move a published post can still do it in the
266
- // file, knowing what it costs.
267
- const promised = promisedDocument(kind, document, store.now());
268
- if (promised !== undefined) {
269
- if (finalSlug !== promised.slug) {
270
- return refuse(`The permalink of a published post is permanent, and the slug names the file it is filed under: this ${kind.singular} keeps the slug ${promised.slug}.`);
271
- }
272
- // An empty field is not a request to move: it is a form that carried no
273
- // permalink, and the promised one is what it keeps. Only a field naming
274
- // some other URL is somebody asking for the one thing this refuses.
275
- const submitted = normalizePermalink(form.permalink);
276
- if (submitted !== undefined && submitted !== promised.permalink) {
277
- return refuse(`The permalink of a published post is permanent: this ${kind.singular} stays at ${promised.permalink}.`);
278
- }
279
- }
280
- const permalink = promised?.permalink ??
281
- resolvePermalink({
262
+ // A URL somebody has been shown only moves when the author asks it to, by
263
+ // editing the slug or the permalink: correcting a date refiles the file and
264
+ // leaves the URL where it was. An empty permalink field is a form that
265
+ // carried none, not a request to move.
266
+ const promised = promisedDocument(document, store.now());
267
+ const submitted = normalizePermalink(form.permalink);
268
+ const asked = promised !== undefined &&
269
+ (finalSlug !== promised.slug || (submitted !== undefined && submitted !== promised.permalink));
270
+ const permalink = promised !== undefined && !asked
271
+ ? promised.permalink
272
+ : resolvePermalink({
282
273
  kind,
283
274
  form,
284
275
  slug: finalSlug,
@@ -301,13 +292,14 @@ async function saveFromForm(c, options) {
301
292
  ...(date === undefined ? {} : { date }),
302
293
  updated: store.now().toISOString(),
303
294
  permalink,
295
+ ...optional('redirectFrom', formerPermalinks(document, promised, permalink)),
304
296
  tags: kind.tagged ? splitTags(form.tags) : [],
305
297
  categories: kind.categorised ? splitTags(form.categories) : [],
306
298
  draft,
307
299
  ...(form.description === '' ? {} : { description: form.description }),
308
300
  ...optional('author', chosenAuthor(c, form.author, document)),
309
301
  ...optional('inReplyTo', replyTo(kind, form, document)),
310
- ...optional('activitypub', document?.activitypub),
302
+ ...optional('activitypub', keptIdentity(document, promised, permalink, c.var.config.baseUrl)),
311
303
  extra: resolveExtra(kind, document, form),
312
304
  body: form.body,
313
305
  };
@@ -373,19 +365,54 @@ function documentPath(input) {
373
365
  return input.trashed ? `${TRASH_DIRECTORY}/${relative}` : relative;
374
366
  }
375
367
  /**
376
- * The document whose permalink has already been promised, or `undefined` when
368
+ * The document whose URL has already been promised, or `undefined` when
377
369
  * nothing has been promised yet.
378
370
  *
379
- * A published post, and only a published post. decision-13 makes its permalink
380
- * its ActivityStreams object id, so the URL is a name its followers, its
381
- * replies and its feed subscribers are all holding; a draft, a trashed post
382
- * and one whose date has not arrived have been shown to nobody, and a page
383
- * federates nothing at all.
371
+ * A published post or page is at a URL readers, search engines and other
372
+ * sites may hold, and a post that was ever announced is at one its followers
373
+ * hold even while it is a draft. A draft nobody was told about, a trashed
374
+ * document and one whose date has not arrived have been shown to nobody, and
375
+ * may move without leaving anything behind.
384
376
  */
385
- function promisedDocument(kind, document, now) {
386
- if (document === undefined || kind.type !== 'post')
377
+ function promisedDocument(document, now) {
378
+ if (document === undefined)
387
379
  return undefined;
388
- return isPublicDocument(document, now) ? document : undefined;
380
+ const announced = document.activitypub?.published !== undefined;
381
+ return isPublicDocument(document, now) || announced ? document : undefined;
382
+ }
383
+ /**
384
+ * The URLs a document is saved as having lived at (TASK-127).
385
+ *
386
+ * Every entry names the document itself rather than the next hop, so a chain
387
+ * of renames collapses by construction: the URL it is leaving joins the ones
388
+ * it already left, and all of them redirect straight to where it is now. The
389
+ * URL it is arriving at leaves the list, because a document moved back to an
390
+ * old URL lives there again.
391
+ */
392
+ function formerPermalinks(document, promised, permalink) {
393
+ const left = promised !== undefined && promised.permalink !== permalink ? [promised.permalink] : [];
394
+ const former = [...new Set([...(document?.redirectFrom ?? []), ...left])].filter((url) => url !== permalink);
395
+ return former.length === 0 ? undefined : former;
396
+ }
397
+ /**
398
+ * The `activitypub` block to write, which pins the object id when a promised
399
+ * post moves (decision-20).
400
+ *
401
+ * decision-13 makes a post's object id its permalink, and a fediverse server
402
+ * cannot rename an object it holds. So the URL the post is leaving is written
403
+ * as its stored id, and the stored-id path does the rest: a peer at the old
404
+ * URL still gets the `Article`, a browser there is sent on, and every `Update`
405
+ * names the id the followers already have. An id the file already stores
406
+ * stays, since it is already what they hold.
407
+ */
408
+ function keptIdentity(document, promised, permalink, baseUrl) {
409
+ const block = document?.activitypub;
410
+ if (promised === undefined || promised.type !== 'post' || promised.permalink === permalink) {
411
+ return block;
412
+ }
413
+ if (block?.id !== undefined)
414
+ return block;
415
+ return { ...block, id: absoluteUrl(promised.permalink, baseUrl) };
389
416
  }
390
417
  /**
391
418
  * The permalink to write.