@geekity/cms 0.8.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 (144) hide show
  1. package/README.md +292 -45
  2. package/admin/pages/comments/all.njk +3 -0
  3. package/admin/pages/settings/discussion.njk +53 -0
  4. package/admin/pages/settings/email.njk +20 -0
  5. package/admin/pages/tools/personal-data.njk +67 -0
  6. package/admin/pages/users/edit.njk +1 -1
  7. package/dist/admin/comments.d.ts +5 -0
  8. package/dist/admin/comments.d.ts.map +1 -1
  9. package/dist/admin/comments.js +13 -0
  10. package/dist/admin/comments.js.map +1 -1
  11. package/dist/admin/headers.d.ts +14 -5
  12. package/dist/admin/headers.d.ts.map +1 -1
  13. package/dist/admin/headers.js +18 -6
  14. package/dist/admin/headers.js.map +1 -1
  15. package/dist/admin/index.d.ts +1 -1
  16. package/dist/admin/index.d.ts.map +1 -1
  17. package/dist/admin/index.js +1 -1
  18. package/dist/admin/index.js.map +1 -1
  19. package/dist/admin/menu.d.ts.map +1 -1
  20. package/dist/admin/menu.js +5 -1
  21. package/dist/admin/menu.js.map +1 -1
  22. package/dist/admin/personal-data.d.ts +35 -0
  23. package/dist/admin/personal-data.d.ts.map +1 -0
  24. package/dist/admin/personal-data.js +90 -0
  25. package/dist/admin/personal-data.js.map +1 -0
  26. package/dist/admin/routes.d.ts.map +1 -1
  27. package/dist/admin/routes.js +18 -2
  28. package/dist/admin/routes.js.map +1 -1
  29. package/dist/admin/session.d.ts +42 -1
  30. package/dist/admin/session.d.ts.map +1 -1
  31. package/dist/admin/session.js +74 -4
  32. package/dist/admin/session.js.map +1 -1
  33. package/dist/admin/settings-discussion.d.ts.map +1 -1
  34. package/dist/admin/settings-discussion.js +9 -1
  35. package/dist/admin/settings-discussion.js.map +1 -1
  36. package/dist/admin/settings-email.d.ts.map +1 -1
  37. package/dist/admin/settings-email.js +10 -1
  38. package/dist/admin/settings-email.js.map +1 -1
  39. package/dist/admin/settings.d.ts +39 -0
  40. package/dist/admin/settings.d.ts.map +1 -1
  41. package/dist/admin/settings.js +144 -0
  42. package/dist/admin/settings.js.map +1 -1
  43. package/dist/admin/store.d.ts +30 -0
  44. package/dist/admin/store.d.ts.map +1 -1
  45. package/dist/admin/store.js +68 -5
  46. package/dist/admin/store.js.map +1 -1
  47. package/dist/admin/templates.d.ts +1 -0
  48. package/dist/admin/templates.d.ts.map +1 -1
  49. package/dist/admin/templates.js +1 -0
  50. package/dist/admin/templates.js.map +1 -1
  51. package/dist/avatars/avatars.d.ts +112 -0
  52. package/dist/avatars/avatars.d.ts.map +1 -0
  53. package/dist/avatars/avatars.js +259 -0
  54. package/dist/avatars/avatars.js.map +1 -0
  55. package/dist/avatars/index.d.ts +4 -0
  56. package/dist/avatars/index.d.ts.map +1 -0
  57. package/dist/avatars/index.js +3 -0
  58. package/dist/avatars/index.js.map +1 -0
  59. package/dist/avatars/routes.d.ts +11 -0
  60. package/dist/avatars/routes.d.ts.map +1 -0
  61. package/dist/avatars/routes.js +33 -0
  62. package/dist/avatars/routes.js.map +1 -0
  63. package/dist/comments/records.d.ts +15 -0
  64. package/dist/comments/records.d.ts.map +1 -1
  65. package/dist/comments/records.js +51 -1
  66. package/dist/comments/records.js.map +1 -1
  67. package/dist/comments/routes.d.ts.map +1 -1
  68. package/dist/comments/routes.js +7 -1
  69. package/dist/comments/routes.js.map +1 -1
  70. package/dist/config.d.ts +24 -0
  71. package/dist/config.d.ts.map +1 -1
  72. package/dist/config.js +57 -0
  73. package/dist/config.js.map +1 -1
  74. package/dist/contact/index.d.ts +1 -1
  75. package/dist/contact/index.d.ts.map +1 -1
  76. package/dist/contact/index.js +1 -1
  77. package/dist/contact/index.js.map +1 -1
  78. package/dist/contact/records.d.ts +8 -2
  79. package/dist/contact/records.d.ts.map +1 -1
  80. package/dist/contact/records.js +13 -6
  81. package/dist/contact/records.js.map +1 -1
  82. package/dist/env.d.ts +6 -0
  83. package/dist/env.d.ts.map +1 -1
  84. package/dist/federation/quotes.d.ts +2 -0
  85. package/dist/federation/quotes.d.ts.map +1 -1
  86. package/dist/federation/quotes.js +4 -0
  87. package/dist/federation/quotes.js.map +1 -1
  88. package/dist/federation/replies.d.ts +23 -0
  89. package/dist/federation/replies.d.ts.map +1 -1
  90. package/dist/federation/replies.js +47 -10
  91. package/dist/federation/replies.js.map +1 -1
  92. package/dist/index.d.ts +23 -2
  93. package/dist/index.d.ts.map +1 -1
  94. package/dist/index.js +41 -7
  95. package/dist/index.js.map +1 -1
  96. package/dist/notifications/index.d.ts +1 -1
  97. package/dist/notifications/index.d.ts.map +1 -1
  98. package/dist/notifications/index.js +1 -1
  99. package/dist/notifications/index.js.map +1 -1
  100. package/dist/notifications/optouts.d.ts +6 -0
  101. package/dist/notifications/optouts.d.ts.map +1 -1
  102. package/dist/notifications/optouts.js +17 -0
  103. package/dist/notifications/optouts.js.map +1 -1
  104. package/dist/privacy/erase.d.ts +45 -0
  105. package/dist/privacy/erase.d.ts.map +1 -0
  106. package/dist/privacy/erase.js +77 -0
  107. package/dist/privacy/erase.js.map +1 -0
  108. package/dist/privacy/policy.d.ts +32 -0
  109. package/dist/privacy/policy.d.ts.map +1 -0
  110. package/dist/privacy/policy.js +37 -0
  111. package/dist/privacy/policy.js.map +1 -0
  112. package/dist/privacy/retention.d.ts +79 -0
  113. package/dist/privacy/retention.d.ts.map +1 -0
  114. package/dist/privacy/retention.js +133 -0
  115. package/dist/privacy/retention.js.map +1 -0
  116. package/dist/web/conversation.d.ts +9 -1
  117. package/dist/web/conversation.d.ts.map +1 -1
  118. package/dist/web/conversation.js +68 -7
  119. package/dist/web/conversation.js.map +1 -1
  120. package/dist/web/index.d.ts +1 -0
  121. package/dist/web/index.d.ts.map +1 -1
  122. package/dist/web/index.js +1 -0
  123. package/dist/web/index.js.map +1 -1
  124. package/dist/web/maintenance.d.ts.map +1 -1
  125. package/dist/web/maintenance.js +7 -2
  126. package/dist/web/maintenance.js.map +1 -1
  127. package/dist/web/routes.d.ts.map +1 -1
  128. package/dist/web/routes.js +4 -0
  129. package/dist/web/routes.js.map +1 -1
  130. package/dist/web/well-known.d.ts +21 -0
  131. package/dist/web/well-known.d.ts.map +1 -0
  132. package/dist/web/well-known.js +66 -0
  133. package/dist/web/well-known.js.map +1 -0
  134. package/dist/webmention/fetch-public.d.ts +34 -0
  135. package/dist/webmention/fetch-public.d.ts.map +1 -0
  136. package/dist/webmention/fetch-public.js +101 -0
  137. package/dist/webmention/fetch-public.js.map +1 -0
  138. package/dist/webmention/reply-context.d.ts.map +1 -1
  139. package/dist/webmention/reply-context.js +12 -89
  140. package/dist/webmention/reply-context.js.map +1 -1
  141. package/package.json +1 -1
  142. package/templates/site/content/_data/site.json +7 -1
  143. package/templates/site/content/pages/privacy.md +127 -0
  144. package/themes/default/README.md +38 -19
