gemi 0.86.1 → 0.88.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/Agent.d.ts +44 -2
- package/dist/ai/Agent.d.ts.map +1 -1
- package/dist/ai/AgentController.d.ts +5 -0
- package/dist/ai/AgentController.d.ts.map +1 -1
- package/dist/ai/Schema.d.ts +102 -0
- package/dist/ai/Schema.d.ts.map +1 -1
- package/dist/ai/index.d.ts +3 -3
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +12 -12
- package/dist/ai/index.js.map +5 -5
- package/dist/ai/signing.d.ts +34 -1
- package/dist/ai/signing.d.ts.map +1 -1
- package/dist/app/index.js +1 -1
- package/dist/auth/AuthController.d.ts +45 -3
- package/dist/auth/AuthController.d.ts.map +1 -1
- package/dist/auth/AuthManager.d.ts +42 -1
- package/dist/auth/AuthManager.d.ts.map +1 -1
- package/dist/auth/UserProvider.d.ts +18 -1
- package/dist/auth/UserProvider.d.ts.map +1 -1
- package/dist/auth/config.d.ts +109 -0
- package/dist/auth/config.d.ts.map +1 -1
- package/dist/auth/oneTimeCode.d.ts +99 -0
- package/dist/auth/oneTimeCode.d.ts.map +1 -0
- package/dist/auth/routes.d.ts +13 -0
- package/dist/auth/routes.d.ts.map +1 -1
- package/dist/auth/types.d.ts +8 -0
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/bin/gemi.js +198 -39
- package/dist/bin/gemi.js.map +5 -4
- package/dist/bun/plugin.js +1 -1
- package/dist/bun/preload.js +1 -1
- package/dist/{chunk-swhyp0yw.js → chunk-0808z3mq.js} +2 -2
- package/dist/{chunk-swhyp0yw.js.map → chunk-0808z3mq.js.map} +1 -1
- package/dist/{chunk-d3jkypc7.js → chunk-0efykzjy.js} +3 -3
- package/dist/{chunk-d3jkypc7.js.map → chunk-0efykzjy.js.map} +1 -1
- package/dist/{chunk-zs90w6ke.js → chunk-16mnpn6c.js} +2 -2
- package/dist/{chunk-zs90w6ke.js.map → chunk-16mnpn6c.js.map} +1 -1
- package/dist/{chunk-1jcp8m8h.js → chunk-17nh5gfm.js} +2 -2
- package/dist/{chunk-1jcp8m8h.js.map → chunk-17nh5gfm.js.map} +1 -1
- package/dist/{chunk-mszy6cfw.js → chunk-3ph0aj0x.js} +2 -2
- package/dist/{chunk-mszy6cfw.js.map → chunk-3ph0aj0x.js.map} +1 -1
- package/dist/{chunk-qje4kdff.js → chunk-3rb5ht8v.js} +3 -3
- package/dist/{chunk-qje4kdff.js.map → chunk-3rb5ht8v.js.map} +1 -1
- package/dist/chunk-3w65ra1s.js +5 -0
- package/dist/{chunk-1yzdxv2a.js.map → chunk-3w65ra1s.js.map} +1 -1
- package/dist/{chunk-v8nf45gt.js → chunk-443dm19c.js} +2 -2
- package/dist/{chunk-v8nf45gt.js.map → chunk-443dm19c.js.map} +1 -1
- package/dist/{chunk-4ysar3ev.js → chunk-49v5xq8q.js} +2 -2
- package/dist/{chunk-4ysar3ev.js.map → chunk-49v5xq8q.js.map} +1 -1
- package/dist/chunk-4v4v5wkh.js +7 -0
- package/dist/chunk-4v4v5wkh.js.map +11 -0
- package/dist/{chunk-2yw23zhn.js → chunk-523t3bcz.js} +4 -4
- package/dist/{chunk-2yw23zhn.js.map → chunk-523t3bcz.js.map} +1 -1
- package/dist/{chunk-1yq1e6sb.js → chunk-56p9a7nx.js} +3 -3
- package/dist/{chunk-1yq1e6sb.js.map → chunk-56p9a7nx.js.map} +1 -1
- package/dist/{chunk-fbwe0agk.js → chunk-61rs7kxf.js} +2 -2
- package/dist/{chunk-fbwe0agk.js.map → chunk-61rs7kxf.js.map} +1 -1
- package/dist/{chunk-cbycz5z3.js → chunk-64z2zt41.js} +2 -2
- package/dist/{chunk-cbycz5z3.js.map → chunk-64z2zt41.js.map} +1 -1
- package/dist/{chunk-saqfc6vp.js → chunk-6dyt8w27.js} +4 -4
- package/dist/{chunk-saqfc6vp.js.map → chunk-6dyt8w27.js.map} +1 -1
- package/dist/{chunk-ha705bcz.js → chunk-6rc6yec4.js} +3 -3
- package/dist/{chunk-ha705bcz.js.map → chunk-6rc6yec4.js.map} +1 -1
- package/dist/{chunk-09sr33ff.js → chunk-6s6fj97j.js} +2 -2
- package/dist/{chunk-09sr33ff.js.map → chunk-6s6fj97j.js.map} +1 -1
- package/dist/{chunk-7nj2t2gm.js → chunk-6tt3ynm7.js} +2 -2
- package/dist/{chunk-7nj2t2gm.js.map → chunk-6tt3ynm7.js.map} +1 -1
- package/dist/{chunk-trdwxm5x.js → chunk-6y62ccam.js} +3 -3
- package/dist/{chunk-trdwxm5x.js.map → chunk-6y62ccam.js.map} +1 -1
- package/dist/{chunk-81v4c4b1.js → chunk-713fezaz.js} +2 -2
- package/dist/{chunk-81v4c4b1.js.map → chunk-713fezaz.js.map} +1 -1
- package/dist/{chunk-xckeyg3v.js → chunk-78gs7xvn.js} +2 -2
- package/dist/{chunk-xckeyg3v.js.map → chunk-78gs7xvn.js.map} +1 -1
- package/dist/{chunk-ndat0nf0.js → chunk-7r78cdyd.js} +2 -2
- package/dist/{chunk-ndat0nf0.js.map → chunk-7r78cdyd.js.map} +1 -1
- package/dist/chunk-86p57tjw.js +5 -0
- package/dist/{chunk-hmh79ezn.js.map → chunk-86p57tjw.js.map} +3 -6
- package/dist/{chunk-ct7wxm98.js → chunk-8dpnghvk.js} +2 -2
- package/dist/{chunk-ct7wxm98.js.map → chunk-8dpnghvk.js.map} +1 -1
- package/dist/{chunk-zf4r4kat.js → chunk-8pesk2wm.js} +2 -2
- package/dist/{chunk-zf4r4kat.js.map → chunk-8pesk2wm.js.map} +1 -1
- package/dist/{chunk-8gexb1gt.js → chunk-8r7xhy1g.js} +2 -2
- package/dist/{chunk-8gexb1gt.js.map → chunk-8r7xhy1g.js.map} +1 -1
- package/dist/{chunk-gx0x772p.js → chunk-8y08amzz.js} +2 -2
- package/dist/{chunk-gx0x772p.js.map → chunk-8y08amzz.js.map} +1 -1
- package/dist/{chunk-y7qnx8vm.js → chunk-9c1zx81w.js} +2 -2
- package/dist/{chunk-y7qnx8vm.js.map → chunk-9c1zx81w.js.map} +1 -1
- package/dist/{chunk-7c33ngqs.js → chunk-ak3yy4za.js} +2 -2
- package/dist/{chunk-7c33ngqs.js.map → chunk-ak3yy4za.js.map} +1 -1
- package/dist/{chunk-z6cgama8.js → chunk-aqtf14yz.js} +2 -2
- package/dist/{chunk-z6cgama8.js.map → chunk-aqtf14yz.js.map} +1 -1
- package/dist/{chunk-z4k18gnp.js → chunk-bsbn7qtd.js} +2 -2
- package/dist/{chunk-z4k18gnp.js.map → chunk-bsbn7qtd.js.map} +1 -1
- package/dist/{chunk-2gdhcswa.js → chunk-d1r618e8.js} +1 -1
- package/dist/{chunk-v4ngf77f.js → chunk-d5h5v4rj.js} +2 -2
- package/dist/{chunk-v4ngf77f.js.map → chunk-d5h5v4rj.js.map} +1 -1
- package/dist/{chunk-7n5775qx.js → chunk-e3fnjj0h.js} +2 -2
- package/dist/{chunk-7n5775qx.js.map → chunk-e3fnjj0h.js.map} +1 -1
- package/dist/chunk-efzvxta5.js +24 -0
- package/dist/{chunk-gs8x0k68.js.map → chunk-efzvxta5.js.map} +6 -5
- package/dist/{chunk-sjckrbr2.js → chunk-fkt43zw1.js} +2 -2
- package/dist/{chunk-sjckrbr2.js.map → chunk-fkt43zw1.js.map} +1 -1
- package/dist/{chunk-p7r3ecpk.js → chunk-g2bsmw1m.js} +2 -2
- package/dist/{chunk-9tsw1bmt.js.map → chunk-g2bsmw1m.js.map} +1 -1
- package/dist/{chunk-1w5a11cd.js → chunk-gzfat1x1.js} +2 -2
- package/dist/{chunk-1w5a11cd.js.map → chunk-gzfat1x1.js.map} +1 -1
- package/dist/{chunk-wwzg4dmy.js → chunk-hnbj9jx2.js} +3 -3
- package/dist/{chunk-wwzg4dmy.js.map → chunk-hnbj9jx2.js.map} +1 -1
- package/dist/{chunk-dadygfkf.js → chunk-j0fgc58k.js} +2 -2
- package/dist/{chunk-dadygfkf.js.map → chunk-j0fgc58k.js.map} +1 -1
- package/dist/{chunk-6nnq3rjj.js → chunk-j3y6pdqp.js} +2 -2
- package/dist/{chunk-6nnq3rjj.js.map → chunk-j3y6pdqp.js.map} +1 -1
- package/dist/{chunk-v2hvnxsf.js → chunk-jfgjscq6.js} +2 -2
- package/dist/{chunk-v2hvnxsf.js.map → chunk-jfgjscq6.js.map} +1 -1
- package/dist/{chunk-k5j65f2c.js → chunk-ngq4n2b3.js} +2 -2
- package/dist/{chunk-k5j65f2c.js.map → chunk-ngq4n2b3.js.map} +1 -1
- package/dist/{chunk-kmsrzbx1.js → chunk-pqydkns8.js} +2 -2
- package/dist/{chunk-kmsrzbx1.js.map → chunk-pqydkns8.js.map} +1 -1
- package/dist/{chunk-pzwyg474.js → chunk-pw95y0fx.js} +2 -2
- package/dist/{chunk-pzwyg474.js.map → chunk-pw95y0fx.js.map} +1 -1
- package/dist/{chunk-9tv5j3b2.js → chunk-pwaftx6n.js} +3 -3
- package/dist/{chunk-9tv5j3b2.js.map → chunk-pwaftx6n.js.map} +1 -1
- package/dist/{chunk-p0m3qgs5.js → chunk-q6ydpt33.js} +2 -2
- package/dist/{chunk-p0m3qgs5.js.map → chunk-q6ydpt33.js.map} +1 -1
- package/dist/{chunk-81k26w39.js → chunk-r1sj312m.js} +2 -2
- package/dist/{chunk-81k26w39.js.map → chunk-r1sj312m.js.map} +1 -1
- package/dist/{chunk-55x9kkdt.js → chunk-r78aqvne.js} +2 -2
- package/dist/{chunk-55x9kkdt.js.map → chunk-r78aqvne.js.map} +1 -1
- package/dist/{chunk-1b5s4w5f.js → chunk-r9qzgvpx.js} +2 -2
- package/dist/{chunk-1b5s4w5f.js.map → chunk-r9qzgvpx.js.map} +1 -1
- package/dist/{chunk-174jkg6d.js → chunk-rhe7s1fm.js} +3 -3
- package/dist/{chunk-174jkg6d.js.map → chunk-rhe7s1fm.js.map} +1 -1
- package/dist/{chunk-vwp1g8wh.js → chunk-rp0reqjn.js} +2 -2
- package/dist/{chunk-vwp1g8wh.js.map → chunk-rp0reqjn.js.map} +1 -1
- package/dist/{chunk-cfykfnqx.js → chunk-rw0t90pf.js} +2 -2
- package/dist/{chunk-cfykfnqx.js.map → chunk-rw0t90pf.js.map} +1 -1
- package/dist/{chunk-mk8m3ffx.js → chunk-s72y1w84.js} +2 -2
- package/dist/{chunk-mk8m3ffx.js.map → chunk-s72y1w84.js.map} +1 -1
- package/dist/{chunk-9tsw1bmt.js → chunk-t93t317r.js} +2 -2
- package/dist/{chunk-p7r3ecpk.js.map → chunk-t93t317r.js.map} +1 -1
- package/dist/{chunk-dwqh79e5.js → chunk-ttckhvew.js} +2 -2
- package/dist/{chunk-dwqh79e5.js.map → chunk-ttckhvew.js.map} +1 -1
- package/dist/{chunk-rdnm6rem.js → chunk-whjhrz97.js} +2 -2
- package/dist/{chunk-rdnm6rem.js.map → chunk-whjhrz97.js.map} +1 -1
- package/dist/{chunk-sejnmn1q.js → chunk-x85x83pa.js} +1 -1
- package/dist/{chunk-s046a984.js → chunk-xc90ycw2.js} +2 -2
- package/dist/{chunk-s046a984.js.map → chunk-xc90ycw2.js.map} +1 -1
- package/dist/{chunk-jhe0t7yj.js → chunk-xqyx8kzr.js} +2 -2
- package/dist/{chunk-jhe0t7yj.js.map → chunk-xqyx8kzr.js.map} +2 -2
- package/dist/{chunk-c3gzpjba.js → chunk-yafxbmy3.js} +1 -1
- package/dist/{chunk-pmmrhak1.js → chunk-yc3n6zhr.js} +3 -3
- package/dist/{chunk-pmmrhak1.js.map → chunk-yc3n6zhr.js.map} +1 -1
- package/dist/chunk-ymgehegb.js +17 -0
- package/dist/{chunk-tag4fdmj.js.map → chunk-ymgehegb.js.map} +12 -8
- package/dist/{chunk-m7y8d3k7.js → chunk-zf8bgrnj.js} +2 -2
- package/dist/{chunk-m7y8d3k7.js.map → chunk-zf8bgrnj.js.map} +1 -1
- package/dist/{chunk-fc2je244.js → chunk-zn5bqe6m.js} +3 -3
- package/dist/{chunk-fc2je244.js.map → chunk-zn5bqe6m.js.map} +1 -1
- package/dist/{chunk-4zj05vry.js → chunk-ztzd90gp.js} +2 -2
- package/dist/{chunk-4zj05vry.js.map → chunk-ztzd90gp.js.map} +1 -1
- package/dist/chunks/{ThemeProvider-D1kDfCwY.js → ThemeProvider-z_MW40tl.js} +126 -6
- package/dist/chunks/ThemeProvider-z_MW40tl.js.map +1 -0
- package/dist/client/ClientRouter.d.ts.map +1 -1
- package/dist/client/ClientRouterContext.d.ts.map +1 -1
- package/dist/client/ComponentContext.d.ts +8 -1
- package/dist/client/ComponentContext.d.ts.map +1 -1
- package/dist/client/MutationError.d.ts +4 -4
- package/dist/client/auth/useEmailCode.d.ts +36 -0
- package/dist/client/auth/useEmailCode.d.ts.map +1 -0
- package/dist/client/chunkLoadRecovery.d.ts +96 -0
- package/dist/client/chunkLoadRecovery.d.ts.map +1 -0
- package/dist/client/index.d.ts +4 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +53 -4
- package/dist/client/index.js.map +1 -1
- package/dist/client/init.d.ts +9 -0
- package/dist/client/init.d.ts.map +1 -1
- package/dist/config/index.d.ts +12 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +1 -1
- package/dist/config/index.js.map +2 -2
- package/dist/console/run.js +2 -2
- package/dist/console/run.js.map +1 -1
- package/dist/container/index.js +2 -2
- package/dist/container/index.js.map +1 -1
- package/dist/database/index.js +2 -2
- package/dist/database/index.js.map +1 -1
- package/dist/email/index.js +2 -2
- package/dist/email/index.js.map +1 -1
- package/dist/facades/index.js +2 -2
- package/dist/facades/index.js.map +1 -1
- package/dist/foundation/index.js +2 -2
- package/dist/foundation/index.js.map +1 -1
- package/dist/http/Error.d.ts +2 -2
- package/dist/http/index.js +2 -2
- package/dist/http/index.js.map +1 -1
- package/dist/i18n/dictionaryRuntime.js +2 -2
- package/dist/i18n/dictionaryRuntime.js.map +1 -1
- package/dist/i18n/index.js +2 -2
- package/dist/i18n/index.js.map +1 -1
- package/dist/kernel/index.d.ts +2 -0
- package/dist/kernel/index.d.ts.map +1 -1
- package/dist/kernel/index.js +3 -3
- package/dist/kernel/index.js.map +2 -2
- package/dist/orm/index.js +3 -3
- package/dist/orm/index.js.map +1 -1
- package/dist/server/forwardedFor.d.ts +1 -1
- package/dist/server/index.js +2 -2
- package/dist/server/index.js.map +1 -1
- package/dist/server/staticAssetMiss.d.ts +7 -0
- package/dist/server/staticAssetMiss.d.ts.map +1 -1
- package/dist/services/index.d.ts +1 -1
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +3 -3
- package/dist/services/index.js.map +1 -1
- package/dist/services/queue/work.js +2 -2
- package/dist/services/queue/work.js.map +1 -1
- package/dist/services/rate-limiter/drivers/InMemoryRateLimiterDriver.d.ts +10 -1
- package/dist/services/rate-limiter/drivers/InMemoryRateLimiterDriver.d.ts.map +1 -1
- package/dist/support/index.js +2 -2
- package/dist/support/index.js.map +1 -1
- package/dist/testing/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-1yzdxv2a.js +0 -5
- package/dist/chunk-gs8x0k68.js +0 -24
- package/dist/chunk-hmh79ezn.js +0 -5
- package/dist/chunk-tag4fdmj.js +0 -17
- package/dist/chunk-w312e9nx.js +0 -5
- package/dist/chunk-w312e9nx.js.map +0 -11
- package/dist/chunks/ThemeProvider-D1kDfCwY.js.map +0 -1
- /package/dist/{chunk-2gdhcswa.js.map → chunk-d1r618e8.js.map} +0 -0
- /package/dist/{chunk-sejnmn1q.js.map → chunk-x85x83pa.js.map} +0 -0
- /package/dist/{chunk-c3gzpjba.js.map → chunk-yafxbmy3.js.map} +0 -0
package/dist/ai/signing.d.ts
CHANGED
|
@@ -32,6 +32,14 @@ import { type NonceStore } from "./store/Nonces";
|
|
|
32
32
|
* output" arm of `ClientToolResult` would be fabricating a server tool's result
|
|
33
33
|
* rather than approving it. Binding the kind makes that a forgery instead of a
|
|
34
34
|
* shape the caller has to remember to check.
|
|
35
|
+
*
|
|
36
|
+
* Keys and principals (#447). Neither token kind is MACed with `SECRET`
|
|
37
|
+
* itself: each is keyed with its own HKDF-derived key (`purposeKey` below), so
|
|
38
|
+
* a MAC minted for one purpose — a pending call, a parked-run record, or
|
|
39
|
+
* anything else in the app keyed off `SECRET` (CSRF, sessions) — is never a
|
|
40
|
+
* MAC for another. And each binds the `subject`, the principal the run was
|
|
41
|
+
* started for (`AgentController.runOwner`), so a token minted while user A was
|
|
42
|
+
* asked cannot be answered by user B, even with A's history in hand.
|
|
35
43
|
*/
|
|
36
44
|
/** Everything the signature commits to. */
|
|
37
45
|
export type PendingCallClaims = {
|
|
@@ -51,6 +59,14 @@ export type PendingCallClaims = {
|
|
|
51
59
|
* being replayed as a top-level call, or as one nested under Y.
|
|
52
60
|
*/
|
|
53
61
|
path?: string[];
|
|
62
|
+
/**
|
|
63
|
+
* Who the question was asked of: the run's owner (`AgentController.runOwner`,
|
|
64
|
+
* `user:<id>` by default). `null` or absent is nobody in particular — an
|
|
65
|
+
* anonymous run — and the two are the same claim. A token minted for one
|
|
66
|
+
* subject fails verification for any other, `null` included, so an approval
|
|
67
|
+
* cannot be carried from one user's session to another's.
|
|
68
|
+
*/
|
|
69
|
+
subject?: string | null;
|
|
54
70
|
};
|
|
55
71
|
export type SignOptions = {
|
|
56
72
|
/** Overrides `process.env.SECRET`. Exists for tests; apps use the app key. */
|
|
@@ -84,6 +100,20 @@ export type VerifyResult = {
|
|
|
84
100
|
ok: false;
|
|
85
101
|
reason: "malformed" | "expired" | "forged";
|
|
86
102
|
};
|
|
103
|
+
/**
|
|
104
|
+
* A key for one purpose, derived from the app secret with HKDF-SHA256.
|
|
105
|
+
*
|
|
106
|
+
* `SECRET` is also what CSRF tokens and sessions are keyed with. Using it as
|
|
107
|
+
* the HMAC key here would make every one of those a potential oracle for the
|
|
108
|
+
* others; HKDF with a purpose label gives each its own independent key, so a
|
|
109
|
+
* weakness or leak in one use cannot be turned against another — including
|
|
110
|
+
* the two token kinds in this file against each other.
|
|
111
|
+
*
|
|
112
|
+
* Memoized per (purpose, secret): verification is on the request path and the
|
|
113
|
+
* derivation is pure. The map is bounded by the number of purposes times the
|
|
114
|
+
* secrets a process ever sees, which is one outside of tests.
|
|
115
|
+
*/
|
|
116
|
+
export declare function purposeKey(purpose: string, override?: string): Buffer;
|
|
87
117
|
/**
|
|
88
118
|
* Serializes a value so that the same value always produces the same string.
|
|
89
119
|
*
|
|
@@ -95,7 +125,7 @@ export type VerifyResult = {
|
|
|
95
125
|
* keep their order because in an array order *is* the value.
|
|
96
126
|
*/
|
|
97
127
|
export declare function canonicalize(value: unknown): string;
|
|
98
|
-
/** `
|
|
128
|
+
/** `agt2.<runId>.<nonce>.<expiry>.<mac>`, all base64url or base36. */
|
|
99
129
|
export declare function signPendingCall(claims: PendingCallClaims, options?: SignOptions): string;
|
|
100
130
|
/**
|
|
101
131
|
* The metadata a signature carries in the clear.
|
|
@@ -158,6 +188,9 @@ export type NestedRunClaims = {
|
|
|
158
188
|
* pending call makes: the input executed is the input signed.
|
|
159
189
|
*/
|
|
160
190
|
input: unknown;
|
|
191
|
+
/** The run's owner, as on `PendingCallClaims.subject`: a record parked for
|
|
192
|
+
* one principal does not re-enter a tool for another. */
|
|
193
|
+
subject?: string | null;
|
|
161
194
|
};
|
|
162
195
|
/**
|
|
163
196
|
* Same shape as a pending call's token, so the same reader serves both — nonce
|
package/dist/ai/signing.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signing.d.ts","sourceRoot":"","sources":["../../ai/signing.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEpE
|
|
1
|
+
{"version":3,"file":"signing.d.ts","sourceRoot":"","sources":["../../ai/signing.ts"],"names":[],"mappings":"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"}
|
package/dist/app/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{xa as a}from"../chunk-
|
|
2
|
+
import{xa as a}from"../chunk-j0fgc58k.js";import"../chunk-7r78cdyd.js";import"../chunk-t93t317r.js";export{a as App};
|
|
3
3
|
|
|
4
4
|
//# debugId=1DF7F2A4406AF3BE64756E2164756E21
|
|
@@ -2,10 +2,14 @@ import { Controller } from "../http/Controller";
|
|
|
2
2
|
import { HttpRequest } from "../http/HttpRequest";
|
|
3
3
|
import type { User } from "./types";
|
|
4
4
|
/**
|
|
5
|
-
* The
|
|
6
|
-
*
|
|
5
|
+
* The longest code the PIN routes accept. A code is six digits by default,
|
|
6
|
+
* `emailCode.length` digits on `/auth/email-code`, or whatever non-empty
|
|
7
|
+
* string `generateCode` returns, so the format is not checked here; the code
|
|
8
|
+
* is compared as a keyed hash, never handed to a query.
|
|
7
9
|
*/
|
|
8
|
-
export declare const
|
|
10
|
+
export declare const MAX_PIN_LENGTH = 256;
|
|
11
|
+
/** A typed PIN, or `null` for what is not a non-empty string within `MAX_PIN_LENGTH`. */
|
|
12
|
+
export declare function pinValue(value: unknown): string | null;
|
|
9
13
|
declare class SignInRequest extends HttpRequest<{
|
|
10
14
|
email: string;
|
|
11
15
|
password: string;
|
|
@@ -56,6 +60,13 @@ export declare class AuthController extends Controller {
|
|
|
56
60
|
session: import("./types").SessionWithUser;
|
|
57
61
|
error?: undefined;
|
|
58
62
|
}>;
|
|
63
|
+
/**
|
|
64
|
+
* The checks both PIN routes share: the verify rate limits, then the code.
|
|
65
|
+
* Every refusal is the `ValidationError` on `pin` these routes have always
|
|
66
|
+
* answered a wrong PIN with, so a client built before #708 shows it where it
|
|
67
|
+
* showed "Invalid pin"; a rate limit is the middleware's 429.
|
|
68
|
+
*/
|
|
69
|
+
private verifyPinRequest;
|
|
59
70
|
signInWithPinV2(req?: HttpRequest<{
|
|
60
71
|
email: string;
|
|
61
72
|
pin: string;
|
|
@@ -126,6 +137,37 @@ export declare class AuthController extends Controller {
|
|
|
126
137
|
}, Record<string, never>>): Promise<{
|
|
127
138
|
email: string;
|
|
128
139
|
}>;
|
|
140
|
+
/**
|
|
141
|
+
* `POST /auth/email-code` `{ email }`: sends a one-time code (#708).
|
|
142
|
+
*
|
|
143
|
+
* Always `{ ok: true }`, whether or not the address has a user and whether
|
|
144
|
+
* or not one would be created, so the answer says nothing about accounts.
|
|
145
|
+
* An address that gets no code (unknown, with `createUser` off) is sent
|
|
146
|
+
* nothing and answered the same.
|
|
147
|
+
*/
|
|
148
|
+
requestEmailCode(req?: HttpRequest<{
|
|
149
|
+
email: string;
|
|
150
|
+
}, Record<string, never>>): Promise<{
|
|
151
|
+
ok: true;
|
|
152
|
+
}>;
|
|
153
|
+
/**
|
|
154
|
+
* `POST /auth/email-code/verify` `{ email, code, name? }`: signs in with a
|
|
155
|
+
* code from `/auth/email-code`, creating the user first when there is none
|
|
156
|
+
* and `createUser` is on. Answers `{ session, isNewUser }` and sets the
|
|
157
|
+
* `access_token` cookie.
|
|
158
|
+
*
|
|
159
|
+
* A wrong, expired or missing code is a `ValidationError` on `code`
|
|
160
|
+
* (`invalid_code`); the guess past `maxAttempts` burns the code and is
|
|
161
|
+
* `too_many_attempts`.
|
|
162
|
+
*/
|
|
163
|
+
verifyEmailCode(req?: HttpRequest<{
|
|
164
|
+
email: string;
|
|
165
|
+
code: string;
|
|
166
|
+
name?: string;
|
|
167
|
+
}, Record<string, never>>): Promise<{
|
|
168
|
+
session: import("./types").SessionWithUser;
|
|
169
|
+
isNewUser: boolean;
|
|
170
|
+
}>;
|
|
129
171
|
}
|
|
130
172
|
export {};
|
|
131
173
|
//# sourceMappingURL=AuthController.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthController.d.ts","sourceRoot":"","sources":["../../auth/AuthController.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"AuthController.d.ts","sourceRoot":"","sources":["../../auth/AuthController.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AASlD,OAAO,KAAK,EAAc,IAAI,EAAE,MAAM,SAAS,CAAC;AAuFhD;;;;;GAKG;AACH,eAAO,MAAM,cAAc,MAAM,CAAC;AAElC,yFAAyF;AACzF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAItD;AAKD,cAAM,aAAc,SAAQ,WAAW,CACrC;IACE,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB,EACD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CACvB;IACC,MAAM;;;;;;;;;MASJ;CACH;AAED,cAAM,qBAAsB,SAAQ,WAAW,CAC7C;IACE,KAAK,EAAE,MAAM,CAAC;CACf,EACD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CACvB;IACC,MAAM;;;;;MAKJ;CACH;AAED,cAAM,oBAAqB,SAAQ,WAAW,CAC5C;IACE,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,EACD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CACvB;IACC,MAAM;;;;;MAKJ;CACH;AAED,qBAAa,cAAe,SAAQ,UAAU;IACtC,EAAE;IAUF,WAAW,CAAC,GAAG;eAA4B,MAAM;6BAAK;;;IAsBtD,mBAAmB,CAAC,GAAG,4DAAoB;;;;;;;IAwCjD;;;;;OAKG;YACW,gBAAgB;IA0BxB,eAAe,CACnB,GAAG;eAA4B,MAAM;aAAO,MAAM;6BAAK;IAqBnD,aAAa,CAAC,GAAG;eAA4B,MAAM;aAAO,MAAM;6BAAK;;;IAoBrE,QAAQ,CAAC,GAAG,gBAAsB;;;;;;;;;;IA+ClC,MAAM,CAAC,GAAG,gBAAsB;;;;;;;;;;IA+ChC,MAAM;IAyGN,OAAO,CAAC,GAAG,4DAAoB;IA8C/B,cAAc,CAAC,GAAG,wBAA8B;IAiChD,aAAa,CAAC,GAAG,uBAA6B;IAuD9C,cAAc,CAClB,GAAG;qBAAkC,MAAM;qBAAe,MAAM;6BAAK;IAuCjE,aAAa,CAAC,GAAG,4DAAoB;;;IA+BrC,aAAa,CAAC,GAAG,4DAAoB;;;;;;;IAoI3C;;;;;OAKG;cACa,gBAAgB,CAAC,IAAI,EAAE;QACrC,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAA;KAAE,GAAG,IAAI,CAAC;IAwFzD,oBAAoB,CAAC,GAAG;eAA4B,MAAM;6BAAK;;;IA0BrE;;;;;;;OAOG;IACG,gBAAgB,CAAC,GAAG;eAA4B,MAAM;6BAAK;;;IAuBjE;;;;;;;;;OASG;IACG,eAAe,CACnB,GAAG;eAA4B,MAAM;cAAQ,MAAM;eAAS,MAAM;6BAAK;;;;CAiF1E"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { HttpRequest } from "../http";
|
|
2
|
-
import type { SessionWithUser } from "./types";
|
|
2
|
+
import type { MagicLinkTokenRow, SessionWithUser } from "./types";
|
|
3
3
|
import { type AuthConfig } from "./config";
|
|
4
4
|
import { UserProvider } from "./UserProvider";
|
|
5
5
|
import type { CreateCookieOptions } from "../http/requestContext";
|
|
@@ -165,6 +165,14 @@ export declare class AuthManager {
|
|
|
165
165
|
email: string;
|
|
166
166
|
id?: number;
|
|
167
167
|
}): Promise<SessionWithUser>;
|
|
168
|
+
/**
|
|
169
|
+
* Issues a magic link and PIN for an existing user, as `/auth/magic-link`
|
|
170
|
+
* and `Auth.createMagicLink` always have, and returns them as issued for the
|
|
171
|
+
* app to mail. An address with no user gets `{}` and nothing is written.
|
|
172
|
+
*
|
|
173
|
+
* Since 0.88 the stored row holds hashes of both (#708); the plain values
|
|
174
|
+
* exist only in what this returns.
|
|
175
|
+
*/
|
|
168
176
|
createMagicLinkToken(email: string): Promise<{
|
|
169
177
|
user: import("./types").User;
|
|
170
178
|
email: string;
|
|
@@ -176,5 +184,38 @@ export declare class AuthManager {
|
|
|
176
184
|
pin?: undefined;
|
|
177
185
|
token?: undefined;
|
|
178
186
|
}>;
|
|
187
|
+
/**
|
|
188
|
+
* Replaces any outstanding code for `email` with a new one and stores it
|
|
189
|
+
* hashed. Writes whether or not a user has the address; callers decide that.
|
|
190
|
+
*/
|
|
191
|
+
issueOneTimeCode(email: string, length: number): Promise<{
|
|
192
|
+
email: string;
|
|
193
|
+
pin: string;
|
|
194
|
+
token: string;
|
|
195
|
+
}>;
|
|
196
|
+
/**
|
|
197
|
+
* Checks a typed code against the outstanding row for `email`, and on a
|
|
198
|
+
* match deletes the row, so the code works once. Every guess counts against
|
|
199
|
+
* `emailCode.maxAttempts`, the right one included, before the comparison;
|
|
200
|
+
* the guess past the limit deletes the row. The comparison is of keyed
|
|
201
|
+
* hashes, in constant time.
|
|
202
|
+
*
|
|
203
|
+
* `claim: false` leaves the row for the caller to claim (with
|
|
204
|
+
* `userProvider.claimMagicLinkToken`) inside a transaction of its own.
|
|
205
|
+
*/
|
|
206
|
+
verifyOneTimeCode(email: string, code: unknown, options?: {
|
|
207
|
+
claim?: boolean;
|
|
208
|
+
}): Promise<{
|
|
209
|
+
status: "ok";
|
|
210
|
+
row: MagicLinkTokenRow;
|
|
211
|
+
} | {
|
|
212
|
+
status: "invalid" | "expired" | "too_many_attempts";
|
|
213
|
+
}>;
|
|
214
|
+
/**
|
|
215
|
+
* The link counterpart of `verifyOneTimeCode`, for
|
|
216
|
+
* `/auth/sign-in/magic-link`: valid for `emailCode.linkExpiresInMinutes`,
|
|
217
|
+
* single use. Not attempt-counted: a 256-bit token is not guessed.
|
|
218
|
+
*/
|
|
219
|
+
verifyMagicLinkToken(email: string, token: unknown): Promise<boolean>;
|
|
179
220
|
}
|
|
180
221
|
//# sourceMappingURL=AuthManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthManager.d.ts","sourceRoot":"","sources":["../../auth/AuthManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AuthManager.d.ts","sourceRoot":"","sources":["../../auth/AuthManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAItC,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAOlE,OAAO,EAGL,KAAK,UAAU,EAEhB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAgClE,qBAAa,WAAW;IACtB,MAAM,CAAC,KAAK,SAAU;IAEtB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;IAKtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAE7C;;;;;;;;;;;;;;OAcG;gBAED,MAAM,GAAE,UAAe,EACvB,QAAQ,GAAE,YAAY,CAAC,GAAG,CAAsB;IAWlD;;;OAGG;IACH,IAAI,YAAY,IAAI,YAAY,CAE/B;IAED,+EAA+E;IAC/E,wBAAwB,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,GAAG,mBAAmB;IAcxF;;;;;;;;OAQG;IACH,OAAO,CAAC,YAAY;IAKpB,4EAA4E;IAC5E,YAAY,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,MAAM,GAAG,SAAS;IAgB5D;;;;;;;;;;;;;;;;;;;;OAoBG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAiCjD;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;YACW,oBAAoB;IAiElC;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACG,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM;IA0BvE,8EAA8E;IAC9E,OAAO,CAAC,qBAAqB;IAK7B;;;;;;;;;;OAUG;YACW,YAAY;IA4B1B,OAAO,CAAC,aAAa;IASf,iBAAiB,CAAC,KAAK,EAAE,MAAM;IAE/B,aAAa,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAI1D,YAAY,CAAC,KAAK,EAAE,MAAM;IA0B1B,uBAAuB,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE;IAalE;;;;;;;;;;;;;;;;;;OAkBG;IACG,qBAAqB,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE;IA4BhE;;;;;;;OAOG;IACG,oBAAoB,CAAC,KAAK,EAAE,MAAM;;;;;;;;;;;IAgBxC;;;OAGG;IACG,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;;;IAgBpD;;;;;;;;;OASG;IACG,iBAAiB,CACrB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,OAAO,EACb,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO,GAChC,OAAO,CACN;QAAE,MAAM,EAAE,IAAI,CAAC;QAAC,GAAG,EAAE,iBAAiB,CAAA;KAAE,GACxC;QAAE,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,mBAAmB,CAAA;KAAE,CAC1D;IAgCD;;;;OAIG;IACG,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;CAY5E"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Account, AuthModels, CreateAccountArgs, CreateMagicLinkTokenArgs, CreatePasswordResetTokenArgs, CreateSessionArgs, CreateSocialAccountArgs, CreateUserArgs, DeletePasswordResetTokenArgs, DeleteSessionArgs, FindPasswordResetTokenArgs, FindSessionArgs, Invitation, PasswordResetToken, SessionWithUser, SocialAccount, UpdateSessionArgs, UpdateUserPasswordArgs, User } from "./types";
|
|
1
|
+
import type { Account, AuthModels, CreateAccountArgs, CreateMagicLinkTokenArgs, MagicLinkTokenRow, CreatePasswordResetTokenArgs, CreateSessionArgs, CreateSocialAccountArgs, CreateUserArgs, DeletePasswordResetTokenArgs, DeleteSessionArgs, FindPasswordResetTokenArgs, FindSessionArgs, Invitation, PasswordResetToken, SessionWithUser, SocialAccount, UpdateSessionArgs, UpdateUserPasswordArgs, User } from "./types";
|
|
2
2
|
/**
|
|
3
3
|
* The `select` all three session queries — `findSession`, `updateSession` and
|
|
4
4
|
* `createSessionV2` — run with, unless a provider's `sessionSelect()` returns
|
|
@@ -208,11 +208,28 @@ export declare class UserProvider<TSession = SessionWithUser> {
|
|
|
208
208
|
token: string;
|
|
209
209
|
pin: string;
|
|
210
210
|
}>;
|
|
211
|
+
/**
|
|
212
|
+
* @deprecated Looks the row up by the value as given, and since 0.88 the
|
|
213
|
+
* columns hold hashes (#708), so a code or token as issued no longer finds
|
|
214
|
+
* its row. gemi's routes do not call this; use `findMagicLinkTokenByEmail`.
|
|
215
|
+
*/
|
|
211
216
|
findUserMagicLinkToken(args: {
|
|
212
217
|
token?: string;
|
|
213
218
|
pin?: string;
|
|
214
219
|
email: string;
|
|
215
220
|
}): Promise<User | null>;
|
|
221
|
+
/**
|
|
222
|
+
* The newest one-time-code row for `email`, or null. `AuthManager` compares
|
|
223
|
+
* the hashes itself, in constant time, rather than asking the database for a
|
|
224
|
+
* row matching the code (#708).
|
|
225
|
+
*/
|
|
226
|
+
findMagicLinkTokenByEmail(email: string): Promise<MagicLinkTokenRow | null>;
|
|
227
|
+
/**
|
|
228
|
+
* Deletes row `id` and reports whether this call is the one that deleted it.
|
|
229
|
+
* Two requests verifying the same code at once both match it; only the one
|
|
230
|
+
* that gets `true` here may sign in.
|
|
231
|
+
*/
|
|
232
|
+
claimMagicLinkToken(id: number): Promise<boolean>;
|
|
216
233
|
deleteMagicLinkToken(email: string): Promise<void>;
|
|
217
234
|
createSocialAccount(args: CreateSocialAccountArgs): Promise<any>;
|
|
218
235
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserProvider.d.ts","sourceRoot":"","sources":["../../auth/UserProvider.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"UserProvider.d.ts","sourceRoot":"","sources":["../../auth/UserProvider.ts"],"names":[],"mappings":"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"}
|
package/dist/auth/config.d.ts
CHANGED
|
@@ -1,6 +1,90 @@
|
|
|
1
1
|
import type { HttpRequest } from "../http/HttpRequest";
|
|
2
2
|
import type { SessionWithUser, User } from "./types";
|
|
3
3
|
import type { OAuthProvider } from "./oauth/OAuthProvider";
|
|
4
|
+
import type { CodeRateLimits } from "./oneTimeCode";
|
|
5
|
+
/** What `emailCode.send` is handed. */
|
|
6
|
+
export interface EmailCodeSendArgs {
|
|
7
|
+
/** Normalized: trimmed and lowercased. */
|
|
8
|
+
email: string;
|
|
9
|
+
/** The one-time code, as typed. Never stored like this. */
|
|
10
|
+
code: string;
|
|
11
|
+
/**
|
|
12
|
+
* A one-time link token for the same row, for an email that offers a link
|
|
13
|
+
* as well as a code (`/auth/sign-in/magic-link?email=&token=`).
|
|
14
|
+
*/
|
|
15
|
+
token: string;
|
|
16
|
+
/** No user has this address yet; verifying the code will create one. */
|
|
17
|
+
isNewUser: boolean;
|
|
18
|
+
req: HttpRequest<any, any>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* One-time email codes (#708). The security settings here (`expiresInMinutes`,
|
|
22
|
+
* `maxAttempts`, `requestLimit`, `verifyLimit`, `linkExpiresInMinutes`) apply
|
|
23
|
+
* to the older `/auth/magic-link` + `/auth/sign-in-with-pin(-v2)` pair too,
|
|
24
|
+
* whether or not `enabled` is on. `enabled`, `createUser`, `length` and `send`
|
|
25
|
+
* are for `POST /auth/email-code` and `/auth/email-code/verify` only.
|
|
26
|
+
*/
|
|
27
|
+
export interface EmailCodeConfig {
|
|
28
|
+
/** Serves `/auth/email-code` and `/auth/email-code/verify`. Default `false`: both answer 404. */
|
|
29
|
+
enabled?: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Sign-up-or-sign-in: an address with no user gets a code too, and verifying
|
|
32
|
+
* it creates the user (verified, inside the same transaction as
|
|
33
|
+
* `onUserCreated`). Default `false`: an unknown address is sent nothing, and
|
|
34
|
+
* the request answers exactly as it would for a known one.
|
|
35
|
+
*/
|
|
36
|
+
createUser?: boolean;
|
|
37
|
+
/** Digits in a code from `/auth/email-code`. Default 6. `/auth/magic-link` PINs stay 6. */
|
|
38
|
+
length?: number;
|
|
39
|
+
/** How long a code (PIN) can be used. Default 10. */
|
|
40
|
+
expiresInMinutes?: number;
|
|
41
|
+
/**
|
|
42
|
+
* How long the link token issued with the code can be used, on
|
|
43
|
+
* `/auth/sign-in/magic-link`. Default 7 days. A link carries 256 random
|
|
44
|
+
* bits, so it is not guessable the way a code is; this bounds how long an
|
|
45
|
+
* old email stays a key.
|
|
46
|
+
*/
|
|
47
|
+
linkExpiresInMinutes?: number;
|
|
48
|
+
/** Wrong guesses one code survives; the next one burns it. Default 5. */
|
|
49
|
+
maxAttempts?: number;
|
|
50
|
+
/**
|
|
51
|
+
* Requests for a code (`/auth/email-code` and `/auth/magic-link`).
|
|
52
|
+
* Default `{ perEmail: [5, 900], perIp: [20, 900] }`. Over it: 429
|
|
53
|
+
* `{ error: { kind: "rate_limit" } }`.
|
|
54
|
+
*/
|
|
55
|
+
requestLimit?: CodeRateLimits;
|
|
56
|
+
/**
|
|
57
|
+
* Guesses (`/auth/email-code/verify` and `/auth/sign-in-with-pin(-v2)`).
|
|
58
|
+
* Default `{ perEmail: [10, 900], perIp: [50, 900] }`. Its `perIp` also
|
|
59
|
+
* limits `/auth/sign-in/magic-link`, on a counter of its own; the link spends
|
|
60
|
+
* no per-address budget, since a 256-bit token is not guessed.
|
|
61
|
+
*/
|
|
62
|
+
verifyLimit?: CodeRateLimits;
|
|
63
|
+
/**
|
|
64
|
+
* `/auth/magic-link` answers `{ email: null }` for an address with no user,
|
|
65
|
+
* which tells anyone asking whether it has an account. Clients built against
|
|
66
|
+
* that (they treat `null` as "no account") keep working while this is
|
|
67
|
+
* `false`, the default. `true` answers `{ email }` for every address.
|
|
68
|
+
* `/auth/email-code` never reveals it.
|
|
69
|
+
*/
|
|
70
|
+
uniformMagicLinkResponse?: boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Delivers a code from `/auth/email-code`. Awaited before the request
|
|
73
|
+
* answers, so for an answer that takes the same time whether or not an
|
|
74
|
+
* address gets a code, enqueue the mail here rather than sending it inline.
|
|
75
|
+
* Unset, the code is logged outside production and dropped in it.
|
|
76
|
+
*/
|
|
77
|
+
send?: (args: EmailCodeSendArgs) => Promise<void> | void;
|
|
78
|
+
}
|
|
79
|
+
/** What `onAuthenticated` is handed. */
|
|
80
|
+
export interface AuthenticatedArgs {
|
|
81
|
+
user: User;
|
|
82
|
+
session: any;
|
|
83
|
+
/** The user was created by this sign-in (email code, or a first OAuth sign-in). */
|
|
84
|
+
isNewUser: boolean;
|
|
85
|
+
method: "password" | "email-code" | "magic-link" | "oauth";
|
|
86
|
+
req: HttpRequest<any, any>;
|
|
87
|
+
}
|
|
4
88
|
/**
|
|
5
89
|
* Decides whether a pre-0.64 session is converted to a `v2.` one. See
|
|
6
90
|
* `AuthConfig.migrateLegacySession`.
|
|
@@ -137,7 +221,32 @@ export interface AuthConfig {
|
|
|
137
221
|
token: string;
|
|
138
222
|
pin: string;
|
|
139
223
|
}) => Promise<void> | void;
|
|
224
|
+
/** One-time email codes, and the limits on the magic-link PIN routes. See `EmailCodeConfig`. */
|
|
225
|
+
emailCode?: EmailCodeConfig;
|
|
226
|
+
/**
|
|
227
|
+
* The code to issue for `email`, on `/auth/magic-link`, `Auth.createMagicLink`
|
|
228
|
+
* and `/auth/email-code`. Return nothing for the default, random digits.
|
|
229
|
+
*
|
|
230
|
+
* For fixed test accounts, instead of rewriting the stored `pin` after the
|
|
231
|
+
* fact (the column holds a hash now, so such a rewrite no longer matches):
|
|
232
|
+
*
|
|
233
|
+
* generateCode: (email) =>
|
|
234
|
+
* process.env.APP_ENV !== "production" && email.endsWith("+e2e@example.com")
|
|
235
|
+
* ? "000000"
|
|
236
|
+
* : undefined,
|
|
237
|
+
*/
|
|
238
|
+
generateCode?: (email: string) => string | null | undefined | Promise<string | null | undefined>;
|
|
239
|
+
/**
|
|
240
|
+
* Fires after every sign-in that sets a session: password, PIN or link,
|
|
241
|
+
* email code, OAuth. Unlike `onSignIn` it has the request, so it can read a
|
|
242
|
+
* cookie or header the app set before sign-in (an anonymous owner id, say)
|
|
243
|
+
* and claim that work for `user`, and it says whether the user is new.
|
|
244
|
+
* Fires after the session is committed; a throw fails the response but not
|
|
245
|
+
* the sign-in.
|
|
246
|
+
*/
|
|
247
|
+
onAuthenticated?: (args: AuthenticatedArgs) => Promise<void> | void;
|
|
140
248
|
}
|
|
249
|
+
export declare function emailCodeDefaults(config?: EmailCodeConfig): Required<EmailCodeConfig>;
|
|
141
250
|
/**
|
|
142
251
|
* The default `verifyPassword`: `false` for anything that is not a hash it can
|
|
143
252
|
* check, rather than an exception.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../auth/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../auth/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import type { HttpRequest } from "../http/HttpRequest";
|
|
2
|
+
import { RateLimiter } from "../services/rate-limiter/RateLimiter";
|
|
3
|
+
/**
|
|
4
|
+
* The one-time secrets behind `/auth/magic-link`, `/auth/sign-in-with-pin(-v2)`,
|
|
5
|
+
* `/auth/sign-in/magic-link` and `/auth/email-code(/verify)` (#708).
|
|
6
|
+
*
|
|
7
|
+
* All of them live in the `MagicLinkToken` table, one row per email: a 256-bit
|
|
8
|
+
* link `token` and a short numeric `pin`. Neither is stored as issued. Both
|
|
9
|
+
* columns hold `h1.` + HMAC-SHA256 under the app's `SECRET`, keyed to the email
|
|
10
|
+
* and to which of the two it is, so a database read alone gives an attacker
|
|
11
|
+
* nothing to type: a 6-digit code is a million candidates, trivial to search
|
|
12
|
+
* against a bare SHA-256, and a keyed hash takes that away.
|
|
13
|
+
*
|
|
14
|
+
* Verification reads the row by email and compares hashes with
|
|
15
|
+
* `timingSafeEqual`, instead of asking the database for a row matching
|
|
16
|
+
* `(pin, email)`. The schema is unchanged: the hash fits the existing `String`
|
|
17
|
+
* columns, the `@@unique`s stay satisfied, and `createdAt` dates the row for
|
|
18
|
+
* the expiry. The attempt count is kept in the rate limiter, keyed by the row,
|
|
19
|
+
* so no column is needed for it either.
|
|
20
|
+
*/
|
|
21
|
+
/** The prefix a hashed column value carries. A value without it was written before 0.88. */
|
|
22
|
+
export declare const ONE_TIME_HASH_PREFIX = "h1.";
|
|
23
|
+
export type OneTimeSecretKind = "pin" | "link";
|
|
24
|
+
export declare function hashOneTimeSecret(kind: OneTimeSecretKind, email: string, value: string): string;
|
|
25
|
+
/**
|
|
26
|
+
* Whether `candidate` is what `stored` was issued as, in time that depends on
|
|
27
|
+
* neither.
|
|
28
|
+
*
|
|
29
|
+
* A row written before hashing (a plain PIN or token, at most one expiry old
|
|
30
|
+
* after the upgrade) is compared as it is, still in constant time, so a code
|
|
31
|
+
* mailed moments before a deploy keeps working until it expires.
|
|
32
|
+
*/
|
|
33
|
+
export declare function oneTimeSecretMatches(kind: OneTimeSecretKind, email: string, stored: string | null | undefined, candidate: unknown): boolean;
|
|
34
|
+
/** `length` random decimal digits, each drawn without modulo bias. */
|
|
35
|
+
export declare function randomDigits(length: number): string;
|
|
36
|
+
/**
|
|
37
|
+
* The longest address any of these routes accepts: 64 for the local part, 1
|
|
38
|
+
* for the `@`, 255 for the domain. Past it a value is refused before it becomes
|
|
39
|
+
* a rate-limit key or a database lookup; the request body can be megabytes, and
|
|
40
|
+
* a limiter keeps a key for every request it counted, refused or not.
|
|
41
|
+
*/
|
|
42
|
+
export declare const MAX_EMAIL_LENGTH = 320;
|
|
43
|
+
/**
|
|
44
|
+
* What the magic-link and PIN routes have always done to an address: trim and
|
|
45
|
+
* lowercase, nothing more, so an account they could reach before (an address
|
|
46
|
+
* without a TLD, a synthetic identifier) is still reachable. `null` for what is
|
|
47
|
+
* not a non-empty string, which used to be a 500, and for anything longer than
|
|
48
|
+
* `MAX_EMAIL_LENGTH`.
|
|
49
|
+
*/
|
|
50
|
+
export declare function foldEmail(value: unknown): string | null;
|
|
51
|
+
/**
|
|
52
|
+
* The stricter form `/auth/email-code` takes: folded, and shaped like an
|
|
53
|
+
* address, since it may create a user from it.
|
|
54
|
+
*/
|
|
55
|
+
export declare function normalizeEmail(value: unknown): string | null;
|
|
56
|
+
/** `[count, windowSeconds]`, or `false` to switch that limit off. */
|
|
57
|
+
export type CodeRateLimit = [count: number, windowSeconds: number] | false;
|
|
58
|
+
export interface CodeRateLimits {
|
|
59
|
+
perEmail?: CodeRateLimit;
|
|
60
|
+
perIp?: CodeRateLimit;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* The app's rate limiter, or a process-local one when none is bound (a test, a
|
|
64
|
+
* kernel without `RateLimiterServiceProvider`). Unlike `RateLimitMiddleware`,
|
|
65
|
+
* this never skips limiting for want of a service: the attempt cap is what
|
|
66
|
+
* keeps a 6-digit code from being guessed, so it has to count somewhere.
|
|
67
|
+
*/
|
|
68
|
+
export declare function codeLimiter(): RateLimiter;
|
|
69
|
+
/** Drops the process-local limiter's counters. For tests. */
|
|
70
|
+
export declare function resetFallbackCodeLimiter(): void;
|
|
71
|
+
/**
|
|
72
|
+
* A limiter key part as it is when short, else its SHA-256. The parts come
|
|
73
|
+
* from the client (an address, an `x-forwarded-for`), and a key is held for
|
|
74
|
+
* the whole window, so none may cost more than a hash's worth of memory.
|
|
75
|
+
*/
|
|
76
|
+
export declare function limiterKeyPart(value: string): string;
|
|
77
|
+
/**
|
|
78
|
+
* Spends one hit of each configured limit for `scope`, per IP first and then
|
|
79
|
+
* per email, and throws the middleware's 429 (`{ error: { kind: "rate_limit" } }`)
|
|
80
|
+
* on the first one that is spent. An IP over its limit does not also spend the
|
|
81
|
+
* address's budget, so somebody hammering from one address cannot use up a
|
|
82
|
+
* victim's.
|
|
83
|
+
*
|
|
84
|
+
* `email: null` spends the IP budget only: a request whose address was refused
|
|
85
|
+
* (missing, malformed, over `MAX_EMAIL_LENGTH`) still counts against its IP,
|
|
86
|
+
* but never makes a per-address key.
|
|
87
|
+
*/
|
|
88
|
+
export declare function enforceCodeRateLimits(scope: "request" | "verify" | "link", email: string | null, req: HttpRequest<any, any>, limits: CodeRateLimits): Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* Counts one guess at the code in row `rowId` and reports whether it is within
|
|
91
|
+
* `maxAttempts`. The key names the row, so a newly issued code starts at zero.
|
|
92
|
+
*
|
|
93
|
+
* The limiter is a sliding window, which lets a count decay. The window is at
|
|
94
|
+
* least a day and at least `(maxAttempts + 1)` code lifetimes, so over the
|
|
95
|
+
* time a code can still be used the count decays by less than one guess and
|
|
96
|
+
* the cap holds for any `expiresInMinutes` (#708).
|
|
97
|
+
*/
|
|
98
|
+
export declare function countCodeAttempt(rowId: number | string, issuedAt: number, maxAttempts: number, expiresInMinutes?: number): Promise<boolean>;
|
|
99
|
+
//# sourceMappingURL=oneTimeCode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oneTimeCode.d.ts","sourceRoot":"","sources":["../../auth/oneTimeCode.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAGnE;;;;;;;;;;;;;;;;;GAiBG;AAEH,4FAA4F;AAC5F,eAAO,MAAM,oBAAoB,QAAQ,CAAC;AAE1C,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,MAAM,CAAC;AAE/C,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAK/F;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,iBAAiB,EACvB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACjC,SAAS,EAAE,OAAO,GACjB,OAAO,CAeT;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMnD;AAED;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAQvD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAY5D;AAED,qEAAqE;AACrE,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC;AAE3E,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAID;;;;;GAKG;AACH,wBAAgB,WAAW,IAAI,WAAW,CAazC;AAED,6DAA6D;AAC7D,wBAAgB,wBAAwB,SAEvC;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,EACpC,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,EAC1B,MAAM,EAAE,cAAc,iBAiBvB;AAED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,GAAG,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,gBAAgB,SAAK,GACpB,OAAO,CAAC,OAAO,CAAC,CAOlB"}
|
package/dist/auth/routes.d.ts
CHANGED
|
@@ -91,6 +91,19 @@ export declare class AuthApiRouter extends ApiRouter {
|
|
|
91
91
|
email: string;
|
|
92
92
|
pin: string;
|
|
93
93
|
}, Promise<import("./types").SessionWithUser>, Record<string, never>>;
|
|
94
|
+
"/email-code": import("../http/ApiRouter").RouteHandler<"POST", {
|
|
95
|
+
email: string;
|
|
96
|
+
}, Promise<{
|
|
97
|
+
ok: true;
|
|
98
|
+
}>, Record<string, never>>;
|
|
99
|
+
"/email-code/verify": import("../http/ApiRouter").RouteHandler<"POST", {
|
|
100
|
+
email: string;
|
|
101
|
+
code: string;
|
|
102
|
+
name?: string;
|
|
103
|
+
}, Promise<{
|
|
104
|
+
session: import("./types").SessionWithUser;
|
|
105
|
+
isNewUser: boolean;
|
|
106
|
+
}>, Record<string, never>>;
|
|
94
107
|
};
|
|
95
108
|
}
|
|
96
109
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../auth/routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,cAAM,eAAgB,SAAQ,UAAU;IACtC,WAAW,WAAqB;IAChC,MAAM;;;;;;;;;;;MAMJ;CACH;AAED,qBAAa,cAAe,SAAQ,UAAU;IAC5C,WAAW,WAAqB;IAChC,MAAM;;;;;;;;;MAMJ;CACH;AAED,qBAAa,aAAc,SAAQ,SAAS;IAC1C,WAAW,WAAqB;IAChC,MAAM
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../auth/routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,cAAM,eAAgB,SAAQ,UAAU;IACtC,WAAW,WAAqB;IAChC,MAAM;;;;;;;;;;;MAMJ;CACH;AAED,qBAAa,cAAe,SAAQ,UAAU;IAC5C,WAAW,WAAqB;IAChC,MAAM;;;;;;;;;MAMJ;CACH;AAED,qBAAa,aAAc,SAAQ,SAAS;IAC1C,WAAW,WAAqB;IAChC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAiBJ;CACH"}
|
package/dist/auth/types.d.ts
CHANGED
|
@@ -136,4 +136,12 @@ export interface CreateMagicLinkTokenArgs {
|
|
|
136
136
|
token: string;
|
|
137
137
|
pin: string;
|
|
138
138
|
}
|
|
139
|
+
/** A `MagicLinkToken` row. `token` and `pin` hold hashes (see `auth/oneTimeCode.ts`). */
|
|
140
|
+
export interface MagicLinkTokenRow {
|
|
141
|
+
id: number;
|
|
142
|
+
email: string;
|
|
143
|
+
token: string;
|
|
144
|
+
pin: string;
|
|
145
|
+
createdAt: Date;
|
|
146
|
+
}
|
|
139
147
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/auth/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../auth/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../auth/types.ts"],"names":[],"mappings":"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"}
|