@actuate-media/cms-core 0.12.0 → 0.14.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 (110) hide show
  1. package/LICENSE +21 -21
  2. package/dist/__tests__/api/api-key-auth.test.d.ts +2 -0
  3. package/dist/__tests__/api/api-key-auth.test.d.ts.map +1 -0
  4. package/dist/__tests__/api/api-key-auth.test.js +217 -0
  5. package/dist/__tests__/api/api-key-auth.test.js.map +1 -0
  6. package/dist/__tests__/api/health.test.d.ts +2 -0
  7. package/dist/__tests__/api/health.test.d.ts.map +1 -0
  8. package/dist/__tests__/api/health.test.js +140 -0
  9. package/dist/__tests__/api/health.test.js.map +1 -0
  10. package/dist/__tests__/auth/oauth.test.d.ts +2 -0
  11. package/dist/__tests__/auth/oauth.test.d.ts.map +1 -0
  12. package/dist/__tests__/auth/oauth.test.js +406 -0
  13. package/dist/__tests__/auth/oauth.test.js.map +1 -0
  14. package/dist/__tests__/auth/reset.test.d.ts +2 -0
  15. package/dist/__tests__/auth/reset.test.d.ts.map +1 -0
  16. package/dist/__tests__/auth/reset.test.js +303 -0
  17. package/dist/__tests__/auth/reset.test.js.map +1 -0
  18. package/dist/__tests__/diagnostics/env.test.d.ts +2 -0
  19. package/dist/__tests__/diagnostics/env.test.d.ts.map +1 -0
  20. package/dist/__tests__/diagnostics/env.test.js +119 -0
  21. package/dist/__tests__/diagnostics/env.test.js.map +1 -0
  22. package/dist/__tests__/diagnostics/logger.test.d.ts +2 -0
  23. package/dist/__tests__/diagnostics/logger.test.d.ts.map +1 -0
  24. package/dist/__tests__/diagnostics/logger.test.js +111 -0
  25. package/dist/__tests__/diagnostics/logger.test.js.map +1 -0
  26. package/dist/__tests__/security/api-key-enhanced.test.d.ts +2 -0
  27. package/dist/__tests__/security/api-key-enhanced.test.d.ts.map +1 -0
  28. package/dist/__tests__/security/api-key-enhanced.test.js +110 -0
  29. package/dist/__tests__/security/api-key-enhanced.test.js.map +1 -0
  30. package/dist/__tests__/security/rate-limit.test.js +42 -0
  31. package/dist/__tests__/security/rate-limit.test.js.map +1 -1
  32. package/dist/actions.d.ts.map +1 -1
  33. package/dist/actions.js +7 -6
  34. package/dist/actions.js.map +1 -1
  35. package/dist/api/handler-factory.d.ts.map +1 -1
  36. package/dist/api/handler-factory.js +31 -8
  37. package/dist/api/handler-factory.js.map +1 -1
  38. package/dist/api/handlers.d.ts.map +1 -1
  39. package/dist/api/handlers.js +508 -55
  40. package/dist/api/handlers.js.map +1 -1
  41. package/dist/auth/oauth.d.ts.map +1 -1
  42. package/dist/auth/oauth.js +5 -1
  43. package/dist/auth/oauth.js.map +1 -1
  44. package/dist/auth/reset.d.ts.map +1 -1
  45. package/dist/auth/reset.js +2 -1
  46. package/dist/auth/reset.js.map +1 -1
  47. package/dist/config/runtime.d.ts +99 -0
  48. package/dist/config/runtime.d.ts.map +1 -0
  49. package/dist/config/runtime.js +43 -0
  50. package/dist/config/runtime.js.map +1 -0
  51. package/dist/config/types.d.ts +21 -0
  52. package/dist/config/types.d.ts.map +1 -1
  53. package/dist/diagnostics/env.d.ts +44 -0
  54. package/dist/diagnostics/env.d.ts.map +1 -0
  55. package/dist/diagnostics/env.js +293 -0
  56. package/dist/diagnostics/env.js.map +1 -0
  57. package/dist/diagnostics/logger.d.ts +38 -0
  58. package/dist/diagnostics/logger.d.ts.map +1 -0
  59. package/dist/diagnostics/logger.js +89 -0
  60. package/dist/diagnostics/logger.js.map +1 -0
  61. package/dist/page-builder/blocks.d.ts.map +1 -1
  62. package/dist/page-builder/blocks.js +6 -1
  63. package/dist/page-builder/blocks.js.map +1 -1
  64. package/dist/security/api-key-enhanced.d.ts +48 -5
  65. package/dist/security/api-key-enhanced.d.ts.map +1 -1
  66. package/dist/security/api-key-enhanced.js +60 -9
  67. package/dist/security/api-key-enhanced.js.map +1 -1
  68. package/dist/security/audit.d.ts.map +1 -1
  69. package/dist/security/audit.js +3 -1
  70. package/dist/security/audit.js.map +1 -1
  71. package/dist/security/rate-limit.d.ts +8 -0
  72. package/dist/security/rate-limit.d.ts.map +1 -1
  73. package/dist/security/rate-limit.js +81 -3
  74. package/dist/security/rate-limit.js.map +1 -1
  75. package/generated/browser.ts +109 -0
  76. package/generated/client.ts +133 -0
  77. package/generated/commonInputTypes.ts +709 -0
  78. package/generated/enums.ts +125 -0
  79. package/generated/internal/class.ts +376 -0
  80. package/generated/internal/prismaNamespace.ts +2617 -0
  81. package/generated/internal/prismaNamespaceBrowser.ts +611 -0
  82. package/generated/models/ApiKey.ts +1550 -0
  83. package/generated/models/AuditLog.ts +1206 -0
  84. package/generated/models/BackupRecord.ts +1250 -0
  85. package/generated/models/ContentLock.ts +1472 -0
  86. package/generated/models/ContentTemplate.ts +1416 -0
  87. package/generated/models/Document.ts +3005 -0
  88. package/generated/models/Folder.ts +1904 -0
  89. package/generated/models/FormSubmission.ts +1200 -0
  90. package/generated/models/InAppNotification.ts +1457 -0
  91. package/generated/models/Media.ts +2340 -0
  92. package/generated/models/MediaUsage.ts +1472 -0
  93. package/generated/models/OAuthAccount.ts +1463 -0
  94. package/generated/models/Redirect.ts +1284 -0
  95. package/generated/models/Session.ts +1492 -0
  96. package/generated/models/Site.ts +1206 -0
  97. package/generated/models/User.ts +3513 -0
  98. package/generated/models/Version.ts +1511 -0
  99. package/generated/models/WorkflowState.ts +1514 -0
  100. package/generated/models.ts +29 -0
  101. package/package.json +1 -1
  102. package/prisma/cms-schema.prisma +306 -306
  103. package/prisma/migrations/0001_init/migration.sql +384 -384
  104. package/prisma/migrations/0002_folders/migration.sql +39 -39
  105. package/prisma/migrations/0003_search_and_webhooks/migration.sql +50 -50
  106. package/prisma/migrations/0004_script_tags/migration.sql +21 -21
  107. package/prisma/migrations/0005_password_reset_tokens/migration.sql +20 -20
  108. package/prisma/migrations/0006_page_builder/migration.sql +38 -38
  109. package/prisma/migrations/migration_lock.toml +3 -3
  110. package/prisma/schema.prisma +549 -549