@@ -3,8 +3,21 @@ import type { ResolvedConfig } from '../config.ts';
3
3
  import type { GeekityEnv } from '../env.ts';
4
4
  /** Where the admin lives. Everything under it needs a session. */
5
5
  export declare const ADMIN_PREFIX = "/admin";
6
- /** Name of the cookie holding the session id. */
6
+ /**
7
+ * Name of the cookie holding the session id over plain http, and the name it
8
+ * had everywhere before TASK-132. Under https the cookie is
9
+ * {@link SECURE_SESSION_COOKIE}; {@link sessionCookieName} picks.
10
+ */
7
11
  export declare const SESSION_COOKIE = "geekity_session";
12
+ /**
13
+ * Name of the session cookie under https.
14
+ *
15
+ * A browser accepts a `__Host-` cookie only when it is `Secure`, has `Path=/`
16
+ * and names no `Domain`, so nothing on a sibling subdomain can set or
17
+ * overwrite it. A plain-http origin cannot set a `Secure` cookie at all, which
18
+ * is why local development on `http://localhost` keeps {@link SESSION_COOKIE}.
19
+ */
20
+ export declare const SECURE_SESSION_COOKIE = "__Host-geekity_session";
8
21
  /** Name of the hidden field every mutating admin form carries. */
9
22
  export declare const CSRF_FIELD = "csrf_token";
10
23
  /**
@@ -34,6 +47,8 @@ export declare function usesSecureCookies(config: Pick<ResolvedConfig, 'baseUrl'
34
47
  * validator.
35
48
  */
36
49
  export declare const SESSION_COOKIE_PATH = "/";
50
+ /** The session cookie's name for this site: {@link SECURE_SESSION_COOKIE} under https. */
51
+ export declare function sessionCookieName(config: Pick<ResolvedConfig, 'baseUrl'>): string;
37
52
  /**
38
53
  * Put the session id in the response's cookie.
39
54
  *
@@ -48,6 +63,32 @@ export declare function setSessionCookie(c: Context<GeekityEnv>, sessionId: stri
48
63
  export declare function clearSessionCookie(c: Context<GeekityEnv>, config: ResolvedConfig): void;
49
64
  /** The session id the request carries, or `undefined`. */
50
65
  export declare function sessionIdFrom(c: Context<GeekityEnv>): string | undefined;
