@schlessera/brain-ui-server 0.31.0 → 0.33.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 +104 -6
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +51 -26
- package/dist/app.js.map +1 -1
- package/dist/bin/brain-ui-cron.d.ts +4 -0
- package/dist/bin/brain-ui-cron.d.ts.map +1 -0
- package/dist/bin/brain-ui-cron.js +123 -0
- package/dist/bin/brain-ui-cron.js.map +1 -0
- package/dist/brain/client.d.ts +9 -0
- package/dist/brain/client.d.ts.map +1 -1
- package/dist/brain/client.js +80 -3
- package/dist/brain/client.js.map +1 -1
- package/dist/config/env.d.ts +22 -5
- package/dist/config/env.d.ts.map +1 -1
- package/dist/config/env.js +30 -9
- package/dist/config/env.js.map +1 -1
- package/dist/cron/digest.d.ts +19 -0
- package/dist/cron/digest.d.ts.map +1 -0
- package/dist/cron/digest.js +26 -0
- package/dist/cron/digest.js.map +1 -0
- package/dist/cron/emit.d.ts +66 -0
- package/dist/cron/emit.d.ts.map +1 -0
- package/dist/cron/emit.js +152 -0
- package/dist/cron/emit.js.map +1 -0
- package/dist/cron/run-job.d.ts +48 -0
- package/dist/cron/run-job.d.ts.map +1 -0
- package/dist/cron/run-job.js +172 -0
- package/dist/cron/run-job.js.map +1 -0
- package/dist/files/walker.d.ts.map +1 -1
- package/dist/files/walker.js +70 -10
- package/dist/files/walker.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/middleware/auth.d.ts +25 -5
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +255 -47
- package/dist/middleware/auth.js.map +1 -1
- package/dist/middleware/body-limit.d.ts +15 -0
- package/dist/middleware/body-limit.d.ts.map +1 -0
- package/dist/middleware/body-limit.js +41 -0
- package/dist/middleware/body-limit.js.map +1 -0
- package/dist/middleware/origin.d.ts +20 -12
- package/dist/middleware/origin.d.ts.map +1 -1
- package/dist/middleware/origin.js +71 -25
- package/dist/middleware/origin.js.map +1 -1
- package/dist/middleware/passkeys.d.ts +5 -1
- package/dist/middleware/passkeys.d.ts.map +1 -1
- package/dist/middleware/passkeys.js +67 -26
- package/dist/middleware/passkeys.js.map +1 -1
- package/dist/routes/brain.d.ts.map +1 -1
- package/dist/routes/brain.js +7 -2
- package/dist/routes/brain.js.map +1 -1
- package/dist/routes/files.js +2 -2
- package/dist/routes/files.js.map +1 -1
- package/dist/routes/models.d.ts.map +1 -1
- package/dist/routes/models.js +22 -10
- package/dist/routes/models.js.map +1 -1
- package/dist/routes/pi-auth.d.ts.map +1 -1
- package/dist/routes/pi-auth.js +12 -4
- package/dist/routes/pi-auth.js.map +1 -1
- package/dist/routes/push.d.ts.map +1 -1
- package/dist/routes/push.js +12 -4
- package/dist/routes/push.js.map +1 -1
- package/dist/routes/render.d.ts +6 -0
- package/dist/routes/render.d.ts.map +1 -1
- package/dist/routes/render.js +8 -11
- package/dist/routes/render.js.map +1 -1
- package/dist/routes/share.d.ts +2 -0
- package/dist/routes/share.d.ts.map +1 -1
- package/dist/routes/share.js +30 -31
- package/dist/routes/share.js.map +1 -1
- package/dist/routes/skills.d.ts.map +1 -1
- package/dist/routes/skills.js +22 -8
- package/dist/routes/skills.js.map +1 -1
- package/dist/routes/web-search.d.ts.map +1 -1
- package/dist/routes/web-search.js +7 -2
- package/dist/routes/web-search.js.map +1 -1
- package/dist/share/staging.d.ts.map +1 -1
- package/dist/share/staging.js +2 -1
- package/dist/share/staging.js.map +1 -1
- package/dist/ws/clients.d.ts +13 -4
- package/dist/ws/clients.d.ts.map +1 -1
- package/dist/ws/clients.js +41 -5
- package/dist/ws/clients.js.map +1 -1
- package/dist/ws/connection.d.ts.map +1 -1
- package/dist/ws/connection.js +10 -2
- package/dist/ws/connection.js.map +1 -1
- package/dist/ws/host.d.ts +5 -0
- package/dist/ws/host.d.ts.map +1 -1
- package/dist/ws/host.js +18 -1
- package/dist/ws/host.js.map +1 -1
- package/package.json +6 -3
- package/src/app.ts +57 -24
- package/src/bin/brain-ui-cron.ts +152 -0
- package/src/brain/client.ts +95 -3
- package/src/config/env.ts +47 -9
- package/src/cron/digest.ts +45 -0
- package/src/cron/emit.ts +230 -0
- package/src/cron/run-job.ts +254 -0
- package/src/files/walker.ts +66 -10
- package/src/index.ts +13 -1
- package/src/middleware/auth.ts +311 -48
- package/src/middleware/body-limit.ts +47 -0
- package/src/middleware/origin.ts +92 -24
- package/src/middleware/passkeys.ts +80 -29
- package/src/routes/brain.ts +7 -3
- package/src/routes/files.ts +2 -2
- package/src/routes/models.ts +17 -10
- package/src/routes/pi-auth.ts +10 -4
- package/src/routes/push.ts +10 -4
- package/src/routes/render.ts +14 -10
- package/src/routes/share.ts +35 -34
- package/src/routes/skills.ts +18 -8
- package/src/routes/web-search.ts +6 -2
- package/src/share/staging.ts +2 -1
- package/src/ws/clients.ts +45 -7
- package/src/ws/connection.ts +11 -2
- package/src/ws/host.ts +23 -1
package/dist/middleware/auth.js
CHANGED
|
@@ -1,17 +1,44 @@
|
|
|
1
1
|
import { Hono } from "hono";
|
|
2
2
|
import { getSignedCookie, setSignedCookie, deleteCookie } from "hono/cookie";
|
|
3
3
|
import { isTailscaleAllowed, clientIp } from "./tailscale.js";
|
|
4
|
+
import { readJsonBody } from "./body-limit.js";
|
|
5
|
+
import { requireJson } from "./origin.js";
|
|
6
|
+
import { setSetting } from "../db/settings.js";
|
|
4
7
|
const COOKIE_NAME = "brain_ui_session";
|
|
5
8
|
const SESSION_TTL_SECONDS = 30 * 24 * 60 * 60; // 30 days
|
|
6
|
-
|
|
9
|
+
const SESSIONS_EPOCH_KEY = "auth.sessionsEpoch";
|
|
10
|
+
const SESSION_REVOKED_CLOSE_CODE = 1008;
|
|
11
|
+
const SESSION_REVOKED_CLOSE_REASON = "Sessions invalidated";
|
|
12
|
+
export const LOGIN_RATE_LIMIT = 5; // failures per window, per client IP
|
|
7
13
|
const LOGIN_RATE_WINDOW_MS = 60_000; // per minute
|
|
8
14
|
// A global cap in addition to the per-IP one: the per-IP key is derived from
|
|
9
15
|
// X-Forwarded-For, which a client behind a trusted proxy can rotate to mint a
|
|
10
16
|
// fresh bucket per request. The global cap bounds brute force across rotated
|
|
11
|
-
// IPs.
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
|
|
17
|
+
// IPs. At 100 genuine failures/minute it stays well above a human's needs and
|
|
18
|
+
// makes a global lockout substantially harder to weaponize, while still
|
|
19
|
+
// bounding distributed online guessing. Per-IP failures remain at 5/minute.
|
|
20
|
+
// Passkeys get 5 matched-but-invalid assertions/minute in an independent
|
|
21
|
+
// `pk:` bucket: assertions are not guessable, but verification still consumes
|
|
22
|
+
// resources. Password and passkey verification therefore each allow two
|
|
23
|
+
// in-flight operations per IP and eight process-wide. Two tolerates a browser
|
|
24
|
+
// retry/double-submit; eight bounds either verifier's comparable CPU cost.
|
|
25
|
+
// Keeping the reservation pools separate preserves passkeys' independent
|
|
26
|
+
// admission path while each pool still has a process-wide ceiling. The failure
|
|
27
|
+
// map and both reservation maps cap at 1,024 source keys, comfortably above
|
|
28
|
+
// the global password-failure budget while bounding forged-IP memory growth.
|
|
29
|
+
export const GLOBAL_LOGIN_RATE_LIMIT = 100; // failures per window, all IPs combined
|
|
30
|
+
export const PASSKEY_LOGIN_RATE_LIMIT = 5;
|
|
31
|
+
const PASSWORD_VERIFY_IN_FLIGHT_PER_IP = 2;
|
|
32
|
+
const PASSWORD_VERIFY_IN_FLIGHT_GLOBAL = 8;
|
|
33
|
+
const PASSKEY_VERIFY_IN_FLIGHT_PER_IP = 2;
|
|
34
|
+
const PASSKEY_VERIFY_IN_FLIGHT_GLOBAL = 8;
|
|
35
|
+
const LOGIN_BUCKET_CAP = 1_024;
|
|
36
|
+
// Client-derived password buckets always start `pw:ip:`, which cannot equal
|
|
37
|
+
// the fixed `pw:global` key for any client-controlled key suffix. Keeping these
|
|
38
|
+
// namespaces disjoint prevents a per-IP saturated write from clamping the
|
|
39
|
+
// authoritative global failure counter to the smaller per-IP limit.
|
|
40
|
+
const PASSWORD_IP_BUCKET_PREFIX = "pw:ip:";
|
|
41
|
+
const PASSWORD_GLOBAL_BUCKET = "pw:global";
|
|
15
42
|
export function resolveAuthMode(auth, log) {
|
|
16
43
|
if (auth.mode)
|
|
17
44
|
return auth.mode;
|
|
@@ -89,7 +116,7 @@ export function assertAuthConfig(mode, auth, log) {
|
|
|
89
116
|
});
|
|
90
117
|
}
|
|
91
118
|
/** Middleware guarding /api/* according to the resolved mode. */
|
|
92
|
-
export function authGuard(mode, auth) {
|
|
119
|
+
export function authGuard(mode, auth, db) {
|
|
93
120
|
switch (mode) {
|
|
94
121
|
case "tailscale":
|
|
95
122
|
return async (c, next) => {
|
|
@@ -111,7 +138,7 @@ export function authGuard(mode, auth) {
|
|
|
111
138
|
};
|
|
112
139
|
case "password":
|
|
113
140
|
return async (c, next) => {
|
|
114
|
-
if (await hasValidSession(c, auth)) {
|
|
141
|
+
if (await hasValidSession(c, auth, db)) {
|
|
115
142
|
await next();
|
|
116
143
|
}
|
|
117
144
|
else {
|
|
@@ -131,7 +158,7 @@ export function authGuard(mode, auth) {
|
|
|
131
158
|
* middleware may sit on the WS route (immutable-header errors). Mirrors
|
|
132
159
|
* {@link authGuard} without emitting a response.
|
|
133
160
|
*/
|
|
134
|
-
export async function isWsAuthorized(c, mode, auth) {
|
|
161
|
+
export async function isWsAuthorized(c, mode, auth, db) {
|
|
135
162
|
switch (mode) {
|
|
136
163
|
case "none":
|
|
137
164
|
return true;
|
|
@@ -140,7 +167,7 @@ export async function isWsAuthorized(c, mode, auth) {
|
|
|
140
167
|
case "proxy":
|
|
141
168
|
return hasProxyAuth(c, auth);
|
|
142
169
|
case "password":
|
|
143
|
-
return hasValidSession(c, auth);
|
|
170
|
+
return hasValidSession(c, auth, db);
|
|
144
171
|
}
|
|
145
172
|
}
|
|
146
173
|
// --- password mode helpers ---
|
|
@@ -149,9 +176,10 @@ export async function isWsAuthorized(c, mode, auth) {
|
|
|
149
176
|
* both password login and passkey login (middleware/passkeys.ts) call this, so
|
|
150
177
|
* authGuard / isWsAuthorized / TTL semantics stay identical across methods.
|
|
151
178
|
*/
|
|
152
|
-
export async function issueSessionCookie(c, auth) {
|
|
179
|
+
export async function issueSessionCookie(c, auth, db) {
|
|
153
180
|
const secret = auth.cookieSecret ?? "";
|
|
154
|
-
|
|
181
|
+
const epoch = sessionsEpoch(db);
|
|
182
|
+
await setSignedCookie(c, COOKIE_NAME, `${Date.now()}.${epoch}`, secret, {
|
|
155
183
|
httpOnly: true,
|
|
156
184
|
sameSite: "Strict",
|
|
157
185
|
// Always Secure — every real deployment serves over HTTPS, and we do not
|
|
@@ -162,26 +190,69 @@ export async function issueSessionCookie(c, auth) {
|
|
|
162
190
|
maxAge: SESSION_TTL_SECONDS,
|
|
163
191
|
});
|
|
164
192
|
}
|
|
165
|
-
async function hasValidSession(c, auth) {
|
|
193
|
+
async function hasValidSession(c, auth, db) {
|
|
166
194
|
const secret = auth.cookieSecret ?? "";
|
|
167
195
|
if (!secret)
|
|
168
196
|
return false;
|
|
197
|
+
let value;
|
|
169
198
|
try {
|
|
170
|
-
|
|
171
|
-
if (typeof value !== "string" || value.length === 0)
|
|
172
|
-
return false;
|
|
173
|
-
// The cookie value is the issue timestamp. Validate its age server-side:
|
|
174
|
-
// Max-Age is client-discardable, so the signature alone does not bound a
|
|
175
|
-
// session's lifetime — this does.
|
|
176
|
-
const issuedAt = Number(value);
|
|
177
|
-
if (!Number.isFinite(issuedAt))
|
|
178
|
-
return false;
|
|
179
|
-
const ageSeconds = (Date.now() - issuedAt) / 1000;
|
|
180
|
-
return ageSeconds >= 0 && ageSeconds < SESSION_TTL_SECONDS;
|
|
199
|
+
value = await getSignedCookie(c, secret, COOKIE_NAME);
|
|
181
200
|
}
|
|
182
201
|
catch {
|
|
183
202
|
return false;
|
|
184
203
|
}
|
|
204
|
+
if (typeof value !== "string" || value.length === 0)
|
|
205
|
+
return false;
|
|
206
|
+
// Both fields are decimal integers. Requiring the exact shape rejects every
|
|
207
|
+
// pre-epoch cookie instead of accidentally interpreting its timestamp as a
|
|
208
|
+
// current session.
|
|
209
|
+
const match = /^(\d+)\.(\d+)$/.exec(value);
|
|
210
|
+
if (!match)
|
|
211
|
+
return false;
|
|
212
|
+
const issuedAt = Number(match[1]);
|
|
213
|
+
const cookieEpoch = Number(match[2]);
|
|
214
|
+
if (!Number.isSafeInteger(issuedAt) || !Number.isSafeInteger(cookieEpoch)) {
|
|
215
|
+
return false;
|
|
216
|
+
}
|
|
217
|
+
const ageSeconds = (Date.now() - issuedAt) / 1000;
|
|
218
|
+
if (ageSeconds < 0 || ageSeconds >= SESSION_TTL_SECONDS)
|
|
219
|
+
return false;
|
|
220
|
+
// Deliberately outside the cookie-parser catch: corrupt authoritative auth
|
|
221
|
+
// state refuses loudly and must never degrade to epoch zero.
|
|
222
|
+
return cookieEpoch === sessionsEpoch(db);
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Read authoritative session state. A missing row is first-run epoch zero;
|
|
226
|
+
* any present row that is not a non-negative safe integer is corruption.
|
|
227
|
+
*/
|
|
228
|
+
function sessionsEpoch(db) {
|
|
229
|
+
const row = db
|
|
230
|
+
.query("SELECT value FROM settings WHERE key = ?")
|
|
231
|
+
.get(SESSIONS_EPOCH_KEY);
|
|
232
|
+
if (!row)
|
|
233
|
+
return 0;
|
|
234
|
+
let value;
|
|
235
|
+
try {
|
|
236
|
+
value = JSON.parse(row.value);
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
throw new Error(`Corrupt ${SESSIONS_EPOCH_KEY}: expected a JSON integer`);
|
|
240
|
+
}
|
|
241
|
+
if (!Number.isSafeInteger(value) || value < 0) {
|
|
242
|
+
throw new Error(`Corrupt ${SESSIONS_EPOCH_KEY}: expected a non-negative integer`);
|
|
243
|
+
}
|
|
244
|
+
return value;
|
|
245
|
+
}
|
|
246
|
+
/** Invalidate every issued session and disconnect every attached client. */
|
|
247
|
+
export function bumpSessionsEpoch(db, clients) {
|
|
248
|
+
const current = sessionsEpoch(db);
|
|
249
|
+
if (current === Number.MAX_SAFE_INTEGER) {
|
|
250
|
+
throw new Error(`${SESSIONS_EPOCH_KEY} cannot be advanced safely`);
|
|
251
|
+
}
|
|
252
|
+
const next = current + 1;
|
|
253
|
+
setSetting(db, SESSIONS_EPOCH_KEY, next);
|
|
254
|
+
clients.closeAll(SESSION_REVOKED_CLOSE_CODE, SESSION_REVOKED_CLOSE_REASON);
|
|
255
|
+
return next;
|
|
185
256
|
}
|
|
186
257
|
// --- proxy mode helpers ---
|
|
187
258
|
function hasProxyAuth(c, auth) {
|
|
@@ -195,63 +266,190 @@ function hasProxyAuth(c, auth) {
|
|
|
195
266
|
return !!user && user.trim().length > 0;
|
|
196
267
|
}
|
|
197
268
|
const loginBuckets = new Map();
|
|
269
|
+
function pruneExpiredBuckets(now) {
|
|
270
|
+
for (const [key, bucket] of loginBuckets) {
|
|
271
|
+
if (now >= bucket.resetAt)
|
|
272
|
+
loginBuckets.delete(key);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
function makeBucketRoom() {
|
|
276
|
+
while (loginBuckets.size >= LOGIN_BUCKET_CAP) {
|
|
277
|
+
// Keep the global password bucket authoritative. The cap is larger than
|
|
278
|
+
// its maximum number of per-IP contributors in one window, so ordinary
|
|
279
|
+
// password traffic never needs to evict an active per-IP failure record.
|
|
280
|
+
const oldest = [...loginBuckets.keys()].find((key) => key !== PASSWORD_GLOBAL_BUCKET);
|
|
281
|
+
if (oldest === undefined)
|
|
282
|
+
break;
|
|
283
|
+
loginBuckets.delete(oldest);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
function bucketForWrite(key, now) {
|
|
287
|
+
pruneExpiredBuckets(now);
|
|
288
|
+
const existing = loginBuckets.get(key);
|
|
289
|
+
if (existing)
|
|
290
|
+
return existing;
|
|
291
|
+
makeBucketRoom();
|
|
292
|
+
const bucket = { failures: 0, resetAt: now + LOGIN_RATE_WINDOW_MS };
|
|
293
|
+
loginBuckets.set(key, bucket);
|
|
294
|
+
return bucket;
|
|
295
|
+
}
|
|
296
|
+
/** Record one genuine authentication failure in a fixed one-minute window. */
|
|
297
|
+
export function recordLoginFailure(key, limit) {
|
|
298
|
+
const bucket = bucketForWrite(key, Date.now());
|
|
299
|
+
// Saturate: callers only care whether the limit was reached, and this avoids
|
|
300
|
+
// an unbounded counter if a test or future caller records after blocking.
|
|
301
|
+
bucket.failures = Math.min(limit, bucket.failures + 1);
|
|
302
|
+
}
|
|
303
|
+
/** Read without allocating: junk requests cannot grow the failure map. */
|
|
304
|
+
export function isLoginBlocked(key, limit) {
|
|
305
|
+
const now = Date.now();
|
|
306
|
+
const bucket = loginBuckets.get(key);
|
|
307
|
+
if (!bucket)
|
|
308
|
+
return false;
|
|
309
|
+
if (now >= bucket.resetAt) {
|
|
310
|
+
loginBuckets.delete(key);
|
|
311
|
+
return false;
|
|
312
|
+
}
|
|
313
|
+
return bucket.failures >= limit;
|
|
314
|
+
}
|
|
315
|
+
function createVerificationReservations(perIpLimit, globalLimit) {
|
|
316
|
+
const buckets = new Map();
|
|
317
|
+
let totalInFlight = 0;
|
|
318
|
+
function prune(now) {
|
|
319
|
+
for (const [key, bucket] of buckets) {
|
|
320
|
+
if (bucket.count === 0 && now >= bucket.expiresAt)
|
|
321
|
+
buckets.delete(key);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
return {
|
|
325
|
+
acquire(ip) {
|
|
326
|
+
const now = Date.now();
|
|
327
|
+
prune(now);
|
|
328
|
+
if (totalInFlight >= globalLimit)
|
|
329
|
+
return false;
|
|
330
|
+
let bucket = buckets.get(ip);
|
|
331
|
+
if (bucket && bucket.count >= perIpLimit)
|
|
332
|
+
return false;
|
|
333
|
+
if (!bucket) {
|
|
334
|
+
while (buckets.size >= LOGIN_BUCKET_CAP) {
|
|
335
|
+
const idle = [...buckets].find(([, entry]) => entry.count === 0);
|
|
336
|
+
if (!idle)
|
|
337
|
+
return false;
|
|
338
|
+
buckets.delete(idle[0]);
|
|
339
|
+
}
|
|
340
|
+
bucket = { count: 0, expiresAt: now + LOGIN_RATE_WINDOW_MS };
|
|
341
|
+
buckets.set(ip, bucket);
|
|
342
|
+
}
|
|
343
|
+
bucket.count++;
|
|
344
|
+
bucket.expiresAt = now + LOGIN_RATE_WINDOW_MS;
|
|
345
|
+
totalInFlight++;
|
|
346
|
+
return true;
|
|
347
|
+
},
|
|
348
|
+
release(ip) {
|
|
349
|
+
const bucket = buckets.get(ip);
|
|
350
|
+
if (!bucket || bucket.count === 0)
|
|
351
|
+
return;
|
|
352
|
+
bucket.count--;
|
|
353
|
+
bucket.expiresAt = Date.now() + LOGIN_RATE_WINDOW_MS;
|
|
354
|
+
totalInFlight--;
|
|
355
|
+
},
|
|
356
|
+
reset() {
|
|
357
|
+
buckets.clear();
|
|
358
|
+
totalInFlight = 0;
|
|
359
|
+
},
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
const passwordVerifications = createVerificationReservations(PASSWORD_VERIFY_IN_FLIGHT_PER_IP, PASSWORD_VERIFY_IN_FLIGHT_GLOBAL);
|
|
363
|
+
const passkeyVerifications = createVerificationReservations(PASSKEY_VERIFY_IN_FLIGHT_PER_IP, PASSKEY_VERIFY_IN_FLIGHT_GLOBAL);
|
|
364
|
+
function acquirePasswordVerification(ip) {
|
|
365
|
+
return passwordVerifications.acquire(ip);
|
|
366
|
+
}
|
|
367
|
+
function releasePasswordVerification(ip) {
|
|
368
|
+
passwordVerifications.release(ip);
|
|
369
|
+
}
|
|
370
|
+
/** Internal middleware coordination; not exported from the package root. */
|
|
371
|
+
export function acquirePasskeyVerification(ip) {
|
|
372
|
+
return passkeyVerifications.acquire(ip);
|
|
373
|
+
}
|
|
374
|
+
/** Internal middleware coordination; not exported from the package root. */
|
|
375
|
+
export function releasePasskeyVerification(ip) {
|
|
376
|
+
passkeyVerifications.release(ip);
|
|
377
|
+
}
|
|
198
378
|
/** Test-only: clear all rate-limit buckets (they are module-global state). */
|
|
199
379
|
export function resetLoginRateLimiter() {
|
|
200
380
|
loginBuckets.clear();
|
|
381
|
+
passwordVerifications.reset();
|
|
382
|
+
passkeyVerifications.reset();
|
|
201
383
|
}
|
|
384
|
+
/** Attempt-counting bucket retained for passkey option generation. */
|
|
202
385
|
export function consumeLoginToken(key, limit) {
|
|
203
|
-
|
|
204
|
-
let bucket = loginBuckets.get(key);
|
|
205
|
-
if (!bucket || now >= bucket.resetAt) {
|
|
206
|
-
bucket = { tokens: limit, resetAt: now + LOGIN_RATE_WINDOW_MS };
|
|
207
|
-
loginBuckets.set(key, bucket);
|
|
208
|
-
}
|
|
209
|
-
if (bucket.tokens <= 0)
|
|
386
|
+
if (isLoginBlocked(key, limit))
|
|
210
387
|
return false;
|
|
211
|
-
|
|
388
|
+
recordLoginFailure(key, limit);
|
|
212
389
|
return true;
|
|
213
390
|
}
|
|
214
391
|
/** Login/logout routes. Only functional in `password` mode. */
|
|
215
|
-
export function authRoutes(mode, auth, deps
|
|
392
|
+
export function authRoutes(mode, auth, deps) {
|
|
216
393
|
const app = new Hono();
|
|
217
394
|
const { log, failures } = deps;
|
|
218
|
-
|
|
395
|
+
const verifyPassword = deps.verifyPassword ?? Bun.password.verify;
|
|
396
|
+
let warnedUntrustedForwardedFor = false;
|
|
397
|
+
app.post("/auth/login", requireJson(), async (c) => {
|
|
219
398
|
if (mode !== "password") {
|
|
220
399
|
return c.json({ error: "Password login is not enabled" }, 400);
|
|
221
400
|
}
|
|
401
|
+
if (!auth.trustProxy &&
|
|
402
|
+
!warnedUntrustedForwardedFor &&
|
|
403
|
+
c.req.header("x-forwarded-for")) {
|
|
404
|
+
warnedUntrustedForwardedFor = true;
|
|
405
|
+
log?.emit({
|
|
406
|
+
severityText: "WARN",
|
|
407
|
+
body: "X-Forwarded-For ignored in password mode",
|
|
408
|
+
attributes: { "auth.mode": "password", "auth.trust_proxy": false },
|
|
409
|
+
});
|
|
410
|
+
}
|
|
222
411
|
const key = clientIp(c, auth.trustProxy, auth.trustProxyHops) || "unknown";
|
|
223
|
-
const
|
|
224
|
-
|
|
225
|
-
|
|
412
|
+
const perIpBucket = `${PASSWORD_IP_BUCKET_PREFIX}${key}`;
|
|
413
|
+
if (deps.passwordDisabled?.(c)) {
|
|
414
|
+
return c.json({ error: "Password login is disabled — sign in with a passkey." }, 403);
|
|
415
|
+
}
|
|
416
|
+
// Refuse a blocked client before reading its body: admission control is
|
|
417
|
+
// cheapest when it costs no parsing.
|
|
418
|
+
const perIpBlocked = isLoginBlocked(perIpBucket, LOGIN_RATE_LIMIT);
|
|
419
|
+
const globalBlocked = isLoginBlocked(PASSWORD_GLOBAL_BUCKET, GLOBAL_LOGIN_RATE_LIMIT);
|
|
420
|
+
if (perIpBlocked || globalBlocked) {
|
|
226
421
|
failures?.add(1, { reason: "rate_limited", method: "password" });
|
|
227
422
|
log?.emit({
|
|
228
423
|
severityText: "WARN",
|
|
229
424
|
body: "login rate limited",
|
|
230
|
-
attributes: { ip: key, limit:
|
|
425
|
+
attributes: { ip: key, limit: perIpBlocked ? "ip" : "global" },
|
|
231
426
|
});
|
|
232
427
|
return c.json({ error: "Too many attempts. Try again in a minute." }, 429);
|
|
233
428
|
}
|
|
234
|
-
if (deps.passwordDisabled?.(c)) {
|
|
235
|
-
return c.json({ error: "Password login is disabled — sign in with a passkey." }, 403);
|
|
236
|
-
}
|
|
237
429
|
const hash = auth.passwordHash ?? "";
|
|
238
430
|
const secret = auth.cookieSecret ?? "";
|
|
239
431
|
let body;
|
|
240
432
|
try {
|
|
241
|
-
|
|
433
|
+
const result = await readJsonBody(c);
|
|
434
|
+
if (result instanceof Response)
|
|
435
|
+
return result;
|
|
436
|
+
body = result;
|
|
242
437
|
}
|
|
243
438
|
catch {
|
|
244
439
|
return c.json({ error: "Invalid request body" }, 400);
|
|
245
440
|
}
|
|
246
441
|
const password = typeof body.password === "string" ? body.password : "";
|
|
247
442
|
if (!password || !hash || !secret) {
|
|
248
|
-
|
|
443
|
+
return c.json({ error: "Invalid credentials" }, 401);
|
|
444
|
+
}
|
|
445
|
+
if (!acquirePasswordVerification(key)) {
|
|
446
|
+
failures?.add(1, { reason: "in_flight_limited", method: "password" });
|
|
249
447
|
log?.emit({
|
|
250
448
|
severityText: "WARN",
|
|
251
|
-
body: "
|
|
449
|
+
body: "password verification capacity reached",
|
|
252
450
|
attributes: { ip: key },
|
|
253
451
|
});
|
|
254
|
-
return c.json({ error: "
|
|
452
|
+
return c.json({ error: "Too many login verifications in progress." }, 429);
|
|
255
453
|
}
|
|
256
454
|
// A verify that THROWS is not a wrong password — it is a hash Bun cannot
|
|
257
455
|
// parse (a corrupt BRAIN_UI_PASSWORD_HASH locks the owner out of every
|
|
@@ -259,11 +457,14 @@ export function authRoutes(mode, auth, deps = {}) {
|
|
|
259
457
|
let ok = false;
|
|
260
458
|
let verifyError = null;
|
|
261
459
|
try {
|
|
262
|
-
ok = await
|
|
460
|
+
ok = await verifyPassword(password, hash);
|
|
263
461
|
}
|
|
264
462
|
catch (err) {
|
|
265
463
|
verifyError = err;
|
|
266
464
|
}
|
|
465
|
+
finally {
|
|
466
|
+
releasePasswordVerification(key);
|
|
467
|
+
}
|
|
267
468
|
if (verifyError) {
|
|
268
469
|
failures?.add(1, { reason: "verify_error", method: "password" });
|
|
269
470
|
log?.emit({
|
|
@@ -276,6 +477,8 @@ export function authRoutes(mode, auth, deps = {}) {
|
|
|
276
477
|
return c.json({ error: "Invalid credentials" }, 401);
|
|
277
478
|
}
|
|
278
479
|
if (!ok) {
|
|
480
|
+
recordLoginFailure(perIpBucket, LOGIN_RATE_LIMIT);
|
|
481
|
+
recordLoginFailure(PASSWORD_GLOBAL_BUCKET, GLOBAL_LOGIN_RATE_LIMIT);
|
|
279
482
|
failures?.add(1, { reason: "invalid_password", method: "password" });
|
|
280
483
|
log?.emit({
|
|
281
484
|
severityText: "WARN",
|
|
@@ -284,7 +487,7 @@ export function authRoutes(mode, auth, deps = {}) {
|
|
|
284
487
|
});
|
|
285
488
|
return c.json({ error: "Invalid credentials" }, 401);
|
|
286
489
|
}
|
|
287
|
-
await issueSessionCookie(c, auth);
|
|
490
|
+
await issueSessionCookie(c, auth, deps.db);
|
|
288
491
|
log?.emit({
|
|
289
492
|
severityText: "INFO",
|
|
290
493
|
body: "login succeeded",
|
|
@@ -292,7 +495,12 @@ export function authRoutes(mode, auth, deps = {}) {
|
|
|
292
495
|
});
|
|
293
496
|
return c.json({ ok: true });
|
|
294
497
|
});
|
|
295
|
-
app.post("/auth/logout", (c) => {
|
|
498
|
+
app.post("/auth/logout", async (c) => {
|
|
499
|
+
if (mode === "password" && !(await hasValidSession(c, auth, deps.db))) {
|
|
500
|
+
return c.json({ error: "Authentication required", authRequired: true }, 401);
|
|
501
|
+
}
|
|
502
|
+
if (mode === "password")
|
|
503
|
+
bumpSessionsEpoch(deps.db, deps.clients);
|
|
296
504
|
deleteCookie(c, COOKIE_NAME, { path: "/" });
|
|
297
505
|
return c.json({ ok: true });
|
|
298
506
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Context } from "hono";
|
|
2
|
+
/** Ordinary JSON control-plane requests never need to be large. */
|
|
3
|
+
export declare const JSON_BODY_LIMIT_BYTES: number;
|
|
4
|
+
/** Render requests may contain inlined images and SVG. */
|
|
5
|
+
export declare const RENDER_BODY_LIMIT_BYTES = 5000000;
|
|
6
|
+
/**
|
|
7
|
+
* Read and parse a JSON request without replacing the request object.
|
|
8
|
+
*
|
|
9
|
+
* Content-Length can reject an oversized request before its stream is touched.
|
|
10
|
+
* Lengthless and chunked bodies are counted while streaming and cancelled as
|
|
11
|
+
* soon as they cross the cap. Returning the 413 response lets route-local
|
|
12
|
+
* invalid-JSON handling remain distinct from an oversized request.
|
|
13
|
+
*/
|
|
14
|
+
export declare function readJsonBody<T = unknown>(c: Context, maxBytes?: number): Promise<T | Response>;
|
|
15
|
+
//# sourceMappingURL=body-limit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"body-limit.d.ts","sourceRoot":"","sources":["../../src/middleware/body-limit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAEpC,mEAAmE;AACnE,eAAO,MAAM,qBAAqB,QAAa,CAAC;AAEhD,0DAA0D;AAC1D,eAAO,MAAM,uBAAuB,UAAY,CAAC;AAEjD;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,CAAC,GAAG,OAAO,EAC5C,CAAC,EAAE,OAAO,EACV,QAAQ,SAAwB,GAC/B,OAAO,CAAC,CAAC,GAAG,QAAQ,CAAC,CA2BvB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/** Ordinary JSON control-plane requests never need to be large. */
|
|
2
|
+
export const JSON_BODY_LIMIT_BYTES = 256 * 1024;
|
|
3
|
+
/** Render requests may contain inlined images and SVG. */
|
|
4
|
+
export const RENDER_BODY_LIMIT_BYTES = 5_000_000;
|
|
5
|
+
/**
|
|
6
|
+
* Read and parse a JSON request without replacing the request object.
|
|
7
|
+
*
|
|
8
|
+
* Content-Length can reject an oversized request before its stream is touched.
|
|
9
|
+
* Lengthless and chunked bodies are counted while streaming and cancelled as
|
|
10
|
+
* soon as they cross the cap. Returning the 413 response lets route-local
|
|
11
|
+
* invalid-JSON handling remain distinct from an oversized request.
|
|
12
|
+
*/
|
|
13
|
+
export async function readJsonBody(c, maxBytes = JSON_BODY_LIMIT_BYTES) {
|
|
14
|
+
const contentLength = c.req.header("content-length");
|
|
15
|
+
if (contentLength !== undefined) {
|
|
16
|
+
const declaredBytes = Number(contentLength);
|
|
17
|
+
if (Number.isFinite(declaredBytes) && declaredBytes > maxBytes) {
|
|
18
|
+
return c.json({ error: "Request body too large" }, 413);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const reader = c.req.raw.body?.getReader();
|
|
22
|
+
if (!reader)
|
|
23
|
+
return JSON.parse("");
|
|
24
|
+
const decoder = new TextDecoder();
|
|
25
|
+
let bytesRead = 0;
|
|
26
|
+
let text = "";
|
|
27
|
+
while (true) {
|
|
28
|
+
const { done, value } = await reader.read();
|
|
29
|
+
if (done)
|
|
30
|
+
break;
|
|
31
|
+
bytesRead += value.byteLength;
|
|
32
|
+
if (bytesRead > maxBytes) {
|
|
33
|
+
await reader.cancel().catch(() => undefined);
|
|
34
|
+
return c.json({ error: "Request body too large" }, 413);
|
|
35
|
+
}
|
|
36
|
+
text += decoder.decode(value, { stream: true });
|
|
37
|
+
}
|
|
38
|
+
text += decoder.decode();
|
|
39
|
+
return JSON.parse(text);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=body-limit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"body-limit.js","sourceRoot":"","sources":["../../src/middleware/body-limit.ts"],"names":[],"mappings":"AAEA,mEAAmE;AACnE,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,GAAG,IAAI,CAAC;AAEhD,0DAA0D;AAC1D,MAAM,CAAC,MAAM,uBAAuB,GAAG,SAAS,CAAC;AAEjD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,CAAU,EACV,QAAQ,GAAG,qBAAqB;IAEhC,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACrD,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;QAC5C,IAAI,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,aAAa,GAAG,QAAQ,EAAE,CAAC;YAC/D,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,EAAE,GAAG,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;IAC3C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAM,CAAC;IAExC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,IAAI;YAAE,MAAM;QAChB,SAAS,IAAI,KAAK,CAAC,UAAU,CAAC;QAC9B,IAAI,SAAS,GAAG,QAAQ,EAAE,CAAC;YACzB,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC7C,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,EAAE,GAAG,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IACzB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;AAC/B,CAAC"}
|
|
@@ -1,16 +1,24 @@
|
|
|
1
|
-
import type { Context } from "hono";
|
|
1
|
+
import type { Context, MiddlewareHandler } from "hono";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Browser request origin policy shared by state-changing HTTP routes and the
|
|
4
|
+
* WebSocket upgrade.
|
|
4
5
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
6
|
+
* Fetch metadata is authoritative when it says same-origin (including the
|
|
7
|
+
* Vite proxy case where Host is rewritten). Older browsers fall back to an
|
|
8
|
+
* Origin comparison: host+port without TRUST_PROXY, or the full origin when
|
|
9
|
+
* proxy headers are trusted. Headerless non-browser clients remain accepted
|
|
10
|
+
* and are still subject to the route's auth guard. ALLOWED_ORIGINS is an
|
|
11
|
+
* additional path for explicitly configured split-topology deployments.
|
|
12
|
+
*/
|
|
13
|
+
export declare function isSameOriginRequest(c: Context, allowedOrigins: readonly string[], trustProxy?: boolean): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Enforce the origin policy on every non-GET API request, with an optional
|
|
16
|
+
* additional allowlist confined to one route prefix.
|
|
14
17
|
*/
|
|
15
|
-
export declare function
|
|
18
|
+
export declare function originPolicy(allowedOrigins: readonly string[], trustProxy?: boolean, scopedAllowlist?: {
|
|
19
|
+
pathPrefix: string;
|
|
20
|
+
origins: readonly string[];
|
|
21
|
+
}): MiddlewareHandler;
|
|
22
|
+
/** Require the exact JSON media type while allowing standard parameters. */
|
|
23
|
+
export declare function requireJson(): MiddlewareHandler;
|
|
16
24
|
//# sourceMappingURL=origin.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"origin.d.ts","sourceRoot":"","sources":["../../src/middleware/origin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"origin.d.ts","sourceRoot":"","sources":["../../src/middleware/origin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AA4BvD;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,CAAC,EAAE,OAAO,EACV,cAAc,EAAE,SAAS,MAAM,EAAE,EACjC,UAAU,UAAQ,GACjB,OAAO,CAqBT;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,cAAc,EAAE,SAAS,MAAM,EAAE,EACjC,UAAU,UAAQ,EAClB,eAAe,CAAC,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GACnE,iBAAiB,CAcnB;AAED,4EAA4E;AAC5E,wBAAgB,WAAW,IAAI,iBAAiB,CAQ/C"}
|