gemi 0.87.0 → 0.88.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/dist/ai/index.js +2 -2
  2. package/dist/ai/index.js.map +1 -1
  3. package/dist/app/index.js +1 -1
  4. package/dist/auth/AuthController.d.ts +45 -3
  5. package/dist/auth/AuthController.d.ts.map +1 -1
  6. package/dist/auth/AuthManager.d.ts +42 -1
  7. package/dist/auth/AuthManager.d.ts.map +1 -1
  8. package/dist/auth/UserProvider.d.ts +18 -1
  9. package/dist/auth/UserProvider.d.ts.map +1 -1
  10. package/dist/auth/config.d.ts +109 -0
  11. package/dist/auth/config.d.ts.map +1 -1
  12. package/dist/auth/oneTimeCode.d.ts +99 -0
  13. package/dist/auth/oneTimeCode.d.ts.map +1 -0
  14. package/dist/auth/routes.d.ts +13 -0
  15. package/dist/auth/routes.d.ts.map +1 -1
  16. package/dist/auth/types.d.ts +8 -0
  17. package/dist/auth/types.d.ts.map +1 -1
  18. package/dist/bin/gemi.js +198 -39
  19. package/dist/bin/gemi.js.map +5 -4
  20. package/dist/bun/plugin.js +1 -1
  21. package/dist/bun/preload.js +1 -1
  22. package/dist/{chunk-3epp751c.js → chunk-0808z3mq.js} +2 -2
  23. package/dist/{chunk-3epp751c.js.map → chunk-0808z3mq.js.map} +1 -1
  24. package/dist/{chunk-q9g7g995.js → chunk-0efykzjy.js} +3 -3
  25. package/dist/{chunk-q9g7g995.js.map → chunk-0efykzjy.js.map} +1 -1
  26. package/dist/{chunk-tkhrvd30.js → chunk-16mnpn6c.js} +2 -2
  27. package/dist/{chunk-tkhrvd30.js.map → chunk-16mnpn6c.js.map} +1 -1
  28. package/dist/{chunk-r8ak7k9b.js → chunk-17nh5gfm.js} +2 -2
  29. package/dist/{chunk-r8ak7k9b.js.map → chunk-17nh5gfm.js.map} +1 -1
  30. package/dist/{chunk-m4fg0k5f.js → chunk-3ph0aj0x.js} +2 -2
  31. package/dist/{chunk-m4fg0k5f.js.map → chunk-3ph0aj0x.js.map} +1 -1
  32. package/dist/{chunk-h5mz3zdr.js → chunk-3rb5ht8v.js} +3 -3
  33. package/dist/{chunk-h5mz3zdr.js.map → chunk-3rb5ht8v.js.map} +1 -1
  34. package/dist/chunk-3w65ra1s.js +5 -0
  35. package/dist/{chunk-vme0xdf4.js.map → chunk-3w65ra1s.js.map} +1 -1
  36. package/dist/{chunk-70ha7xye.js → chunk-443dm19c.js} +2 -2
  37. package/dist/{chunk-70ha7xye.js.map → chunk-443dm19c.js.map} +1 -1
  38. package/dist/{chunk-41mz2fs2.js → chunk-49v5xq8q.js} +2 -2
  39. package/dist/{chunk-41mz2fs2.js.map → chunk-49v5xq8q.js.map} +1 -1
  40. package/dist/{chunk-hj93em1r.js → chunk-4v4v5wkh.js} +2 -2
  41. package/dist/{chunk-hj93em1r.js.map → chunk-4v4v5wkh.js.map} +1 -1
  42. package/dist/{chunk-9yd5d1ff.js → chunk-523t3bcz.js} +4 -4
  43. package/dist/{chunk-9yd5d1ff.js.map → chunk-523t3bcz.js.map} +1 -1
  44. package/dist/{chunk-xcqw162y.js → chunk-56p9a7nx.js} +3 -3
  45. package/dist/{chunk-xcqw162y.js.map → chunk-56p9a7nx.js.map} +1 -1
  46. package/dist/{chunk-4f48z676.js → chunk-61rs7kxf.js} +2 -2
  47. package/dist/{chunk-4f48z676.js.map → chunk-61rs7kxf.js.map} +1 -1
  48. package/dist/{chunk-zgy7jtcq.js → chunk-64z2zt41.js} +2 -2
  49. package/dist/{chunk-zgy7jtcq.js.map → chunk-64z2zt41.js.map} +1 -1
  50. package/dist/{chunk-2zsfntsf.js → chunk-6dyt8w27.js} +4 -4
  51. package/dist/{chunk-2zsfntsf.js.map → chunk-6dyt8w27.js.map} +1 -1
  52. package/dist/{chunk-f32t2eny.js → chunk-6rc6yec4.js} +3 -3
  53. package/dist/{chunk-f32t2eny.js.map → chunk-6rc6yec4.js.map} +1 -1
  54. package/dist/{chunk-bjd9wr4t.js → chunk-6s6fj97j.js} +2 -2
  55. package/dist/{chunk-bjd9wr4t.js.map → chunk-6s6fj97j.js.map} +1 -1
  56. package/dist/{chunk-ngqgm026.js → chunk-6tt3ynm7.js} +2 -2
  57. package/dist/{chunk-ngqgm026.js.map → chunk-6tt3ynm7.js.map} +1 -1
  58. package/dist/{chunk-brd6tb1s.js → chunk-6y62ccam.js} +3 -3
  59. package/dist/{chunk-brd6tb1s.js.map → chunk-6y62ccam.js.map} +1 -1
  60. package/dist/{chunk-f6qhsdsn.js → chunk-713fezaz.js} +2 -2
  61. package/dist/{chunk-f6qhsdsn.js.map → chunk-713fezaz.js.map} +1 -1
  62. package/dist/{chunk-27k2zsq8.js → chunk-78gs7xvn.js} +2 -2
  63. package/dist/{chunk-27k2zsq8.js.map → chunk-78gs7xvn.js.map} +1 -1
  64. package/dist/chunk-7awbkbbx.js +17 -0
  65. package/dist/{chunk-z61sdvb0.js.map → chunk-7awbkbbx.js.map} +14 -10
  66. package/dist/{chunk-4mynkrv4.js → chunk-7r78cdyd.js} +2 -2
  67. package/dist/{chunk-4mynkrv4.js.map → chunk-7r78cdyd.js.map} +1 -1
  68. package/dist/{chunk-fsad7g9c.js → chunk-8dpnghvk.js} +2 -2
  69. package/dist/{chunk-fsad7g9c.js.map → chunk-8dpnghvk.js.map} +1 -1
  70. package/dist/{chunk-mxmw42c1.js → chunk-8pesk2wm.js} +2 -2
  71. package/dist/{chunk-mxmw42c1.js.map → chunk-8pesk2wm.js.map} +1 -1
  72. package/dist/{chunk-tx51rqct.js → chunk-8r7xhy1g.js} +2 -2
  73. package/dist/{chunk-tx51rqct.js.map → chunk-8r7xhy1g.js.map} +1 -1
  74. package/dist/{chunk-c8bjqw07.js → chunk-8y08amzz.js} +2 -2
  75. package/dist/{chunk-c8bjqw07.js.map → chunk-8y08amzz.js.map} +1 -1
  76. package/dist/{chunk-ryj4wqcp.js → chunk-9c1zx81w.js} +2 -2
  77. package/dist/{chunk-ryj4wqcp.js.map → chunk-9c1zx81w.js.map} +1 -1
  78. package/dist/{chunk-3k2ykvez.js → chunk-ak3yy4za.js} +2 -2
  79. package/dist/{chunk-3k2ykvez.js.map → chunk-ak3yy4za.js.map} +1 -1
  80. package/dist/{chunk-08qvtx8v.js → chunk-bhzb8e5r.js} +2 -2
  81. package/dist/{chunk-08qvtx8v.js.map → chunk-bhzb8e5r.js.map} +1 -1
  82. package/dist/{chunk-vemwqxx2.js → chunk-bsbn7qtd.js} +2 -2
  83. package/dist/{chunk-vemwqxx2.js.map → chunk-bsbn7qtd.js.map} +1 -1
  84. package/dist/{chunk-grtmy031.js → chunk-d1r618e8.js} +1 -1
  85. package/dist/chunk-d1zt6sfj.js +5 -0
  86. package/dist/{chunk-p4125aj9.js.map → chunk-d1zt6sfj.js.map} +3 -6
  87. package/dist/{chunk-mjrxyvwr.js → chunk-d5h5v4rj.js} +2 -2
  88. package/dist/{chunk-mjrxyvwr.js.map → chunk-d5h5v4rj.js.map} +1 -1
  89. package/dist/{chunk-ma2zdn5s.js → chunk-e3fnjj0h.js} +2 -2
  90. package/dist/{chunk-ma2zdn5s.js.map → chunk-e3fnjj0h.js.map} +1 -1
  91. package/dist/{chunk-yr51wvkr.js → chunk-fkt43zw1.js} +2 -2
  92. package/dist/{chunk-yr51wvkr.js.map → chunk-fkt43zw1.js.map} +1 -1
  93. package/dist/{chunk-x74r8j5k.js → chunk-g2bsmw1m.js} +2 -2
  94. package/dist/{chunk-3bjj31n9.js.map → chunk-g2bsmw1m.js.map} +1 -1
  95. package/dist/{chunk-v36ey99b.js → chunk-gzfat1x1.js} +2 -2
  96. package/dist/{chunk-v36ey99b.js.map → chunk-gzfat1x1.js.map} +1 -1
  97. package/dist/{chunk-97bt619e.js → chunk-hnbj9jx2.js} +3 -3
  98. package/dist/{chunk-97bt619e.js.map → chunk-hnbj9jx2.js.map} +1 -1
  99. package/dist/{chunk-y3trr7xh.js → chunk-j0fgc58k.js} +2 -2
  100. package/dist/{chunk-y3trr7xh.js.map → chunk-j0fgc58k.js.map} +1 -1
  101. package/dist/{chunk-fev2yjmb.js → chunk-jfgjscq6.js} +2 -2
  102. package/dist/{chunk-fev2yjmb.js.map → chunk-jfgjscq6.js.map} +1 -1
  103. package/dist/{chunk-165mrqab.js → chunk-ngq4n2b3.js} +2 -2
  104. package/dist/{chunk-165mrqab.js.map → chunk-ngq4n2b3.js.map} +1 -1
  105. package/dist/{chunk-t70a927z.js → chunk-pqydkns8.js} +2 -2
  106. package/dist/{chunk-t70a927z.js.map → chunk-pqydkns8.js.map} +1 -1
  107. package/dist/{chunk-yd04n99w.js → chunk-pw95y0fx.js} +2 -2
  108. package/dist/{chunk-yd04n99w.js.map → chunk-pw95y0fx.js.map} +1 -1
  109. package/dist/{chunk-04ebkq8a.js → chunk-pwaftx6n.js} +3 -3
  110. package/dist/{chunk-04ebkq8a.js.map → chunk-pwaftx6n.js.map} +1 -1
  111. package/dist/{chunk-x02whwn3.js → chunk-q6ydpt33.js} +2 -2
  112. package/dist/{chunk-x02whwn3.js.map → chunk-q6ydpt33.js.map} +1 -1
  113. package/dist/{chunk-es6gxzyf.js → chunk-q77qf42t.js} +2 -2
  114. package/dist/{chunk-es6gxzyf.js.map → chunk-q77qf42t.js.map} +1 -1
  115. package/dist/{chunk-76ar9z69.js → chunk-r1sj312m.js} +2 -2
  116. package/dist/{chunk-76ar9z69.js.map → chunk-r1sj312m.js.map} +1 -1
  117. package/dist/{chunk-0w95nc15.js → chunk-r78aqvne.js} +2 -2
  118. package/dist/{chunk-0w95nc15.js.map → chunk-r78aqvne.js.map} +1 -1
  119. package/dist/{chunk-mdpm06cg.js → chunk-r9qzgvpx.js} +2 -2
  120. package/dist/{chunk-mdpm06cg.js.map → chunk-r9qzgvpx.js.map} +1 -1
  121. package/dist/{chunk-hp96c8hp.js → chunk-rhe7s1fm.js} +3 -3
  122. package/dist/{chunk-hp96c8hp.js.map → chunk-rhe7s1fm.js.map} +1 -1
  123. package/dist/{chunk-n9n3sqx5.js → chunk-rp0reqjn.js} +2 -2
  124. package/dist/{chunk-n9n3sqx5.js.map → chunk-rp0reqjn.js.map} +1 -1
  125. package/dist/{chunk-7g90me53.js → chunk-rw0t90pf.js} +2 -2
  126. package/dist/{chunk-7g90me53.js.map → chunk-rw0t90pf.js.map} +1 -1
  127. package/dist/{chunk-9zkgvggh.js → chunk-s72y1w84.js} +2 -2
  128. package/dist/{chunk-9zkgvggh.js.map → chunk-s72y1w84.js.map} +1 -1
  129. package/dist/{chunk-3bjj31n9.js → chunk-t93t317r.js} +2 -2
  130. package/dist/{chunk-x74r8j5k.js.map → chunk-t93t317r.js.map} +1 -1
  131. package/dist/{chunk-m0kbpywd.js → chunk-ttckhvew.js} +2 -2
  132. package/dist/{chunk-m0kbpywd.js.map → chunk-ttckhvew.js.map} +1 -1
  133. package/dist/{chunk-gsv1syg3.js → chunk-whjhrz97.js} +2 -2
  134. package/dist/{chunk-gsv1syg3.js.map → chunk-whjhrz97.js.map} +1 -1
  135. package/dist/chunk-x5ajfnrx.js +24 -0
  136. package/dist/{chunk-smtcmc20.js.map → chunk-x5ajfnrx.js.map} +6 -5
  137. package/dist/{chunk-ebbft1yj.js → chunk-x85x83pa.js} +1 -1
  138. package/dist/{chunk-tqzddk5e.js → chunk-xc90ycw2.js} +2 -2
  139. package/dist/{chunk-tqzddk5e.js.map → chunk-xc90ycw2.js.map} +1 -1
  140. package/dist/{chunk-w8cf1kqd.js → chunk-xqyx8kzr.js} +2 -2
  141. package/dist/{chunk-w8cf1kqd.js.map → chunk-xqyx8kzr.js.map} +2 -2
  142. package/dist/{chunk-x2ds4xaj.js → chunk-yafxbmy3.js} +1 -1
  143. package/dist/{chunk-71vjxehx.js → chunk-yc3n6zhr.js} +3 -3
  144. package/dist/{chunk-71vjxehx.js.map → chunk-yc3n6zhr.js.map} +1 -1
  145. package/dist/{chunk-rj81ysxm.js → chunk-zf8bgrnj.js} +2 -2
  146. package/dist/{chunk-rj81ysxm.js.map → chunk-zf8bgrnj.js.map} +1 -1
  147. package/dist/{chunk-0ms02b96.js → chunk-zn5bqe6m.js} +3 -3
  148. package/dist/{chunk-0ms02b96.js.map → chunk-zn5bqe6m.js.map} +1 -1
  149. package/dist/{chunk-7bynhyt1.js → chunk-ztzd90gp.js} +2 -2
  150. package/dist/{chunk-7bynhyt1.js.map → chunk-ztzd90gp.js.map} +1 -1
  151. package/dist/chunks/{ThemeProvider-D1kDfCwY.js → ThemeProvider-z_MW40tl.js} +126 -6
  152. package/dist/chunks/ThemeProvider-z_MW40tl.js.map +1 -0
  153. package/dist/client/ClientRouter.d.ts.map +1 -1
  154. package/dist/client/ClientRouterContext.d.ts.map +1 -1
  155. package/dist/client/ComponentContext.d.ts +8 -1
  156. package/dist/client/ComponentContext.d.ts.map +1 -1
  157. package/dist/client/MutationError.d.ts +4 -4
  158. package/dist/client/auth/useEmailCode.d.ts +36 -0
  159. package/dist/client/auth/useEmailCode.d.ts.map +1 -0
  160. package/dist/client/chunkLoadRecovery.d.ts +96 -0
  161. package/dist/client/chunkLoadRecovery.d.ts.map +1 -0
  162. package/dist/client/index.d.ts +4 -0
  163. package/dist/client/index.d.ts.map +1 -1
  164. package/dist/client/index.js +53 -4
  165. package/dist/client/index.js.map +1 -1
  166. package/dist/client/init.d.ts +9 -0
  167. package/dist/client/init.d.ts.map +1 -1
  168. package/dist/config/index.d.ts +12 -0
  169. package/dist/config/index.d.ts.map +1 -1
  170. package/dist/config/index.js +1 -1
  171. package/dist/config/index.js.map +2 -2
  172. package/dist/console/run.js +2 -2
  173. package/dist/console/run.js.map +1 -1
  174. package/dist/container/index.js +2 -2
  175. package/dist/container/index.js.map +1 -1
  176. package/dist/database/index.js +2 -2
  177. package/dist/database/index.js.map +1 -1
  178. package/dist/email/index.js +2 -2
  179. package/dist/email/index.js.map +1 -1
  180. package/dist/facades/index.js +2 -2
  181. package/dist/facades/index.js.map +1 -1
  182. package/dist/foundation/index.js +2 -2
  183. package/dist/foundation/index.js.map +1 -1
  184. package/dist/http/ApiRouter.d.ts +12 -1
  185. package/dist/http/ApiRouter.d.ts.map +1 -1
  186. package/dist/http/Error.d.ts +2 -2
  187. package/dist/http/index.js +2 -2
  188. package/dist/http/index.js.map +1 -1
  189. package/dist/i18n/dictionaryRuntime.js +2 -2
  190. package/dist/i18n/dictionaryRuntime.js.map +1 -1
  191. package/dist/i18n/index.js +2 -2
  192. package/dist/i18n/index.js.map +1 -1
  193. package/dist/kernel/index.d.ts +2 -0
  194. package/dist/kernel/index.d.ts.map +1 -1
  195. package/dist/kernel/index.js +3 -3
  196. package/dist/kernel/index.js.map +2 -2
  197. package/dist/orm/index.js +3 -3
  198. package/dist/orm/index.js.map +1 -1
  199. package/dist/server/forwardedFor.d.ts +1 -1
  200. package/dist/server/index.js +2 -2
  201. package/dist/server/index.js.map +1 -1
  202. package/dist/server/staticAssetMiss.d.ts +7 -0
  203. package/dist/server/staticAssetMiss.d.ts.map +1 -1
  204. package/dist/services/index.d.ts +1 -1
  205. package/dist/services/index.d.ts.map +1 -1
  206. package/dist/services/index.js +3 -3
  207. package/dist/services/index.js.map +1 -1
  208. package/dist/services/queue/work.js +2 -2
  209. package/dist/services/queue/work.js.map +1 -1
  210. package/dist/services/rate-limiter/drivers/InMemoryRateLimiterDriver.d.ts +10 -1
  211. package/dist/services/rate-limiter/drivers/InMemoryRateLimiterDriver.d.ts.map +1 -1
  212. package/dist/services/router/createFlatApiRoutes.d.ts.map +1 -1
  213. package/dist/support/index.js +2 -2
  214. package/dist/support/index.js.map +1 -1
  215. package/dist/testing/index.js +1 -1
  216. package/package.json +1 -1
  217. package/dist/chunk-p4125aj9.js +0 -5
  218. package/dist/chunk-smtcmc20.js +0 -24
  219. package/dist/chunk-vme0xdf4.js +0 -5
  220. package/dist/chunk-z61sdvb0.js +0 -17
  221. package/dist/chunks/ThemeProvider-D1kDfCwY.js.map +0 -1
  222. /package/dist/{chunk-grtmy031.js.map → chunk-d1r618e8.js.map} +0 -0
  223. /package/dist/{chunk-ebbft1yj.js.map → chunk-x85x83pa.js.map} +0 -0
  224. /package/dist/{chunk-x2ds4xaj.js.map → chunk-yafxbmy3.js.map} +0 -0