66
+ /**
67
+ * Retire a session cookie set under the old name before the site moved to
68
+ * `__Host-` (TASK-132), and answer whether it was somebody's login.
69
+ *
70
+ * The old cookie is never taken as a session under https: accepting it would
71
+ * let a sibling subdomain plant a session again, which is the one thing the
72
+ * prefix is for. So its row is deleted and the browser is told to drop it, and
73
+ * the person signs in once more. Over plain http the two names are one and
74
+ * there is nothing to retire.
75
+ */
76
+ export declare function retireOldSessionCookie(c: Context<GeekityEnv>): boolean;
77
+ /**
78
+ * Whether the browser says this state-changing request came from another site.
79
+ *
80
+ * `Sec-Fetch-Site` is set by the browser and cannot be written by a page, so a
81
+ * `cross-site` or `same-site` POST is a form or `fetch` on a page that is not
82
+ * this origin, refused before any handler runs and whatever token it carries.
83
+ * `same-site` is refused too, because a sibling subdomain is exactly the
84
+ * neighbour the `__Host-` cookie keeps out. `same-origin` and `none` (the
85
+ * person typed or bookmarked it) pass, and so does a request with no header
86
+ * at all, from an older browser or a script, which the CSRF token still
87
+ * guards.
88
+ */
89
+ export declare function crossSiteWrite(c: Context<GeekityEnv>): boolean;
90
+ /** What a refused cross-site write is told, in the admin and on a comment. */
91
+ export declare const CROSS_SITE_REFUSAL = "That request came from another site, so it was refused.";
51
92
  /**
52
93
  * Whether a submitted token is this session's, compared in constant time.
53
94
  *
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/admin/session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAGpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,kEAAkE;AAClE,eAAO,MAAM,YAAY,WAAW,CAAC;AAErC,iDAAiD;AACjD,eAAO,MAAM,cAAc,oBAAoB,CAAC;AAEhD,kEAAkE;AAClE,eAAO,MAAM,UAAU,eAAe,CAAC;AAEvC;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,GAAG,OAAO,CAMlF;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAEvC;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,EACtB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACrD,IAAI,CAQN;AAED,sFAAsF;AACtF,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAOvF;AAED,0DAA0D;AAC1D,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,SAAS,CAGxE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,CAG9E"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/admin/session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAGpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,kEAAkE;AAClE,eAAO,MAAM,YAAY,WAAW,CAAC;AAErC;;;;GAIG;AACH,eAAO,MAAM,cAAc,oBAAoB,CAAC;AAEhD;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,2BAA6B,CAAC;AAEhE,kEAAkE;AAClE,eAAO,MAAM,UAAU,eAAe,CAAC;AAEvC;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,GAAG,OAAO,CAMlF;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAEvC,0FAA0F;AAC1F,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,GAAG,MAAM,CAEjF;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,EACtB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACrD,IAAI,CAQN;AAED,sFAAsF;AACtF,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAOvF;AAED,0DAA0D;AAC1D,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,SAAS,CAExE;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAetE;AAUD;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAI9D;AAED,8EAA8E;AAC9E,eAAO,MAAM,kBAAkB,4DAA4D,CAAC;AAE5F;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,CAG9E"}
@@ -2,8 +2,21 @@ import { timingSafeEqual } from 'node:crypto';
2
2
  import { deleteCookie, getCookie, setCookie } from 'hono/cookie';
3
3
  /** Where the admin lives. Everything under it needs a session. */
4
4
  export const ADMIN_PREFIX = '/admin';
5
- /** Name of the cookie holding the session id. */
5
+ /**
6
+ * Name of the cookie holding the session id over plain http, and the name it
7
+ * had everywhere before TASK-132. Under https the cookie is
8
+ * {@link SECURE_SESSION_COOKIE}; {@link sessionCookieName} picks.
9
+ */
6
10
  export const SESSION_COOKIE = 'geekity_session';
11
+ /**
12
+ * Name of the session cookie under https.
13
+ *
14
+ * A browser accepts a `__Host-` cookie only when it is `Secure`, has `Path=/`
15
+ * and names no `Domain`, so nothing on a sibling subdomain can set or
16
+ * overwrite it. A plain-http origin cannot set a `Secure` cookie at all, which
17
+ * is why local development on `http://localhost` keeps {@link SESSION_COOKIE}.
18
+ */
19
+ export const SECURE_SESSION_COOKIE = `__Host-${SESSION_COOKIE}`;
7
20
  /** Name of the hidden field every mutating admin form carries. */
8
21
  export const CSRF_FIELD = 'csrf_token';
9
22
  /**
@@ -40,6 +53,10 @@ export function usesSecureCookies(config) {
40
53
  * validator.
41
54
  */
42
55
  export const SESSION_COOKIE_PATH = '/';
56
+ /** The session cookie's name for this site: {@link SECURE_SESSION_COOKIE} under https. */
57
+ export function sessionCookieName(config) {
58
+ return usesSecureCookies(config) ? SECURE_SESSION_COOKIE : SESSION_COOKIE;
59
+ }
43
60
  /**
44
61
  * Put the session id in the response's cookie.
45
62
  *
@@ -47,7 +64,7 @@ export const SESSION_COOKIE_PATH = '/';
47
64
  * cross-site POSTs, belt to the CSRF token's braces.
48
65
  */
