@proteinjs/user-server 1.8.0 → 1.9.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.
Files changed (72) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/generated/index.d.ts.map +1 -1
  3. package/dist/generated/index.js +3 -1
  4. package/dist/generated/index.js.map +1 -1
  5. package/dist/src/authentication/DbSessionStore.d.ts +3 -2
  6. package/dist/src/authentication/DbSessionStore.d.ts.map +1 -1
  7. package/dist/src/authentication/DbSessionStore.js +3 -2
  8. package/dist/src/authentication/DbSessionStore.js.map +1 -1
  9. package/dist/src/authentication/establishSession.d.ts +30 -0
  10. package/dist/src/authentication/establishSession.d.ts.map +1 -0
  11. package/dist/src/authentication/establishSession.js +83 -0
  12. package/dist/src/authentication/establishSession.js.map +1 -0
  13. package/dist/src/routes/devLogin.d.ts.map +1 -1
  14. package/dist/src/routes/devLogin.js +6 -12
  15. package/dist/src/routes/devLogin.js.map +1 -1
  16. package/dist/src/routes/login.d.ts.map +1 -1
  17. package/dist/src/routes/login.js +2 -3
  18. package/dist/src/routes/login.js.map +1 -1
  19. package/dist/src/routes/logout.d.ts +10 -0
  20. package/dist/src/routes/logout.d.ts.map +1 -1
  21. package/dist/src/routes/logout.js +13 -32
  22. package/dist/src/routes/logout.js.map +1 -1
  23. package/dist/src/routes/signup.d.ts +19 -0
  24. package/dist/src/routes/signup.d.ts.map +1 -0
  25. package/dist/src/routes/signup.js +102 -0
  26. package/dist/src/routes/signup.js.map +1 -0
  27. package/dist/src/routes/validateResetPasswordToken.d.ts.map +1 -1
  28. package/dist/src/routes/validateResetPasswordToken.js +5 -1
  29. package/dist/src/routes/validateResetPasswordToken.js.map +1 -1
  30. package/dist/src/services/Signup.d.ts +18 -1
  31. package/dist/src/services/Signup.d.ts.map +1 -1
  32. package/dist/src/services/Signup.js +8 -2
  33. package/dist/src/services/Signup.js.map +1 -1
  34. package/dist/test/AccountDeletion.integration.test.js +24 -16
  35. package/dist/test/AccountDeletion.integration.test.js.map +1 -1
  36. package/dist/test/DevLogin.test.js +15 -20
  37. package/dist/test/DevLogin.test.js.map +1 -1
  38. package/dist/test/LogoutRoute.test.d.ts +2 -0
  39. package/dist/test/LogoutRoute.test.d.ts.map +1 -0
  40. package/dist/test/LogoutRoute.test.js +81 -0
  41. package/dist/test/LogoutRoute.test.js.map +1 -0
  42. package/dist/test/Signup.test.js +4 -2
  43. package/dist/test/Signup.test.js.map +1 -1
  44. package/dist/test/SignupRoute.test.d.ts +2 -0
  45. package/dist/test/SignupRoute.test.d.ts.map +1 -0
  46. package/dist/test/SignupRoute.test.js +338 -0
  47. package/dist/test/SignupRoute.test.js.map +1 -0
  48. package/dist/test/ValidateResetToken.test.d.ts +2 -0
  49. package/dist/test/ValidateResetToken.test.d.ts.map +1 -0
  50. package/dist/test/ValidateResetToken.test.js +170 -0
  51. package/dist/test/ValidateResetToken.test.js.map +1 -0
  52. package/dist/test/passportSessionHarness.d.ts +31 -0
  53. package/dist/test/passportSessionHarness.d.ts.map +1 -0
  54. package/dist/test/passportSessionHarness.js +107 -0
  55. package/dist/test/passportSessionHarness.js.map +1 -0
  56. package/generated/index.ts +3 -1
  57. package/package.json +6 -4
  58. package/src/authentication/DbSessionStore.ts +3 -2
  59. package/src/authentication/establishSession.ts +33 -0
  60. package/src/routes/devLogin.ts +4 -6
  61. package/src/routes/login.ts +2 -3
  62. package/src/routes/logout.ts +13 -18
  63. package/src/routes/signup.ts +55 -0
  64. package/src/routes/validateResetPasswordToken.ts +5 -1
  65. package/src/services/Signup.ts +21 -2
  66. package/test/AccountDeletion.integration.test.ts +15 -11
  67. package/test/DevLogin.test.ts +11 -14
  68. package/test/LogoutRoute.test.ts +33 -0
  69. package/test/Signup.test.ts +4 -2
  70. package/test/SignupRoute.test.ts +219 -0
  71. package/test/ValidateResetToken.test.ts +86 -0
  72. package/test/passportSessionHarness.ts +58 -0
@@ -0,0 +1,58 @@
1
+ import passport from 'passport';
2
+
3
+ /** Session-lifecycle events in call order — the session-establishment contract under test. */
4
+ export type SessionEvent = 'regenerate' | 'login' | 'save';
5
+
6
+ export type PassportRequest = {
7
+ /** Express-shaped request whose `login`/`logout` are REAL passport machinery. */
8
+ request: any;
9
+ /**
10
+ * 'regenerate' / 'login' / 'save' in call order. The full contract of session establishment:
11
+ * regenerate FIRST (a fresh session id on privilege change — session fixation), then the bind
12
+ * of the account onto the fresh session, then save (the row must commit before the response).
13
+ */
14
+ events: SessionEvent[];
15
+ };
16
+
17
+ /**
18
+ * Builds a request whose `request.login` / `request.logout` are the GENUINE passport 0.6
19
+ * machinery, wired through `authenticator.initialize()` — the same middleware the server runs —
20
+ * over an express-session-shaped session mock.
21
+ *
22
+ * Why real passport and not a hand-mocked `login`: since passport 0.6 (the CVE-2022-25896
23
+ * session-fixation fix), the regenerate and the commit-before-response save live INSIDE
24
+ * `request.login` (SessionManager.logIn: regenerate → serializeUser → bind → save). A mocked
25
+ * `login` would assert nothing about either — the door suites must drive the real owner to
26
+ * prove the doors inherit the contract.
27
+ *
28
+ * serializeUser mirrors @proteinjs/server's identity pass-through (the session stores the
29
+ * account email directly), instrumented to record the bind ('login') between 'regenerate' and
30
+ * 'save'. The session mock replicates the one express-session behavior passport depends on:
31
+ * `regenerate` REPLACES `request.session` with a fresh session (new id, no passport state), so
32
+ * the bind provably lands on the post-regeneration session.
33
+ */
34
+ export const createPassportRequest = async (extra: Record<string, unknown> = {}): Promise<PassportRequest> => {
35
+ const events: SessionEvent[] = [];
36
+ const authenticator = new passport.Passport();
37
+ authenticator.serializeUser((user: unknown, done: (err: unknown, id?: unknown) => void) => {
38
+ events.push('login');
39
+ done(null, user);
40
+ });
41
+
42
+ const request: any = { ...extra };
43
+ const makeSession = (): any => ({
44
+ regenerate: (done: (err?: unknown) => void) => {
45
+ events.push('regenerate');
46
+ request.session = makeSession();
47
+ done();
48
+ },
49
+ save: (done: (err?: unknown) => void) => {
50
+ events.push('save');
51
+ done();
52
+ },
53
+ });
54
+ request.session = makeSession();
55
+
56
+ await new Promise<void>((resolve) => authenticator.initialize()(request, {} as never, () => resolve()));
57
+ return { request, events };
58
+ };