@pellux/goodvibes-sdk 0.33.37 → 0.34.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/dist/client-auth/control-plane-auth-snapshot.d.ts +23 -0
- package/dist/client-auth/control-plane-auth-snapshot.d.ts.map +1 -1
- package/dist/client-auth/oauth-types.d.ts +18 -0
- package/dist/client-auth/oauth-types.d.ts.map +1 -1
- package/dist/client-auth/types.d.ts +26 -0
- package/dist/client-auth/types.d.ts.map +1 -1
- package/dist/client.d.ts +22 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/contracts/artifacts/operator-contract.json +1463 -10
- package/dist/events/knowledge.d.ts +31 -0
- package/dist/events/knowledge.d.ts.map +1 -1
- package/dist/events/tasks.d.ts +58 -0
- package/dist/events/tasks.d.ts.map +1 -1
- package/dist/events/transport.d.ts +60 -0
- package/dist/events/transport.d.ts.map +1 -1
- package/dist/platform/agents/wrfc-config.d.ts +6 -0
- package/dist/platform/agents/wrfc-config.d.ts.map +1 -1
- package/dist/platform/agents/wrfc-config.js +6 -0
- package/dist/platform/agents/wrfc-controller.d.ts +74 -0
- package/dist/platform/agents/wrfc-controller.d.ts.map +1 -1
- package/dist/platform/agents/wrfc-controller.js +368 -9
- package/dist/platform/agents/wrfc-reporting.d.ts +60 -0
- package/dist/platform/agents/wrfc-reporting.d.ts.map +1 -1
- package/dist/platform/agents/wrfc-reporting.js +131 -7
- package/dist/platform/agents/wrfc-types.d.ts +12 -0
- package/dist/platform/agents/wrfc-types.d.ts.map +1 -1
- package/dist/platform/config/manager.d.ts +11 -0
- package/dist/platform/config/manager.d.ts.map +1 -1
- package/dist/platform/config/manager.js +17 -1
- package/dist/platform/config/schema-domain-core.d.ts +2 -0
- package/dist/platform/config/schema-domain-core.d.ts.map +1 -1
- package/dist/platform/config/schema-domain-core.js +17 -0
- package/dist/platform/config/schema-shared.d.ts +6 -0
- package/dist/platform/config/schema-shared.d.ts.map +1 -1
- package/dist/platform/config/schema-types.d.ts +9 -2
- package/dist/platform/config/schema-types.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-calendar.d.ts +9 -0
- package/dist/platform/control-plane/method-catalog-calendar.d.ts.map +1 -0
- package/dist/platform/control-plane/method-catalog-calendar.js +117 -0
- package/dist/platform/control-plane/method-catalog-channels.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-channels.js +174 -0
- package/dist/platform/control-plane/method-catalog-control-automation.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-control-automation.js +10 -4
- package/dist/platform/control-plane/method-catalog-email.d.ts +9 -0
- package/dist/platform/control-plane/method-catalog-email.d.ts.map +1 -0
- package/dist/platform/control-plane/method-catalog-email.js +101 -0
- package/dist/platform/control-plane/method-catalog-knowledge.js +4 -4
- package/dist/platform/control-plane/method-catalog-runtime.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog-runtime.js +13 -0
- package/dist/platform/control-plane/method-catalog.d.ts.map +1 -1
- package/dist/platform/control-plane/method-catalog.js +4 -0
- package/dist/platform/control-plane/routes/automation.js +2 -2
- package/dist/platform/control-plane/routes/operator.d.ts.map +1 -1
- package/dist/platform/control-plane/routes/operator.js +2 -0
- package/dist/platform/control-plane/routes/sessions.js +1 -1
- package/dist/platform/daemon/http/router.d.ts.map +1 -1
- package/dist/platform/daemon/http/router.js +12 -2
- package/dist/platform/daemon/http-listener.d.ts +17 -0
- package/dist/platform/daemon/http-listener.d.ts.map +1 -1
- package/dist/platform/daemon/http-listener.js +186 -7
- package/dist/platform/knowledge/knowledge-api.d.ts +1 -1
- package/dist/platform/knowledge/knowledge-api.d.ts.map +1 -1
- package/dist/platform/knowledge/knowledge-api.js +1 -1
- package/dist/platform/runtime/store/helpers/reducers/lifecycle.d.ts.map +1 -1
- package/dist/platform/runtime/store/helpers/reducers/lifecycle.js +4 -0
- package/dist/platform/runtime/store/helpers/reducers/sync.d.ts.map +1 -1
- package/dist/platform/runtime/store/helpers/reducers/sync.js +4 -0
- package/dist/platform/security/http-auth.d.ts.map +1 -1
- package/dist/platform/security/http-auth.js +11 -4
- package/dist/platform/security/user-auth.d.ts +98 -2
- package/dist/platform/security/user-auth.d.ts.map +1 -1
- package/dist/platform/security/user-auth.js +195 -18
- package/dist/platform/sessions/manager.d.ts +19 -2
- package/dist/platform/sessions/manager.d.ts.map +1 -1
- package/dist/platform/sessions/manager.js +43 -6
- package/dist/platform/state/memory-registry.d.ts +1 -1
- package/dist/platform/state/memory-registry.d.ts.map +1 -1
- package/dist/platform/state/memory-registry.js +2 -2
- package/dist/platform/state/memory-store.d.ts +1 -1
- package/dist/platform/state/memory-store.d.ts.map +1 -1
- package/dist/platform/state/memory-store.js +2 -2
- package/dist/platform/version.js +1 -1
- package/package.json +9 -9
|
@@ -540,11 +540,21 @@ export class DaemonHttpRouter {
|
|
|
540
540
|
return body;
|
|
541
541
|
const username = typeof body.username === 'string' ? body.username : '';
|
|
542
542
|
const password = typeof body.password === 'string' ? body.password : '';
|
|
543
|
-
const
|
|
544
|
-
if (!
|
|
543
|
+
const authResult = this.context.userAuth.authenticate(username, password);
|
|
544
|
+
if (!authResult.ok) {
|
|
545
|
+
if (authResult.lockedUntilMs) {
|
|
546
|
+
const retryAfterSeconds = Math.ceil((authResult.lockedUntilMs - Date.now()) / 1_000);
|
|
547
|
+
return Response.json({ error: 'Too many requests' }, { status: 429, headers: { 'Retry-After': String(Math.max(1, retryAfterSeconds)) } });
|
|
548
|
+
}
|
|
545
549
|
return Response.json({ error: 'Invalid credentials' }, { status: 401 });
|
|
546
550
|
}
|
|
551
|
+
const { user } = authResult;
|
|
547
552
|
const session = this.context.userAuth.createSession(user.username);
|
|
553
|
+
// Auto-retire the bootstrap credential file ONLY after the first
|
|
554
|
+
// NON-bootstrap login (mirrors http-listener.ts handleLogin behaviour).
|
|
555
|
+
if (!authResult.usedBootstrapCredential && this.context.userAuth.inspect().bootstrapCredentialPresent) {
|
|
556
|
+
this.context.userAuth.clearBootstrapCredentialFile();
|
|
557
|
+
}
|
|
548
558
|
return Response.json({
|
|
549
559
|
authenticated: true,
|
|
550
560
|
token: session.token,
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { HookDispatcher } from '../hooks/dispatcher.js';
|
|
2
2
|
import { UserAuthManager } from '../security/user-auth.js';
|
|
3
3
|
import { ConfigManager } from '../config/manager.js';
|
|
4
|
+
/**
|
|
5
|
+
* Returns true when the given IP address belongs to a Cloudflare-owned range.
|
|
6
|
+
* Used to validate CF-Connecting-IP header trust: only trust it when the
|
|
7
|
+
* connecting peer is actually a Cloudflare edge node.
|
|
8
|
+
*/
|
|
9
|
+
export declare function isCloudflareIp(ip: string): boolean;
|
|
4
10
|
interface HttpListenerConfig {
|
|
5
11
|
port?: number | undefined;
|
|
6
12
|
host?: string | undefined;
|
|
@@ -28,6 +34,15 @@ interface HttpListenerConfig {
|
|
|
28
34
|
* allowedOrigins must be configured or hostMode must be local/loopback.
|
|
29
35
|
*/
|
|
30
36
|
enforceCors?: boolean | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* When true, extract the real client IP from CF-Connecting-IP ONLY when the
|
|
39
|
+
* connecting peer address belongs to a Cloudflare-owned CIDR range.
|
|
40
|
+
* Requires trustProxy=true. Prevents header-injection bypass: a peer that is
|
|
41
|
+
* not a Cloudflare edge node cannot fake CF-Connecting-IP to manipulate rate
|
|
42
|
+
* limiting. When trustProxy=false, CF-Connecting-IP is ignored regardless.
|
|
43
|
+
* Default: false.
|
|
44
|
+
*/
|
|
45
|
+
trustCloudflare?: boolean | undefined;
|
|
31
46
|
/** Pre-configured UserAuthManager owned by the runtime service graph. */
|
|
32
47
|
userAuth: UserAuthManager;
|
|
33
48
|
}
|
|
@@ -60,6 +75,8 @@ export declare class HttpListener {
|
|
|
60
75
|
private loginRateLimiter;
|
|
61
76
|
/** Whether to trust x-forwarded-for / x-real-ip for client IP resolution. */
|
|
62
77
|
private trustProxy;
|
|
78
|
+
/** When true, trust CF-Connecting-IP only from validated Cloudflare edge IPs. */
|
|
79
|
+
private trustCloudflare;
|
|
63
80
|
private readonly configManager;
|
|
64
81
|
private readonly serveFactory;
|
|
65
82
|
private tlsState;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-listener.d.ts","sourceRoot":"","sources":["../../../src/platform/daemon/http-listener.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAMxD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"http-listener.d.ts","sourceRoot":"","sources":["../../../src/platform/daemon/http-listener.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAMxD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AA2HrD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAWlD;AAMD,UAAU,kBAAkB;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACtC,cAAc,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IAC5C,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,CAAC,EAAE,OAAO,GAAG,CAAC,KAAK,GAAG,SAAS,CAAC;IAC5C,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAClC;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACtC,yEAAyE;IACzE,QAAQ,EAAE,eAAe,CAAC;CAC3B;AAED,UAAU,gBAAgB;IACxB,YAAY,EAAE,OAAO,CAAC;CACvB;AAMD;;;;;;;;GAQG;AACH,qBAAa,YAAY;IA8BX,OAAO,CAAC,MAAM;IA7B1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAA6C;IAC3D,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,cAAc,CAAW;IACjC,kEAAkE;IAClE,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,cAAc,CAAwB;IAC9C,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,WAAW,CAAc;IACjC,oDAAoD;IACpD,OAAO,CAAC,gBAAgB,CAAc;IACtC,6EAA6E;IAC7E,OAAO,CAAC,UAAU,CAAU;IAC5B,iFAAiF;IACjF,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmB;IAChD,OAAO,CAAC,QAAQ,CAA0C;IAC1D,4EAA4E;IAC5E,OAAO,CAAC,iBAAiB,CAA6B;IACtD,gFAAgF;IAChF,OAAO,CAAC,WAAW,CAAS;IAC5B,sEAAsE;IACtE,OAAO,CAAC,kBAAkB,CAA8B;IACxD,0FAA0F;IAC1F,OAAO,CAAC,aAAa,CAAS;gBAEV,MAAM,EAAE,kBAAkB;IAqC9C;;;;OAIG;IACH,MAAM,CAAC,YAAY,EAAE,gBAAgB,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO;IAU/D;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsC5B;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAKrC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB3B;;;OAGG;IACH,OAAO,CAAC,gCAAgC;IAwDxC;;OAEG;IACH,IAAI,SAAS,IAAI,OAAO,CAEvB;IAMD,OAAO,CAAC,SAAS;YAOH,aAAa;YAgBb,aAAa;YA6Cb,mBAAmB;YA4DnB,WAAW;YAuEX,aAAa;CAgD5B"}
|
|
@@ -13,6 +13,145 @@ import { createHostModeRestartWatcher } from './host-mode-watcher.js';
|
|
|
13
13
|
import { RateLimiter } from './http/rate-limiter.js';
|
|
14
14
|
import { readTextBodyWithinLimit } from '../utils/request-body.js';
|
|
15
15
|
// ---------------------------------------------------------------------------
|
|
16
|
+
// Cloudflare IP ranges (maintained constant; do NOT fetch at runtime by default).
|
|
17
|
+
// Source: https://www.cloudflare.com/ips/
|
|
18
|
+
// Last reviewed: 2026-06-11
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
/** Cloudflare published IPv4 CIDR ranges (full list). */
|
|
21
|
+
const CLOUDFLARE_IPV4_CIDRS = [
|
|
22
|
+
['103.21.244.0', 22],
|
|
23
|
+
['103.22.200.0', 22],
|
|
24
|
+
['103.31.4.0', 22],
|
|
25
|
+
['104.16.0.0', 13],
|
|
26
|
+
['104.24.0.0', 14],
|
|
27
|
+
['108.162.192.0', 18],
|
|
28
|
+
['131.0.72.0', 22],
|
|
29
|
+
['141.101.64.0', 18],
|
|
30
|
+
['162.158.0.0', 15],
|
|
31
|
+
['172.64.0.0', 13],
|
|
32
|
+
['173.245.48.0', 20],
|
|
33
|
+
['188.114.96.0', 20],
|
|
34
|
+
['190.93.240.0', 20],
|
|
35
|
+
['197.234.240.0', 22],
|
|
36
|
+
['198.41.128.0', 17],
|
|
37
|
+
];
|
|
38
|
+
/** Cloudflare published IPv6 CIDR prefixes (prefix string, prefix-length pairs). */
|
|
39
|
+
const CLOUDFLARE_IPV6_PREFIXES = [
|
|
40
|
+
['2400:cb00::', 32],
|
|
41
|
+
['2606:4700::', 32],
|
|
42
|
+
['2803:f800::', 32],
|
|
43
|
+
['2405:b500::', 32],
|
|
44
|
+
['2405:8100::', 32],
|
|
45
|
+
['2a06:98c0::', 29],
|
|
46
|
+
['2c0f:f248::', 32],
|
|
47
|
+
];
|
|
48
|
+
function ipv4ToUint32(ip) {
|
|
49
|
+
const parts = ip.split('.');
|
|
50
|
+
if (parts.length !== 4)
|
|
51
|
+
return undefined;
|
|
52
|
+
let n = 0;
|
|
53
|
+
for (const part of parts) {
|
|
54
|
+
const v = Number(part);
|
|
55
|
+
if (!Number.isInteger(v) || v < 0 || v > 255)
|
|
56
|
+
return undefined;
|
|
57
|
+
n = (n << 8) | v;
|
|
58
|
+
}
|
|
59
|
+
// Shift result to unsigned 32-bit
|
|
60
|
+
return n >>> 0;
|
|
61
|
+
}
|
|
62
|
+
function isIpInCidr4(ip, cidrNet, prefixLen) {
|
|
63
|
+
const ipInt = ipv4ToUint32(ip);
|
|
64
|
+
const netInt = ipv4ToUint32(cidrNet);
|
|
65
|
+
if (ipInt === undefined || netInt === undefined)
|
|
66
|
+
return false;
|
|
67
|
+
const mask = prefixLen === 0 ? 0 : (~0 << (32 - prefixLen)) >>> 0;
|
|
68
|
+
return (ipInt & mask) === (netInt & mask);
|
|
69
|
+
}
|
|
70
|
+
function isIpv6InPrefix(ip, prefix, prefixLen) {
|
|
71
|
+
try {
|
|
72
|
+
// Normalize by expanding both to full 128-bit arrays
|
|
73
|
+
const ipBytes = ipv6ToBytes(ip);
|
|
74
|
+
const prefixBytes = ipv6ToBytes(prefix);
|
|
75
|
+
if (!ipBytes || !prefixBytes)
|
|
76
|
+
return false;
|
|
77
|
+
const fullBytes = Math.floor(prefixLen / 8);
|
|
78
|
+
const remainBits = prefixLen % 8;
|
|
79
|
+
for (let i = 0; i < fullBytes; i++) {
|
|
80
|
+
if (ipBytes[i] !== prefixBytes[i])
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
if (remainBits > 0 && fullBytes < 16) {
|
|
84
|
+
const mask = (0xff << (8 - remainBits)) & 0xff;
|
|
85
|
+
if ((ipBytes[fullBytes] & mask) !== (prefixBytes[fullBytes] & mask))
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function ipv6ToBytes(ip) {
|
|
95
|
+
try {
|
|
96
|
+
// Strip brackets if present (e.g. [::1])
|
|
97
|
+
const clean = ip.replace(/^\[|\]$/g, '');
|
|
98
|
+
// Reject zone IDs (e.g. fe80::1%eth0) — '%' is not valid in a routable address.
|
|
99
|
+
if (clean.includes('%'))
|
|
100
|
+
return undefined;
|
|
101
|
+
const halves = clean.split('::');
|
|
102
|
+
if (halves.length > 2)
|
|
103
|
+
return undefined;
|
|
104
|
+
const leftGroups = halves[0] ? halves[0].split(':') : [];
|
|
105
|
+
const rightGroups = halves[1] ? halves[1].split(':') : [];
|
|
106
|
+
const totalGroups = 8;
|
|
107
|
+
const zeroGroups = totalGroups - leftGroups.length - rightGroups.length;
|
|
108
|
+
if (zeroGroups < 0)
|
|
109
|
+
return undefined;
|
|
110
|
+
const groups = [
|
|
111
|
+
...leftGroups,
|
|
112
|
+
...Array(zeroGroups).fill('0'),
|
|
113
|
+
...rightGroups,
|
|
114
|
+
];
|
|
115
|
+
if (groups.length !== 8)
|
|
116
|
+
return undefined;
|
|
117
|
+
const bytes = new Uint8Array(16);
|
|
118
|
+
for (let i = 0; i < 8; i++) {
|
|
119
|
+
const g = groups[i];
|
|
120
|
+
// Each group must be 1-4 hex characters — no leading garbage, no zone index fragments.
|
|
121
|
+
if (!/^[0-9a-fA-F]{1,4}$/.test(g))
|
|
122
|
+
return undefined;
|
|
123
|
+
const v = parseInt(g, 16);
|
|
124
|
+
// parseInt with a valid hex pattern never exceeds 0xffff, but guard defensively.
|
|
125
|
+
if (v < 0 || v > 0xffff)
|
|
126
|
+
return undefined;
|
|
127
|
+
bytes[i * 2] = (v >> 8) & 0xff;
|
|
128
|
+
bytes[i * 2 + 1] = v & 0xff;
|
|
129
|
+
}
|
|
130
|
+
return bytes;
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Returns true when the given IP address belongs to a Cloudflare-owned range.
|
|
138
|
+
* Used to validate CF-Connecting-IP header trust: only trust it when the
|
|
139
|
+
* connecting peer is actually a Cloudflare edge node.
|
|
140
|
+
*/
|
|
141
|
+
export function isCloudflareIp(ip) {
|
|
142
|
+
if (!ip)
|
|
143
|
+
return false;
|
|
144
|
+
// Strip IPv6-mapped IPv4 prefix (::ffff:a.b.c.d)
|
|
145
|
+
const v4mapped = ip.match(/^::ffff:(\d+\.\d+\.\d+\.\d+)$/i);
|
|
146
|
+
const candidate = v4mapped ? v4mapped[1] : ip;
|
|
147
|
+
// Try IPv4 ranges first
|
|
148
|
+
if (/^\d+\.\d+\.\d+\.\d+$/.test(candidate)) {
|
|
149
|
+
return CLOUDFLARE_IPV4_CIDRS.some(([net, len]) => isIpInCidr4(candidate, net, len));
|
|
150
|
+
}
|
|
151
|
+
// Try IPv6 prefixes
|
|
152
|
+
return CLOUDFLARE_IPV6_PREFIXES.some(([prefix, len]) => isIpv6InPrefix(candidate, prefix, len));
|
|
153
|
+
}
|
|
154
|
+
// ---------------------------------------------------------------------------
|
|
16
155
|
// HttpListener
|
|
17
156
|
// ---------------------------------------------------------------------------
|
|
18
157
|
/**
|
|
@@ -41,6 +180,8 @@ export class HttpListener {
|
|
|
41
180
|
loginRateLimiter;
|
|
42
181
|
/** Whether to trust x-forwarded-for / x-real-ip for client IP resolution. */
|
|
43
182
|
trustProxy;
|
|
183
|
+
/** When true, trust CF-Connecting-IP only from validated Cloudflare edge IPs. */
|
|
184
|
+
trustCloudflare;
|
|
44
185
|
configManager;
|
|
45
186
|
serveFactory;
|
|
46
187
|
tlsState = null;
|
|
@@ -78,6 +219,7 @@ export class HttpListener {
|
|
|
78
219
|
// scrypt-cost-throttled online brute-force attacks.
|
|
79
220
|
this.loginRateLimiter = new RateLimiter(config.loginRateLimit ?? 5);
|
|
80
221
|
this.trustProxy = config.trustProxy ?? Boolean(this.configManager.get('httpListener.trustProxy'));
|
|
222
|
+
this.trustCloudflare = config.trustCloudflare ?? false;
|
|
81
223
|
this.serveFactory = config.serveFactory ?? Bun.serve;
|
|
82
224
|
}
|
|
83
225
|
/**
|
|
@@ -254,7 +396,25 @@ export class HttpListener {
|
|
|
254
396
|
const requestId = randomUUID();
|
|
255
397
|
const startMs = Date.now();
|
|
256
398
|
const url = new URL(req.url);
|
|
257
|
-
const
|
|
399
|
+
const effectiveTrustProxy = this.trustProxy || (this.tlsState?.trustProxy ?? false);
|
|
400
|
+
let clientIp;
|
|
401
|
+
if (this.trustCloudflare && effectiveTrustProxy) {
|
|
402
|
+
// Extract peer IP via standard x-forwarded-for first to validate against CF ranges.
|
|
403
|
+
const peerIp = extractForwardedClientIp(req, true) ?? 'unknown';
|
|
404
|
+
const cfConnectingIp = req.headers.get('cf-connecting-ip')?.trim();
|
|
405
|
+
if (cfConnectingIp && isCloudflareIp(peerIp)) {
|
|
406
|
+
// Peer is a real Cloudflare edge node — trust the CF header.
|
|
407
|
+
clientIp = cfConnectingIp;
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
// Not validated as a CF edge or no CF header — fall through without CF trust.
|
|
411
|
+
// Use peerIp if available (x-forwarded-for from non-CF proxy), else 'unknown'.
|
|
412
|
+
clientIp = peerIp;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
else {
|
|
416
|
+
clientIp = extractForwardedClientIp(req, effectiveTrustProxy) ?? 'unknown';
|
|
417
|
+
}
|
|
258
418
|
let response = null;
|
|
259
419
|
try {
|
|
260
420
|
response = await this._handleRequestInner(req, url, clientIp, requestId);
|
|
@@ -304,13 +464,13 @@ export class HttpListener {
|
|
|
304
464
|
// x-forwarded-for is only trustworthy when running behind a trusted reverse proxy.
|
|
305
465
|
if (url.pathname === '/login' && req.method === 'POST') {
|
|
306
466
|
if (!this.loginRateLimiter.check(clientIp)) {
|
|
307
|
-
return Response.json({ error: 'Too many requests' }, { status: 429 });
|
|
467
|
+
return Response.json({ error: 'Too many requests' }, { status: 429, headers: { 'Retry-After': '60' } });
|
|
308
468
|
}
|
|
309
469
|
return this.handleLogin(req, clientIp, requestId);
|
|
310
470
|
}
|
|
311
471
|
// General rate limiting for all other routes.
|
|
312
472
|
if (!this.rateLimiter.check(clientIp)) {
|
|
313
|
-
return Response.json({ error: 'Too many requests' }, { status: 429 });
|
|
473
|
+
return Response.json({ error: 'Too many requests' }, { status: 429, headers: { 'Retry-After': '60' } });
|
|
314
474
|
}
|
|
315
475
|
// Auth check
|
|
316
476
|
if (!this.checkAuth(req)) {
|
|
@@ -331,19 +491,25 @@ export class HttpListener {
|
|
|
331
491
|
return body;
|
|
332
492
|
const username = typeof body.username === 'string' ? body.username : '';
|
|
333
493
|
const password = typeof body.password === 'string' ? body.password : '';
|
|
334
|
-
const
|
|
335
|
-
if (!
|
|
494
|
+
const authResult = this.userAuth.authenticate(username, password);
|
|
495
|
+
if (!authResult.ok) {
|
|
336
496
|
// AUTH_FAILED — never log credential values
|
|
497
|
+
const lockedUntilMs = authResult.lockedUntilMs;
|
|
337
498
|
logger.warn('AUTH_FAILED', {
|
|
338
499
|
type: 'AUTH_FAILED',
|
|
339
500
|
requestId,
|
|
340
|
-
usernameAttempted: username,
|
|
341
501
|
clientIp,
|
|
342
|
-
reason: 'invalid_credentials',
|
|
502
|
+
reason: lockedUntilMs ? 'account_locked' : 'invalid_credentials',
|
|
503
|
+
// Never log usernameAttempted to avoid associating accounts with IPs in logs
|
|
343
504
|
});
|
|
344
505
|
authFailureTotal.add(1);
|
|
506
|
+
if (lockedUntilMs) {
|
|
507
|
+
const retryAfterSeconds = Math.ceil((lockedUntilMs - Date.now()) / 1_000);
|
|
508
|
+
return Response.json({ error: 'Too many requests' }, { status: 429, headers: { 'Retry-After': String(Math.max(1, retryAfterSeconds)) } });
|
|
509
|
+
}
|
|
345
510
|
return Response.json({ error: 'Invalid credentials' }, { status: 401 });
|
|
346
511
|
}
|
|
512
|
+
const { user } = authResult;
|
|
347
513
|
const session = this.userAuth.createSession(user.username);
|
|
348
514
|
// AUTH_SUCCEEDED — never log credential values
|
|
349
515
|
authSuccessTotal.add(1);
|
|
@@ -354,6 +520,19 @@ export class HttpListener {
|
|
|
354
520
|
clientIp,
|
|
355
521
|
method: 'password',
|
|
356
522
|
});
|
|
523
|
+
// Auto-retire the bootstrap credential file ONLY after the first
|
|
524
|
+
// NON-bootstrap login. The bootstrap credential is a one-time convenience
|
|
525
|
+
// artifact; retiring it immediately on a bootstrap login would prevent the
|
|
526
|
+
// operator from logging in again if the session is lost before a real
|
|
527
|
+
// account/password is established.
|
|
528
|
+
if (!authResult.usedBootstrapCredential && this.userAuth.inspect().bootstrapCredentialPresent) {
|
|
529
|
+
const retired = this.userAuth.clearBootstrapCredentialFile();
|
|
530
|
+
if (retired) {
|
|
531
|
+
logger.info('Bootstrap credential file retired after first non-bootstrap login', {
|
|
532
|
+
username: user.username,
|
|
533
|
+
});
|
|
534
|
+
}
|
|
535
|
+
}
|
|
357
536
|
return Response.json({
|
|
358
537
|
authenticated: true,
|
|
359
538
|
token: session.token,
|
|
@@ -54,7 +54,7 @@ export interface MemoryApi {
|
|
|
54
54
|
rebuildVectors(): MemoryVectorStats;
|
|
55
55
|
rebuildVectorsAsync(): Promise<MemoryVectorStats>;
|
|
56
56
|
doctor(): Promise<MemoryDoctorReport>;
|
|
57
|
-
reviewQueue(limit?: number): readonly MemoryRecord[];
|
|
57
|
+
reviewQueue(limit?: number, scope?: MemoryScope): readonly MemoryRecord[];
|
|
58
58
|
exportBundle(filter?: MemorySearchFilter): MemoryBundle;
|
|
59
59
|
importBundle(bundle: MemoryBundle): Promise<MemoryImportResult>;
|
|
60
60
|
get(id: string): MemoryRecord | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knowledge-api.d.ts","sourceRoot":"","sources":["../../../src/platform/knowledge/knowledge-api.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"knowledge-api.d.ts","sourceRoot":"","sources":["../../../src/platform/knowledge/knowledge-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,7 +31,7 @@ export function createMemoryApi(memoryRegistry) {
|
|
|
31
31
|
rebuildVectors: () => memoryRegistry.rebuildVectors(),
|
|
32
32
|
rebuildVectorsAsync: () => memoryRegistry.rebuildVectorsAsync(),
|
|
33
33
|
doctor: () => memoryRegistry.doctor(),
|
|
34
|
-
reviewQueue: (limit = 10) => memoryRegistry.reviewQueue(limit),
|
|
34
|
+
reviewQueue: (limit = 10, scope) => memoryRegistry.reviewQueue(limit, scope),
|
|
35
35
|
exportBundle: (filter = {}) => memoryRegistry.exportBundle(filter),
|
|
36
36
|
importBundle: (bundle) => memoryRegistry.importBundle(bundle),
|
|
37
37
|
get: (id) => memoryRegistry.get(id),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../../../../src/platform/runtime/store/helpers/reducers/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAChH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EACV,qBAAqB,EAGtB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC/F,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnG,OAAO,KAAK,EACV,wBAAwB,EAGzB,MAAM,gCAAgC,CAAC;AA+BxC,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,eAAe,GACrB,kBAAkB,CAyBpB;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,qBAAqB,EAC7B,KAAK,EAAE,eAAe,GACrB,qBAAqB,CAmCvB;AAiCD,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,GAAG,eAAe,
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../../../../src/platform/runtime/store/helpers/reducers/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAChH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EACV,qBAAqB,EAGtB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC/F,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnG,OAAO,KAAK,EACV,wBAAwB,EAGzB,MAAM,gCAAgC,CAAC;AA+BxC,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,eAAe,GACrB,kBAAkB,CAyBpB;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,qBAAqB,EAC7B,KAAK,EAAE,eAAe,GACrB,qBAAqB,CAmCvB;AAiCD,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,GAAG,eAAe,CA0D1F;AAED,iBAAS,0BAA0B,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,eAAe,CAQ/G;AAED,iBAAS,0BAA0B,CACjC,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,SAAS,EACvC,MAAM,EAAE,MAAM,GACb,eAAe,CAIjB;AA2CD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,UAAU,GAAG,gBAAgB,CA0F9F;AAED,iBAAS,2BAA2B,CAClC,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,SAAS,EACxC,MAAM,EAAE,MAAM,GACb,gBAAgB,CAgBlB;AAgBD,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,wBAAwB,EAChC,KAAK,EAAE,kBAAkB,GACxB,wBAAwB,CA4G1B;AAED,OAAO,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,2BAA2B,EAAE,CAAC"}
|
|
@@ -121,6 +121,10 @@ function countTaskTransition(domain, previous, task) {
|
|
|
121
121
|
return { totalCreated, totalCompleted, totalFailed, totalCancelled };
|
|
122
122
|
}
|
|
123
123
|
export function updateTaskState(domain, event) {
|
|
124
|
+
// Progress-only events (BATCH_JOB_PROGRESS, EXPORT_PROGRESS) have no taskId —
|
|
125
|
+
// they are not task lifecycle events and do not mutate the task registry.
|
|
126
|
+
if (!('taskId' in event))
|
|
127
|
+
return domain;
|
|
124
128
|
const tasks = new Map(domain.tasks);
|
|
125
129
|
const existing = tasks.get(event.taskId);
|
|
126
130
|
const timestamp = now();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../../../../src/platform/runtime/store/helpers/reducers/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9F,OAAO,KAAK,EAAE,sBAAsB,EAAE,iBAAiB,EAAqB,MAAM,+BAA+B,CAAC;AAClH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AACxG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AACnF,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AACnF,OAAO,KAAK,EAAE,wBAAwB,EAA8B,MAAM,gCAAgC,CAAC;AAC3G,OAAO,KAAK,EAAE,iBAAiB,EAAuC,MAAM,0BAA0B,CAAC;AACvG,OAAO,KAAK,EAAE,cAAc,EAA4C,MAAM,sBAAsB,CAAC;AACrG,OAAO,KAAK,EAAE,cAAc,EAAqB,MAAM,sBAAsB,CAAC;AAC9E,OAAO,KAAK,EAAE,iBAAiB,EAAwB,MAAM,yBAAyB,CAAC;AACvF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AACpF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAGnE,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,wBAAwB,EAChC,KAAK,EAAE,kBAAkB,GACxB,wBAAwB,CA2C1B;AAuBD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,WAAW,GAAG,iBAAiB,CAmDlG;AAyBD,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,GAAG,cAAc,CA8HtF;
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../../../../src/platform/runtime/store/helpers/reducers/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -271,6 +271,10 @@ function transportStateForEvent(event) {
|
|
|
271
271
|
case 'TRANSPORT_RETRY_EXECUTED':
|
|
272
272
|
case 'STREAM_SUBSCRIBER_CONNECTED':
|
|
273
273
|
case 'STREAM_SUBSCRIBER_DISCONNECTED':
|
|
274
|
+
// UX-enhancement observability events — no transport state change.
|
|
275
|
+
case 'TRANSPORT_BACKPRESSURE':
|
|
276
|
+
case 'TRANSPORT_CONNECTION_STATE':
|
|
277
|
+
case 'TRANSPORT_RECONNECT_ATTEMPT':
|
|
274
278
|
return null;
|
|
275
279
|
}
|
|
276
280
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-auth.d.ts","sourceRoot":"","sources":["../../../src/platform/security/http-auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,eAAO,MAAM,4BAA4B,sBAAsB,CAAC;AAEhE,MAAM,MAAM,4BAA4B,GACpC;IACE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC,CAAC;AAEN,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC3C;AAmCD,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,OAAO,GACX,MAAM,CAQR;
|
|
1
|
+
{"version":3,"file":"http-auth.d.ts","sourceRoot":"","sources":["../../../src/platform/security/http-auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,eAAO,MAAM,4BAA4B,sBAAsB,CAAC;AAEhE,MAAM,MAAM,4BAA4B,GACpC;IACE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC,CAAC;AAEN,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC3C;AAmCD,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,OAAO,GACX,MAAM,CAQR;AAeD,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;IACP,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,iBAAiB,GAAG,SAAS,CAAC,CAAC;CACzE,GACA,4BAA4B,GAAG,IAAI,CAqBrC;AAED,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,OAAO,EACZ,OAAO,EAAE;IACP,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,iBAAiB,GAAG,SAAS,CAAC,CAAC;CACzE,GACA,4BAA4B,GAAG,IAAI,CAErC;AAED,wBAAgB,eAAe,CAAC,aAAa,EAAE,4BAA4B,GAAG,IAAI,GAAG,OAAO,CAG3F;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,MAAM,CAa/F;AAED,wBAAgB,iCAAiC,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,UAAQ,GAAG,MAAM,CAW1F"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { timingSafeEqual } from 'node:crypto';
|
|
1
|
+
import { createHash, timingSafeEqual } from 'node:crypto';
|
|
2
2
|
export const OPERATOR_SESSION_COOKIE_NAME = 'goodvibes_session';
|
|
3
3
|
function parseCookies(header) {
|
|
4
4
|
const cookies = new Map();
|
|
@@ -47,10 +47,17 @@ export function extractOperatorAuthToken(req) {
|
|
|
47
47
|
return sessionCookie;
|
|
48
48
|
return '';
|
|
49
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Compare two tokens in constant time without leaking length via early-exit.
|
|
52
|
+
* Hash both sides with SHA-256 so the Buffers are always 32 bytes before
|
|
53
|
+
* calling timingSafeEqual, eliminating the length-based side-channel that a
|
|
54
|
+
* plain Buffer.from(token).length check or early-return on length mismatch
|
|
55
|
+
* would have exposed.
|
|
56
|
+
*/
|
|
50
57
|
function matchesSharedToken(token, sharedToken) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
return timingSafeEqual(
|
|
58
|
+
const aHash = createHash('sha256').update(token).digest();
|
|
59
|
+
const bHash = createHash('sha256').update(sharedToken).digest();
|
|
60
|
+
return timingSafeEqual(aHash, bHash);
|
|
54
61
|
}
|
|
55
62
|
export function authenticateOperatorToken(token, context) {
|
|
56
63
|
const normalized = token.trim();
|
|
@@ -11,10 +11,57 @@ export interface AuthSession {
|
|
|
11
11
|
interface UserAuthConfig {
|
|
12
12
|
sessionTtlMs?: number | undefined;
|
|
13
13
|
maxSessions?: number | undefined;
|
|
14
|
+
/** Maximum number of per-account lock state entries. Excess entries are evicted by staleness. Default: 10000. */
|
|
15
|
+
maxAccountLocks?: number | undefined;
|
|
14
16
|
users?: AuthUser[] | undefined;
|
|
15
17
|
bootstrapFilePath: string;
|
|
16
18
|
bootstrapCredentialPath: string;
|
|
19
|
+
/** Scrypt cost params for hashing new passwords. Existing hashes carry their own params. Default: Node defaults. */
|
|
20
|
+
scryptParams?: ScryptParams | undefined;
|
|
21
|
+
/** Injectable clock for testing. Defaults to Date.now. */
|
|
22
|
+
nowFn?: (() => number) | undefined;
|
|
17
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Scrypt cost parameters. N must be a power of 2. Increasing N multiplies
|
|
26
|
+
* memory usage by 128*N*r bytes and CPU time proportionally.
|
|
27
|
+
* Safe minimums: N>=16384, r>=8, p>=1.
|
|
28
|
+
*/
|
|
29
|
+
export interface ScryptParams {
|
|
30
|
+
/** CPU/memory cost factor — must be a power of 2. Default: 16384. */
|
|
31
|
+
readonly N: number;
|
|
32
|
+
/** Block size. Default: 8. */
|
|
33
|
+
readonly r: number;
|
|
34
|
+
/** Parallelization factor. Default: 1. */
|
|
35
|
+
readonly p: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Per-account login failure state for escalating lockout.
|
|
39
|
+
* Independent of IP-based throttling.
|
|
40
|
+
*/
|
|
41
|
+
interface AccountLockState {
|
|
42
|
+
failures: number;
|
|
43
|
+
lockedUntil: number;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Result of authenticate() — includes lock state so callers can
|
|
47
|
+
* return Retry-After without leaking whether the username exists.
|
|
48
|
+
*
|
|
49
|
+
* The union is strict: `.user` is ONLY present (and non-undefined) on the
|
|
50
|
+
* `ok:true` branch, so TypeScript catches any caller that forgets to check `.ok`
|
|
51
|
+
* before accessing the user. `.usedBootstrapCredential` is set on the `ok:true`
|
|
52
|
+
* branch so callers can decide whether to retire the bootstrap credential file.
|
|
53
|
+
*/
|
|
54
|
+
export type AuthenticateResult = {
|
|
55
|
+
readonly ok: true;
|
|
56
|
+
readonly user: AuthUser;
|
|
57
|
+
readonly usedBootstrapCredential: boolean;
|
|
58
|
+
readonly lockedUntilMs?: undefined;
|
|
59
|
+
} | {
|
|
60
|
+
readonly ok: false;
|
|
61
|
+
readonly user?: undefined;
|
|
62
|
+
readonly usedBootstrapCredential?: undefined;
|
|
63
|
+
readonly lockedUntilMs?: number;
|
|
64
|
+
};
|
|
18
65
|
export interface AuthUserRecord {
|
|
19
66
|
readonly username: string;
|
|
20
67
|
readonly roles: readonly string[];
|
|
@@ -37,14 +84,63 @@ export interface LocalAuthSnapshot {
|
|
|
37
84
|
export declare class UserAuthManager {
|
|
38
85
|
private users;
|
|
39
86
|
private sessions;
|
|
87
|
+
/** Per-username failure counters for account-level lockout (independent of IP throttling). */
|
|
88
|
+
private accountLocks;
|
|
40
89
|
private sessionTtlMs;
|
|
41
90
|
private readonly maxSessions;
|
|
91
|
+
private readonly maxAccountLocks;
|
|
42
92
|
private readonly userStorePath;
|
|
43
93
|
private readonly bootstrapCredentialPath;
|
|
44
94
|
private readonly persistUsers;
|
|
95
|
+
private readonly scryptParams;
|
|
96
|
+
/** Injectable clock — defaults to Date.now for production. */
|
|
97
|
+
private readonly nowFn;
|
|
45
98
|
constructor(config: UserAuthConfig);
|
|
46
|
-
static hashPassword(password: string): string;
|
|
47
|
-
|
|
99
|
+
static hashPassword(password: string, params?: ScryptParams): string;
|
|
100
|
+
/**
|
|
101
|
+
* Authenticate username/password with per-account lockout.
|
|
102
|
+
* - Does NOT leak whether a username exists (same generic error path for unknown users).
|
|
103
|
+
* - Records failures against the username bucket (not IP) with escalating backoff.
|
|
104
|
+
* - Returns lockedUntilMs when the account is temporarily locked.
|
|
105
|
+
* - Returns usedBootstrapCredential=true when the matched credential originated from
|
|
106
|
+
* the bootstrap credential file, so callers can defer retirement until a non-bootstrap
|
|
107
|
+
* login succeeds.
|
|
108
|
+
*/
|
|
109
|
+
authenticate(username: string, password: string): AuthenticateResult;
|
|
110
|
+
/**
|
|
111
|
+
* Record a login failure for the given username and apply escalating backoff.
|
|
112
|
+
*
|
|
113
|
+
* Thresholds are anchored ABOVE the per-IP login budget (default 5/min) so
|
|
114
|
+
* the first account lock cannot fire before the IP limiter has already
|
|
115
|
+
* throttled further attempts. This preserves the 401-then-429-by-IP contract
|
|
116
|
+
* for in-budget attempts.
|
|
117
|
+
*
|
|
118
|
+
* 1-5 failures: no lock (IP budget exhaustion fires at attempt 6+)
|
|
119
|
+
* 6-9 failures: 30-second lock
|
|
120
|
+
* 10-19 failures: 5-minute lock
|
|
121
|
+
* 20+ failures: 30-minute lock
|
|
122
|
+
*
|
|
123
|
+
* Note: failures also increment during an active lock window (when the account
|
|
124
|
+
* is already locked and another attempt arrives). This means a lock can expire
|
|
125
|
+
* with a failure count already in a higher tier, causing the next lock after
|
|
126
|
+
* expiry to jump directly to that tier. This is intentional: repeated attempts
|
|
127
|
+
* during a lock are themselves failures and escalate the penalty schedule.
|
|
128
|
+
*/
|
|
129
|
+
private _recordLoginFailure;
|
|
130
|
+
/**
|
|
131
|
+
* Evict account lock entries when the map is at capacity.
|
|
132
|
+
* Prefers entries with expired locks + no recent failures (stale entries).
|
|
133
|
+
* Falls back to the entry with the oldest/soonest-expired lock.
|
|
134
|
+
* Preserves no-username-enumeration: eviction policy is time-based, not
|
|
135
|
+
* user-existence-based.
|
|
136
|
+
*/
|
|
137
|
+
private _evictAccountLockIfNeeded;
|
|
138
|
+
/**
|
|
139
|
+
* Expose account lock state for testing.
|
|
140
|
+
* Returns a defensive copy so callers cannot mutate internal state.
|
|
141
|
+
* Use the injected nowFn (via UserAuthManager constructor) to advance time in tests.
|
|
142
|
+
*/
|
|
143
|
+
getAccountLockState(username: string): AccountLockState | undefined;
|
|
48
144
|
getUser(username: string): AuthUserRecord | null;
|
|
49
145
|
createSession(username: string): AuthSession;
|
|
50
146
|
validateSession(token: string): AuthSession | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-auth.d.ts","sourceRoot":"","sources":["../../../src/platform/security/user-auth.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,cAAc;IACtB,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,KAAK,CAAC,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;IAC/B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uBAAuB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"user-auth.d.ts","sourceRoot":"","sources":["../../../src/platform/security/user-auth.ts"],"names":[],"mappings":"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"}
|