49
66
  export function setSessionCookie(c, sessionId, options) {
50
- setCookie(c, SESSION_COOKIE, sessionId, {
67
+ setCookie(c, sessionCookieName(options.config), sessionId, {
51
68
  path: SESSION_COOKIE_PATH,
52
69
  httpOnly: true,
53
70
  sameSite: 'Lax',
@@ -57,7 +74,7 @@ export function setSessionCookie(c, sessionId, options) {
57
74
  }
58
75
  /** Drop the session cookie. The attributes have to match the ones it was set with. */
59
76
  export function clearSessionCookie(c, config) {
60
- deleteCookie(c, SESSION_COOKIE, {
77
+ deleteCookie(c, sessionCookieName(config), {
61
78
  path: SESSION_COOKIE_PATH,
62
79
  httpOnly: true,
63
80
  sameSite: 'Lax',
@@ -66,9 +83,62 @@ export function clearSessionCookie(c, config) {
66
83
  }
67
84
  /** The session id the request carries, or `undefined`. */
68
85
  export function sessionIdFrom(c) {
69
- const value = getCookie(c, SESSION_COOKIE);
86
+ return cookieOrUndefined(c, sessionCookieName(c.var.config));
87
+ }
88
+ /**
89
+ * Retire a session cookie set under the old name before the site moved to
90
+ * `__Host-` (TASK-132), and answer whether it was somebody's login.
91
+ *
92
+ * The old cookie is never taken as a session under https: accepting it would
93
+ * let a sibling subdomain plant a session again, which is the one thing the
94
+ * prefix is for. So its row is deleted and the browser is told to drop it, and
95
+ * the person signs in once more. Over plain http the two names are one and
96
+ * there is nothing to retire.
97
+ */
98
+ export function retireOldSessionCookie(c) {
99
+ const config = c.var.config;
100
+ if (!usesSecureCookies(config))
101
+ return false;
102
+ const id = cookieOrUndefined(c, SESSION_COOKIE);
103
+ if (id === undefined)
104
+ return false;
105
+ const session = c.var.admin.getSession(id);
106
+ if (session !== undefined)
107
+ c.var.admin.deleteSession(session.id);
108
+ deleteCookie(c, SESSION_COOKIE, {
109
+ path: SESSION_COOKIE_PATH,
110
+ httpOnly: true,
111
+ sameSite: 'Lax',
112
+ secure: true,
113
+ });
114
+ return session?.userId != null;
115
+ }
116
+ function cookieOrUndefined(c, name) {
117
+ const value = getCookie(c, name);
70
118
  return value === undefined || value === '' ? undefined : value;
71
119
  }
120
+ /** Methods that change nothing, and so need neither a token nor Fetch Metadata. */
121
+ const SAFE_METHODS = new Set(['GET', 'HEAD', 'OPTIONS']);
122
+ /**
123
+ * Whether the browser says this state-changing request came from another site.
124
+ *
125
+ * `Sec-Fetch-Site` is set by the browser and cannot be written by a page, so a
126
+ * `cross-site` or `same-site` POST is a form or `fetch` on a page that is not
127
+ * this origin, refused before any handler runs and whatever token it carries.
128
+ * `same-site` is refused too, because a sibling subdomain is exactly the
129
+ * neighbour the `__Host-` cookie keeps out. `same-origin` and `none` (the
130
+ * person typed or bookmarked it) pass, and so does a request with no header
131
+ * at all, from an older browser or a script, which the CSRF token still
132
+ * guards.
133
+ */
134
+ export function crossSiteWrite(c) {
135
+ if (SAFE_METHODS.has(c.req.method))
136
+ return false;
137
+ const site = c.req.header('sec-fetch-site');
138
+ return site === 'cross-site' || site === 'same-site';
139
+ }
140
+ /** What a refused cross-site write is told, in the admin and on a comment. */
141
+ export const CROSS_SITE_REFUSAL = 'That request came from another site, so it was refused.';
72
142
  /**
73
143
  * Whether a submitted token is this session's, compared in constant time.
74
144
  *
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/admin/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAKjE,kEAAkE;AAClE,MAAM,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAC;AAErC,iDAAiD;AACjD,MAAM,CAAC,MAAM,cAAc,GAAG,iBAAiB,CAAC;AAEhD,kEAAkE;AAClE,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC;AAEvC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAuC;IACvE,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEvC;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,CAAsB,EACtB,SAAiB,EACjB,OAAsD;IAEtD,SAAS,CAAC,CAAC,EAAE,cAAc,EAAE,SAAS,EAAE;QACtC,IAAI,EAAE,mBAAmB;QACzB,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC;QACzC,OAAO,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;KACrC,CAAC,CAAC;AACL,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,kBAAkB,CAAC,CAAsB,EAAE,MAAsB;IAC/E,YAAY,CAAC,CAAC,EAAE,cAAc,EAAE;QAC9B,IAAI,EAAE,mBAAmB;QACzB,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC;KAClC,CAAC,CAAC;AACL,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,aAAa,CAAC,CAAsB;IAClD,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;IAC3C,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AACjE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB,EAAE,SAAkB;IACnE,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxF,OAAO,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AACxF,CAAC"}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/admin/session.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"settings-discussion.d.ts","sourceRoot":"","sources":["../../src/admin/settings-discussion.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,OAAO,KAAK,EAAwB,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAI7E;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,4BAA6B,CAAC;AAEvD,yCAAyC;AACzC,eAAO,MAAM,cAAc;aAAK,GAAG,EAAE,aAAa;aAAE,MAAM,EAAE,QAAQ;CAAW,CAAC;AAEhF,oEAAoE;AACpE,eAAO,MAAM,cAAc,WAAW,CAAC;AAEvC,oCAAoC;AACpC,eAAO,MAAM,mBAAmB,EAAE,YAUjC,CAAC;AA0DF;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA6BrE"}
1
+ {"version":3,"file":"settings-discussion.d.ts","sourceRoot":"","sources":["../../src/admin/settings-discussion.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,OAAO,KAAK,EAAwB,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAI7E;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,4BAA6B,CAAC;AAEvD,yCAAyC;AACzC,eAAO,MAAM,cAAc;aAAK,GAAG,EAAE,aAAa;aAAE,MAAM,EAAE,QAAQ;CAAW,CAAC;AAEhF,oEAAoE;AACpE,eAAO,MAAM,cAAc,WAAW,CAAC;AAEvC,oCAAoC;AACpC,eAAO,MAAM,mBAAmB,EAAE,YAkBjC,CAAC;AA0DF;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA6BrE"}
@@ -30,7 +30,15 @@ export const DISCUSSION_SETTINGS = {
30
30
  label: 'Discussion',
31
31
  path: settingsPagePath('discussion'),
32
32
  template: ADMIN_TEMPLATES.settingsDiscussion,
33
- fields: ['comments', 'commentsCloseAfterDays', 'webmentionsSend', 'webmentionsReceive'],
33
+ fields: [
34
+ 'comments',
35
+ 'commentsCloseAfterDays',
36
+ 'webmentionsSend',
37
+ 'webmentionsReceive',
38
+ 'commentEmailRetentionDays',
39
+ 'addressHashRetentionDays',
40
+ 'contactMessageRetentionDays',
41
+ ],
34
42
  panels: (c) => akismetPanel(c.var.config.dataDir),
35
43
  endpoints: mountAkismet,
36
44
  };
@@ -1 +1 @@
1
- {"version":3,"file":"settings-discussion.js","sourceRoot":"","sources":["../../src/admin/settings-discussion.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"settings-discussion.js","sourceRoot":"","sources":["../../src/admin/settings-discussion.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"settings-email.d.ts","sourceRoot":"","sources":["../../src/admin/settings-email.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAcH,OAAO,KAAK,EAAwB,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGlD;;;;;;;;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,YAU5B,CAAC;AA+GF;;;;;;;;;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;;;;;;;GAOG;AAcH,OAAO,KAAK,EAAwB,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGlD;;;;;;;;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+GF;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA2C1F"}
@@ -46,7 +46,16 @@ export const EMAIL_SETTINGS = {
46
46
  label: 'Email',
47
47
  path: settingsPagePath('email'),
48
48
  template: ADMIN_TEMPLATES.settingsEmail,
49
- fields: ['mailProvider', 'mailFromName', 'mailFromAddress', 'mailReplyTo', 'contactEmail'],
49
+ fields: [
50
+ 'mailProvider',
51
+ 'mailFromName',
52
+ 'mailFromAddress',
53
+ 'mailReplyTo',
54
+ 'contactEmail',
55
+ 'securityContacts',
56
+ 'securityPolicy',
57
+ 'securityLanguages',
58
+ ],
50
59
  panels: (c, settings) => mailPanel(c.var.config.dataDir, settings),
51
60
  endpoints: mountMail,
52
61
  };
@@ -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,3 +1,4 @@
1
+ import type { RetentionPolicy } from '../privacy/policy.ts';
1
2
  import type { ResolvedConfig } from '../config.ts';
2
3
  import type { MailProviderName } from '../mail/provider.ts';
3
4
  import type { NavigationMenus } from '../web/navigation.ts';
@@ -121,6 +122,19 @@ export interface SiteSettings {
121
122
  * for itself with `comments: true` or `comments: false` in its front matter.
122
123
  */
123
124
  commentsCloseAfterDays: number;
125
+ /**
126
+ * How many days a comment keeps its author's email (TASK-135). Zero keeps it
127
+ * forever. Past it the email is removed from the comment file and the index,
128
+ * and with it the author's subscription to replies.
129
+ */
130
+ commentEmailRetentionDays: number;
131
+ /**
132
+ * How many days a comment or a contact message keeps the salted hash of the
133
+ * address it came from. Zero keeps it forever.
134
+ */
135
+ addressHashRetentionDays: number;
136
+ /** How many days a contact message is kept at all. Zero keeps it forever. */
137
+ contactMessageRetentionDays: number;
124
138
  /**
125
139
  * Whether the site tells the pages a post links to that it has (TASK-51).
126
140
  *
@@ -173,6 +187,23 @@ export interface SiteSettings {
173
187
  * in the HTML of the page the form is on however a theme is written.
174
188
  */
175
189
  contactEmail: string;
190
+ /**
191
+ * Where a security researcher reports a vulnerability: the `Contact` lines
192
+ * of `/.well-known/security.txt` (RFC 9116, TASK-133), each a `mailto:`,
193
+ * `https:` or `tel:` URI, in the order the site prefers them.
194
+ *
195
+ * Empty means the site answers that path with a 404. There is no fallback
196
+ * to {@link SiteSettings.contactEmail}: that address is promised never to
197
+ * appear on the public site, and this one is published by definition.
198
+ */
199
+ securityContacts: readonly string[];
200
+ /** The `Policy` line of security.txt: an https URL, or empty for none. */
201
+ securityPolicy: string;
202
+ /**
203
+ * The `Preferred-Languages` line of security.txt: language tags joined by
204
+ * `, `, or empty for none.
205
+ */
206
+ securityLanguages: string;
176
207
  /**
177
208
  * The relay inboxes the site subscribes to (FEP-ae0c): a Mastodon-style
178
209
  * relay boosts every public post it is sent, which is how a small site
@@ -261,6 +292,9 @@ export declare const SETTINGS_FIELDS: {
261
292
  readonly categoryBase: 'category_base';
262
293
  readonly comments: 'comments';
263
294
  readonly commentsCloseAfterDays: 'comments_close_after_days';
295
+ readonly commentEmailRetentionDays: 'comment_email_retention_days';
296
+ readonly addressHashRetentionDays: 'address_hash_retention_days';
297
+ readonly contactMessageRetentionDays: 'contact_message_retention_days';
264
298
  readonly webmentionsSend: 'webmentions_send';
265
299
  readonly webmentionsReceive: 'webmentions_receive';
266
300
  readonly notifyServer: 'notify_server';
@@ -269,6 +303,9 @@ export declare const SETTINGS_FIELDS: {
269
303
  readonly mailFromAddress: 'mail_from_address';
270
304
  readonly mailReplyTo: 'mail_reply_to';
271
305
  readonly contactEmail: 'contact_email';
306
+ readonly securityContacts: 'security_contacts';
307
+ readonly securityPolicy: 'security_policy';
308
+ readonly securityLanguages: 'security_languages';
272
309
  readonly relays: 'relays';
273
310
  readonly wordpressActivityPub: 'wordpress_activitypub';
274
311
  };
@@ -434,4 +471,6 @@ export declare function relayList(value: string): string[];
434
471
  * an origin, and some relays hang one off a query string.
435
472
  */
436
473
  export declare function normalizeRelayInbox(value: string): string | undefined;
474
+ /** The three retention periods, as the sweep reads them. */
475
+ export declare function retentionPolicyOf(settings: SiteSettings): RetentionPolicy;
437
476
  //# sourceMappingURL=settings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/admin/settings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/admin/settings.ts"],"names":[],"mappings":"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"}
@@ -57,6 +57,11 @@ export const DEFAULT_SITE_SETTINGS = {
57
57
  categoryBase: DEFAULT_TAXONOMY_BASES.category,
58
58
  comments: true,
59
59
  commentsCloseAfterDays: DEFAULT_COMMENTS_CLOSE_AFTER_DAYS,
60
+ // Forever, so a site that upgrades loses nothing it never chose to lose.
61
+ // `geekity init` writes the recommended periods for a new site.
62
+ commentEmailRetentionDays: 0,
63
+ addressHashRetentionDays: 0,
64
+ contactMessageRetentionDays: 0,
60
65
  webmentionsSend: true,
61
66
  webmentionsReceive: true,
62
67
  notifyServer: DEFAULT_NOTIFY_SERVER,
@@ -65,6 +70,9 @@ export const DEFAULT_SITE_SETTINGS = {
65
70
  mailFromAddress: '',
66
71
  mailReplyTo: '',
67
72
  contactEmail: '',
73
+ securityContacts: [],
74
+ securityPolicy: '',
75
+ securityLanguages: '',
68
76
  relays: [],
69
77
  wordpressActivityPub: false,
70
78
  menus: {},
@@ -86,6 +94,9 @@ export const SETTINGS_FIELDS = {
86
94
  categoryBase: 'category_base',
87
95
  comments: 'comments',
88
96
  commentsCloseAfterDays: 'comments_close_after_days',
97
+ commentEmailRetentionDays: 'comment_email_retention_days',
98
+ addressHashRetentionDays: 'address_hash_retention_days',
99
+ contactMessageRetentionDays: 'contact_message_retention_days',
89
100
  webmentionsSend: 'webmentions_send',
90
101
  webmentionsReceive: 'webmentions_receive',
91
102
  notifyServer: 'notify_server',
@@ -94,6 +105,9 @@ export const SETTINGS_FIELDS = {
94
105
  mailFromAddress: 'mail_from_address',
95
106
  mailReplyTo: 'mail_reply_to',
96
107
  contactEmail: 'contact_email',
108
+ securityContacts: 'security_contacts',
109
+ securityPolicy: 'security_policy',
110
+ securityLanguages: 'security_languages',
97
111
  relays: 'relays',
98
112
  wordpressActivityPub: 'wordpress_activitypub',
99
113
  };
@@ -155,6 +169,9 @@ export function settingsFromSiteJson(file) {
155
169
  ...(Number.isInteger(closeAfterDays) && closeAfterDays >= 0
156
170
  ? { commentsCloseAfterDays: closeAfterDays }
157
171
  : {}),
172
+ ...wholeDays(file, 'commentEmailRetentionDays'),
173
+ ...wholeDays(file, 'addressHashRetentionDays'),
174
+ ...wholeDays(file, 'contactMessageRetentionDays'),
158
175
  ...(typeof file['webmentionsSend'] === 'boolean'
159
176
  ? { webmentionsSend: file['webmentionsSend'] }
160
177
  : {}),
@@ -175,6 +192,20 @@ export function settingsFromSiteJson(file) {
175
192
  : {}),
176
193
  ...(typeof file['mailReplyTo'] === 'string' ? { mailReplyTo: file['mailReplyTo'] } : {}),
177
194
  ...(typeof file['contactEmail'] === 'string' ? { contactEmail: file['contactEmail'] } : {}),
195
+ // Through the form's own normalisers, and dropped when they refuse: these
196
+ // three are printed line by line into security.txt, so a hand edit with a
197
+ // line break in it must not become a field nobody set.
198
+ ...(Array.isArray(file['securityContacts'])
199
+ ? {
200
+ securityContacts: securityContactList(file['securityContacts'].filter((entry) => typeof entry === 'string').join('\n')),
201
+ }
202
+ : {}),
203
+ ...(typeof file['securityPolicy'] === 'string'
204
+ ? { securityPolicy: normalizeSecurityPolicy(file['securityPolicy']) ?? '' }
205
+ : {}),
206
+ ...(typeof file['securityLanguages'] === 'string'
207
+ ? { securityLanguages: normalizeLanguageList(file['securityLanguages']) ?? '' }
208
+ : {}),
178
209
  // Through the same normaliser a submitted form goes through, so the file
179
210
  // and the screen cannot mean different things by the same line.
180
211
  ...(Array.isArray(file['relays'])
@@ -233,6 +264,9 @@ export function siteJsonFor(settings, existing = {}) {
233
264
  categoryBase: settings.categoryBase,
234
265
  comments: settings.comments,
235
266
  commentsCloseAfterDays: settings.commentsCloseAfterDays,
267
+ commentEmailRetentionDays: settings.commentEmailRetentionDays,
268
+ addressHashRetentionDays: settings.addressHashRetentionDays,
269
+ contactMessageRetentionDays: settings.contactMessageRetentionDays,
236
270
  webmentionsSend: settings.webmentionsSend,
237
271
  webmentionsReceive: settings.webmentionsReceive,
238
272
  notifyServer: settings.notifyServer,
@@ -241,6 +275,9 @@ export function siteJsonFor(settings, existing = {}) {
241
275
  mailFromAddress: settings.mailFromAddress,
242
276
  mailReplyTo: settings.mailReplyTo,
243
277
  contactEmail: settings.contactEmail,
278
+ securityContacts: [...settings.securityContacts],
279
+ securityPolicy: settings.securityPolicy,
280
+ securityLanguages: settings.securityLanguages,
244
281
  relays: [...settings.relays],
245
282
  // Every menu the site holds, written whole. A settings page never has
246
283
  // them off its own form — it reads them out of the file inside the write
@@ -477,6 +514,9 @@ const FIELD_CHECKS = {
477
514
  ? 'Comments close after a whole number of days, or 0 for never.'
478
515
  : undefined;
479
516
  },
517
+ commentEmailRetentionDays: (form) => retentionProblem(form.commentEmailRetentionDays),
518
+ addressHashRetentionDays: (form) => retentionProblem(form.addressHashRetentionDays),
519
+ contactMessageRetentionDays: (form) => retentionProblem(form.contactMessageRetentionDays),
480
520
  webmentionsSend: () => undefined,
481
521
  webmentionsReceive: () => undefined,
482
522
  // Empty is a value here — it is how a site turns real-time notification off
@@ -503,6 +543,21 @@ const FIELD_CHECKS = {
503
543
  contactEmail: (form) => form.contactEmail.trim() !== '' && !EMAIL_PATTERN.test(form.contactEmail.trim())
504
544
  ? 'A contact address is an email address, such as hello@example.com, or empty for the first admin with one.'
505
545
  : undefined,
546
+ // Line by line, like the relays, and for the same reason.
547
+ securityContacts: (form) => {
548
+ const bad = relayLines(form.securityContacts).find((line) => normalizeSecurityContact(line) === undefined);
549
+ return bad === undefined
550
+ ? undefined
551
+ : 'A security contact is an email address, an https:// URL or a tel: number, one per line. ' +
552
+ `"${bad}" is not one.`;
553
+ },
554
+ // RFC 9116 wants every web URI in the file to be https.
555
+ securityPolicy: (form) => form.securityPolicy.trim() !== '' && normalizeSecurityPolicy(form.securityPolicy) === undefined
556
+ ? 'A security policy is an https:// URL, or empty for none.'
557
+ : undefined,
558
+ securityLanguages: (form) => normalizeLanguageList(form.securityLanguages) === undefined
559
+ ? 'Preferred languages are language tags separated by commas, such as en, fr, or empty for none.'
560
+ : undefined,
506
561
  // A relay list is checked line by line, and the first bad line is what the
507
562
  // field says: a textarea has one message, and pointing at the line somebody
508
563
  // has to fix is more use than counting how many are wrong.
@@ -575,6 +630,9 @@ export function settingsFromForm(form, carried = {}) {
575
630
  // empty string here means.
576
631
  comments: form.comments !== '',
577
632
  commentsCloseAfterDays: Number(form.commentsCloseAfterDays),
633
+ commentEmailRetentionDays: Number(form.commentEmailRetentionDays),
634
+ addressHashRetentionDays: Number(form.addressHashRetentionDays),
635
+ contactMessageRetentionDays: Number(form.contactMessageRetentionDays),
578
636
  webmentionsSend: form.webmentionsSend !== '',
579
637
  webmentionsReceive: form.webmentionsReceive !== '',
580
638
  notifyServer: normalizeBaseUrl(form.notifyServer) ?? '',
@@ -585,6 +643,9 @@ export function settingsFromForm(form, carried = {}) {
585
643
  mailFromAddress: form.mailFromAddress.trim(),
586
644
  mailReplyTo: form.mailReplyTo.trim(),
587
645
  contactEmail: form.contactEmail.trim(),
646
+ securityContacts: securityContactList(form.securityContacts),
647
+ securityPolicy: normalizeSecurityPolicy(form.securityPolicy) ?? '',
648
+ securityLanguages: normalizeLanguageList(form.securityLanguages) ?? '',
588
649
  relays: relayList(form.relays),
589
650
  wordpressActivityPub: form.wordpressActivityPub !== '',
590
651
  };
@@ -606,6 +667,9 @@ export function formFromSettings(settings) {
606
667
  categoryBase: settings.categoryBase,
607
668
  comments: settings.comments ? '1' : '',
608
669
  commentsCloseAfterDays: String(settings.commentsCloseAfterDays),
670
+ commentEmailRetentionDays: String(settings.commentEmailRetentionDays),
671
+ addressHashRetentionDays: String(settings.addressHashRetentionDays),
672
+ contactMessageRetentionDays: String(settings.contactMessageRetentionDays),
609
673
  webmentionsSend: settings.webmentionsSend ? '1' : '',
610
674
  webmentionsReceive: settings.webmentionsReceive ? '1' : '',
611
675
  notifyServer: settings.notifyServer,
@@ -614,6 +678,9 @@ export function formFromSettings(settings) {
614
678
  mailFromAddress: settings.mailFromAddress,
615
679
  mailReplyTo: settings.mailReplyTo,
616
680
  contactEmail: settings.contactEmail,
681
+ securityContacts: settings.securityContacts.join('\n'),
682
+ securityPolicy: settings.securityPolicy,
683
+ securityLanguages: settings.securityLanguages,
617
684
  relays: settings.relays.join('\n'),
618
685
  wordpressActivityPub: settings.wordpressActivityPub ? '1' : '',
619
686
  };
@@ -714,6 +781,59 @@ export function normalizeRelayInbox(value) {
714
781
  const href = parsed.href;
715
782
  return href.endsWith('/') && parsed.pathname !== '/' ? href.slice(0, -1) : href;
716
783
  }
784
+ /** A security contact textarea as its URIs, in order, repeats dropped. */
785
+ function securityContactList(value) {
786
+ const contacts = [];
787
+ for (const line of relayLines(value)) {
788
+ const contact = normalizeSecurityContact(line);
789
+ if (contact !== undefined && !contacts.includes(contact))
790
+ contacts.push(contact);
791
+ }
792
+ return contacts;
793
+ }
794
+ /** A phone number as a `tel:` URI writes it: digits and visual separators. */
795
+ const TEL_PATTERN = /^tel:\+?[0-9][0-9().-]*$/i;
796
+ /**
797
+ * One security contact as the URI security.txt carries, or `undefined`.
798
+ *
799
+ * A bare address is taken as the `mailto:` it means, since that is what
800
+ * somebody filling in a settings form types.
801
+ */
802
+ function normalizeSecurityContact(value) {
803
+ const trimmed = value.trim();
804
+ const address = trimmed.toLowerCase().startsWith('mailto:') ? trimmed.slice(7) : trimmed;
805
+ if (EMAIL_PATTERN.test(address))
806
+ return `mailto:${address}`;
807
+ if (TEL_PATTERN.test(trimmed))
808
+ return `tel:${trimmed.slice(4)}`;
809
+ return httpsUrl(trimmed);
810
+ }
811
+ /** A security policy URL, or `undefined` when it is not an https one. */
812
+ function normalizeSecurityPolicy(value) {
813
+ return httpsUrl(value.trim());
814
+ }
815
+ /** An absolute https URL as `URL` spells it, or `undefined`. */
816
+ function httpsUrl(value) {
817
+ let parsed;
818
+ try {
819
+ parsed = new URL(value);
820
+ }
821
+ catch {
822
+ return undefined;
823
+ }
824
+ return parsed.protocol === 'https:' ? parsed.href : undefined;
825
+ }
826
+ /**
827
+ * A comma-separated list of language tags, joined the way RFC 9116's example
828
+ * writes them, or `undefined` when one of them is not a tag. Empty is a value.
829
+ */
830
+ function normalizeLanguageList(value) {
831
+ const tags = value
832
+ .split(',')
833
+ .map((tag) => tag.trim())
834
+ .filter((tag) => tag !== '');
835
+ return tags.every((tag) => LANGUAGE_TAG_PATTERN.test(tag)) ? tags.join(', ') : undefined;
836
+ }
717
837
  /**
718
838
  * What a page slug may be made of on this screen: the shape
719
839
  * {@link slugify} produces, which is what the editor writes.
@@ -759,4 +879,28 @@ function parseSiteJson(source) {
759
879
  ? parsed
760
880
  : {};
761
881
  }
882
+ /** The three retention periods, as the sweep reads them. */
883
+ export function retentionPolicyOf(settings) {
884
+ return {
885
+ commentEmailDays: settings.commentEmailRetentionDays,
886
+ addressHashDays: settings.addressHashRetentionDays,
887
+ contactMessageDays: settings.contactMessageRetentionDays,
888
+ };
889
+ }
890
+ /** A retention key from `site.json`, when it holds a whole number of days. */
891
+ function wholeDays(file, key) {
892
+ const days = file[key];
893
+ return typeof days === 'number' && Number.isInteger(days) && days >= 0 ? { [key]: days } : {};
894
+ }
895
+ /**
896
+ * What is wrong with a typed retention period, if anything. Empty is refused
897
+ * rather than read as zero, because zero keeps the data forever and a cleared
898
+ * field should not be how a site says that.
899
+ */
900
+ function retentionProblem(typed) {
901
+ const days = Number(typed.trim());
902
+ return typed.trim() === '' || !Number.isInteger(days) || days < 0
903
+ ? 'Keep it for a whole number of days, or 0 to keep it forever.'
904
+ : undefined;
905
+ }
762
906
  //# sourceMappingURL=settings.js.map