@ashlr/hub 3.3.0 → 3.3.2
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/CHANGELOG.md +46 -2
- package/README.md +51 -38
- package/dist/build-identity.json +2 -2
- package/dist/cli/completions.js +1 -2
- package/dist/cli/completions.js.map +1 -1
- package/dist/cli/dashboard.js +5 -4
- package/dist/cli/dashboard.js.map +1 -1
- package/dist/cli/help.js +7 -10
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/index.d.ts +0 -1
- package/dist/cli/index.js +0 -10
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/serve.js +7 -3
- package/dist/cli/serve.js.map +1 -1
- package/dist/cli/setup.d.ts +5 -3
- package/dist/cli/setup.js +14 -7
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/update.js +3 -1
- package/dist/cli/update.js.map +1 -1
- package/dist/core/daemon/activation-permit.d.ts +33 -268
- package/dist/core/daemon/activation-permit.js +106 -1111
- package/dist/core/daemon/activation-permit.js.map +1 -1
- package/dist/core/daemon/loop.d.ts +1 -13
- package/dist/core/daemon/loop.js +10 -113
- package/dist/core/daemon/loop.js.map +1 -1
- package/dist/core/daemon/service-install-authority.d.ts +5 -1
- package/dist/core/daemon/service-install-authority.js +7 -20
- package/dist/core/daemon/service-install-authority.js.map +1 -1
- package/dist/core/fleet/automerge-pass.js +28 -77
- package/dist/core/fleet/automerge-pass.js.map +1 -1
- package/dist/core/fleet/decisions-ledger.js +1 -1
- package/dist/core/fleet/decisions-ledger.js.map +1 -1
- package/dist/core/fleet/judge-trace.js +2 -1
- package/dist/core/fleet/judge-trace.js.map +1 -1
- package/dist/core/fleet/manager.d.ts +6 -0
- package/dist/core/fleet/manager.js +35 -17
- package/dist/core/fleet/manager.js.map +1 -1
- package/dist/core/fleet/post-merge-credit-label.d.ts +10 -0
- package/dist/core/fleet/post-merge-credit-label.js +13 -0
- package/dist/core/fleet/post-merge-credit-label.js.map +1 -0
- package/dist/core/fleet/post-merge-credit.d.ts +20 -38
- package/dist/core/fleet/post-merge-credit.js +38 -39
- package/dist/core/fleet/post-merge-credit.js.map +1 -1
- package/dist/core/fleet/self-improve.d.ts +7 -7
- package/dist/core/fleet/self-improve.js +104 -20
- package/dist/core/fleet/self-improve.js.map +1 -1
- package/dist/core/fleet/status.js +0 -1
- package/dist/core/fleet/status.js.map +1 -1
- package/dist/core/foundry/automerge-scope-policy.d.ts +2 -2
- package/dist/core/foundry/automerge-scope-policy.js +2 -9
- package/dist/core/foundry/automerge-scope-policy.js.map +1 -1
- package/dist/core/goals/store.js +60 -20
- package/dist/core/goals/store.js.map +1 -1
- package/dist/core/inbox/apply.js +3 -5
- package/dist/core/inbox/apply.js.map +1 -1
- package/dist/core/inbox/merge.d.ts +0 -84
- package/dist/core/inbox/merge.js +23 -277
- package/dist/core/inbox/merge.js.map +1 -1
- package/dist/core/learn/reflect.js +10 -0
- package/dist/core/learn/reflect.js.map +1 -1
- package/dist/core/onboard.d.ts +2 -0
- package/dist/core/onboard.js +9 -3
- package/dist/core/onboard.js.map +1 -1
- package/dist/core/run/orchestrator.js +2 -0
- package/dist/core/run/orchestrator.js.map +1 -1
- package/dist/core/types.d.ts +5 -4
- package/dist/core/types.js.map +1 -1
- package/dist/core/web/api.d.ts +6 -0
- package/dist/core/web/api.js +69 -11
- package/dist/core/web/api.js.map +1 -1
- package/dist/core/web/public/app.js +5 -1
- package/dist/core/web/public/next/assets/index-CDHQraxS.css +1 -0
- package/dist/core/web/public/next/assets/index-zVKD9krw.js +69 -0
- package/dist/core/web/public/next/assets/{index-Ct0mf8n4.js.map → index-zVKD9krw.js.map} +1 -1
- package/dist/core/web/public/next/index.html +2 -2
- package/dist/core/web/read-session-revocations.d.ts +26 -0
- package/dist/core/web/read-session-revocations.js +48 -0
- package/dist/core/web/read-session-revocations.js.map +1 -0
- package/dist/core/web/server.js +73 -27
- package/dist/core/web/server.js.map +1 -1
- package/dist/core/web/static.d.ts +1 -1
- package/dist/core/web/static.js +54 -20
- package/dist/core/web/static.js.map +1 -1
- package/dist/release-dependency-inventory.json +1 -1
- package/docs/RUNTIME_ACTIVATION_AUTHORITY.md +0 -11
- package/node_modules/fast-uri/index.js +201 -48
- package/node_modules/fast-uri/lib/schemes.js +9 -4
- package/node_modules/fast-uri/lib/utils.js +388 -91
- package/node_modules/fast-uri/package.json +1 -1
- package/node_modules/fast-uri/test/component-safe-serialization.test.js +105 -0
- package/node_modules/fast-uri/test/equal.test.js +31 -3
- package/node_modules/fast-uri/test/fixtures/uri-js-parse.json +2 -0
- package/node_modules/fast-uri/test/ipv6-canonical.test.js +34 -0
- package/node_modules/fast-uri/test/ipv6-validation.test.js +90 -0
- package/node_modules/fast-uri/test/malformed-percent.test.js +77 -0
- package/node_modules/fast-uri/test/malformed-urn.test.js +61 -0
- package/node_modules/fast-uri/test/parse.test.js +7 -3
- package/node_modules/fast-uri/test/query-fragment-normalization.test.js +33 -0
- package/node_modules/fast-uri/test/reserved-path-normalization.test.js +109 -0
- package/node_modules/fast-uri/test/scheme-validation.test.js +124 -0
- package/node_modules/fast-uri/test/security-normalization.test.js +101 -0
- package/node_modules/fast-uri/test/security.test.js +75 -3
- package/node_modules/fast-uri/test/urn-full-input.test.js +29 -0
- package/node_modules/fast-uri/test/websocket-query-preservation.test.js +24 -0
- package/node_modules/qs/.github/THREAT_MODEL.md +3 -3
- package/node_modules/qs/CHANGELOG.md +26 -0
- package/node_modules/qs/README.md +19 -1
- package/node_modules/qs/dist/qs.js +25 -25
- package/node_modules/qs/eslint.config.mjs +1 -1
- package/node_modules/qs/lib/parse.js +16 -6
- package/node_modules/qs/lib/stringify.js +23 -8
- package/node_modules/qs/lib/utils.js +57 -11
- package/node_modules/qs/package.json +8 -7
- package/node_modules/qs/test/parse.js +419 -0
- package/node_modules/qs/test/stringify.js +317 -0
- package/node_modules/qs/test/utils.js +206 -0
- package/package.json +5 -4
- package/schema/config.schema.json +7 -7
- package/dist/cli/activation.d.ts +0 -41
- package/dist/cli/activation.js +0 -485
- package/dist/cli/activation.js.map +0 -1
- package/dist/core/web/public/next/assets/index-CY0U241s.css +0 -1
- package/dist/core/web/public/next/assets/index-Ct0mf8n4.js +0 -69
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
<meta name="color-scheme" content="light dark" />
|
|
7
7
|
<title>ashlr — operator console</title>
|
|
8
8
|
<meta name="referrer" content="no-referrer" />
|
|
9
|
-
<script type="module" crossorigin src="/next/assets/index-
|
|
10
|
-
<link rel="stylesheet" crossorigin href="/next/assets/index-
|
|
9
|
+
<script type="module" crossorigin src="/next/assets/index-zVKD9krw.js"></script>
|
|
10
|
+
<link rel="stylesheet" crossorigin href="/next/assets/index-CDHQraxS.css">
|
|
11
11
|
</head>
|
|
12
12
|
<body>
|
|
13
13
|
<div id="root"></div>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bounded, process-local revocation state for signed dashboard read sessions.
|
|
3
|
+
*
|
|
4
|
+
* Tickets are otherwise self-contained, so deleting the browser cookie alone
|
|
5
|
+
* would not revoke a copied ticket. This registry remembers the exact ticket
|
|
6
|
+
* digest until its signed expiry. If the bounded registry saturates, it tells
|
|
7
|
+
* the owning server to rotate the independent ticket-signing key and drain
|
|
8
|
+
* every stream. That invalidates all old tickets without evicting a still-live
|
|
9
|
+
* revocation and still permits a fresh ticket exchange afterward.
|
|
10
|
+
*/
|
|
11
|
+
export interface RevocableReadSession {
|
|
12
|
+
id: string;
|
|
13
|
+
expiresAt: number;
|
|
14
|
+
}
|
|
15
|
+
export interface ReadSessionRevocationResult {
|
|
16
|
+
rotateSigningKey: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare class ReadSessionRevocations {
|
|
19
|
+
private readonly maxEntries;
|
|
20
|
+
private readonly revoked;
|
|
21
|
+
constructor(maxEntries?: number);
|
|
22
|
+
private prune;
|
|
23
|
+
isRevoked(id: string, nowMs?: number): boolean;
|
|
24
|
+
revoke(session: RevocableReadSession, nowMs?: number): ReadSessionRevocationResult;
|
|
25
|
+
clear(): void;
|
|
26
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bounded, process-local revocation state for signed dashboard read sessions.
|
|
3
|
+
*
|
|
4
|
+
* Tickets are otherwise self-contained, so deleting the browser cookie alone
|
|
5
|
+
* would not revoke a copied ticket. This registry remembers the exact ticket
|
|
6
|
+
* digest until its signed expiry. If the bounded registry saturates, it tells
|
|
7
|
+
* the owning server to rotate the independent ticket-signing key and drain
|
|
8
|
+
* every stream. That invalidates all old tickets without evicting a still-live
|
|
9
|
+
* revocation and still permits a fresh ticket exchange afterward.
|
|
10
|
+
*/
|
|
11
|
+
export class ReadSessionRevocations {
|
|
12
|
+
maxEntries;
|
|
13
|
+
revoked = new Map();
|
|
14
|
+
constructor(maxEntries = 1_024) {
|
|
15
|
+
this.maxEntries = maxEntries;
|
|
16
|
+
if (!Number.isSafeInteger(maxEntries) || maxEntries < 1) {
|
|
17
|
+
throw new Error('read session revocation capacity must be a positive integer');
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
prune(nowMs) {
|
|
21
|
+
for (const [id, expiresAt] of this.revoked) {
|
|
22
|
+
if (expiresAt <= nowMs)
|
|
23
|
+
this.revoked.delete(id);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
isRevoked(id, nowMs = Date.now()) {
|
|
27
|
+
this.prune(nowMs);
|
|
28
|
+
return (this.revoked.get(id) ?? 0) > nowMs;
|
|
29
|
+
}
|
|
30
|
+
revoke(session, nowMs = Date.now()) {
|
|
31
|
+
this.prune(nowMs);
|
|
32
|
+
if (session.expiresAt <= nowMs) {
|
|
33
|
+
return { rotateSigningKey: false };
|
|
34
|
+
}
|
|
35
|
+
const priorExpiry = this.revoked.get(session.id);
|
|
36
|
+
if (priorExpiry !== undefined || this.revoked.size < this.maxEntries) {
|
|
37
|
+
this.revoked.set(session.id, Math.max(priorExpiry ?? 0, session.expiresAt));
|
|
38
|
+
return { rotateSigningKey: false };
|
|
39
|
+
}
|
|
40
|
+
// Never evict a live revocation. The caller must synchronously rotate the
|
|
41
|
+
// ticket-signing key and drain all streams before returning logout success.
|
|
42
|
+
return { rotateSigningKey: true };
|
|
43
|
+
}
|
|
44
|
+
clear() {
|
|
45
|
+
this.revoked.clear();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=read-session-revocations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-session-revocations.js","sourceRoot":"","sources":["../../../src/core/web/read-session-revocations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH,MAAM,OAAO,sBAAsB;IAGJ;IAFZ,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IAErD,YAA6B,aAAa,KAAK;QAAlB,eAAU,GAAV,UAAU,CAAQ;QAC7C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,KAAa;QACzB,KAAK,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3C,IAAI,SAAS,IAAI,KAAK;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,SAAS,CAAC,EAAU,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE;QACtC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,OAA6B,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE;QACtD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAClB,IAAI,OAAO,CAAC,SAAS,IAAI,KAAK,EAAE,CAAC;YAC/B,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;QACrC,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACjD,IAAI,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YACrE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;YAC5E,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;QACrC,CAAC;QAED,0EAA0E;QAC1E,4EAA4E;QAC5E,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;IACpC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF"}
|
package/dist/core/web/server.js
CHANGED
|
@@ -20,7 +20,8 @@ import { createServer } from 'node:http';
|
|
|
20
20
|
import { createHash, createHmac, randomBytes, timingSafeEqual } from 'node:crypto';
|
|
21
21
|
import { fileURLToPath } from 'node:url';
|
|
22
22
|
import { join, dirname } from 'node:path';
|
|
23
|
-
import { handleApi, drainSseConnections } from './api.js';
|
|
23
|
+
import { handleApi, drainSseConnections, drainSseSession } from './api.js';
|
|
24
|
+
import { ReadSessionRevocations } from './read-session-revocations.js';
|
|
24
25
|
import { serveStatic } from './static.js';
|
|
25
26
|
// ---------------------------------------------------------------------------
|
|
26
27
|
// Host-header allowlist (anti DNS-rebinding)
|
|
@@ -38,6 +39,7 @@ const MAX_READ_SESSION_BYTES = 256;
|
|
|
38
39
|
const READ_CLIENT_HEADER = 'x-ashlr-read-client';
|
|
39
40
|
const READ_CLIENT_QUERY = 'client';
|
|
40
41
|
const READ_CLIENT_RE = /^[a-f0-9]{64}$/;
|
|
42
|
+
const READ_SESSION_REVOCATION_CAPACITY = 64;
|
|
41
43
|
function isAllowedHost(host) {
|
|
42
44
|
if (!host)
|
|
43
45
|
return false;
|
|
@@ -71,7 +73,10 @@ function sendJson(res, status, body, headers = {}) {
|
|
|
71
73
|
'X-Content-Type-Options': 'nosniff',
|
|
72
74
|
...headers,
|
|
73
75
|
});
|
|
74
|
-
|
|
76
|
+
const publicBody = body && typeof body === 'object' && 'error' in body
|
|
77
|
+
? { ...body, error: String(body.error).slice(0, 512) }
|
|
78
|
+
: body;
|
|
79
|
+
res.end(JSON.stringify(publicBody));
|
|
75
80
|
}
|
|
76
81
|
function clientBinding(clientProof) {
|
|
77
82
|
return createHash('sha256').update(clientProof, 'utf8').digest('base64url');
|
|
@@ -86,12 +91,12 @@ function ticketPayload(expiresAtMs, nonce, binding) {
|
|
|
86
91
|
binding,
|
|
87
92
|
].join('.');
|
|
88
93
|
}
|
|
89
|
-
function signTicketPayload(payload,
|
|
90
|
-
return createHmac('sha256',
|
|
94
|
+
function signTicketPayload(payload, signingKey) {
|
|
95
|
+
return createHmac('sha256', signingKey).update(payload, 'utf8').digest('base64url');
|
|
91
96
|
}
|
|
92
|
-
function mintReadSession(
|
|
97
|
+
function mintReadSession(signingKey, clientProof, nowMs = Date.now()) {
|
|
93
98
|
const payload = ticketPayload(nowMs + READ_SESSION_TTL_MS, randomBytes(16).toString('base64url'), clientBinding(clientProof));
|
|
94
|
-
return `${payload}.${signTicketPayload(payload,
|
|
99
|
+
return `${payload}.${signTicketPayload(payload, signingKey)}`;
|
|
95
100
|
}
|
|
96
101
|
function readClientHeader(req) {
|
|
97
102
|
const value = headerValue(req, READ_CLIENT_HEADER);
|
|
@@ -138,40 +143,48 @@ function readCookie(req, name) {
|
|
|
138
143
|
}
|
|
139
144
|
return found;
|
|
140
145
|
}
|
|
141
|
-
function
|
|
146
|
+
function validateReadSession(req, signingKey, url, revocations, purpose = 'read', nowMs = Date.now()) {
|
|
142
147
|
const ticket = readCookie(req, READ_SESSION_COOKIE);
|
|
143
148
|
if (!ticket)
|
|
144
|
-
return
|
|
145
|
-
const clientProof = readSessionClientProof(req, url);
|
|
149
|
+
return null;
|
|
150
|
+
const clientProof = purpose === 'logout' ? readClientHeader(req) : readSessionClientProof(req, url);
|
|
146
151
|
if (!clientProof)
|
|
147
|
-
return
|
|
152
|
+
return null;
|
|
148
153
|
const parts = ticket.split('.');
|
|
149
154
|
if (parts.length !== 7)
|
|
150
|
-
return
|
|
155
|
+
return null;
|
|
151
156
|
const [version, method, pathPrefix, expiresRaw, nonce, binding, signature] = parts;
|
|
152
157
|
if (version !== READ_SESSION_VERSION
|
|
153
158
|
|| method !== READ_SESSION_METHOD
|
|
154
159
|
|| pathPrefix !== READ_SESSION_PATH_PREFIX
|
|
155
|
-
|| (req.method ?? 'GET').toUpperCase() !== method
|
|
156
|
-
|| !url.pathname.startsWith(pathPrefix)
|
|
160
|
+
|| (purpose === 'read' && (req.method ?? 'GET').toUpperCase() !== method)
|
|
161
|
+
|| (purpose === 'read' && !url.pathname.startsWith(pathPrefix))
|
|
157
162
|
|| !/^\d{13}$/.test(expiresRaw ?? '')
|
|
158
163
|
|| !/^[A-Za-z0-9_-]{22}$/.test(nonce ?? '')
|
|
159
164
|
|| !/^[A-Za-z0-9_-]{43}$/.test(binding ?? '')
|
|
160
165
|
|| !/^[A-Za-z0-9_-]{43}$/.test(signature ?? ''))
|
|
161
|
-
return
|
|
166
|
+
return null;
|
|
162
167
|
const expiresAtMs = Number(expiresRaw);
|
|
163
168
|
if (!Number.isSafeInteger(expiresAtMs)
|
|
164
169
|
|| expiresAtMs <= nowMs
|
|
165
170
|
|| expiresAtMs > nowMs + READ_SESSION_TTL_MS + READ_SESSION_FUTURE_SKEW_MS)
|
|
166
|
-
return
|
|
171
|
+
return null;
|
|
167
172
|
if (!safeEqual(binding, clientBinding(clientProof)))
|
|
168
|
-
return
|
|
173
|
+
return null;
|
|
169
174
|
const payload = ticketPayload(expiresAtMs, nonce, binding);
|
|
170
|
-
|
|
175
|
+
if (!safeEqual(signature, signTicketPayload(payload, signingKey)))
|
|
176
|
+
return null;
|
|
177
|
+
const session = {
|
|
178
|
+
id: createHash('sha256').update(ticket, 'utf8').digest('hex'),
|
|
179
|
+
expiresAt: expiresAtMs,
|
|
180
|
+
};
|
|
181
|
+
return revocations.isRevoked(session.id, nowMs) ? null : session;
|
|
171
182
|
}
|
|
172
|
-
function
|
|
173
|
-
|
|
174
|
-
|
|
183
|
+
function readAuthority(req, token, signingKey, url, revocations) {
|
|
184
|
+
if (safeEqual(headerValue(req, 'x-ashlr-token'), token))
|
|
185
|
+
return { kind: 'header' };
|
|
186
|
+
const session = validateReadSession(req, signingKey, url, revocations);
|
|
187
|
+
return session ? { kind: 'session', session } : null;
|
|
175
188
|
}
|
|
176
189
|
function sessionCookie(value, maxAgeSeconds) {
|
|
177
190
|
// The dashboard is intentionally plain HTTP on loopback, so a Secure cookie
|
|
@@ -211,10 +224,18 @@ export async function startServer(cfg, opts) {
|
|
|
211
224
|
// while the mutation token is accepted only by handleApi mutation gates.
|
|
212
225
|
const readToken = randomBytes(32).toString('hex');
|
|
213
226
|
const token = randomBytes(32).toString('hex');
|
|
227
|
+
let readSessionSigningKey = randomBytes(32).toString('hex');
|
|
228
|
+
const readSessionRevocations = new ReadSessionRevocations(READ_SESSION_REVOCATION_CAPACITY);
|
|
214
229
|
const server = createServer((req, res) => {
|
|
215
230
|
// The EventSource client proof appears in its same-origin URL because the
|
|
216
231
|
// browser API cannot set headers. Never allow it to escape in a Referer.
|
|
217
232
|
res.setHeader('Referrer-Policy', 'no-referrer');
|
|
233
|
+
// Legacy index.html contains its stylesheet inline; scripts remain
|
|
234
|
+
// external-only. The new console uses external assets for both.
|
|
235
|
+
res.setHeader('Content-Security-Policy', "default-src 'self'; base-uri 'none'; object-src 'none'; frame-ancestors 'none'; form-action 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; connect-src 'self'");
|
|
236
|
+
res.setHeader('X-Frame-Options', 'DENY');
|
|
237
|
+
res.setHeader('Cross-Origin-Resource-Policy', 'same-origin');
|
|
238
|
+
res.setHeader('Permissions-Policy', 'camera=(), microphone=(), geolocation=()');
|
|
218
239
|
// ── 1. Host-header allowlist (anti DNS-rebinding) ──────────────────────
|
|
219
240
|
if (!isAllowedHost(req.headers.host)) {
|
|
220
241
|
res.writeHead(403, { 'Content-Type': 'text/plain' });
|
|
@@ -228,6 +249,7 @@ export async function startServer(cfg, opts) {
|
|
|
228
249
|
}
|
|
229
250
|
const path = url.pathname;
|
|
230
251
|
const method = (req.method ?? 'GET').toUpperCase();
|
|
252
|
+
const authority = readAuthority(req, readToken, readSessionSigningKey, url, readSessionRevocations);
|
|
231
253
|
// Exchange the raw operator token for a short-lived, read-only browser
|
|
232
254
|
// session. The ticket is HMAC-bound to this server process and cannot be
|
|
233
255
|
// used by any mutation route, which still requires the raw header.
|
|
@@ -241,13 +263,32 @@ export async function startServer(cfg, opts) {
|
|
|
241
263
|
sendJson(res, 400, { error: 'invalid read client proof' });
|
|
242
264
|
return;
|
|
243
265
|
}
|
|
244
|
-
const ticket = mintReadSession(
|
|
266
|
+
const ticket = mintReadSession(readSessionSigningKey, readClientHeader(req));
|
|
245
267
|
sendJson(res, 204, undefined, {
|
|
246
268
|
'Set-Cookie': sessionCookie(ticket, Math.floor(READ_SESSION_TTL_MS / 1000)),
|
|
247
269
|
});
|
|
248
270
|
return;
|
|
249
271
|
}
|
|
250
272
|
if (method === 'DELETE') {
|
|
273
|
+
const session = !url.search
|
|
274
|
+
? validateReadSession(req, readSessionSigningKey, url, readSessionRevocations, 'logout')
|
|
275
|
+
: null;
|
|
276
|
+
if (!session) {
|
|
277
|
+
sendJson(res, 401, { code: 'SESSION_REQUIRED', error: 'valid read session required' });
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
const revocation = readSessionRevocations.revoke(session);
|
|
281
|
+
if (revocation.rotateSigningKey) {
|
|
282
|
+
// Capacity exhaustion must never resurrect an evicted ticket. Rotate
|
|
283
|
+
// the independent signer synchronously and drain all old streams;
|
|
284
|
+
// the stable raw read token can still mint fresh tickets afterward.
|
|
285
|
+
readSessionSigningKey = randomBytes(32).toString('hex');
|
|
286
|
+
readSessionRevocations.clear();
|
|
287
|
+
drainSseConnections();
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
drainSseSession(session.id);
|
|
291
|
+
}
|
|
251
292
|
sendJson(res, 204, undefined, {
|
|
252
293
|
'Set-Cookie': sessionCookie('', 0),
|
|
253
294
|
});
|
|
@@ -258,7 +299,7 @@ export async function startServer(cfg, opts) {
|
|
|
258
299
|
}
|
|
259
300
|
// Public liveness is intentionally content-free and bounded. Operators
|
|
260
301
|
// with read authority retain the richer persisted /api/health projection.
|
|
261
|
-
if (path === '/api/health' && method === 'GET' && !
|
|
302
|
+
if (path === '/api/health' && method === 'GET' && !authority) {
|
|
262
303
|
sendJson(res, 200, { ok: true });
|
|
263
304
|
return;
|
|
264
305
|
}
|
|
@@ -266,7 +307,7 @@ export async function startServer(cfg, opts) {
|
|
|
266
307
|
// GET (including SSE) is default-deny here before route dispatch.
|
|
267
308
|
if (method === 'GET'
|
|
268
309
|
&& (path === '/api' || path.startsWith('/api/'))
|
|
269
|
-
&& !
|
|
310
|
+
&& !authority) {
|
|
270
311
|
sendJson(res, 401, { error: 'unauthorized: read session required' }, {
|
|
271
312
|
Vary: 'Cookie, X-Ashlr-Token, X-Ashlr-Read-Client',
|
|
272
313
|
});
|
|
@@ -274,7 +315,11 @@ export async function startServer(cfg, opts) {
|
|
|
274
315
|
}
|
|
275
316
|
// ── 2. API routes ──────────────────────────────────────────────────────
|
|
276
317
|
// handleApi is async; wrap to catch errors without crashing the server.
|
|
277
|
-
handleApi(req, res, cfg, {
|
|
318
|
+
handleApi(req, res, cfg, {
|
|
319
|
+
token,
|
|
320
|
+
allowDispatch: opts.allowDispatch,
|
|
321
|
+
readSession: authority?.kind === 'session' ? authority.session : undefined,
|
|
322
|
+
})
|
|
278
323
|
.then((handled) => {
|
|
279
324
|
if (handled)
|
|
280
325
|
return;
|
|
@@ -288,10 +333,10 @@ export async function startServer(cfg, opts) {
|
|
|
288
333
|
.catch(() => {
|
|
289
334
|
// Never let an unhandled rejection crash the server.
|
|
290
335
|
if (!res.headersSent) {
|
|
291
|
-
res
|
|
336
|
+
sendJson(res, 500, { code: 'INTERNAL_ERROR', error: 'internal server error' });
|
|
292
337
|
}
|
|
293
|
-
if (!res.writableEnded) {
|
|
294
|
-
res.end(
|
|
338
|
+
else if (!res.writableEnded) {
|
|
339
|
+
res.end();
|
|
295
340
|
}
|
|
296
341
|
});
|
|
297
342
|
});
|
|
@@ -329,6 +374,7 @@ export async function startServer(cfg, opts) {
|
|
|
329
374
|
// Drain all open SSE response streams registered by handleApi, then
|
|
330
375
|
// close the HTTP server (stops accepting new connections).
|
|
331
376
|
drainSseConnections();
|
|
377
|
+
readSessionRevocations.clear();
|
|
332
378
|
if (typeof server.closeAllConnections === 'function') {
|
|
333
379
|
server.closeAllConnections();
|
|
334
380
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/core/web/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/core/web/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,4 +15,4 @@
|
|
|
15
15
|
* - No outward calls; pure local fs read bounded to the assets dir.
|
|
16
16
|
*/
|
|
17
17
|
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
18
|
-
export declare function serveStatic(req: IncomingMessage, res: ServerResponse, dir: string): boolean;
|
|
18
|
+
export declare function serveStatic(req: IncomingMessage, res: ServerResponse, dir: string, beforeDescriptorOpen?: (() => void) | undefined): boolean;
|
package/dist/core/web/static.js
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* - NEVER throws — all errors are caught and surface as `false`.
|
|
15
15
|
* - No outward calls; pure local fs read bounded to the assets dir.
|
|
16
16
|
*/
|
|
17
|
-
import { readFileSync,
|
|
17
|
+
import { closeSync, constants, fstatSync, lstatSync, openSync, readFileSync, realpathSync } from 'node:fs';
|
|
18
18
|
import { resolve, join, sep, normalize, extname } from 'node:path';
|
|
19
19
|
// ---------------------------------------------------------------------------
|
|
20
20
|
// Content-Type mapping (only the handful of extensions the SPA ships).
|
|
@@ -67,14 +67,16 @@ function extractPathname(rawUrl) {
|
|
|
67
67
|
// ---------------------------------------------------------------------------
|
|
68
68
|
// serveStatic
|
|
69
69
|
// ---------------------------------------------------------------------------
|
|
70
|
-
export function serveStatic(req, res, dir) {
|
|
70
|
+
export function serveStatic(req, res, dir, beforeDescriptorOpen = undefined) {
|
|
71
71
|
try {
|
|
72
72
|
const rootDir = resolve(dir);
|
|
73
73
|
const pathname = extractPathname(req.url);
|
|
74
74
|
if (pathname === null)
|
|
75
75
|
return false;
|
|
76
76
|
// "/" (or empty) -> index.html (SPA shell).
|
|
77
|
-
let rel = pathname === '/' ? '/index.html'
|
|
77
|
+
let rel = pathname === '/' ? '/index.html'
|
|
78
|
+
: (pathname === '/next' || pathname === '/next/') ? '/next/index.html'
|
|
79
|
+
: pathname;
|
|
78
80
|
// Reject null bytes anywhere in the relative path.
|
|
79
81
|
if (rel.includes('\x00'))
|
|
80
82
|
return false;
|
|
@@ -91,28 +93,60 @@ export function serveStatic(req, res, dir) {
|
|
|
91
93
|
if (candidate !== rootDir && !candidate.startsWith(rootWithSep)) {
|
|
92
94
|
return false;
|
|
93
95
|
}
|
|
94
|
-
//
|
|
95
|
-
|
|
96
|
+
// Open first without following a replacement final symlink. All named-path
|
|
97
|
+
// containment and identity checks happen after descriptor custody is held,
|
|
98
|
+
// so the bytes are never read through a separately checked pathname.
|
|
99
|
+
let fd;
|
|
96
100
|
try {
|
|
97
|
-
|
|
101
|
+
const realRoot = realpathSync(rootDir);
|
|
102
|
+
beforeDescriptorOpen?.();
|
|
103
|
+
fd = openSync(candidate, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));
|
|
104
|
+
const openedBefore = fstatSync(fd);
|
|
105
|
+
if (!openedBefore.isFile())
|
|
106
|
+
return false;
|
|
107
|
+
const realCandidate = realpathSync(candidate);
|
|
108
|
+
const realRootWithSep = realRoot.endsWith(sep) ? realRoot : realRoot + sep;
|
|
109
|
+
if (!realCandidate.startsWith(realRootWithSep))
|
|
110
|
+
return false;
|
|
111
|
+
const namedBefore = lstatSync(candidate);
|
|
112
|
+
if (namedBefore.isSymbolicLink() || !namedBefore.isFile() ||
|
|
113
|
+
openedBefore.dev !== namedBefore.dev || openedBefore.ino !== namedBefore.ino)
|
|
114
|
+
return false;
|
|
115
|
+
const body = readFileSync(fd);
|
|
116
|
+
const openedAfter = fstatSync(fd);
|
|
117
|
+
const realCandidateAfter = realpathSync(candidate);
|
|
118
|
+
const namedAfter = lstatSync(candidate);
|
|
119
|
+
if (!openedAfter.isFile() || !realCandidateAfter.startsWith(realRootWithSep) ||
|
|
120
|
+
namedAfter.isSymbolicLink() || !namedAfter.isFile() ||
|
|
121
|
+
openedBefore.dev !== openedAfter.dev || openedBefore.ino !== openedAfter.ino ||
|
|
122
|
+
openedAfter.dev !== namedAfter.dev || openedAfter.ino !== namedAfter.ino ||
|
|
123
|
+
openedBefore.size !== openedAfter.size ||
|
|
124
|
+
openedBefore.mtimeMs !== openedAfter.mtimeMs ||
|
|
125
|
+
openedBefore.ctimeMs !== openedAfter.ctimeMs ||
|
|
126
|
+
openedAfter.size !== namedAfter.size ||
|
|
127
|
+
openedAfter.mtimeMs !== namedAfter.mtimeMs ||
|
|
128
|
+
openedAfter.ctimeMs !== namedAfter.ctimeMs)
|
|
129
|
+
return false;
|
|
130
|
+
res.setHeader('Content-Type', contentTypeFor(candidate));
|
|
131
|
+
res.writeHead(200, {
|
|
132
|
+
'Content-Type': contentTypeFor(candidate),
|
|
133
|
+
'Content-Length': String(body.byteLength),
|
|
134
|
+
'Cache-Control': 'no-cache',
|
|
135
|
+
'X-Content-Type-Options': 'nosniff',
|
|
136
|
+
});
|
|
137
|
+
res.end(body);
|
|
138
|
+
return true;
|
|
98
139
|
}
|
|
99
140
|
catch {
|
|
100
141
|
return false; // ENOENT and friends -> not found.
|
|
101
142
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
'Content-Type': contentTypeFor(candidate),
|
|
110
|
-
'Content-Length': String(body.byteLength),
|
|
111
|
-
'Cache-Control': 'no-cache',
|
|
112
|
-
'X-Content-Type-Options': 'nosniff',
|
|
113
|
-
});
|
|
114
|
-
res.end(body);
|
|
115
|
-
return true;
|
|
143
|
+
finally {
|
|
144
|
+
if (fd !== undefined)
|
|
145
|
+
try {
|
|
146
|
+
closeSync(fd);
|
|
147
|
+
}
|
|
148
|
+
catch { /* best effort */ }
|
|
149
|
+
}
|
|
116
150
|
}
|
|
117
151
|
catch {
|
|
118
152
|
// NEVER throw — any unexpected error means "not served".
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static.js","sourceRoot":"","sources":["../../../src/core/web/static.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"static.js","sourceRoot":"","sources":["../../../src/core/web/static.ts"],"names":[],"mappings":"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"}
|