@@ -0,0 +1,406 @@
1
+ import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest';
2
+ import * as jose from 'jose';
3
+ import { generateCodeVerifier, generateCodeChallenge, generateState, generateOAuthNonce, verifyState, getAuthorizationUrl, handleOAuthCallback, InvalidOAuthStateError, } from '../../auth/oauth.js';
4
+ const TEST_SECRET = 'a-secret-key-that-is-at-least-32-chars-long!!';
5
+ const RETURN_TO = '/admin/dashboard';
6
+ const PROVIDER_CONFIG = {
7
+ clientId: 'client-id-123',
8
+ clientSecret: 'client-secret-abc',
9
+ redirectUri: 'https://example.com/api/cms/auth/oauth/google/callback',
10
+ };
11
+ // ─── PKCE primitives ────────────────────────────────────────────────────
12
+ describe('generateCodeVerifier', () => {
13
+ it('returns a base64url string with no padding', () => {
14
+ const v = generateCodeVerifier();
15
+ // RFC 7636 §4.1: verifiers are 43..128 chars from the unreserved alphabet.
16
+ expect(v).toMatch(/^[A-Za-z0-9_-]{43,128}$/);
17
+ expect(v).not.toContain('=');
18
+ expect(v).not.toContain('+');
19
+ expect(v).not.toContain('/');
20
+ });
21
+ it('produces a unique value per call', () => {
22
+ const a = generateCodeVerifier();
23
+ const b = generateCodeVerifier();
24
+ const c = generateCodeVerifier();
25
+ expect(new Set([a, b, c]).size).toBe(3);
26
+ });
27
+ });
28
+ describe('generateCodeChallenge', () => {
29
+ it('returns a base64url SHA-256 of the verifier (RFC 7636 §4.2 S256 method)', async () => {
30
+ // Test vector from RFC 7636 §4.2: verifier "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk"
31
+ // → challenge "E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM"
32
+ const verifier = 'dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk';
33
+ const challenge = await generateCodeChallenge(verifier);
34
+ expect(challenge).toBe('E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM');
35
+ });
36
+ it('produces base64url output (no padding)', async () => {
37
+ const challenge = await generateCodeChallenge('any-verifier-value-for-testing-only');
38
+ expect(challenge).toMatch(/^[A-Za-z0-9_-]+$/);
39
+ expect(challenge).not.toContain('=');
40
+ });
41
+ });
42
+ describe('generateOAuthNonce', () => {
43
+ it('returns a base64url 16-byte nonce', () => {
44
+ const n = generateOAuthNonce();
45
+ expect(n).toMatch(/^[A-Za-z0-9_-]+$/);
46
+ // 16 bytes → 22 base64url chars (no padding)
47
+ expect(n.length).toBe(22);
48
+ });
49
+ it('produces a unique value per call', () => {
50
+ const set = new Set(Array.from({ length: 50 }, () => generateOAuthNonce()));
51
+ expect(set.size).toBe(50);
52
+ });
53
+ });
54
+ // ─── State token (signed JWT with PKCE verifier) ────────────────────────
55
+ describe('generateState / verifyState', () => {
56
+ it('round-trips a valid state through sign + verify', async () => {
57
+ const verifier = generateCodeVerifier();
58
+ const state = await generateState('google', verifier, RETURN_TO, TEST_SECRET);
59
+ const decoded = await verifyState(state, TEST_SECRET);
60
+ expect(decoded.provider).toBe('google');
61
+ expect(decoded.codeVerifier).toBe(verifier);
62
+ expect(decoded.returnTo).toBe(RETURN_TO);
63
+ expect(decoded.nonce).toBeUndefined();
64
+ });
65
+ it('round-trips a nonce when provided', async () => {
66
+ const nonce = generateOAuthNonce();
67
+ const state = await generateState('github', generateCodeVerifier(), '/admin', TEST_SECRET, nonce);
68
+ const decoded = await verifyState(state, TEST_SECRET);
69
+ expect(decoded.nonce).toBe(nonce);
70
+ });
71
+ it('strips standard JWT claims from the returned payload', async () => {
72
+ const verifier = generateCodeVerifier();
73
+ const state = await generateState('google', verifier, RETURN_TO, TEST_SECRET);
74
+ const decoded = await verifyState(state, TEST_SECRET);
75
+ // jose injects iat/exp/iss into the JWT but verifyState should only return
76
+ // the validated OAuthState fields.
77
+ expect(decoded.iat).toBeUndefined();
78
+ expect(decoded.exp).toBeUndefined();
79
+ expect(decoded.iss).toBeUndefined();
80
+ });
81
+ it('rejects a token signed with a different secret', async () => {
82
+ const state = await generateState('google', generateCodeVerifier(), RETURN_TO, TEST_SECRET);
83
+ await expect(verifyState(state, 'a-different-secret-of-at-least-32-chars-x')).rejects.toThrow();
84
+ });
85
+ it('rejects a tampered token', async () => {
86
+ const state = await generateState('google', generateCodeVerifier(), RETURN_TO, TEST_SECRET);
87
+ // Flip a character in the signature (last segment)
88
+ const parts = state.split('.');
89
+ parts[2] = parts[2].replace(/[A-Za-z0-9_-]/, (c) => (c === 'a' ? 'b' : 'a'));
90
+ const tampered = parts.join('.');
91
+ await expect(verifyState(tampered, TEST_SECRET)).rejects.toThrow();
92
+ });
93
+ it('rejects a token issued by a different application (issuer mismatch)', async () => {
94
+ // Sign a state-shaped JWT with the right key but a wrong `iss`.
95
+ const key = new TextEncoder().encode(TEST_SECRET);
96
+ const evil = await new jose.SignJWT({
97
+ provider: 'google',
98
+ codeVerifier: 'x'.repeat(43),
99
+ returnTo: '/',
100
+ })
101
+ .setProtectedHeader({ alg: 'HS256' })
102
+ .setIssuedAt()
103
+ .setExpirationTime('10m')
104
+ .setIssuer('not-actuate-cms')
105
+ .sign(key);
106
+ await expect(verifyState(evil, TEST_SECRET)).rejects.toThrow();
107
+ });
108
+ it('rejects a state with a missing provider field', async () => {
109
+ const key = new TextEncoder().encode(TEST_SECRET);
110
+ const malformed = await new jose.SignJWT({
111
+ codeVerifier: 'x'.repeat(43),
112
+ returnTo: '/',
113
+ })
114
+ .setProtectedHeader({ alg: 'HS256' })
115
+ .setIssuedAt()
116
+ .setExpirationTime('10m')
117
+ .setIssuer('actuate-cms')
118
+ .sign(key);
119
+ await expect(verifyState(malformed, TEST_SECRET)).rejects.toThrow(InvalidOAuthStateError);
120
+ });
121
+ it('rejects a state with a missing codeVerifier field', async () => {
122
+ const key = new TextEncoder().encode(TEST_SECRET);
123
+ const malformed = await new jose.SignJWT({
124
+ provider: 'google',
125
+ returnTo: '/',
126
+ })
127
+ .setProtectedHeader({ alg: 'HS256' })
128
+ .setIssuedAt()
129
+ .setExpirationTime('10m')
130
+ .setIssuer('actuate-cms')
131
+ .sign(key);
132
+ await expect(verifyState(malformed, TEST_SECRET)).rejects.toThrow(InvalidOAuthStateError);
133
+ });
134
+ it('rejects a state where nonce is not a string', async () => {
135
+ const key = new TextEncoder().encode(TEST_SECRET);
136
+ const malformed = await new jose.SignJWT({
137
+ provider: 'google',
138
+ codeVerifier: 'x'.repeat(43),
139
+ returnTo: '/',
140
+ nonce: 12345,
141
+ })
142
+ .setProtectedHeader({ alg: 'HS256' })
143
+ .setIssuedAt()
144
+ .setExpirationTime('10m')
145
+ .setIssuer('actuate-cms')
146
+ .sign(key);
147
+ await expect(verifyState(malformed, TEST_SECRET)).rejects.toThrow(InvalidOAuthStateError);
148
+ });
149
+ });
150
+ // ─── Authorization URL builder ──────────────────────────────────────────
151
+ describe('getAuthorizationUrl', () => {
152
+ it('builds a Google authorize URL with PKCE params', () => {
153
+ const url = new URL(getAuthorizationUrl('google', PROVIDER_CONFIG, 'state-jwt', 'challenge-x'));
154
+ expect(url.origin + url.pathname).toBe('https://accounts.google.com/o/oauth2/v2/auth');
155
+ expect(url.searchParams.get('response_type')).toBe('code');
156
+ expect(url.searchParams.get('client_id')).toBe(PROVIDER_CONFIG.clientId);
157
+ expect(url.searchParams.get('redirect_uri')).toBe(PROVIDER_CONFIG.redirectUri);
158
+ expect(url.searchParams.get('state')).toBe('state-jwt');
159
+ expect(url.searchParams.get('code_challenge')).toBe('challenge-x');
160
+ expect(url.searchParams.get('code_challenge_method')).toBe('S256');
161
+ expect(url.searchParams.get('scope')).toContain('openid');
162
+ });
163
+ it('uses a github-specific authorize endpoint', () => {
164
+ const url = new URL(getAuthorizationUrl('github', PROVIDER_CONFIG, 's', 'c'));
165
+ expect(url.origin + url.pathname).toBe('https://github.com/login/oauth/authorize');
166
+ });
167
+ });
168
+ function createFakeDb(initial = {}) {
169
+ const users = initial.users ?? [];
170
+ const oauthAccounts = initial.oauthAccounts ?? [];
171
+ const sessions = [];
172
+ return {
173
+ users,
174
+ oauthAccounts,
175
+ sessions,
176
+ user: {
177
+ findFirst: vi.fn(async ({ where }) => {
178
+ const target = where.email.equals.toLowerCase();
179
+ return users.find((u) => u.email.toLowerCase() === target) ?? null;
180
+ }),
181
+ create: vi.fn(async ({ data }) => {
182
+ const u = { id: `u_${users.length + 1}`, ...data };
183
+ users.push(u);
184
+ return u;
185
+ }),
186
+ },
187
+ oAuthAccount: {
188
+ findUnique: vi.fn(async ({ where, }) => {
189
+ const w = where.provider_providerAccountId;
190
+ const acc = oauthAccounts.find((a) => a.provider === w.provider && a.providerAccountId === w.providerAccountId);
191
+ if (!acc)
192
+ return null;
193
+ const user = users.find((u) => u.id === acc.userId) ?? null;
194
+ return { ...acc, user };
195
+ }),
196
+ upsert: vi.fn(async ({ where, create }) => {
197
+ const w = where.provider_providerAccountId;
198
+ const existing = oauthAccounts.find((a) => a.provider === w.provider && a.providerAccountId === w.providerAccountId);
199
+ if (existing)
200
+ return existing;
201
+ oauthAccounts.push({
202
+ provider: w.provider,
203
+ providerAccountId: w.providerAccountId,
204
+ userId: create.userId,
205
+ });
206
+ return oauthAccounts[oauthAccounts.length - 1];
207
+ }),
208
+ },
209
+ session: {
210
+ create: vi.fn(async ({ data }) => {
211
+ const s = { id: `s_${sessions.length + 1}`, ...data };
212
+ sessions.push(s);
213
+ return s;
214
+ }),
215
+ },
216
+ };
217
+ }
218
+ describe('handleOAuthCallback', () => {
219
+ const PROVIDERS = { google: PROVIDER_CONFIG };
220
+ const originalFetch = globalThis.fetch;
221
+ const originalEncryptionKey = process.env.CMS_ENCRYPTION_KEY;
222
+ beforeEach(() => {
223
+ // Set a 64-hex-char encryption key so encryptSecret() doesn't throw.
224
+ process.env.CMS_ENCRYPTION_KEY = 'a'.repeat(64);
225
+ });
226
+ afterEach(() => {
227
+ globalThis.fetch = originalFetch;
228
+ if (originalEncryptionKey === undefined) {
229
+ delete process.env.CMS_ENCRYPTION_KEY;
230
+ }
231
+ else {
232
+ process.env.CMS_ENCRYPTION_KEY = originalEncryptionKey;
233
+ }
234
+ vi.restoreAllMocks();
235
+ });
236
+ function mockProviderResponses(opts) {
237
+ globalThis.fetch = vi.fn(async (input) => {
238
+ const url = typeof input === 'string' ? input : (input.url ?? input.toString());
239
+ if (url.includes('oauth2.googleapis.com/token')) {
240
+ return new Response(JSON.stringify({ access_token: opts.accessToken ?? 'access-tok', token_type: 'Bearer' }), { status: 200, headers: { 'Content-Type': 'application/json' } });
241
+ }
242
+ if (url.includes('googleapis.com/oauth2/v3/userinfo')) {
243
+ return new Response(JSON.stringify({
244
+ sub: opts.profile.id,
245
+ email: opts.profile.email,
246
+ name: opts.profile.name,
247
+ }), { status: 200, headers: { 'Content-Type': 'application/json' } });
248
+ }
249
+ throw new Error(`Unexpected fetch in test: ${url}`);
250
+ });
251
+ }
252
+ it('rejects when the state.provider does not match the URL provider', async () => {
253
+ const state = await generateState('github', generateCodeVerifier(), RETURN_TO, TEST_SECRET);
254
+ const db = createFakeDb();
255
+ await expect(handleOAuthCallback('google', 'code-x', state, PROVIDERS, TEST_SECRET, db)).rejects.toThrow(/Provider mismatch/);
256
+ });
257
+ it('rejects when the nonce in state does not match the cookie nonce', async () => {
258
+ const nonce = generateOAuthNonce();
259
+ const state = await generateState('google', generateCodeVerifier(), RETURN_TO, TEST_SECRET, nonce);
260
+ const db = createFakeDb();
261
+ await expect(handleOAuthCallback('google', 'code-x', state, PROVIDERS, TEST_SECRET, db, {
262
+ expectedNonce: 'a-different-nonce',
263
+ })).rejects.toThrow(/nonce mismatch/i);
264
+ });
265
+ it('rejects when state has a nonce but no cookie nonce was provided', async () => {
266
+ const nonce = generateOAuthNonce();
267
+ const state = await generateState('google', generateCodeVerifier(), RETURN_TO, TEST_SECRET, nonce);
268
+ const db = createFakeDb();
269
+ await expect(handleOAuthCallback('google', 'code-x', state, PROVIDERS, TEST_SECRET, db, {
270
+ expectedNonce: null,
271
+ })).rejects.toThrow(/nonce mismatch/i);
272
+ });
273
+ it('rejects when the provider is not configured', async () => {
274
+ const state = await generateState('github', generateCodeVerifier(), RETURN_TO, TEST_SECRET);
275
+ const db = createFakeDb();
276
+ await expect(handleOAuthCallback('github', 'code-x', state, PROVIDERS, TEST_SECRET, db)).rejects.toThrow(/not configured/);
277
+ });
278
+ it('rejects when the OAuth provider returns no email', async () => {
279
+ mockProviderResponses({ profile: { id: '111', email: '', name: 'Nobody' } });
280
+ const state = await generateState('google', generateCodeVerifier(), RETURN_TO, TEST_SECRET);
281
+ const db = createFakeDb();
282
+ await expect(handleOAuthCallback('google', 'code-x', state, PROVIDERS, TEST_SECRET, db)).rejects.toThrow(/email/);
283
+ });
284
+ it('rejects self-signup when allowSelfSignup is false (default)', async () => {
285
+ mockProviderResponses({ profile: { id: '222', email: 'new@example.com', name: 'New User' } });
286
+ const state = await generateState('google', generateCodeVerifier(), RETURN_TO, TEST_SECRET);
287
+ const db = createFakeDb();
288
+ await expect(handleOAuthCallback('google', 'code-x', state, PROVIDERS, TEST_SECRET, db)).rejects.toThrow(/No account found/);
289
+ expect(db.user.create).not.toHaveBeenCalled();
290
+ });
291
+ it('refuses to silently link an OAuth login to a password-protected account', async () => {
292
+ mockProviderResponses({
293
+ profile: { id: '333', email: 'pwd@example.com', name: 'Pwd User' },
294
+ });
295
+ const state = await generateState('google', generateCodeVerifier(), RETURN_TO, TEST_SECRET);
296
+ const db = createFakeDb({
297
+ users: [
298
+ {
299
+ id: 'u_existing',
300
+ email: 'pwd@example.com',
301
+ name: 'Pwd User',
302
+ role: 'CLIENT',
303
+ passwordHash: 'pbkdf2:600000:abc:def',
304
+ },
305
+ ],
306
+ });
307
+ await expect(handleOAuthCallback('google', 'code-x', state, PROVIDERS, TEST_SECRET, db)).rejects.toThrow(/already exists/);
308
+ });
309
+ it('reuses an existing OAuth-only account (passwordHash null) when emails match', async () => {
310
+ mockProviderResponses({
311
+ profile: { id: '444', email: 'oauth@example.com', name: 'OAuth User' },
312
+ });
313
+ const state = await generateState('google', generateCodeVerifier(), RETURN_TO, TEST_SECRET);
314
+ const db = createFakeDb({
315
+ users: [
316
+ {
317
+ id: 'u_oauth_only',
318
+ email: 'oauth@example.com',
319
+ name: 'OAuth User',
320
+ role: 'CLIENT',
321
+ passwordHash: null,
322
+ },
323
+ ],
324
+ });
325
+ const result = await handleOAuthCallback('google', 'code-x', state, PROVIDERS, TEST_SECRET, db);
326
+ expect(result.user.id).toBe('u_oauth_only');
327
+ expect(db.user.create).not.toHaveBeenCalled();
328
+ expect(db.session.create).toHaveBeenCalledOnce();
329
+ });
330
+ it('provisions a new user when allowSelfSignup is true and no account exists', async () => {
331
+ mockProviderResponses({
332
+ profile: { id: '555', email: 'fresh@example.com', name: 'Fresh User' },
333
+ });
334
+ const state = await generateState('google', generateCodeVerifier(), RETURN_TO, TEST_SECRET);
335
+ const db = createFakeDb();
336
+ const onProvision = vi.fn();
337
+ const result = await handleOAuthCallback('google', 'code-x', state, PROVIDERS, TEST_SECRET, db, { allowSelfSignup: true, onProvision });
338
+ expect(onProvision).toHaveBeenCalledOnce();
339
+ expect(db.user.create).toHaveBeenCalledOnce();
340
+ expect(db.user.create.mock.calls[0][0].data.passwordHash).toBeNull();
341
+ expect(result.user.email).toBe('fresh@example.com');
342
+ expect(result.user.role).toBe('CLIENT');
343
+ });
344
+ it('lets onProvision throw to reject self-signup', async () => {
345
+ mockProviderResponses({
346
+ profile: { id: '666', email: 'blocked@evil.com', name: 'Blocked' },
347
+ });
348
+ const state = await generateState('google', generateCodeVerifier(), RETURN_TO, TEST_SECRET);
349
+ const db = createFakeDb();
350
+ const onProvision = vi.fn(() => {
351
+ throw new Error('Email domain not allowed');
352
+ });
353
+ await expect(handleOAuthCallback('google', 'code-x', state, PROVIDERS, TEST_SECRET, db, {
354
+ allowSelfSignup: true,
355
+ onProvision,
356
+ })).rejects.toThrow(/domain not allowed/);
357
+ expect(db.user.create).not.toHaveBeenCalled();
358
+ });
359
+ it('returns an existing user found via OAuthAccount even if email differs', async () => {
360
+ mockProviderResponses({
361
+ profile: { id: '777', email: 'now@example.com', name: 'Linked User' },
362
+ });
363
+ const state = await generateState('google', generateCodeVerifier(), RETURN_TO, TEST_SECRET);
364
+ const db = createFakeDb({
365
+ users: [
366
+ {
367
+ id: 'u_linked',
368
+ email: 'old@example.com', // different from current OAuth email
369
+ name: 'Linked',
370
+ role: 'ADMIN',
371
+ passwordHash: 'pbkdf2:600000:a:b',
372
+ },
373
+ ],
374
+ oauthAccounts: [{ provider: 'google', providerAccountId: '777', userId: 'u_linked' }],
375
+ });
376
+ const result = await handleOAuthCallback('google', 'code-x', state, PROVIDERS, TEST_SECRET, db);
377
+ // Even though the email matches a *different* user, the existing
378
+ // OAuthAccount link wins and we return the linked user.
379
+ expect(result.user.id).toBe('u_linked');
380
+ expect(result.user.role).toBe('ADMIN');
381
+ });
382
+ it('creates a session row for the authenticated user', async () => {
383
+ mockProviderResponses({
384
+ profile: { id: '888', email: 'session@example.com', name: 'Session User' },
385
+ });
386
+ const state = await generateState('google', generateCodeVerifier(), RETURN_TO, TEST_SECRET);
387
+ const db = createFakeDb({
388
+ users: [
389
+ {
390
+ id: 'u_sess',
391
+ email: 'session@example.com',
392
+ name: 'Session',
393
+ role: 'CLIENT',
394
+ passwordHash: null,
395
+ },
396
+ ],
397
+ });
398
+ await handleOAuthCallback('google', 'code-x', state, PROVIDERS, TEST_SECRET, db);
399
+ expect(db.session.create).toHaveBeenCalledOnce();
400
+ const call = db.session.create.mock.calls[0][0];
401
+ expect(call.data.userId).toBe('u_sess');
402
+ // Default 7-day expiry — verify the date is in the future
403
+ expect(call.data.expiresAt.getTime()).toBeGreaterThan(Date.now());
404
+ });
405
+ });
406
+ //# sourceMappingURL=oauth.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.test.js","sourceRoot":"","sources":["../../../src/__tests__/auth/oauth.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=reset.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reset.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/auth/reset.test.ts"],"names":[],"mappings":""}