package/dist/app/index.js CHANGED
@@ -1,4 +1,4 @@
1
1
  // @bun
2
- import{xa as a}from"../chunk-y3trr7xh.js";import"../chunk-4mynkrv4.js";import"../chunk-3bjj31n9.js";export{a as App};
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 digits of a magic-link PIN, as `AuthManager.createMagicLinkToken` makes
6
- * them.
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 PIN_PATTERN: RegExp;
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;AAMlD,OAAO,KAAK,EAAc,IAAI,EAAE,MAAM,SAAS,CAAC;AAqDhD;;;GAGG;AACH,eAAO,MAAM,WAAW,QAAY,CAAC;AAyCrC,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;;;;;;;IAiD3C,eAAe,CACnB,GAAG;eAA4B,MAAM;aAAO,MAAM;6BAAK;IAmCnD,aAAa,CAAC,GAAG;eAA4B,MAAM;aAAO,MAAM;6BAAK;;;IAkCrE,QAAQ,CAAC,GAAG,gBAAsB;;;;;;;;;;IA8ClC,MAAM,CAAC,GAAG,gBAAsB;;;;;;;;;;IA8ChC,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;;;;;;;IA6H3C;;;;;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;;;CAkBtE"}
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":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAItC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAEL,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;IAMlD;;;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;IA4B1D,oBAAoB,CAAC,KAAK,EAAE,MAAM;;;;;;;;;;;CA4BzC"}
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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"}
@@ -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":"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"}
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"}
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAaJ;CACH"}
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"}
@@ -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
@@ -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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"}