@vex-chat/spire 4.0.0 → 4.1.1

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.
@@ -3,10 +3,12 @@
3
3
  * Licensed under AGPL-3.0. See LICENSE for details.
4
4
  * Commercial licenses available at vex.wtf
5
5
  */
6
+ import { createHash, randomBytes, timingSafeEqual } from "node:crypto";
6
7
  import express from "express";
7
8
  import { XUtils } from "@vex-chat/crypto";
8
9
  import { PasskeyAuthFinishPayloadSchema, PasskeyAuthStartPayloadSchema, PasskeyRegistrationFinishPayloadSchema, PasskeyRegistrationStartPayloadSchema, } from "@vex-chat/types";
9
10
  import { generateAuthenticationOptions, generateRegistrationOptions, verifyAuthenticationResponse, verifyRegistrationResponse, } from "@simplewebauthn/server";
11
+ import { z } from "zod";
10
12
  import { JWT_EXPIRY_PASSKEY } from "../Spire.js";
11
13
  import { signAuthJwt } from "../utils/authJwt.js";
12
14
  import { AppError } from "./errors.js";
@@ -17,11 +19,73 @@ import { sendWireResponse } from "./wireResponse.js";
17
19
  import { protect, protectAnyAuth } from "./index.js";
18
20
  const REGISTRATION_TTL_MS = 5 * 60 * 1000; // 5 min
19
21
  const AUTHENTICATION_TTL_MS = 5 * 60 * 1000;
22
+ const BROWSER_AUTHENTICATION_TTL_MS = 5 * 60 * 1000;
23
+ const BROWSER_REGISTRATION_TTL_MS = 5 * 60 * 1000;
20
24
  // Cap each user's passkey count so a compromised JWT can't fill the
21
25
  // table. WebAuthn-style apps typically allow ~20; we go conservative.
22
26
  const MAX_PASSKEYS_PER_USER = 10;
23
27
  const pendingRegistrations = new Map();
24
28
  const pendingAuthentications = new Map();
