@voltro/plugin-auth 0.71.0 → 0.72.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/CHANGELOG.md +435 -0
- package/THIRD-PARTY-NOTICES.md +29 -1
- package/dist/index.d.ts +260 -176
- package/dist/index.js +184 -131
- package/dist/{plugin-CPcpSSf9.js → plugin-DFQ8N52Q.js} +236 -232
- package/dist/plugin.d.ts +179 -142
- package/dist/plugin.js +1 -1
- package/dist/strategy.d.ts +179 -142
- package/package.json +3 -3
|
@@ -2,89 +2,89 @@ import { hashPassword as e, verifyPassword as t, verifyPasswordWithRehash as n }
|
|
|
2
2
|
import { SESSION_COOKIE_NAME as r, clearSessionCookie as i, issueSession as a, readSessionKeyed as o, resolveSessionSecret as s, resolveSessionSecrets as c, sessionSecretsOf as l } from "./session.js";
|
|
3
3
|
import { a as u, l as d, o as f, s as p, t as m } from "./strategy-MP_KxNuA.js";
|
|
4
4
|
import { hashToken as h, mintSecret as g, mintToken as _ } from "./tokens.js";
|
|
5
|
-
import { CSRF_COOKIE_NAME as v, CSRF_HEADER_NAME as
|
|
6
|
-
import { generateChallenge as
|
|
7
|
-
import { createHmac as
|
|
5
|
+
import { CSRF_COOKIE_NAME as v, CSRF_HEADER_NAME as ee, issueCsrfToken as y, verifyCsrf as te } from "./csrf.js";
|
|
6
|
+
import { generateChallenge as b, verifyAssertion as x, verifyRegistration as ne } from "./webauthn.js";
|
|
7
|
+
import { createHmac as re, randomBytes as S, timingSafeEqual as ie } from "node:crypto";
|
|
8
8
|
import { Data as ae, Effect as C } from "effect";
|
|
9
9
|
import { buildSetCookie as oe, readCookie as se } from "@voltro/protocol/session";
|
|
10
|
-
import { registerRetention as ce, retentionTtlMsFromEnv as le } from "@voltro/database";
|
|
11
|
-
import { IMPERSONATION_METADATA_KEY as w, definePlugin as
|
|
10
|
+
import { registerRetention as ce, retentionTtlMsFromEnv as le, writeTenantSelection as ue } from "@voltro/database";
|
|
11
|
+
import { IMPERSONATION_METADATA_KEY as w, definePlugin as de, rawImpersonationMark as fe, selectSubjectTenant as pe } from "@voltro/protocol";
|
|
12
12
|
//#region src/subjectGuard.ts
|
|
13
|
-
var
|
|
13
|
+
var me = { ok: !0 }, he = (e, t) => C.gen(function* () {
|
|
14
14
|
for (let n of e) {
|
|
15
15
|
let e = yield* n(t);
|
|
16
16
|
if (!e.ok) return e;
|
|
17
17
|
}
|
|
18
|
-
return
|
|
19
|
-
}), T = 30,
|
|
18
|
+
return me;
|
|
19
|
+
}), T = 30, ge = 6, _e = 20, ve = "sha1", ye = 1, E = class extends ae.TaggedError("TotpVerifyError") {}, be = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567", xe = (e) => {
|
|
20
20
|
let t = 0, n = 0, r = "";
|
|
21
|
-
for (let i of e) for (n = n << 8 | i, t += 8; t >= 5;) r +=
|
|
22
|
-
return t > 0 && (r +=
|
|
23
|
-
},
|
|
21
|
+
for (let i of e) for (n = n << 8 | i, t += 8; t >= 5;) r += be[n >>> t - 5 & 31], t -= 5;
|
|
22
|
+
return t > 0 && (r += be[n << 5 - t & 31]), r;
|
|
23
|
+
}, Se = (e) => {
|
|
24
24
|
let t = e.toUpperCase().replace(/[\s=]+/g, "");
|
|
25
25
|
if (!/^[A-Z2-7]+$/.test(t)) return null;
|
|
26
26
|
let n = new Uint8Array(Math.floor(t.length * 5 / 8)), r = 0, i = 0, a = 0;
|
|
27
27
|
for (let e of t) {
|
|
28
|
-
let t =
|
|
28
|
+
let t = be.indexOf(e);
|
|
29
29
|
if (t === -1) return null;
|
|
30
30
|
i = i << 5 | t, r += 5, r >= 8 && (n[a++] = i >>> r - 8 & 255, r -= 8);
|
|
31
31
|
}
|
|
32
32
|
return n.subarray(0, a);
|
|
33
|
-
},
|
|
33
|
+
}, Ce = (e) => {
|
|
34
34
|
let t = Buffer.alloc(8);
|
|
35
35
|
return t.writeBigUInt64BE(BigInt(e), 0), t;
|
|
36
|
-
},
|
|
37
|
-
let n =
|
|
38
|
-
n.update(
|
|
36
|
+
}, we = (e, t) => {
|
|
37
|
+
let n = re(ve, Buffer.from(e));
|
|
38
|
+
n.update(Ce(t));
|
|
39
39
|
let r = n.digest(), i = r[r.length - 1] & 15, a = (r[i] & 127) << 24 | (r[i + 1] & 255) << 16 | (r[i + 2] & 255) << 8 | r[i + 3] & 255;
|
|
40
|
-
return String(a % 10 **
|
|
41
|
-
},
|
|
40
|
+
return String(a % 10 ** ge).padStart(ge, "0");
|
|
41
|
+
}, Te = () => xe(S(_e)), Ee = (e) => `otpauth://totp/${encodeURIComponent(`${e.issuer}:${e.accountName}`)}?${new URLSearchParams({
|
|
42
42
|
secret: e.secret,
|
|
43
43
|
issuer: e.issuer,
|
|
44
44
|
algorithm: "SHA1",
|
|
45
|
-
digits: String(
|
|
45
|
+
digits: String(ge),
|
|
46
46
|
period: String(T)
|
|
47
|
-
}).toString()}`,
|
|
48
|
-
let n =
|
|
49
|
-
return n ?
|
|
50
|
-
},
|
|
51
|
-
let r =
|
|
52
|
-
if (!r) return yield* C.fail(new
|
|
47
|
+
}).toString()}`, De = (e, t = Date.now()) => {
|
|
48
|
+
let n = Se(e);
|
|
49
|
+
return n ? we(n, Math.floor(t / 1e3 / T)) : "000000";
|
|
50
|
+
}, D = (e, t, n = Date.now()) => C.gen(function* () {
|
|
51
|
+
let r = Se(e);
|
|
52
|
+
if (!r) return yield* C.fail(new E({ reason: "malformedSecret" }));
|
|
53
53
|
let i = t.replace(/\s+/g, "");
|
|
54
|
-
if (!/^[0-9]{6}$/.test(i)) return yield* C.fail(new
|
|
54
|
+
if (!/^[0-9]{6}$/.test(i)) return yield* C.fail(new E({ reason: "invalidCode" }));
|
|
55
55
|
let a = Math.floor(n / 1e3 / T), o = Buffer.from(i);
|
|
56
|
-
for (let e = -1; e <=
|
|
57
|
-
let t =
|
|
56
|
+
for (let e = -1; e <= ye; e++) {
|
|
57
|
+
let t = we(r, a + e), n = Buffer.from(t);
|
|
58
58
|
if (n.length === o.length && ie(n, o)) return !0;
|
|
59
59
|
}
|
|
60
|
-
return yield* C.fail(new
|
|
61
|
-
}),
|
|
60
|
+
return yield* C.fail(new E({ reason: "invalidCode" }));
|
|
61
|
+
}), O = (e = 10) => {
|
|
62
62
|
let t = [];
|
|
63
63
|
for (let n = 0; n < e; n++) {
|
|
64
|
-
let e =
|
|
64
|
+
let e = xe(S(16)).slice(0, 25).match(/.{1,5}/g) ?? [];
|
|
65
65
|
t.push(e.join("-"));
|
|
66
66
|
}
|
|
67
67
|
return t;
|
|
68
|
-
},
|
|
68
|
+
}, Oe = 60, ke = "email_not_verified", k = "emailVerified", Ae = (e) => e?.policy ?? "off", A = (e) => Ae(e) !== "off", j = (e, t) => {
|
|
69
69
|
if (e.emailVerifiedAt != null) return !0;
|
|
70
70
|
let n = t?.exemptAccountsCreatedBefore;
|
|
71
71
|
return n !== void 0 && e.createdAt.getTime() < n.getTime();
|
|
72
|
-
},
|
|
72
|
+
}, je = (e) => {
|
|
73
73
|
if (e.type !== "user") return null;
|
|
74
74
|
let t = e.metadata?.[k];
|
|
75
75
|
return typeof t == "boolean" ? t : null;
|
|
76
|
-
},
|
|
77
|
-
let t =
|
|
76
|
+
}, Me = (e) => {
|
|
77
|
+
let t = Ae(e) === "strict";
|
|
78
78
|
return (n) => C.succeed(!t || j(n, e) ? { ok: !0 } : {
|
|
79
79
|
ok: !1,
|
|
80
|
-
code:
|
|
80
|
+
code: ke,
|
|
81
81
|
message: "This account's email address has not been confirmed yet. Request a new confirmation link and follow it, then sign in again."
|
|
82
82
|
});
|
|
83
83
|
}, M = (e, t) => ({
|
|
84
84
|
status: e,
|
|
85
85
|
body: JSON.stringify(t),
|
|
86
86
|
contentType: "application/json; charset=utf-8"
|
|
87
|
-
}),
|
|
87
|
+
}), Ne = (e, t, n) => `${e}${t}${t.includes("?") ? "&" : "?"}token=${encodeURIComponent(n)}`, N = (e, t, n) => C.gen(function* () {
|
|
88
88
|
let r = n.emailVerification, i = (n.now ?? Date.now)(), a = (r?.resendCooldownSeconds ?? 60) * 1e3;
|
|
89
89
|
if (a > 0) {
|
|
90
90
|
let n = yield* t.latestToken(e.id, "email-verify");
|
|
@@ -98,7 +98,7 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
98
98
|
purpose: "email-verify",
|
|
99
99
|
expiresAt: o.expiresAt
|
|
100
100
|
}).pipe(C.ignore), !n.sendEmail) return !1;
|
|
101
|
-
let s =
|
|
101
|
+
let s = Ne(n.appBaseUrl ?? "", r?.callbackPath ?? "/auth/verify-email/callback", o.token);
|
|
102
102
|
return yield* C.tryPromise(() => n.sendEmail({
|
|
103
103
|
to: e.email,
|
|
104
104
|
kind: "email-verify",
|
|
@@ -111,7 +111,7 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
111
111
|
if (!e.email && !e.userId) return M(400, { error: "email or userId required" });
|
|
112
112
|
let r = e.userId ? yield* t.findById(e.userId) : yield* t.findByEmail(e.email);
|
|
113
113
|
return r && !j(r, n.emailVerification) && (yield* N(r, t, n)), M(202, { ok: !0 });
|
|
114
|
-
}),
|
|
114
|
+
}), Pe = (e, t) => C.gen(function* () {
|
|
115
115
|
if (!e.token) return M(400, { error: "token required" });
|
|
116
116
|
let n = yield* t.consumeToken(h(e.token), "email-verify");
|
|
117
117
|
if (!n) return M(401, { error: "invalid or expired token" });
|
|
@@ -120,11 +120,11 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
120
120
|
ok: !0,
|
|
121
121
|
verified: !0
|
|
122
122
|
})) : M(401, { error: "invalid or expired token" });
|
|
123
|
-
}),
|
|
124
|
-
maxAttempts: e.lockout?.maxAttempts ??
|
|
125
|
-
windowMs: (e.lockout?.windowSeconds ??
|
|
126
|
-
lockMs: (e.lockout?.lockSeconds ??
|
|
127
|
-
}), F = (e) => e.secrets ?? (e.secret === void 0 ? c() : l(e.secret)),
|
|
123
|
+
}), Fe = 5, Ie = 900, Le = 900, Re = (e) => ({
|
|
124
|
+
maxAttempts: e.lockout?.maxAttempts ?? Fe,
|
|
125
|
+
windowMs: (e.lockout?.windowSeconds ?? Ie) * 1e3,
|
|
126
|
+
lockMs: (e.lockout?.lockSeconds ?? Le) * 1e3
|
|
127
|
+
}), F = (e) => e.secrets ?? (e.secret === void 0 ? c() : l(e.secret)), ze = (e) => e.secret ?? s(), I = (e, t, n = {}) => ({
|
|
128
128
|
status: e,
|
|
129
129
|
body: JSON.stringify(t),
|
|
130
130
|
contentType: "application/json; charset=utf-8",
|
|
@@ -135,7 +135,7 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
135
135
|
contentType: "text/plain",
|
|
136
136
|
location: e,
|
|
137
137
|
...t
|
|
138
|
-
}),
|
|
138
|
+
}), Be = 604800, Ve = (e, t) => e.type === "user" ? {
|
|
139
139
|
...e,
|
|
140
140
|
metadata: {
|
|
141
141
|
...e.metadata ?? {},
|
|
@@ -143,7 +143,7 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
143
143
|
}
|
|
144
144
|
} : e, R = (e, t, n, r = {}) => C.gen(function* () {
|
|
145
145
|
r.clearLoginFailures !== !1 && (yield* t.clearLoginFailures(e.email));
|
|
146
|
-
let i = yield* t.listMemberships(e.id), o = r.sessionId ?? u("sess"), s = r.ttlSeconds ??
|
|
146
|
+
let i = yield* t.listMemberships(e.id), o = r.sessionId ?? u("sess"), s = r.ttlSeconds ?? Be;
|
|
147
147
|
r.sessionRow !== "existing" && (yield* t.insertSession({
|
|
148
148
|
id: o,
|
|
149
149
|
userId: e.id,
|
|
@@ -154,7 +154,7 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
154
154
|
}).pipe(C.ignore));
|
|
155
155
|
let c = { ...r.metadata };
|
|
156
156
|
A(n.emailVerification) && (c[k] = j(e, n.emailVerification));
|
|
157
|
-
let l =
|
|
157
|
+
let l = Ve(p(e, {
|
|
158
158
|
memberships: i,
|
|
159
159
|
...Object.keys(c).length > 0 ? { metadata: c } : {}
|
|
160
160
|
}), o);
|
|
@@ -169,12 +169,12 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
169
169
|
}), z = (e, t) => C.gen(function* () {
|
|
170
170
|
let n = t.subjectGuards ?? [];
|
|
171
171
|
if (n.length === 0) return null;
|
|
172
|
-
let r = yield*
|
|
172
|
+
let r = yield* he(n, e);
|
|
173
173
|
return r.ok ? null : I(403, {
|
|
174
174
|
error: r.code,
|
|
175
175
|
message: r.message
|
|
176
176
|
});
|
|
177
|
-
}),
|
|
177
|
+
}), He = (r, i, a) => C.gen(function* () {
|
|
178
178
|
if (!r.email || !r.password) return I(400, { error: "email and password required" });
|
|
179
179
|
let o = yield* i.findByEmail(r.email), s = (a.now ?? Date.now)(), c = yield* i.isLockedOut(r.email, s);
|
|
180
180
|
if (c.locked) return I(429, {
|
|
@@ -185,7 +185,7 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
185
185
|
let n = yield* e("decoy-not-a-real-password").pipe(C.orElseSucceed(() => ""));
|
|
186
186
|
return yield* t(r.password, n), { valid: !1 };
|
|
187
187
|
});
|
|
188
|
-
if (!o || !d.valid) return yield* i.recordLoginFailure(r.email, s,
|
|
188
|
+
if (!o || !d.valid) return yield* i.recordLoginFailure(r.email, s, Re(a)), I(401, { error: "invalid credentials" });
|
|
189
189
|
let f = yield* z(o, a);
|
|
190
190
|
if (f) return f;
|
|
191
191
|
if (d.rehash && (yield* i.updatePassword(o.id, d.rehash).pipe(C.ignore)), o.mfaEnrolledAt) {
|
|
@@ -211,7 +211,7 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
211
211
|
ok: !0,
|
|
212
212
|
subject: m
|
|
213
213
|
}, { setCookie: p });
|
|
214
|
-
}),
|
|
214
|
+
}), Ue = (e, t, n) => C.gen(function* () {
|
|
215
215
|
if (!e.pendingToken) return I(400, { error: "pending token required" });
|
|
216
216
|
if (!e.code && !e.recoveryCode) return I(400, { error: "code or recoveryCode required" });
|
|
217
217
|
let r = yield* t.consumeToken(h(e.pendingToken), "mfa-pending");
|
|
@@ -225,7 +225,7 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
225
225
|
});
|
|
226
226
|
let s = yield* z(i, n);
|
|
227
227
|
if (s) return s;
|
|
228
|
-
if (!(e.recoveryCode ? yield* t.consumeRecoveryCode(i.id, h(e.recoveryCode.trim())) : yield*
|
|
228
|
+
if (!(e.recoveryCode ? yield* t.consumeRecoveryCode(i.id, h(e.recoveryCode.trim())) : yield* D(i.mfaSecret, e.code ?? "").pipe(C.map(() => !0), C.catchTag("TotpVerifyError", () => C.succeed(!1))))) return yield* t.recordLoginFailure(i.email, a, Re(n)), I(401, { error: "invalid_code" });
|
|
229
229
|
let { setCookie: c, subject: l } = yield* R(i, t, n, {
|
|
230
230
|
ipAddress: e.ipAddress ?? null,
|
|
231
231
|
userAgent: e.userAgent ?? null
|
|
@@ -234,7 +234,7 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
234
234
|
ok: !0,
|
|
235
235
|
subject: l
|
|
236
236
|
}, { setCookie: c });
|
|
237
|
-
}),
|
|
237
|
+
}), We = (t, n, r) => C.gen(function* () {
|
|
238
238
|
if (!t.email || !t.password) return I(400, { error: "email and password required" });
|
|
239
239
|
if (t.password.length < 8) return I(400, { error: "password must be at least 8 characters" });
|
|
240
240
|
if (yield* n.findByEmail(t.email)) return I(409, { error: "email already registered" });
|
|
@@ -257,7 +257,7 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
257
257
|
}).pipe(C.catchAll((e) => C.succeed(I(500, {
|
|
258
258
|
error: "signup_failed",
|
|
259
259
|
cause: String(e)
|
|
260
|
-
})))),
|
|
260
|
+
})))), Ge = (e) => ({
|
|
261
261
|
status: 302,
|
|
262
262
|
body: "",
|
|
263
263
|
location: e.successRedirect ?? "/",
|
|
@@ -265,49 +265,49 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
265
265
|
...e.cookieDomain ? { domain: e.cookieDomain } : {},
|
|
266
266
|
secure: e.cookieSecure ?? !0
|
|
267
267
|
})
|
|
268
|
-
}),
|
|
268
|
+
}), Ke = (e, t) => C.gen(function* () {
|
|
269
269
|
let n = yield* t.findById(e.userId);
|
|
270
270
|
if (!n) return I(404, { error: "user_not_found" });
|
|
271
|
-
let r =
|
|
271
|
+
let r = Te();
|
|
272
272
|
return yield* t.setMfaSecret(n.id, r).pipe(C.catchAll(() => C.succeed(n))), I(200, {
|
|
273
273
|
ok: !0,
|
|
274
274
|
secret: r,
|
|
275
|
-
otpauthUrl:
|
|
275
|
+
otpauthUrl: Ee({
|
|
276
276
|
issuer: e.issuer,
|
|
277
277
|
accountName: e.accountName,
|
|
278
278
|
secret: r
|
|
279
279
|
})
|
|
280
280
|
});
|
|
281
|
-
}),
|
|
281
|
+
}), qe = (e, t) => C.gen(function* () {
|
|
282
282
|
let n = yield* t.findById(e.userId);
|
|
283
283
|
if (!n) return I(404, { error: "user_not_found" });
|
|
284
284
|
if (!n.mfaSecret) return I(400, { error: "no_enrollment_in_progress" });
|
|
285
285
|
if (n.mfaEnrolledAt) return I(409, { error: "already_enrolled" });
|
|
286
|
-
if (!(yield*
|
|
286
|
+
if (!(yield* D(n.mfaSecret, e.code).pipe(C.map(() => !0), C.catchTag("TotpVerifyError", () => C.succeed(!1))))) return I(401, { error: "invalid_code" });
|
|
287
287
|
yield* t.markMfaEnrolled(n.id).pipe(C.catchAll(() => C.succeed(n)));
|
|
288
|
-
let r =
|
|
288
|
+
let r = O();
|
|
289
289
|
return yield* t.replaceRecoveryCodes(n.id, r.map((e) => h(e))).pipe(C.ignore), I(200, {
|
|
290
290
|
ok: !0,
|
|
291
291
|
enrolled: !0,
|
|
292
292
|
recoveryCodes: r
|
|
293
293
|
});
|
|
294
|
-
}),
|
|
294
|
+
}), Je = (e, t) => C.gen(function* () {
|
|
295
295
|
let n = yield* t.findById(e.userId);
|
|
296
296
|
if (!n) return I(404, { error: "user_not_found" });
|
|
297
297
|
if (!n.mfaEnrolledAt) return I(400, { error: "mfa_not_enrolled" });
|
|
298
|
-
let r =
|
|
298
|
+
let r = O();
|
|
299
299
|
return yield* t.replaceRecoveryCodes(n.id, r.map((e) => h(e))).pipe(C.ignore), I(200, {
|
|
300
300
|
ok: !0,
|
|
301
301
|
recoveryCodes: r
|
|
302
302
|
});
|
|
303
|
-
}),
|
|
303
|
+
}), Ye = (e, t) => C.gen(function* () {
|
|
304
304
|
let n = yield* t.findById(e.userId);
|
|
305
305
|
return n ? (yield* t.clearMfa(n.id).pipe(C.catchAll(() => C.succeed(n))), yield* t.replaceRecoveryCodes(n.id, []).pipe(C.ignore), I(200, {
|
|
306
306
|
ok: !0,
|
|
307
307
|
enrolled: !1
|
|
308
308
|
})) : I(404, { error: "user_not_found" });
|
|
309
|
-
}),
|
|
310
|
-
let t =
|
|
309
|
+
}), Xe = (e) => {
|
|
310
|
+
let t = y(ze(e)), n = oe(v, t, {
|
|
311
311
|
httpOnly: !1,
|
|
312
312
|
sameSite: "lax",
|
|
313
313
|
secure: e.cookieSecure ?? !0,
|
|
@@ -315,7 +315,7 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
315
315
|
path: "/"
|
|
316
316
|
});
|
|
317
317
|
return I(200, { csrfToken: t }, { setCookie: n });
|
|
318
|
-
},
|
|
318
|
+
}, Ze = (e, t, n) => `${e}${t}${t.includes("?") ? "&" : "?"}token=${encodeURIComponent(n)}`, Qe = (e, t, n) => C.gen(function* () {
|
|
319
319
|
if (!e.email) return I(400, { error: "email required" });
|
|
320
320
|
let r = yield* t.findByEmail(e.email);
|
|
321
321
|
if (r) {
|
|
@@ -327,7 +327,7 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
327
327
|
purpose: "magic-link",
|
|
328
328
|
expiresAt: i.expiresAt
|
|
329
329
|
}).pipe(C.ignore);
|
|
330
|
-
let a =
|
|
330
|
+
let a = Ze(n.appBaseUrl ?? "", e.callbackPath ?? "/auth/magic-link/callback", i.token);
|
|
331
331
|
n.sendEmail && (yield* C.tryPromise(() => n.sendEmail({
|
|
332
332
|
to: r.email,
|
|
333
333
|
kind: "magic-link",
|
|
@@ -338,7 +338,7 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
338
338
|
})).pipe(C.ignore));
|
|
339
339
|
}
|
|
340
340
|
return I(202, { ok: !0 });
|
|
341
|
-
}),
|
|
341
|
+
}), $e = (e, t, n) => C.gen(function* () {
|
|
342
342
|
if (!e.token) return I(400, { error: "token required" });
|
|
343
343
|
let r = yield* t.consumeToken(h(e.token), "magic-link");
|
|
344
344
|
if (!r) return I(401, { error: "invalid or expired token" });
|
|
@@ -351,7 +351,7 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
351
351
|
ok: !0,
|
|
352
352
|
subject: c
|
|
353
353
|
}, { setCookie: s });
|
|
354
|
-
}),
|
|
354
|
+
}), et = (e, t, n) => C.gen(function* () {
|
|
355
355
|
if (!e.email) return I(400, { error: "email required" });
|
|
356
356
|
let r = yield* t.findByEmail(e.email);
|
|
357
357
|
if (r) {
|
|
@@ -363,7 +363,7 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
363
363
|
purpose: "password-reset",
|
|
364
364
|
expiresAt: i.expiresAt
|
|
365
365
|
}).pipe(C.ignore);
|
|
366
|
-
let a =
|
|
366
|
+
let a = Ze(n.appBaseUrl ?? "", e.callbackPath ?? "/auth/password-reset/callback", i.token);
|
|
367
367
|
n.sendEmail && (yield* C.tryPromise(() => n.sendEmail({
|
|
368
368
|
to: r.email,
|
|
369
369
|
kind: "password-reset",
|
|
@@ -374,14 +374,14 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
374
374
|
})).pipe(C.ignore));
|
|
375
375
|
}
|
|
376
376
|
return I(202, { ok: !0 });
|
|
377
|
-
}),
|
|
377
|
+
}), tt = (t, n) => C.gen(function* () {
|
|
378
378
|
if (!t.token || !t.newPassword) return I(400, { error: "token and newPassword required" });
|
|
379
379
|
if (t.newPassword.length < 8) return I(400, { error: "password must be at least 8 characters" });
|
|
380
380
|
let r = yield* n.consumeToken(h(t.token), "password-reset");
|
|
381
381
|
if (!r) return I(401, { error: "invalid or expired token" });
|
|
382
382
|
let i = yield* e(t.newPassword).pipe(C.orElseSucceed(() => ""));
|
|
383
383
|
return i ? (yield* n.updatePassword(r.userId, i).pipe(C.ignore), yield* n.markEmailVerified(r.userId).pipe(C.ignore), yield* n.revokeAllOtherSessions(r.userId, "__none__").pipe(C.ignore), I(200, { ok: !0 })) : I(500, { error: "hash_failed" });
|
|
384
|
-
}),
|
|
384
|
+
}), nt = (e, t) => C.gen(function* () {
|
|
385
385
|
return I(200, { sessions: (yield* t.listSessions(e.userId)).map((e) => ({
|
|
386
386
|
id: e.id,
|
|
387
387
|
tenantId: e.tenantId,
|
|
@@ -391,37 +391,38 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
391
391
|
lastSeenAt: e.lastSeenAt.toISOString(),
|
|
392
392
|
expiresAt: e.expiresAt.toISOString()
|
|
393
393
|
})) });
|
|
394
|
-
}),
|
|
394
|
+
}), rt = (e, t) => C.gen(function* () {
|
|
395
395
|
return (yield* t.revokeSession(e.userId, e.sessionId)) ? I(200, {
|
|
396
396
|
ok: !0,
|
|
397
397
|
revoked: 1
|
|
398
398
|
}) : I(404, { error: "session_not_found" });
|
|
399
|
-
}),
|
|
399
|
+
}), it = (e, t) => C.gen(function* () {
|
|
400
400
|
return I(200, {
|
|
401
401
|
ok: !0,
|
|
402
402
|
revoked: yield* t.revokeAllOtherSessions(e.userId, e.keepSessionId)
|
|
403
403
|
});
|
|
404
|
-
}),
|
|
405
|
-
let
|
|
406
|
-
if (!
|
|
407
|
-
let
|
|
408
|
-
if (
|
|
409
|
-
let
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
}
|
|
414
|
-
|
|
404
|
+
}), at = (e, t, n, i, o) => C.gen(function* () {
|
|
405
|
+
let s = yield* t.findById(e.userId);
|
|
406
|
+
if (!s) return I(404, { error: "user_not_found" });
|
|
407
|
+
let c = yield* t.listMemberships(s.id), l = c.find((t) => t.tenantId === e.targetTenantId)?.role ?? null;
|
|
408
|
+
if (l === null) return I(403, { error: "not a member of the target tenant" });
|
|
409
|
+
let u = e.metadata === void 0 ? void 0 : Object.fromEntries(Object.entries(e.metadata).filter(([e]) => e !== "memberships")), d = pe(p(s, { ...u === void 0 ? {} : { metadata: u } }), e.targetTenantId, c);
|
|
410
|
+
o !== void 0 && d.type === "user" && (yield* C.promise(() => ue(o, {
|
|
411
|
+
type: d.type,
|
|
412
|
+
id: d.id
|
|
413
|
+
}, e.targetTenantId)));
|
|
414
|
+
let f = e.sessionId ? Ve(d, e.sessionId) : d, m = a(f, F(n), {
|
|
415
|
+
ttlSeconds: Be,
|
|
415
416
|
...n.cookieDomain ? { domain: n.cookieDomain } : {},
|
|
416
417
|
secure: n.cookieSecure ?? !0
|
|
417
418
|
});
|
|
418
|
-
return e.clientId !== void 0 && i && i(e.clientId, { cookies: { [r]:
|
|
419
|
+
return e.clientId !== void 0 && i && i(e.clientId, { cookies: { [r]: m.value } }), I(200, {
|
|
419
420
|
ok: !0,
|
|
420
421
|
tenantId: e.targetTenantId,
|
|
421
|
-
role:
|
|
422
|
-
subject:
|
|
423
|
-
}, { setCookie:
|
|
424
|
-
}),
|
|
422
|
+
role: l,
|
|
423
|
+
subject: f
|
|
424
|
+
}, { setCookie: m.setCookie });
|
|
425
|
+
}), ot = (e, t) => C.gen(function* () {
|
|
425
426
|
return I(200, { memberships: (yield* t.listMemberships(e.userId)).map((e) => ({
|
|
426
427
|
tenantId: e.tenantId,
|
|
427
428
|
role: e.role,
|
|
@@ -432,7 +433,7 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
432
433
|
body: JSON.stringify(t),
|
|
433
434
|
contentType: "application/json; charset=utf-8",
|
|
434
435
|
...n
|
|
435
|
-
}),
|
|
436
|
+
}), st = 604800, ct = () => {
|
|
436
437
|
let e = /* @__PURE__ */ new Map();
|
|
437
438
|
return {
|
|
438
439
|
put: (t, n, r) => C.sync(() => {
|
|
@@ -446,7 +447,7 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
446
447
|
return e.delete(t), !n || n.expiresAt < Date.now() ? null : n.challenge;
|
|
447
448
|
})
|
|
448
449
|
};
|
|
449
|
-
},
|
|
450
|
+
}, lt = (e) => ({
|
|
450
451
|
put: (t, n, r) => C.gen(function* () {
|
|
451
452
|
let i = /* @__PURE__ */ new Date(), a = new Date(i.getTime() + r * 1e3);
|
|
452
453
|
(yield* e`
|
|
@@ -466,9 +467,9 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
466
467
|
`)[0];
|
|
467
468
|
return n && n.expiresAt.getTime() > Date.now() ? n.challenge : null;
|
|
468
469
|
}).pipe(C.orElseSucceed(() => null))
|
|
469
|
-
}), V = 300,
|
|
470
|
+
}), V = 300, ut = (e, t, n, r) => C.gen(function* () {
|
|
470
471
|
if (!(yield* t.findById(e.userId))) return B(404, { error: "user_not_found" });
|
|
471
|
-
let i =
|
|
472
|
+
let i = b();
|
|
472
473
|
yield* n.put(`${e.userId}:register`, i, V);
|
|
473
474
|
let a = yield* t.listPasskeys(e.userId);
|
|
474
475
|
return B(200, {
|
|
@@ -499,7 +500,7 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
499
500
|
},
|
|
500
501
|
timeout: V * 1e3
|
|
501
502
|
});
|
|
502
|
-
}),
|
|
503
|
+
}), dt = (e, t, n, r) => C.gen(function* () {
|
|
503
504
|
if (!(yield* t.findById(e.userId))) return B(404, { error: "user_not_found" });
|
|
504
505
|
let i = yield* n.take(`${e.userId}:register`);
|
|
505
506
|
if (!i) return B(400, { error: "no_pending_challenge" });
|
|
@@ -521,8 +522,8 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
521
522
|
ok: !0,
|
|
522
523
|
credentialId: a.result.credentialId
|
|
523
524
|
})) : B(400, { error: a.error });
|
|
524
|
-
}),
|
|
525
|
-
let i =
|
|
525
|
+
}), ft = (e, t, n, r) => C.gen(function* () {
|
|
526
|
+
let i = b(), a = e.userId ? `${e.userId}:assert` : "*:assert";
|
|
526
527
|
yield* n.put(a, i, V);
|
|
527
528
|
let o = e.userId ? (yield* t.listPasskeys(e.userId)).map((e) => ({
|
|
528
529
|
type: "public-key",
|
|
@@ -535,12 +536,12 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
535
536
|
userVerification: "preferred",
|
|
536
537
|
timeout: V * 1e3
|
|
537
538
|
});
|
|
538
|
-
}),
|
|
539
|
+
}), pt = (e, t, n, r, i) => C.gen(function* () {
|
|
539
540
|
let o = yield* t.findPasskey(e.credentialId);
|
|
540
541
|
if (!o) return B(401, { error: "unknown_credential" });
|
|
541
542
|
let s = e.userId ? `${e.userId}:assert` : "*:assert", c = yield* n.take(s);
|
|
542
543
|
if (!c) return B(400, { error: "no_pending_challenge" });
|
|
543
|
-
let l =
|
|
544
|
+
let l = x({
|
|
544
545
|
clientDataJSON: e.clientDataJSON,
|
|
545
546
|
authenticatorData: e.authenticatorData,
|
|
546
547
|
signature: e.signature,
|
|
@@ -561,7 +562,7 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
561
562
|
id: h,
|
|
562
563
|
userId: d.id,
|
|
563
564
|
tenantId: d.tenantId,
|
|
564
|
-
expiresAt: new Date(Date.now() +
|
|
565
|
+
expiresAt: new Date(Date.now() + st * 1e3),
|
|
565
566
|
ipAddress: null,
|
|
566
567
|
userAgent: null
|
|
567
568
|
}).pipe(C.ignore);
|
|
@@ -572,7 +573,7 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
572
573
|
sessionId: h
|
|
573
574
|
}
|
|
574
575
|
} : g, v = a(_, F(i), {
|
|
575
|
-
ttlSeconds:
|
|
576
|
+
ttlSeconds: st,
|
|
576
577
|
...i.cookieDomain ? { domain: i.cookieDomain } : {},
|
|
577
578
|
secure: i.cookieSecure ?? !0
|
|
578
579
|
});
|
|
@@ -580,25 +581,25 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
580
581
|
ok: !0,
|
|
581
582
|
subject: _
|
|
582
583
|
}, { setCookie: v.setCookie });
|
|
583
|
-
}),
|
|
584
|
+
}), mt = 604800, ht = 500, H = [
|
|
584
585
|
"owner",
|
|
585
586
|
"admin",
|
|
586
587
|
"member",
|
|
587
588
|
"viewer"
|
|
588
|
-
],
|
|
589
|
-
let n =
|
|
589
|
+
], gt = ["owner", "admin"], _t = (e, t) => t.indexOf(e), vt = (e, t = H) => {
|
|
590
|
+
let n = _t(e.inviterRole, t);
|
|
590
591
|
if (n < 0) return !1;
|
|
591
|
-
let r =
|
|
592
|
+
let r = _t(e.requestedRole, t);
|
|
592
593
|
return r < 0 ? n === 0 : r >= n;
|
|
593
|
-
},
|
|
594
|
+
}, yt = (e) => {
|
|
594
595
|
let t = e?.roleRank ?? H;
|
|
595
|
-
return e?.canGrantRole ?? ((e) =>
|
|
596
|
+
return e?.canGrantRole ?? ((e) => vt(e, t));
|
|
596
597
|
}, U = (e, t, n = {}) => ({
|
|
597
598
|
status: e,
|
|
598
599
|
body: JSON.stringify(t),
|
|
599
600
|
contentType: "application/json; charset=utf-8",
|
|
600
601
|
...n
|
|
601
|
-
}),
|
|
602
|
+
}), bt = (e, t, n) => `${e}${t}${t.includes("?") ? "&" : "?"}token=${encodeURIComponent(n)}`, xt = (e) => ({
|
|
602
603
|
id: e.id,
|
|
603
604
|
email: e.email,
|
|
604
605
|
tenantId: e.tenantId,
|
|
@@ -610,15 +611,15 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
610
611
|
createdAt: e.createdAt.toISOString()
|
|
611
612
|
}), W = (e, t, n, r) => C.gen(function* () {
|
|
612
613
|
let i = yield* n.membershipRole(e, t);
|
|
613
|
-
return i === null || !(r?.inviterRoles ??
|
|
614
|
-
}), G = (e) => "status" in e,
|
|
614
|
+
return i === null || !(r?.inviterRoles ?? gt).includes(i) ? U(403, { error: "not_permitted" }) : { role: i };
|
|
615
|
+
}), G = (e) => "status" in e, St = (e, t, n) => C.gen(function* () {
|
|
615
616
|
let r = e.email.trim().toLowerCase();
|
|
616
617
|
if (!r || !r.includes("@")) return U(400, { error: "a valid email is required" });
|
|
617
618
|
if (!e.tenantId) return U(400, { error: "tenantId required" });
|
|
618
619
|
if (!e.role) return U(400, { error: "role required" });
|
|
619
620
|
let i = n.invitations, a = yield* W(e.inviterUserId, e.tenantId, t, i);
|
|
620
621
|
if (G(a)) return a;
|
|
621
|
-
if (!
|
|
622
|
+
if (!yt(i)({
|
|
622
623
|
inviterRole: a.role,
|
|
623
624
|
requestedRole: e.role,
|
|
624
625
|
tenantId: e.tenantId
|
|
@@ -639,7 +640,7 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
639
640
|
expiresAt: new Date(o.getTime() + s * 1e3)
|
|
640
641
|
});
|
|
641
642
|
if (n.sendEmail) {
|
|
642
|
-
let t =
|
|
643
|
+
let t = bt(n.appBaseUrl ?? "", i?.callbackPath ?? "/auth/invitations/accept", c.token);
|
|
643
644
|
yield* C.tryPromise(() => n.sendEmail({
|
|
644
645
|
to: r,
|
|
645
646
|
kind: "invitation",
|
|
@@ -651,12 +652,12 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
651
652
|
}
|
|
652
653
|
return U(201, {
|
|
653
654
|
ok: !0,
|
|
654
|
-
invitation:
|
|
655
|
+
invitation: xt(l)
|
|
655
656
|
});
|
|
656
|
-
}),
|
|
657
|
+
}), Ct = (e, t, n) => C.gen(function* () {
|
|
657
658
|
let r = yield* W(e.callerUserId, e.tenantId, t, n.invitations);
|
|
658
|
-
return G(r) ? r : U(200, { invitations: (yield* t.listInvitations(e.tenantId)).map(
|
|
659
|
-
}),
|
|
659
|
+
return G(r) ? r : U(200, { invitations: (yield* t.listInvitations(e.tenantId)).map(xt) });
|
|
660
|
+
}), wt = (e, t, n) => C.gen(function* () {
|
|
660
661
|
if (!e.invitationId) return U(400, { error: "invitationId required" });
|
|
661
662
|
let r = yield* W(e.callerUserId, e.tenantId, t, n.invitations);
|
|
662
663
|
if (G(r)) return r;
|
|
@@ -665,7 +666,7 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
665
666
|
ok: !0,
|
|
666
667
|
revoked: 1
|
|
667
668
|
}) : U(404, { error: "invitation_not_found" });
|
|
668
|
-
}),
|
|
669
|
+
}), Tt = (e, t, n = {}) => C.gen(function* () {
|
|
669
670
|
if (!e.token) return U(400, { error: "token required" });
|
|
670
671
|
let r = yield* t.findInvitationByHash(h(e.token));
|
|
671
672
|
if (!r) return U(404, { error: "invalid_invitation" });
|
|
@@ -678,7 +679,7 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
678
679
|
role: r.role,
|
|
679
680
|
expiresAt: r.expiresAt.toISOString()
|
|
680
681
|
});
|
|
681
|
-
}),
|
|
682
|
+
}), Et = (e, t, n = {}) => C.gen(function* () {
|
|
682
683
|
if (!e.token) return U(400, { error: "token required" });
|
|
683
684
|
let r = h(e.token), i = new Date((n.now ?? Date.now)()), a = yield* t.findInvitationByHash(r);
|
|
684
685
|
if (!a) return U(401, { error: "invalid_or_expired_invitation" });
|
|
@@ -710,7 +711,7 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
710
711
|
joinedAt: c.joinedAt.toISOString()
|
|
711
712
|
}
|
|
712
713
|
});
|
|
713
|
-
}),
|
|
714
|
+
}), Dt = (e, t, n) => C.gen(function* () {
|
|
714
715
|
if (!e.token || !e.password) return U(400, { error: "token and password required" });
|
|
715
716
|
if (e.password.length < (n.minPasswordLength ?? 8)) return U(400, { error: "password must be at least 8 characters" });
|
|
716
717
|
let r = h(e.token), i = new Date((n.now ?? Date.now)()), a = yield* t.findInvitationByHash(r);
|
|
@@ -739,7 +740,7 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
739
740
|
tenantId: c.tenantId,
|
|
740
741
|
role: c.role
|
|
741
742
|
})) : U(409, { error: "account_exists" });
|
|
742
|
-
}),
|
|
743
|
+
}), Ot = 900, kt = [
|
|
743
744
|
"/mfa/enroll/start",
|
|
744
745
|
"/mfa/enroll/verify",
|
|
745
746
|
"/mfa/unenroll",
|
|
@@ -749,7 +750,7 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
749
750
|
"/sessions/revoke-others",
|
|
750
751
|
"/switch-tenant",
|
|
751
752
|
"/impersonate/start"
|
|
752
|
-
],
|
|
753
|
+
], At = (e) => {
|
|
753
754
|
if (typeof e != "object" || !e) return null;
|
|
754
755
|
let t = e;
|
|
755
756
|
return typeof t.actorUserId != "string" || t.actorUserId.length === 0 || typeof t.grantId != "string" || typeof t.expiresAt != "string" || typeof t.actorSessionId != "string" || typeof t.startedAt != "string" ? null : {
|
|
@@ -760,9 +761,9 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
760
761
|
expiresAt: t.expiresAt,
|
|
761
762
|
...typeof t.reason == "string" ? { reason: t.reason } : {}
|
|
762
763
|
};
|
|
763
|
-
}, K = (e) => e.type === "user" ?
|
|
764
|
+
}, K = (e) => e.type === "user" ? At(fe(e)) : null, q = (e) => K(e) !== null, jt = () => (e) => {
|
|
764
765
|
if (e.type !== "user" || e.metadata === void 0) return e;
|
|
765
|
-
let t =
|
|
766
|
+
let t = At(e.metadata[w]), { metadata: n, ...r } = e;
|
|
766
767
|
return {
|
|
767
768
|
...r,
|
|
768
769
|
metadata: t === null ? { __redacted: "all" } : {
|
|
@@ -781,7 +782,7 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
781
782
|
try: () => Promise.resolve(n),
|
|
782
783
|
catch: (e) => e
|
|
783
784
|
});
|
|
784
|
-
}).pipe(C.catchAllCause(() => C.void)),
|
|
785
|
+
}).pipe(C.catchAllCause(() => C.void)), Mt = (e, t, n) => C.gen(function* () {
|
|
785
786
|
let r = n.impersonation, i = (n.now ?? Date.now)(), a = new Date(i), o = e.actorSubject, s = (t, n, i = {}) => Y(r, {
|
|
786
787
|
kind: "refused",
|
|
787
788
|
at: a,
|
|
@@ -851,7 +852,7 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
851
852
|
startedAt: _.startedAt.toISOString(),
|
|
852
853
|
expiresAt: h.toISOString(),
|
|
853
854
|
...d.length > 0 ? { reason: d } : {}
|
|
854
|
-
},
|
|
855
|
+
}, ee = yield* n.issuer.issue(l, {
|
|
855
856
|
sessionId: g,
|
|
856
857
|
ttlSeconds: m,
|
|
857
858
|
metadata: { [w]: v },
|
|
@@ -875,9 +876,9 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
875
876
|
}), J(200, {
|
|
876
877
|
ok: !0,
|
|
877
878
|
impersonation: v,
|
|
878
|
-
subject:
|
|
879
|
-
}, { setCookie:
|
|
880
|
-
}),
|
|
879
|
+
subject: ee.subject
|
|
880
|
+
}, { setCookie: ee.setCookie });
|
|
881
|
+
}), Nt = (e, t, n) => C.gen(function* () {
|
|
881
882
|
let r = n.impersonation, i = (n.now ?? Date.now)(), a = new Date(i), o = K(e.subject);
|
|
882
883
|
if (!o || !e.sessionId) return J(400, { error: "not_impersonating" });
|
|
883
884
|
let s = yield* t.findImpersonationGrantBySession(e.sessionId);
|
|
@@ -907,10 +908,10 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
907
908
|
restored: !0,
|
|
908
909
|
subject: d.subject
|
|
909
910
|
}, { setCookie: d.setCookie });
|
|
910
|
-
}),
|
|
911
|
-
for (let t of e) if (
|
|
911
|
+
}), Pt = (e) => {
|
|
912
|
+
for (let t of e) if (Ft(t)) return t.auth.sessionStrategy;
|
|
912
913
|
return null;
|
|
913
|
-
},
|
|
914
|
+
}, Ft = (e) => typeof e.auth == "object" && e.auth !== null && typeof e.auth.sessionStrategy == "object", It = "/auth", Lt = (e) => {
|
|
914
915
|
let t = Buffer.from(e.rawBody).toString("utf8");
|
|
915
916
|
if (!t) return {};
|
|
916
917
|
if ((e.headers["content-type"] ?? "").includes("application/x-www-form-urlencoded")) {
|
|
@@ -936,8 +937,8 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
936
937
|
status: e,
|
|
937
938
|
body: JSON.stringify(t),
|
|
938
939
|
contentType: "application/json; charset=utf-8"
|
|
939
|
-
}), Q = (e) => typeof e == "string" ? e : void 0, $ = (e, t) => typeof t == "string" && t.length > 0 ? { [e]: t } : {},
|
|
940
|
-
let n = t.prefix ??
|
|
940
|
+
}), Q = (e) => typeof e == "string" ? e : void 0, $ = (e, t) => typeof t == "string" && t.length > 0 ? { [e]: t } : {}, Rt = (t) => {
|
|
941
|
+
let n = t.prefix ?? It, r = t.store, s = t.challengeStore ?? ct(), c = { current: void 0 }, l = {
|
|
941
942
|
...t.secret === void 0 ? {} : { secret: t.secret },
|
|
942
943
|
...t.secrets === void 0 ? {} : { secrets: t.secrets },
|
|
943
944
|
defaultTenantId: t.defaultTenantId,
|
|
@@ -946,11 +947,11 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
946
947
|
...t.successRedirect === void 0 ? {} : { successRedirect: t.successRedirect },
|
|
947
948
|
...t.sendEmail === void 0 ? {} : { sendEmail: t.sendEmail },
|
|
948
949
|
...t.appBaseUrl === void 0 ? {} : { appBaseUrl: t.appBaseUrl },
|
|
949
|
-
subjectGuards: [...t.subjectGuards ?? [], ...A(t.emailVerification) ? [
|
|
950
|
+
subjectGuards: [...t.subjectGuards ?? [], ...A(t.emailVerification) ? [Me(t.emailVerification)] : []],
|
|
950
951
|
...t.lockout === void 0 ? {} : { lockout: t.lockout },
|
|
951
952
|
...t.now === void 0 ? {} : { now: t.now },
|
|
952
953
|
...t.emailVerification === void 0 ? {} : { emailVerification: t.emailVerification }
|
|
953
|
-
},
|
|
954
|
+
}, u = {
|
|
954
955
|
...t.appBaseUrl === void 0 ? {} : { appBaseUrl: t.appBaseUrl },
|
|
955
956
|
...t.sendEmail === void 0 ? {} : { sendEmail: t.sendEmail },
|
|
956
957
|
...t.invitations === void 0 ? {} : { invitations: t.invitations },
|
|
@@ -969,16 +970,16 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
969
970
|
ttlMs: le(process.env.VOLTRO_IMPERSONATION_GRANTS_TTL_HOURS, 8760),
|
|
970
971
|
envVar: "VOLTRO_IMPERSONATION_GRANTS_TTL_HOURS"
|
|
971
972
|
});
|
|
972
|
-
let
|
|
973
|
-
let t = F(
|
|
973
|
+
let p = d(r, t.sessionRevocation ?? {}), h = async (e) => {
|
|
974
|
+
let t = F(l), n = o(e.headers.cookie, t);
|
|
974
975
|
if (!n) return null;
|
|
975
976
|
let i = f(n.subject);
|
|
976
|
-
if (i && !await C.runPromise(
|
|
977
|
+
if (i && !await C.runPromise(p.isLive(i))) return null;
|
|
977
978
|
if (n.renew || n.kid !== t.current.kid) {
|
|
978
979
|
let e = Math.max(n.exp - n.iat, 60), o = a(n.subject, t, {
|
|
979
980
|
ttlSeconds: e,
|
|
980
|
-
...
|
|
981
|
-
secure:
|
|
981
|
+
...l.cookieDomain ? { domain: l.cookieDomain } : {},
|
|
982
|
+
secure: l.cookieSecure ?? !0
|
|
982
983
|
});
|
|
983
984
|
return i && await C.runPromise(r.touchSession(i, new Date(Date.now() + e * 1e3))), {
|
|
984
985
|
subject: n.subject,
|
|
@@ -990,7 +991,7 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
990
991
|
subject: n.subject,
|
|
991
992
|
sessionId: i
|
|
992
993
|
};
|
|
993
|
-
},
|
|
994
|
+
}, g = (e, t) => {
|
|
994
995
|
if (!t) return e;
|
|
995
996
|
let n = e.headers ?? {};
|
|
996
997
|
return n["set-cookie"] ? e : {
|
|
@@ -1000,11 +1001,11 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
1000
1001
|
"set-cookie": t
|
|
1001
1002
|
}
|
|
1002
1003
|
};
|
|
1003
|
-
},
|
|
1004
|
-
let n = e.headers[
|
|
1005
|
-
return
|
|
1006
|
-
},
|
|
1007
|
-
issue: (e, t) => R(e, r,
|
|
1004
|
+
}, _ = (e) => {
|
|
1005
|
+
let n = e.headers[ee], r = se(e.headers.cookie, v);
|
|
1006
|
+
return te(n, r, ze(t));
|
|
1007
|
+
}, y = (e, t) => e.path === `${n}${t}`, b = (e) => C.runPromise(e).then(X), x = {
|
|
1008
|
+
issue: (e, t) => R(e, r, l, {
|
|
1008
1009
|
sessionId: t.sessionId,
|
|
1009
1010
|
ttlSeconds: t.ttlSeconds,
|
|
1010
1011
|
metadata: t.metadata,
|
|
@@ -1012,166 +1013,166 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
1012
1013
|
userAgent: t.userAgent ?? null,
|
|
1013
1014
|
clearLoginFailures: !1
|
|
1014
1015
|
}),
|
|
1015
|
-
reissue: (e, t) => R(e, r,
|
|
1016
|
+
reissue: (e, t) => R(e, r, l, {
|
|
1016
1017
|
sessionId: t.sessionId,
|
|
1017
1018
|
ttlSeconds: t.ttlSeconds,
|
|
1018
1019
|
sessionRow: "existing",
|
|
1019
1020
|
clearLoginFailures: !1
|
|
1020
1021
|
}),
|
|
1021
1022
|
clear: () => i({
|
|
1022
|
-
...
|
|
1023
|
-
secure:
|
|
1023
|
+
...l.cookieDomain ? { domain: l.cookieDomain } : {},
|
|
1024
|
+
secure: l.cookieSecure ?? !0
|
|
1024
1025
|
})
|
|
1025
|
-
},
|
|
1026
|
+
}, ne = {
|
|
1026
1027
|
method: "*",
|
|
1027
1028
|
path: n,
|
|
1028
1029
|
handle: async (i) => {
|
|
1029
|
-
let a = i.method === "GET" ? {} :
|
|
1030
|
-
if (i.method === "GET" &&
|
|
1031
|
-
if (i.method === "POST" &&
|
|
1030
|
+
let a = i.method === "GET" ? {} : Lt(i);
|
|
1031
|
+
if (i.method === "GET" && y(i, "/csrf")) return X(Xe(l));
|
|
1032
|
+
if (i.method === "POST" && y(i, "/sign-in")) return b(He({
|
|
1032
1033
|
email: Q(a.email) ?? "",
|
|
1033
1034
|
password: Q(a.password) ?? "",
|
|
1034
1035
|
...a.redirectAfter === void 0 ? {} : { redirectAfter: !!a.redirectAfter },
|
|
1035
1036
|
...i.remoteAddr ? { ipAddress: i.remoteAddr } : {},
|
|
1036
1037
|
...i.headers["user-agent"] ? { userAgent: i.headers["user-agent"] } : {}
|
|
1037
|
-
}, r,
|
|
1038
|
-
if (i.method === "POST" &&
|
|
1038
|
+
}, r, l));
|
|
1039
|
+
if (i.method === "POST" && y(i, "/sign-up")) return b(We({
|
|
1039
1040
|
email: Q(a.email) ?? "",
|
|
1040
1041
|
password: Q(a.password) ?? "",
|
|
1041
1042
|
...$("tenantId", a.tenantId),
|
|
1042
1043
|
...a.redirectAfter === void 0 ? {} : { redirectAfter: !!a.redirectAfter }
|
|
1043
|
-
}, r,
|
|
1044
|
-
if (i.method === "POST" &&
|
|
1045
|
-
let e = await
|
|
1046
|
-
return e && e.subject.type === "user" && e.sessionId && (await C.runPromise(r.revokeSession(e.subject.id, e.sessionId)),
|
|
1044
|
+
}, r, l));
|
|
1045
|
+
if (i.method === "POST" && y(i, "/sign-out")) {
|
|
1046
|
+
let e = await h(i);
|
|
1047
|
+
return e && e.subject.type === "user" && e.sessionId && (await C.runPromise(r.revokeSession(e.subject.id, e.sessionId)), p.invalidate(e.sessionId)), X(Ge(l));
|
|
1047
1048
|
}
|
|
1048
|
-
if (i.method === "POST" &&
|
|
1049
|
+
if (i.method === "POST" && y(i, "/magic-link")) return b(Qe({
|
|
1049
1050
|
email: Q(a.email) ?? "",
|
|
1050
1051
|
...$("callbackPath", a.callbackPath)
|
|
1051
|
-
}, r,
|
|
1052
|
-
if (i.method === "POST" &&
|
|
1052
|
+
}, r, l));
|
|
1053
|
+
if (i.method === "POST" && y(i, "/magic-link/callback")) return b($e({
|
|
1053
1054
|
token: Q(a.token) ?? "",
|
|
1054
1055
|
...a.redirectAfter === void 0 ? {} : { redirectAfter: !!a.redirectAfter }
|
|
1055
|
-
}, r,
|
|
1056
|
-
if (i.method === "POST" &&
|
|
1056
|
+
}, r, l));
|
|
1057
|
+
if (i.method === "POST" && y(i, "/password-reset")) return b(et({
|
|
1057
1058
|
email: Q(a.email) ?? "",
|
|
1058
1059
|
...$("callbackPath", a.callbackPath)
|
|
1059
|
-
}, r,
|
|
1060
|
-
if (i.method === "POST" &&
|
|
1060
|
+
}, r, l));
|
|
1061
|
+
if (i.method === "POST" && y(i, "/password-reset/confirm")) return b(tt({
|
|
1061
1062
|
token: Q(a.token) ?? "",
|
|
1062
1063
|
newPassword: Q(a.newPassword) ?? ""
|
|
1063
1064
|
}, r));
|
|
1064
|
-
if (i.method === "POST" &&
|
|
1065
|
+
if (i.method === "POST" && y(i, "/verify-email")) {
|
|
1065
1066
|
let e = Q(a.email);
|
|
1066
|
-
if (e) return b(P({ email: e }, r,
|
|
1067
|
-
let t = await
|
|
1068
|
-
return !t || t.subject.type !== "user" ? Z(400, { error: "email required" }) : b(P({ userId: t.subject.id }, r,
|
|
1067
|
+
if (e) return b(P({ email: e }, r, l));
|
|
1068
|
+
let t = await h(i);
|
|
1069
|
+
return !t || t.subject.type !== "user" ? Z(400, { error: "email required" }) : b(P({ userId: t.subject.id }, r, l));
|
|
1069
1070
|
}
|
|
1070
|
-
if (i.method === "POST" &&
|
|
1071
|
-
if (t.invitations && i.method === "POST" &&
|
|
1072
|
-
if (t.invitations && i.method === "POST" &&
|
|
1071
|
+
if (i.method === "POST" && y(i, "/verify-email/callback")) return b(Pe({ token: Q(a.token) ?? "" }, r));
|
|
1072
|
+
if (t.invitations && i.method === "POST" && y(i, "/invitations/preview")) return b(Tt({ token: Q(a.token) ?? "" }, r, u));
|
|
1073
|
+
if (t.invitations && i.method === "POST" && y(i, "/invitations/sign-up")) return b(Dt({
|
|
1073
1074
|
token: Q(a.token) ?? "",
|
|
1074
1075
|
password: Q(a.password) ?? ""
|
|
1075
1076
|
}, r, {
|
|
1076
|
-
...
|
|
1077
|
+
...u,
|
|
1077
1078
|
hashPassword: e
|
|
1078
1079
|
}));
|
|
1079
|
-
if (i.method === "POST" &&
|
|
1080
|
+
if (i.method === "POST" && y(i, "/mfa/verify")) return b(Ue({
|
|
1080
1081
|
pendingToken: Q(a.pendingToken) ?? "",
|
|
1081
1082
|
...$("code", a.code),
|
|
1082
1083
|
...$("recoveryCode", a.recoveryCode),
|
|
1083
1084
|
...a.redirectAfter === void 0 ? {} : { redirectAfter: !!a.redirectAfter },
|
|
1084
1085
|
...i.remoteAddr ? { ipAddress: i.remoteAddr } : {},
|
|
1085
1086
|
...i.headers["user-agent"] ? { userAgent: i.headers["user-agent"] } : {}
|
|
1086
|
-
}, r,
|
|
1087
|
-
if (t.passkey && i.method === "POST" &&
|
|
1088
|
-
if (t.passkey && i.method === "POST" &&
|
|
1087
|
+
}, r, l));
|
|
1088
|
+
if (t.passkey && i.method === "POST" && y(i, "/passkey/assert/options")) return b(ft({ ...$("userId", a.userId) }, r, s, t.passkey));
|
|
1089
|
+
if (t.passkey && i.method === "POST" && y(i, "/passkey/assert/verify")) return b(pt({
|
|
1089
1090
|
credentialId: Q(a.credentialId) ?? "",
|
|
1090
1091
|
clientDataJSON: Q(a.clientDataJSON) ?? "",
|
|
1091
1092
|
authenticatorData: Q(a.authenticatorData) ?? "",
|
|
1092
1093
|
signature: Q(a.signature) ?? "",
|
|
1093
1094
|
...$("userId", a.userId)
|
|
1094
|
-
}, r, s, t.passkey,
|
|
1095
|
-
let o = await
|
|
1095
|
+
}, r, s, t.passkey, l));
|
|
1096
|
+
let o = await h(i), d = o?.subject ?? null, f = () => !d || d.type !== "user" ? Z(401, { error: "unauthenticated" }) : { userId: d.id }, m = () => _(i) ? null : Z(403, { error: "csrf" }), v = (e) => b(e).then((e) => g(e, o?.renewSetCookie));
|
|
1096
1097
|
if (d && q(d)) {
|
|
1097
1098
|
let e = i.path.startsWith(n) ? i.path.slice(n.length) : "";
|
|
1098
|
-
if (
|
|
1099
|
+
if (kt.includes(e)) return Z(403, {
|
|
1099
1100
|
error: "forbidden_while_impersonating",
|
|
1100
1101
|
message: "This action changes account credentials or session scope and is refused while impersonating. Stop the impersonation first."
|
|
1101
1102
|
});
|
|
1102
1103
|
}
|
|
1103
|
-
if (i.method === "GET" &&
|
|
1104
|
+
if (i.method === "GET" && y(i, "/session")) {
|
|
1104
1105
|
let e = f();
|
|
1105
|
-
return "status" in e ? e :
|
|
1106
|
+
return "status" in e ? e : g(Z(200, {
|
|
1106
1107
|
ok: !0,
|
|
1107
1108
|
subject: d,
|
|
1108
1109
|
renewed: o?.renewSetCookie !== void 0
|
|
1109
1110
|
}), o?.renewSetCookie);
|
|
1110
1111
|
}
|
|
1111
|
-
if (i.method === "GET" &&
|
|
1112
|
+
if (i.method === "GET" && y(i, "/sessions")) {
|
|
1112
1113
|
let e = f();
|
|
1113
|
-
return "status" in e ? e : v(
|
|
1114
|
+
return "status" in e ? e : v(nt({ userId: e.userId }, r));
|
|
1114
1115
|
}
|
|
1115
|
-
if (i.method === "GET" &&
|
|
1116
|
+
if (i.method === "GET" && y(i, "/memberships")) {
|
|
1116
1117
|
let e = f();
|
|
1117
|
-
return "status" in e ? e : v(
|
|
1118
|
+
return "status" in e ? e : v(ot({ userId: e.userId }, r));
|
|
1118
1119
|
}
|
|
1119
|
-
if (i.method === "POST" &&
|
|
1120
|
+
if (i.method === "POST" && y(i, "/sessions/revoke")) {
|
|
1120
1121
|
let e = f();
|
|
1121
1122
|
if ("status" in e) return e;
|
|
1122
1123
|
let t = m();
|
|
1123
1124
|
if (t) return t;
|
|
1124
1125
|
let n = Q(a.sessionId) ?? "";
|
|
1125
|
-
return v(
|
|
1126
|
+
return v(rt({
|
|
1126
1127
|
userId: e.userId,
|
|
1127
1128
|
sessionId: n
|
|
1128
|
-
}, r)).then((e) => (n &&
|
|
1129
|
+
}, r)).then((e) => (n && p.invalidate(n), e));
|
|
1129
1130
|
}
|
|
1130
|
-
if (i.method === "POST" &&
|
|
1131
|
+
if (i.method === "POST" && y(i, "/sessions/revoke-others")) {
|
|
1131
1132
|
let e = f();
|
|
1132
|
-
return "status" in e ? e : m() || v(
|
|
1133
|
+
return "status" in e ? e : m() || v(it({
|
|
1133
1134
|
userId: e.userId,
|
|
1134
1135
|
keepSessionId: o?.sessionId ?? "__none__"
|
|
1135
1136
|
}, r));
|
|
1136
1137
|
}
|
|
1137
|
-
if (t.invitations && i.method === "POST" &&
|
|
1138
|
+
if (t.invitations && i.method === "POST" && y(i, "/invitations")) {
|
|
1138
1139
|
let e = f();
|
|
1139
|
-
return "status" in e ? e : m() || v(
|
|
1140
|
+
return "status" in e ? e : m() || v(St({
|
|
1140
1141
|
inviterUserId: e.userId,
|
|
1141
1142
|
tenantId: Q(a.tenantId) ?? d?.tenantId ?? "",
|
|
1142
1143
|
email: Q(a.email) ?? "",
|
|
1143
1144
|
role: Q(a.role) ?? ""
|
|
1144
|
-
}, r,
|
|
1145
|
+
}, r, u));
|
|
1145
1146
|
}
|
|
1146
1147
|
if (t.invitations && i.method === "GET" && i.path === `${n}/invitations`) {
|
|
1147
1148
|
let e = f();
|
|
1148
|
-
return "status" in e ? e : v(
|
|
1149
|
+
return "status" in e ? e : v(Ct({
|
|
1149
1150
|
callerUserId: e.userId,
|
|
1150
1151
|
tenantId: d?.tenantId ?? ""
|
|
1151
|
-
}, r,
|
|
1152
|
+
}, r, u));
|
|
1152
1153
|
}
|
|
1153
|
-
if (t.invitations && i.method === "POST" &&
|
|
1154
|
+
if (t.invitations && i.method === "POST" && y(i, "/invitations/revoke")) {
|
|
1154
1155
|
let e = f();
|
|
1155
|
-
return "status" in e ? e : m() || v(
|
|
1156
|
+
return "status" in e ? e : m() || v(wt({
|
|
1156
1157
|
callerUserId: e.userId,
|
|
1157
1158
|
tenantId: Q(a.tenantId) ?? d?.tenantId ?? "",
|
|
1158
1159
|
invitationId: Q(a.invitationId) ?? ""
|
|
1159
|
-
}, r,
|
|
1160
|
+
}, r, u));
|
|
1160
1161
|
}
|
|
1161
|
-
if (t.invitations && i.method === "POST" &&
|
|
1162
|
+
if (t.invitations && i.method === "POST" && y(i, "/invitations/accept")) {
|
|
1162
1163
|
let e = f();
|
|
1163
1164
|
if (!("status" in e)) {
|
|
1164
1165
|
let e = m();
|
|
1165
1166
|
if (e) return e;
|
|
1166
1167
|
}
|
|
1167
|
-
return v(
|
|
1168
|
+
return v(Et({
|
|
1168
1169
|
token: Q(a.token) ?? "",
|
|
1169
1170
|
..."status" in e ? {} : { userId: e.userId }
|
|
1170
|
-
}, r,
|
|
1171
|
+
}, r, u));
|
|
1171
1172
|
}
|
|
1172
|
-
if (t.impersonation && i.method === "POST" &&
|
|
1173
|
+
if (t.impersonation && i.method === "POST" && y(i, "/impersonate/start")) {
|
|
1173
1174
|
let e = f();
|
|
1174
|
-
return "status" in e ? e : m() || b(
|
|
1175
|
+
return "status" in e ? e : m() || b(Mt({
|
|
1175
1176
|
actorSubject: d,
|
|
1176
1177
|
actorSessionId: o?.sessionId ?? "",
|
|
1177
1178
|
...$("targetUserId", a.userId),
|
|
@@ -1184,68 +1185,68 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
1184
1185
|
impersonation: t.impersonation,
|
|
1185
1186
|
issuer: x,
|
|
1186
1187
|
...t.now === void 0 ? {} : { now: t.now },
|
|
1187
|
-
invalidateSession: (e) =>
|
|
1188
|
+
invalidateSession: (e) => p.invalidate(e)
|
|
1188
1189
|
}));
|
|
1189
1190
|
}
|
|
1190
|
-
if (t.impersonation && i.method === "POST" &&
|
|
1191
|
+
if (t.impersonation && i.method === "POST" && y(i, "/impersonate/stop")) {
|
|
1191
1192
|
let e = f();
|
|
1192
|
-
return "status" in e ? e : m() || b(
|
|
1193
|
+
return "status" in e ? e : m() || b(Nt({
|
|
1193
1194
|
subject: d,
|
|
1194
1195
|
sessionId: o?.sessionId ?? ""
|
|
1195
1196
|
}, r, {
|
|
1196
1197
|
impersonation: t.impersonation,
|
|
1197
1198
|
issuer: x,
|
|
1198
1199
|
...t.now === void 0 ? {} : { now: t.now },
|
|
1199
|
-
invalidateSession: (e) =>
|
|
1200
|
+
invalidateSession: (e) => p.invalidate(e)
|
|
1200
1201
|
}));
|
|
1201
1202
|
}
|
|
1202
|
-
if (i.method === "POST" &&
|
|
1203
|
+
if (i.method === "POST" && y(i, "/switch-tenant")) {
|
|
1203
1204
|
let e = f();
|
|
1204
|
-
return "status" in e ? e : m() || b(
|
|
1205
|
+
return "status" in e ? e : m() || b(at({
|
|
1205
1206
|
userId: e.userId,
|
|
1206
1207
|
targetTenantId: Q(a.targetTenantId) ?? "",
|
|
1207
1208
|
...typeof a.clientId == "number" ? { clientId: a.clientId } : {},
|
|
1208
1209
|
...o?.sessionId ? { sessionId: o.sessionId } : {},
|
|
1209
1210
|
...d?.type === "user" && d.metadata ? { metadata: d.metadata } : {}
|
|
1210
|
-
}, r,
|
|
1211
|
+
}, r, l, t.rebind, c.current));
|
|
1211
1212
|
}
|
|
1212
|
-
if (t.mfa && i.method === "POST" &&
|
|
1213
|
+
if (t.mfa && i.method === "POST" && y(i, "/mfa/enroll/start")) {
|
|
1213
1214
|
let e = f();
|
|
1214
1215
|
if ("status" in e) return e;
|
|
1215
1216
|
let n = m();
|
|
1216
1217
|
if (n) return n;
|
|
1217
1218
|
let i = await C.runPromise(r.findById(e.userId));
|
|
1218
|
-
return v(
|
|
1219
|
+
return v(Ke({
|
|
1219
1220
|
userId: e.userId,
|
|
1220
1221
|
issuer: t.mfa.issuer,
|
|
1221
1222
|
accountName: i?.email ?? e.userId
|
|
1222
1223
|
}, r));
|
|
1223
1224
|
}
|
|
1224
|
-
if (t.mfa && i.method === "POST" &&
|
|
1225
|
+
if (t.mfa && i.method === "POST" && y(i, "/mfa/enroll/verify")) {
|
|
1225
1226
|
let e = f();
|
|
1226
|
-
return "status" in e ? e : m() || v(
|
|
1227
|
+
return "status" in e ? e : m() || v(qe({
|
|
1227
1228
|
userId: e.userId,
|
|
1228
1229
|
code: Q(a.code) ?? ""
|
|
1229
1230
|
}, r));
|
|
1230
1231
|
}
|
|
1231
|
-
if (t.mfa && i.method === "POST" &&
|
|
1232
|
+
if (t.mfa && i.method === "POST" && y(i, "/mfa/unenroll")) {
|
|
1232
1233
|
let e = f();
|
|
1233
|
-
return "status" in e ? e : m() || v(
|
|
1234
|
+
return "status" in e ? e : m() || v(Ye({ userId: e.userId }, r));
|
|
1234
1235
|
}
|
|
1235
|
-
if (t.mfa && i.method === "POST" &&
|
|
1236
|
+
if (t.mfa && i.method === "POST" && y(i, "/mfa/recovery-codes/regenerate")) {
|
|
1236
1237
|
let e = f();
|
|
1237
|
-
return "status" in e ? e : m() || v(
|
|
1238
|
+
return "status" in e ? e : m() || v(Je({ userId: e.userId }, r));
|
|
1238
1239
|
}
|
|
1239
|
-
if (t.passkey && i.method === "POST" &&
|
|
1240
|
+
if (t.passkey && i.method === "POST" && y(i, "/passkey/register/options")) {
|
|
1240
1241
|
let e = f();
|
|
1241
|
-
return "status" in e ? e : m() || v(
|
|
1242
|
+
return "status" in e ? e : m() || v(ut({
|
|
1242
1243
|
userId: e.userId,
|
|
1243
1244
|
userName: Q(a.userName) ?? e.userId
|
|
1244
1245
|
}, r, s, t.passkey));
|
|
1245
1246
|
}
|
|
1246
|
-
if (t.passkey && i.method === "POST" &&
|
|
1247
|
+
if (t.passkey && i.method === "POST" && y(i, "/passkey/register/verify")) {
|
|
1247
1248
|
let e = f();
|
|
1248
|
-
return "status" in e ? e : m() || v(
|
|
1249
|
+
return "status" in e ? e : m() || v(dt({
|
|
1249
1250
|
userId: e.userId,
|
|
1250
1251
|
credentialId: Q(a.credentialId) ?? "",
|
|
1251
1252
|
clientDataJSON: Q(a.clientDataJSON) ?? "",
|
|
@@ -1255,18 +1256,21 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
1255
1256
|
}
|
|
1256
1257
|
return !t.passkey && i.path.startsWith(`${n}/passkey/`) ? Z(501, { error: "passkey_not_configured" }) : Z(404, { error: "not_found" });
|
|
1257
1258
|
}
|
|
1258
|
-
},
|
|
1259
|
+
}, re = de({
|
|
1259
1260
|
name: t.name ? `@voltro/plugin-auth#${t.name}` : "@voltro/plugin-auth",
|
|
1260
1261
|
description: "Auth routes — mounts the full auth surface (password, magic-link, password-reset, CSRF, session probe/list/revoke, memberships, switch-tenant, passkey ceremonies) under /auth on the framework listener, with keyed secret rotation + request-time revocation.",
|
|
1261
1262
|
permissions: [],
|
|
1262
|
-
declaredEnv:
|
|
1263
|
-
httpRoutes: [
|
|
1263
|
+
declaredEnv: zt,
|
|
1264
|
+
httpRoutes: [ne],
|
|
1265
|
+
bindDataStore: (e) => {
|
|
1266
|
+
c.current = e;
|
|
1267
|
+
},
|
|
1264
1268
|
onActivate: (e) => C.sync(() => {
|
|
1265
1269
|
e.logger.info("auth routes active", {
|
|
1266
1270
|
prefix: n,
|
|
1267
1271
|
passkey: t.passkey ? t.passkey.rpId : "disabled",
|
|
1268
1272
|
email: t.sendEmail ? "wired" : "unwired",
|
|
1269
|
-
revocationWindowMs:
|
|
1273
|
+
revocationWindowMs: p.ttlMs,
|
|
1270
1274
|
emailVerification: t.emailVerification?.policy ?? "off",
|
|
1271
1275
|
invitations: t.invitations ? "enabled" : "disabled",
|
|
1272
1276
|
impersonation: t.impersonation ? `enabled(max ${t.impersonation.maxDurationSeconds ?? 900}s)` : "disabled"
|
|
@@ -1275,14 +1279,14 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
1275
1279
|
onDeactivate: () => C.void
|
|
1276
1280
|
}), S = t.secrets ?? t.secret;
|
|
1277
1281
|
return {
|
|
1278
|
-
...
|
|
1282
|
+
...re,
|
|
1279
1283
|
auth: { sessionStrategy: m({
|
|
1280
1284
|
...S === void 0 ? {} : { secret: S },
|
|
1281
1285
|
store: r,
|
|
1282
|
-
revocation:
|
|
1286
|
+
revocation: p
|
|
1283
1287
|
}) }
|
|
1284
1288
|
};
|
|
1285
|
-
},
|
|
1289
|
+
}, zt = [
|
|
1286
1290
|
{
|
|
1287
1291
|
name: "VOLTRO_SESSION_SECRET_PREVIOUS",
|
|
1288
1292
|
required: !1,
|
|
@@ -1327,4 +1331,4 @@ var fe = { ok: !0 }, pe = (e, t) => C.gen(function* () {
|
|
|
1327
1331
|
}
|
|
1328
1332
|
];
|
|
1329
1333
|
//#endregion
|
|
1330
|
-
export {
|
|
1334
|
+
export { Pe as $, ot as A, et as B, pt as C, F as D, ct as E, qe as F, We as G, rt as H, Je as I, ke as J, at as K, Ye as L, $e as M, Qe as N, z as O, Ke as P, Me as Q, Ue as R, ft as S, dt as T, He as U, it as V, Ge as W, Oe as X, k as Y, A as Z, St as _, Mt as a, O as at, wt as b, K as c, Ee as ct, H as d, P as et, ht as f, Dt as g, Et as h, kt as i, E as it, nt as j, Xe as k, q as l, D as lt, vt as m, Pt as n, N as nt, Nt as o, De as ot, mt as p, R as q, Ot as r, j as rt, jt as s, Te as st, Rt as t, je as tt, gt as u, he as ut, Ct as v, ut as w, lt as x, Tt as y, tt as z };
|