@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.
- package/README.md +292 -45
- package/admin/pages/comments/all.njk +3 -0
- package/admin/pages/settings/discussion.njk +53 -0
- package/admin/pages/settings/email.njk +20 -0
- package/admin/pages/tools/personal-data.njk +67 -0
- package/admin/pages/users/edit.njk +1 -1
- package/dist/admin/comments.d.ts +5 -0
- package/dist/admin/comments.d.ts.map +1 -1
- package/dist/admin/comments.js +13 -0
- package/dist/admin/comments.js.map +1 -1
- package/dist/admin/headers.d.ts +14 -5
- package/dist/admin/headers.d.ts.map +1 -1
- package/dist/admin/headers.js +18 -6
- package/dist/admin/headers.js.map +1 -1
- package/dist/admin/index.d.ts +1 -1
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/menu.d.ts.map +1 -1
- package/dist/admin/menu.js +5 -1
- package/dist/admin/menu.js.map +1 -1
- package/dist/admin/personal-data.d.ts +35 -0
- package/dist/admin/personal-data.d.ts.map +1 -0
- package/dist/admin/personal-data.js +90 -0
- package/dist/admin/personal-data.js.map +1 -0
- package/dist/admin/routes.d.ts.map +1 -1
- package/dist/admin/routes.js +18 -2
- package/dist/admin/routes.js.map +1 -1
- package/dist/admin/session.d.ts +42 -1
- package/dist/admin/session.d.ts.map +1 -1
- package/dist/admin/session.js +74 -4
- package/dist/admin/session.js.map +1 -1
- package/dist/admin/settings-discussion.d.ts.map +1 -1
- package/dist/admin/settings-discussion.js +9 -1
- package/dist/admin/settings-discussion.js.map +1 -1
- package/dist/admin/settings-email.d.ts.map +1 -1
- package/dist/admin/settings-email.js +10 -1
- package/dist/admin/settings-email.js.map +1 -1
- package/dist/admin/settings.d.ts +39 -0
- package/dist/admin/settings.d.ts.map +1 -1
- package/dist/admin/settings.js +144 -0
- package/dist/admin/settings.js.map +1 -1
- package/dist/admin/store.d.ts +30 -0
- package/dist/admin/store.d.ts.map +1 -1
- package/dist/admin/store.js +68 -5
- package/dist/admin/store.js.map +1 -1
- package/dist/admin/templates.d.ts +1 -0
- package/dist/admin/templates.d.ts.map +1 -1
- package/dist/admin/templates.js +1 -0
- package/dist/admin/templates.js.map +1 -1
- package/dist/avatars/avatars.d.ts +112 -0
- package/dist/avatars/avatars.d.ts.map +1 -0
- package/dist/avatars/avatars.js +259 -0
- package/dist/avatars/avatars.js.map +1 -0
- package/dist/avatars/index.d.ts +4 -0
- package/dist/avatars/index.d.ts.map +1 -0
- package/dist/avatars/index.js +3 -0
- package/dist/avatars/index.js.map +1 -0
- package/dist/avatars/routes.d.ts +11 -0
- package/dist/avatars/routes.d.ts.map +1 -0
- package/dist/avatars/routes.js +33 -0
- package/dist/avatars/routes.js.map +1 -0
- package/dist/comments/records.d.ts +15 -0
- package/dist/comments/records.d.ts.map +1 -1
- package/dist/comments/records.js +51 -1
- package/dist/comments/records.js.map +1 -1
- package/dist/comments/routes.d.ts.map +1 -1
- package/dist/comments/routes.js +7 -1
- package/dist/comments/routes.js.map +1 -1
- package/dist/config.d.ts +24 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +57 -0
- package/dist/config.js.map +1 -1
- package/dist/contact/index.d.ts +1 -1
- package/dist/contact/index.d.ts.map +1 -1
- package/dist/contact/index.js +1 -1
- package/dist/contact/index.js.map +1 -1
- package/dist/contact/records.d.ts +8 -2
- package/dist/contact/records.d.ts.map +1 -1
- package/dist/contact/records.js +13 -6
- package/dist/contact/records.js.map +1 -1
- package/dist/env.d.ts +6 -0
- package/dist/env.d.ts.map +1 -1
- package/dist/federation/quotes.d.ts +2 -0
- package/dist/federation/quotes.d.ts.map +1 -1
- package/dist/federation/quotes.js +4 -0
- package/dist/federation/quotes.js.map +1 -1
- package/dist/federation/replies.d.ts +23 -0
- package/dist/federation/replies.d.ts.map +1 -1
- package/dist/federation/replies.js +47 -10
- package/dist/federation/replies.js.map +1 -1
- package/dist/index.d.ts +23 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +41 -7
- package/dist/index.js.map +1 -1
- package/dist/notifications/index.d.ts +1 -1
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js +1 -1
- package/dist/notifications/index.js.map +1 -1
- package/dist/notifications/optouts.d.ts +6 -0
- package/dist/notifications/optouts.d.ts.map +1 -1
- package/dist/notifications/optouts.js +17 -0
- package/dist/notifications/optouts.js.map +1 -1
- package/dist/privacy/erase.d.ts +45 -0
- package/dist/privacy/erase.d.ts.map +1 -0
- package/dist/privacy/erase.js +77 -0
- package/dist/privacy/erase.js.map +1 -0
- package/dist/privacy/policy.d.ts +32 -0
- package/dist/privacy/policy.d.ts.map +1 -0
- package/dist/privacy/policy.js +37 -0
- package/dist/privacy/policy.js.map +1 -0
- package/dist/privacy/retention.d.ts +79 -0
- package/dist/privacy/retention.d.ts.map +1 -0
- package/dist/privacy/retention.js +133 -0
- package/dist/privacy/retention.js.map +1 -0
- package/dist/web/conversation.d.ts +9 -1
- package/dist/web/conversation.d.ts.map +1 -1
- package/dist/web/conversation.js +68 -7
- package/dist/web/conversation.js.map +1 -1
- package/dist/web/index.d.ts +1 -0
- package/dist/web/index.d.ts.map +1 -1
- package/dist/web/index.js +1 -0
- package/dist/web/index.js.map +1 -1
- package/dist/web/maintenance.d.ts.map +1 -1
- package/dist/web/maintenance.js +7 -2
- package/dist/web/maintenance.js.map +1 -1
- package/dist/web/routes.d.ts.map +1 -1
- package/dist/web/routes.js +4 -0
- package/dist/web/routes.js.map +1 -1
- package/dist/web/well-known.d.ts +21 -0
- package/dist/web/well-known.d.ts.map +1 -0
- package/dist/web/well-known.js +66 -0
- package/dist/web/well-known.js.map +1 -0
- package/dist/webmention/fetch-public.d.ts +34 -0
- package/dist/webmention/fetch-public.d.ts.map +1 -0
- package/dist/webmention/fetch-public.js +101 -0
- package/dist/webmention/fetch-public.js.map +1 -0
- package/dist/webmention/reply-context.d.ts.map +1 -1
- package/dist/webmention/reply-context.js +12 -89
- package/dist/webmention/reply-context.js.map +1 -1
- package/package.json +1 -1
- package/templates/site/content/_data/site.json +7 -1
- package/templates/site/content/pages/privacy.md +127 -0
- package/themes/default/README.md +38 -19
package/dist/admin/session.d.ts
CHANGED
|
@@ -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
|
-
/**
|
|
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
|
|
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"}
|
package/dist/admin/session.js
CHANGED
|
@@ -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
|
-
/**
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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
|
|
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,
|
|
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: [
|
|
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":"AAAA;;;;;;GAMG;AAIH,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEjE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAClF,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,
|
|
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,
|
|
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: [
|
|
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":"AAAA;;;;;;;GAOG;AAKH,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEjE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE/E,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,aAAa,OAAO,CAAC;AAEjD,mEAAmE;AACnE,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,WAAW,EAAE,eAAe;IAC5B,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE,WAAW;IACrB,UAAU,EAAE,aAAa;IACzB,QAAQ,EAAE,WAAW;IACrB,YAAY,EAAE,eAAe;IAC7B,MAAM,EAAE,QAAQ;CACR,CAAC;AAEX,yEAAyE;AACzE,MAAM,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAC;AAEpC,8CAA8C;AAC9C,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,aAAa,YAAY,CAAC;AAE3D,mEAAmE;AACnE,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,EAAE,EAAE,IAAI,EAAW,CAAC;AAEtD,2EAA2E;AAC3E,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAEzC,+BAA+B;AAC/B,MAAM,CAAC,MAAM,cAAc,GAAiB;IAC1C,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,gBAAgB,CAAC,OAAO,CAAC;IAC/B,QAAQ,EAAE,eAAe,CAAC,aAAa;IACvC,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"settings-email.js","sourceRoot":"","sources":["../../src/admin/settings-email.ts"],"names":[],"mappings":"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"}
|
package/dist/admin/settings.d.ts
CHANGED
|
@@ -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":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAOnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAI5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAM5D,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG1E,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,YAAY,CAAC;AAE5D;;;GAGG;AACH,eAAO,MAAM,aAAa,oBAA6B,CAAC;AAExD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,oBAAoB,QAA8C,CAAC;AAEhF;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,QAAsC,CAAC;AAEjE;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,YAAY;IAC3B,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;;;;;OASG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;;;;;OAUG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;;;OAOG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB;;;;;;;OAOG;IACH,sBAAsB,EAAE,MAAM,CAAC;IAC/B;;;;;OAKG;IACH,eAAe,EAAE,OAAO,CAAC;IACzB;;;;;;;;OAQG;IACH,kBAAkB,EAAE,OAAO,CAAC;IAC5B;;;;;OAKG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;;OAMG;IACH,YAAY,EAAE,gBAAgB,CAAC;IAC/B,uEAAuE;IACvE,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,eAAe,EAAE,MAAM,CAAC;IACxB,gFAAgF;IAChF,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;;OAOG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;;;;;;OAUG;IACH,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B;;;;;;;;;;;OAWG;IACH,oBAAoB,EAAE,OAAO,CAAC;IAC9B;;;;;;;;;;OAUG;IACH,KAAK,EAAE,eAAe,CAAC;IACvB;;;;;;;;OAQG;IACH,iBAAiB,EAAE,SAAS,gBAAgB,EAAE,CAAC;CAChD;AAED;;;;;;GAMG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,YAAY,EAAE,mBAAmB,GAAG,OAAO,CAAC,CAAC;AAEvF;;;;;;;GAOG;AACH,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,mBAAmB,GAAG,OAAO,CAAC,CAAC,CAAC;AAEzF;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAE,
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/admin/settings.ts"],"names":[],"mappings":"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"}
|
package/dist/admin/settings.js
CHANGED
|
@@ -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
|