29
+ const pendingBrowserAuthentications = new Map();
30
+ const pendingBrowserRegistrations = new Map();
31
+ const BrowserHandoffTokenSchema = z.object({
32
+ token: z.string().min(32).max(256),
33
+ });
34
+ const BrowserAuthenticationFinishSchema = BrowserHandoffTokenSchema.extend({
35
+ response: z.record(z.string(), z.unknown()),
36
+ });
37
+ const BrowserRegistrationFinishSchema = BrowserHandoffTokenSchema.extend({
38
+ response: z.record(z.string(), z.unknown()),
39
+ });
40
+ function browserTokenDigest(token) {
41
+ return createHash("sha256").update(token, "utf8").digest();
42
+ }
43
+ function browserTokenMatches(pending, token) {
44
+ return timingSafeEqual(pending.tokenDigest, browserTokenDigest(token));
45
+ }
46
+ function createBrowserAuthentication(authenticationRequestID) {
47
+ pruneBrowserAuthentications();
48
+ const requestID = crypto.randomUUID();
49
+ const browserToken = randomBytes(32).toString("base64url");
50
+ const createdAt = Date.now();
51
+ pendingBrowserAuthentications.set(requestID, {
52
+ authenticationRequestID,
53
+ createdAt,
54
+ status: "pending",
55
+ tokenDigest: browserTokenDigest(browserToken),
56
+ });
57
+ return {
58
+ browserToken,
59
+ expiresAt: new Date(createdAt + BROWSER_AUTHENTICATION_TTL_MS).toISOString(),
60
+ requestID,
61
+ };
62
+ }
63
+ function createBrowserRegistration(args) {
64
+ pruneBrowserRegistrations();
65
+ const requestID = crypto.randomUUID();
66
+ const browserToken = randomBytes(32).toString("base64url");
67
+ const createdAt = Date.now();
68
+ pendingBrowserRegistrations.set(requestID, {
69
+ createdAt,
70
+ deviceID: args.deviceID,
71
+ name: args.name,
72
+ registrationRequestID: args.registrationRequestID,
73
+ status: "pending",
74
+ tokenDigest: browserTokenDigest(browserToken),
75
+ userID: args.userID,
76
+ username: args.username,
77
+ });
78
+ return {
79
+ browserToken,
80
+ expiresAt: new Date(createdAt + BROWSER_REGISTRATION_TTL_MS).toISOString(),
81
+ requestID,
82
+ };
83
+ }
84
+ function failBrowserRegistration(pending, error) {
85
+ delete pending.challenge;
86
+ pending.error = error;
87
+ pending.status = "failed";
88
+ }
25
89
  /**
26
90
  * Returns the WebAuthn relying-party config from the environment.
27
91
  *
@@ -30,7 +94,7 @@ const pendingAuthentications = new Map();
30
94
  * - `SPIRE_PASSKEY_RP_NAME` — display name for prompts. Defaults to
31
95
  * "Vex".
32
96
  * - `SPIRE_PASSKEY_ORIGINS` — comma-separated allowlist of expected
33
- * client origins (e.g. `https://app.vex.wtf,tauri://localhost,
97
+ * client origins (e.g. `https://app.vex.wtf,
34
98
  * http://localhost:5173`). Required: WebAuthn binds an assertion
35
99
  * to its origin and we must check it explicitly.
36
100
  *
@@ -69,6 +133,21 @@ function pruneAuthentications(nowMs = Date.now()) {
69
133
  for (const [id, entry] of pendingAuthentications.entries()) {
70
134
  if (nowMs - entry.createdAt > AUTHENTICATION_TTL_MS) {
71
135
  pendingAuthentications.delete(id);
136
+ pendingBrowserAuthentications.delete(entry.browserRequestID);
137
+ }
138
+ }
139
+ }
140
+ function pruneBrowserAuthentications(nowMs = Date.now()) {
141
+ for (const [id, entry] of pendingBrowserAuthentications.entries()) {
142
+ if (nowMs - entry.createdAt > BROWSER_AUTHENTICATION_TTL_MS) {
143
+ pendingBrowserAuthentications.delete(id);
144
+ }
145
+ }
146
+ }
147
+ function pruneBrowserRegistrations(nowMs = Date.now()) {
148
+ for (const [id, entry] of pendingBrowserRegistrations.entries()) {
149
+ if (nowMs - entry.createdAt > BROWSER_REGISTRATION_TTL_MS) {
150
+ pendingBrowserRegistrations.delete(id);
72
151
  }
73
152
  }
74
153
  }
@@ -163,7 +242,15 @@ export const getPasskeyRouter = (db) => {
163
242
  });
164
243
  pruneRegistrations();
165
244
  const requestID = crypto.randomUUID();
245
+ const browserHandoff = createBrowserRegistration({
246
+ deviceID: req.device.deviceID,
247
+ name: parsed.data.name,
248
+ registrationRequestID: requestID,
249
+ userID,
250
+ username: userDetails.username,
251
+ });
166
252
  pendingRegistrations.set(requestID, {
253
+ browserRequestID: browserHandoff.requestID,
167
254
  challenge: options.challenge,
168
255
  createdAt: Date.now(),
169
256
  deviceID: req.device.deviceID,
@@ -176,7 +263,11 @@ export const getPasskeyRouter = (db) => {
176
263
  // SimpleWebAuthn). The wire shape is identical — both
177
264
  // sides hand the JSON straight to navigator.credentials.
178
265
  sendWireResponse(req, res, {
179
- options,
266
+ // Older libvex releases preserve the opaque options object but
267
+ // strip unknown top-level fields. Keep the handoff inside that
268
+ // object so desktop can adopt the HTTPS bridge before its next
269
+ // package bump; WebAuthn ignores unknown dictionary members.
270
+ options: { ...options, vexBrowserHandoff: browserHandoff },
180
271
  requestID,
181
272
  });
182
273
  });
@@ -214,6 +305,7 @@ export const getPasskeyRouter = (db) => {
214
305
  // Single-use challenge: clear immediately so a replay can't
215
306
  // re-bind the credential to a second name.
216
307
  pendingRegistrations.delete(parsed.data.requestID);
308
+ pendingBrowserRegistrations.delete(pending.browserRequestID);
217
309
  const { expectedOrigin, rpID } = getRpConfig();
218
310
  let verification;
219
311
  try {
@@ -306,6 +398,233 @@ export const getPasskeyRouter = (db) => {
306
398
  res.sendStatus(200);
307
399
  });
308
400
  // ── Public passkey login ───────────────────────────────────────────
401
+ router.post("/auth/passkey/browser-registration/:requestID/begin", authLimiter, async (req, res) => {
402
+ const parsed = BrowserHandoffTokenSchema.safeParse(req.body);
403
+ if (!parsed.success) {
404
+ res.status(400).send({ error: "Invalid browser handoff." });
405
+ return;
406
+ }
407
+ pruneBrowserRegistrations();
408
+ const pending = pendingBrowserRegistrations.get(getParam(req, "requestID"));
409
+ if (!pending || !browserTokenMatches(pending, parsed.data.token)) {
410
+ res.status(401).send({
411
+ error: "Browser handoff is invalid or expired.",
412
+ });
413
+ return;
414
+ }
415
+ if (pending.status === "failed") {
416
+ res.status(409).send({
417
+ error: pending.error ??
418
+ "Browser handoff has already completed.",
419
+ });
420
+ return;
421
+ }
422
+ const device = await db.retrieveDevice(pending.deviceID);
423
+ if (!device || device.owner !== pending.userID) {
424
+ failBrowserRegistration(pending, "The originating device is no longer approved.");
425
+ res.status(401).send({ error: pending.error });
426
+ return;
427
+ }
428
+ const existing = await db.retrievePasskeysByUser(pending.userID);
429
+ if (existing.length >= MAX_PASSKEYS_PER_USER) {
430
+ failBrowserRegistration(pending, `Each account is limited to ${MAX_PASSKEYS_PER_USER} passkeys.`);
431
+ res.status(409).send({ error: pending.error });
432
+ return;
433
+ }
434
+ // The browser and native challenges represent one user action.
435
+ // Once the HTTPS path starts, the custom-origin path cannot also
436
+ // finish and create a second credential.
437
+ pendingRegistrations.delete(pending.registrationRequestID);
438
+ const { rpID, rpName } = getRpConfig();
439
+ const options = await generateRegistrationOptions({
440
+ attestationType: "none",
441
+ authenticatorSelection: {
442
+ requireResidentKey: false,
443
+ residentKey: "preferred",
444
+ userVerification: "required",
445
+ },
446
+ excludeCredentials: [],
447
+ rpID,
448
+ rpName,
449
+ userDisplayName: pending.username,
450
+ userID: new TextEncoder().encode(pending.userID),
451
+ userName: pending.username,
452
+ });
453
+ pending.challenge = options.challenge;
454
+ delete pending.error;
455
+ pending.status = "in_progress";
456
+ sendWireResponse(req, res, { options });
457
+ });
458
+ router.post("/auth/passkey/browser-registration/:requestID/finish", authLimiter, async (req, res) => {
459
+ const parsed = BrowserRegistrationFinishSchema.safeParse(req.body);
460
+ if (!parsed.success) {
461
+ res.status(400).send({
462
+ error: "Invalid browser handoff response.",
463
+ });
464
+ return;
465
+ }
466
+ pruneBrowserRegistrations();
467
+ const pending = pendingBrowserRegistrations.get(getParam(req, "requestID"));
468
+ if (!pending || !browserTokenMatches(pending, parsed.data.token)) {
469
+ res.status(401).send({
470
+ error: "Browser handoff is invalid or expired.",
471
+ });
472
+ return;
473
+ }
474
+ if (pending.status !== "in_progress" || !pending.challenge) {
475
+ res.status(409).send({
476
+ error: "Request a fresh passkey challenge and try again.",
477
+ });
478
+ return;
479
+ }
480
+ const challenge = pending.challenge;
481
+ delete pending.challenge;
482
+ const device = await db.retrieveDevice(pending.deviceID);
483
+ if (!device || device.owner !== pending.userID) {
484
+ failBrowserRegistration(pending, "The originating device is no longer approved.");
485
+ res.status(401).send({ error: pending.error });
486
+ return;
487
+ }
488
+ const { expectedOrigin, rpID } = getRpConfig();
489
+ let verification;
490
+ try {
491
+ verification = await verifyRegistrationResponse({
492
+ expectedChallenge: challenge,
493
+ expectedOrigin,
494
+ expectedRPID: rpID,
495
+ requireUserVerification: true,
496
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- structurally validated by simplewebauthn below
497
+ response: parsed.data
498
+ .response,
499
+ });
500
+ }
501
+ catch (err) {
502
+ logWebAuthnFailure("browser registration", err);
503
+ failBrowserRegistration(pending, "Passkey attestation could not be verified.");
504
+ res.status(400).send({ error: pending.error });
505
+ return;
506
+ }
507
+ if (!verification.verified) {
508
+ failBrowserRegistration(pending, "Passkey attestation failed.");
509
+ res.status(400).send({ error: pending.error });
510
+ return;
511
+ }
512
+ const credential = verification.registrationInfo.credential;
513
+ const duplicate = await db.retrievePasskeyByCredentialID(credential.id);
514
+ if (duplicate) {
515
+ failBrowserRegistration(pending, "This authenticator is already registered.");
516
+ res.status(409).send({ error: pending.error });
517
+ return;
518
+ }
519
+ const existing = await db.retrievePasskeysByUser(pending.userID);
520
+ if (existing.length >= MAX_PASSKEYS_PER_USER) {
521
+ failBrowserRegistration(pending, `Each account is limited to ${MAX_PASSKEYS_PER_USER} passkeys.`);
522
+ res.status(409).send({ error: pending.error });
523
+ return;
524
+ }
525
+ const created = await db.createPasskey(pending.userID, pending.name, credential.id, XUtils.encodeHex(credential.publicKey), 0, sanitizeTransports(credential.transports ?? []));
526
+ pendingBrowserRegistrations.delete(getParam(req, "requestID"));
527
+ sendWireResponse(req, res, created);
528
+ });
529
+ router.post("/auth/passkey/browser-authentication/:requestID/begin", authLimiter, (req, res) => {
530
+ const parsed = BrowserHandoffTokenSchema.safeParse(req.body);
531
+ if (!parsed.success) {
532
+ res.status(400).send({ error: "Invalid browser handoff." });
533
+ return;
534
+ }
535
+ pruneAuthentications();
536
+ pruneBrowserAuthentications();
537
+ const browserRequestID = getParam(req, "requestID");
538
+ const browserPending = pendingBrowserAuthentications.get(browserRequestID);
539
+ if (!browserPending ||
540
+ !browserTokenMatches(browserPending, parsed.data.token)) {
541
+ res.status(401).send({
542
+ error: "Browser handoff is invalid or expired.",
543
+ });
544
+ return;
545
+ }
546
+ const authenticationPending = pendingAuthentications.get(browserPending.authenticationRequestID);
547
+ if (!authenticationPending) {
548
+ pendingBrowserAuthentications.delete(browserRequestID);
549
+ res.status(401).send({
550
+ error: "Authentication request is invalid or expired.",
551
+ });
552
+ return;
553
+ }
554
+ if (browserPending.status === "response_ready") {
555
+ res.status(409).send({
556
+ error: "This browser handoff has already completed.",
557
+ });
558
+ return;
559
+ }
560
+ browserPending.status = "in_progress";
561
+ sendWireResponse(req, res, {
562
+ options: authenticationPending.options,
563
+ });
564
+ });
565
+ router.post("/auth/passkey/browser-authentication/:requestID/finish", authLimiter, (req, res) => {
566
+ const parsed = BrowserAuthenticationFinishSchema.safeParse(req.body);
567
+ if (!parsed.success) {
568
+ res.status(400).send({
569
+ error: "Invalid browser handoff response.",
570
+ });
571
+ return;
572
+ }
573
+ pruneAuthentications();
574
+ pruneBrowserAuthentications();
575
+ const browserRequestID = getParam(req, "requestID");
576
+ const browserPending = pendingBrowserAuthentications.get(browserRequestID);
577
+ if (!browserPending ||
578
+ !browserTokenMatches(browserPending, parsed.data.token)) {
579
+ res.status(401).send({
580
+ error: "Browser handoff is invalid or expired.",
581
+ });
582
+ return;
583
+ }
584
+ if (browserPending.status !== "in_progress" ||
585
+ !pendingAuthentications.has(browserPending.authenticationRequestID)) {
586
+ res.status(409).send({
587
+ error: "Request a fresh passkey challenge and try again.",
588
+ });
589
+ return;
590
+ }
591
+ browserPending.response = parsed.data.response;
592
+ browserPending.status = "response_ready";
593
+ sendWireResponse(req, res, { ok: true });
594
+ });
595
+ router.post("/auth/passkey/browser-authentication/:requestID/status", authLimiter, (req, res) => {
596
+ const parsed = BrowserHandoffTokenSchema.safeParse(req.body);
597
+ if (!parsed.success) {
598
+ res.status(400).send({ error: "Invalid browser handoff." });
599
+ return;
600
+ }
601
+ pruneAuthentications();
602
+ pruneBrowserAuthentications();
603
+ const browserRequestID = getParam(req, "requestID");
604
+ const browserPending = pendingBrowserAuthentications.get(browserRequestID);
605
+ if (!browserPending ||
606
+ !browserTokenMatches(browserPending, parsed.data.token)) {
607
+ res.status(401).send({
608
+ error: "Browser handoff is invalid or expired.",
609
+ });
610
+ return;
611
+ }
612
+ if (!pendingAuthentications.has(browserPending.authenticationRequestID)) {
613
+ pendingBrowserAuthentications.delete(browserRequestID);
614
+ res.status(401).send({
615
+ error: "Authentication request is invalid or expired.",
616
+ });
617
+ return;
618
+ }
619
+ if (browserPending.status !== "response_ready" ||
620
+ !browserPending.response) {
621
+ res.status(202).send({ status: browserPending.status });
622
+ return;
623
+ }
624
+ sendWireResponse(req, res, {
625
+ response: browserPending.response,
626
+ });
627
+ });
309
628
  router.post("/auth/passkey/begin", authLimiter, async (req, res) => {
310
629
  const parsed = PasskeyAuthStartPayloadSchema.safeParse(req.body);
311
630
  if (!parsed.success) {
@@ -345,13 +664,16 @@ export const getPasskeyRouter = (db) => {
345
664
  });
346
665
  pruneAuthentications();
347
666
  const requestID = crypto.randomUUID();
667
+ const browserHandoff = createBrowserAuthentication(requestID);
348
668
  pendingAuthentications.set(requestID, {
669
+ browserRequestID: browserHandoff.requestID,
349
670
  challenge: options.challenge,
350
671
  createdAt: Date.now(),
672
+ options,
351
673
  userID: user.userID,
352
674
  });
353
675
  sendWireResponse(req, res, {
354
- options,
676
+ options: { ...options, vexBrowserHandoff: browserHandoff },
355
677
  requestID,
356
678
  });
357
679
  });
@@ -374,6 +696,7 @@ export const getPasskeyRouter = (db) => {
374
696
  }
375
697
  // Single-use.
376
698
  pendingAuthentications.delete(parsed.data.requestID);
699
+ pendingBrowserAuthentications.delete(pending.browserRequestID);
377
700
  // The browser's AuthenticationResponseJSON is opaque to spire
378
701
  // — simplewebauthn does the structural decode + signature
379
702
  // verification. The cast from `Record<string, unknown>` to
@@ -1 +1 @@
1
- {"version":3,"file":"passkey.js","sourceRoot":"","sources":["../../src/server/passkey.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"passkey.js","sourceRoot":"","sources":["../../src/server/passkey.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Copyright (c) 2020-2026 Vex Heavy Industries LLC
3
+ * Licensed under AGPL-3.0. See LICENSE for details.
4
+ * Commercial licenses available at vex.wtf
5
+ */
6
+ import type { Database } from "../Database.ts";
7
+ type NotifyServerChange = (serverID: string) => Promise<void>;
8
+ export declare function deleteServerIconFile(iconID: string): Promise<void>;
9
+ export declare const getServerIconRouter: (db: Database, notifyServerChange: NotifyServerChange) => import("express-serve-static-core").Router;
10
+ export {};
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Copyright (c) 2020-2026 Vex Heavy Industries LLC
3
+ * Licensed under AGPL-3.0. See LICENSE for details.
4
+ * Commercial licenses available at vex.wtf
5
+ */
6
+ import * as fs from "node:fs";
7
+ import * as fsp from "node:fs/promises";
8
+ import express from "express";
9
+ import { XUtils } from "@vex-chat/crypto";
10
+ import { fileTypeFromBuffer, fileTypeFromFile } from "file-type";
11
+ import multer from "multer";
12
+ import { z } from "zod/v4";
13
+ import { POWER_LEVELS } from "../ClientManager.js";
14
+ import { msgpack } from "../utils/msgpack.js";
15
+ import { hasPermission } from "./permissions.js";
16
+ import { uploadLimiter } from "./rateLimit.js";
17
+ import { getParam, getUser } from "./utils.js";
18
+ import { ALLOWED_IMAGE_TYPES, protect } from "./index.js";
19
+ const SERVER_ICON_DIR = "server-icons";
20
+ const MAX_SERVER_ICON_BYTES = 5 * 1024 * 1024;
21
+ const safePathParam = z.string().regex(/^[a-zA-Z0-9._-]+$/);
22
+ const serverIconUpload = multer({
23
+ limits: { fields: 1, files: 1, fileSize: MAX_SERVER_ICON_BYTES, parts: 2 },
24
+ });
25
+ const serverIconJsonPayload = z.object({
26
+ file: z
27
+ .string()
28
+ .min(1)
29
+ .max(Math.ceil((MAX_SERVER_ICON_BYTES * 4) / 3) + 4),
30
+ });
31
+ export async function deleteServerIconFile(iconID) {
32
+ const safeID = safePathParam.safeParse(iconID);
33
+ if (!safeID.success)
34
+ return;
35
+ await fsp
36
+ .unlink(`${SERVER_ICON_DIR}/${safeID.data}`)
37
+ .catch(() => undefined);
38
+ }
39
+ export const getServerIconRouter = (db, notifyServerChange) => {
40
+ const router = express.Router();
41
+ router.get("/:iconID", async (req, res) => {
42
+ const safeID = safePathParam.safeParse(getParam(req, "iconID"));
43
+ if (!safeID.success) {
44
+ res.sendStatus(400);
45
+ return;
46
+ }
47
+ const filePath = `${SERVER_ICON_DIR}/${safeID.data}`;
48
+ const typeDetails = await fileTypeFromFile(filePath).catch(() => null);
49
+ if (!typeDetails) {
50
+ res.sendStatus(404);
51
+ return;
52
+ }
53
+ res.set("Content-Type", typeDetails.mime);
54
+ res.set("Cache-Control", "public, max-age=31536000, immutable");
55
+ res.set("Cross-Origin-Resource-Policy", "cross-origin");
56
+ const stream = fs.createReadStream(filePath);
57
+ stream.on("error", () => {
58
+ if (!res.headersSent)
59
+ res.sendStatus(500);
60
+ else
61
+ res.destroy();
62
+ });
63
+ stream.pipe(res);
64
+ });
65
+ router.post("/:serverID/json", uploadLimiter, protect, async (req, res) => {
66
+ const parsed = serverIconJsonPayload.safeParse(req.body);
67
+ if (!parsed.success) {
68
+ res.status(400).json({
69
+ error: "Invalid server icon payload",
70
+ issues: parsed.error.issues,
71
+ });
72
+ return;
73
+ }
74
+ let buffer;
75
+ try {
76
+ buffer = Buffer.from(XUtils.decodeBase64(parsed.data.file));
77
+ }
78
+ catch {
79
+ res.status(400).json({ error: "Icon must be valid base64." });
80
+ return;
81
+ }
82
+ await saveIcon(req, res, db, notifyServerChange, buffer);
83
+ });
84
+ router.post("/:serverID", uploadLimiter, protect, serverIconUpload.single("icon"), async (req, res) => {
85
+ if (!req.file) {
86
+ res.sendStatus(400);
87
+ return;
88
+ }
89
+ await saveIcon(req, res, db, notifyServerChange, req.file.buffer);
90
+ });
91
+ router.delete("/:serverID", protect, async (req, res) => {
92
+ const serverID = getParam(req, "serverID");
93
+ if (!(await canManageServer(db, getUser(req).userID, serverID))) {
94
+ res.sendStatus(403);
95
+ return;
96
+ }
97
+ const existing = await db.retrieveServer(serverID);
98
+ if (!existing) {
99
+ res.sendStatus(404);
100
+ return;
101
+ }
102
+ const updated = await db.updateServer(serverID, { icon: null });
103
+ if (!updated) {
104
+ res.sendStatus(404);
105
+ return;
106
+ }
107
+ if (existing.icon)
108
+ await deleteServerIconFile(existing.icon);
109
+ await notifyServerChange(serverID);
110
+ res.send(msgpack.encode(updated));
111
+ });
112
+ return router;
113
+ };
114
+ async function canManageServer(db, userID, serverID) {
115
+ const permissions = await db.retrievePermissions(userID, "server");
116
+ return hasPermission(permissions, serverID, POWER_LEVELS.CREATE);
117
+ }
118
+ async function saveIcon(req, res, db, notifyServerChange, buffer) {
119
+ const serverID = getParam(req, "serverID");
120
+ if (!(await canManageServer(db, getUser(req).userID, serverID))) {
121
+ res.sendStatus(403);
122
+ return;
123
+ }
124
+ if (buffer.byteLength > MAX_SERVER_ICON_BYTES) {
125
+ res.sendStatus(413);
126
+ return;
127
+ }
128
+ const typeDetails = await fileTypeFromBuffer(buffer);
129
+ if (!ALLOWED_IMAGE_TYPES.includes(typeDetails?.mime ?? "")) {
130
+ res.status(400).json({
131
+ error: "Unsupported icon type. Use JPEG, PNG, GIF, APNG, AVIF, or WebP.",
132
+ });
133
+ return;
134
+ }
135
+ const existing = await db.retrieveServer(serverID);
136
+ if (!existing) {
137
+ res.sendStatus(404);
138
+ return;
139
+ }
140
+ const iconID = crypto.randomUUID();
141
+ const filePath = `${SERVER_ICON_DIR}/${iconID}`;
142
+ try {
143
+ await fsp.writeFile(filePath, buffer, { flag: "wx" });
144
+ const updated = await db.updateServer(serverID, { icon: iconID });
145
+ if (!updated) {
146
+ throw new Error("Server disappeared while its icon was updating.");
147
+ }
148
+ if (existing.icon)
149
+ await deleteServerIconFile(existing.icon);
150
+ await notifyServerChange(serverID);
151
+ res.send(msgpack.encode(updated));
152
+ }
153
+ catch (error) {
154
+ await fsp.unlink(filePath).catch(() => undefined);
155
+ throw error;
156
+ }
157
+ }
158
+ //# sourceMappingURL=serverIcon.js.map