@actuate-media/cms-core 0.37.0 → 0.39.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/__tests__/api/ai-status.test.d.ts +2 -0
- package/dist/__tests__/api/ai-status.test.d.ts.map +1 -0
- package/dist/__tests__/api/ai-status.test.js +110 -0
- package/dist/__tests__/api/ai-status.test.js.map +1 -0
- package/dist/__tests__/api/totp-login.test.d.ts +2 -0
- package/dist/__tests__/api/totp-login.test.d.ts.map +1 -0
- package/dist/__tests__/api/totp-login.test.js +115 -0
- package/dist/__tests__/api/totp-login.test.js.map +1 -0
- package/dist/__tests__/api/users-invite.test.d.ts +2 -0
- package/dist/__tests__/api/users-invite.test.d.ts.map +1 -0
- package/dist/__tests__/api/users-invite.test.js +167 -0
- package/dist/__tests__/api/users-invite.test.js.map +1 -0
- package/dist/__tests__/auth/invite.test.d.ts +2 -0
- package/dist/__tests__/auth/invite.test.d.ts.map +1 -0
- package/dist/__tests__/auth/invite.test.js +151 -0
- package/dist/__tests__/auth/invite.test.js.map +1 -0
- package/dist/__tests__/auth/reset.test.js +52 -1
- package/dist/__tests__/auth/reset.test.js.map +1 -1
- package/dist/__tests__/auth/totp.test.d.ts +2 -0
- package/dist/__tests__/auth/totp.test.d.ts.map +1 -0
- package/dist/__tests__/auth/totp.test.js +52 -0
- package/dist/__tests__/auth/totp.test.js.map +1 -0
- package/dist/__tests__/email/sender.test.d.ts +2 -0
- package/dist/__tests__/email/sender.test.d.ts.map +1 -0
- package/dist/__tests__/email/sender.test.js +33 -0
- package/dist/__tests__/email/sender.test.js.map +1 -0
- package/dist/__tests__/middleware.test.js +30 -0
- package/dist/__tests__/middleware.test.js.map +1 -1
- package/dist/__tests__/setup/index.test.js +37 -2
- package/dist/__tests__/setup/index.test.js.map +1 -1
- package/dist/api/handlers.d.ts.map +1 -1
- package/dist/api/handlers.js +141 -5
- package/dist/api/handlers.js.map +1 -1
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +1 -0
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/invite-email.d.ts +12 -0
- package/dist/auth/invite-email.d.ts.map +1 -0
- package/dist/auth/invite-email.js +57 -0
- package/dist/auth/invite-email.js.map +1 -0
- package/dist/auth/invite.d.ts +37 -0
- package/dist/auth/invite.d.ts.map +1 -0
- package/dist/auth/invite.js +104 -0
- package/dist/auth/invite.js.map +1 -0
- package/dist/auth/reset.d.ts +6 -0
- package/dist/auth/reset.d.ts.map +1 -1
- package/dist/auth/reset.js +11 -3
- package/dist/auth/reset.js.map +1 -1
- package/dist/auth/totp.d.ts +12 -0
- package/dist/auth/totp.d.ts.map +1 -1
- package/dist/auth/totp.js +24 -0
- package/dist/auth/totp.js.map +1 -1
- package/dist/email/sender.d.ts +35 -0
- package/dist/email/sender.d.ts.map +1 -0
- package/dist/email/sender.js +25 -0
- package/dist/email/sender.js.map +1 -0
- package/dist/forms/notify.d.ts.map +1 -1
- package/dist/forms/notify.js +3 -2
- package/dist/forms/notify.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +60 -1
- package/dist/middleware.js.map +1 -1
- package/dist/setup/index.d.ts +14 -0
- package/dist/setup/index.d.ts.map +1 -1
- package/dist/setup/index.js +29 -3
- package/dist/setup/index.js.map +1 -1
- package/package.json +6 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
2
|
import { generateResetToken, hashToken, createPasswordReset, executePasswordReset, } from '../../auth/reset.js';
|
|
3
3
|
import { verifyPassword } from '../../auth/password.js';
|
|
4
|
+
import { setEmailSender } from '../../email/sender.js';
|
|
4
5
|
function createFakeDb(initial = {}) {
|
|
5
6
|
const users = initial.users ?? [];
|
|
6
7
|
const tokens = [];
|
|
@@ -205,6 +206,56 @@ describe('createPasswordReset', () => {
|
|
|
205
206
|
expect(db.passwordResetToken.create).toHaveBeenCalledOnce();
|
|
206
207
|
expect(TEST_CONFIG.platform.email.send).not.toHaveBeenCalled();
|
|
207
208
|
});
|
|
209
|
+
it('builds the reset link from the configured admin path (not a hardcoded /admin)', async () => {
|
|
210
|
+
const db = createFakeDb({
|
|
211
|
+
users: [{ id: 'u_1', email: 'a@example.com', name: 'A', isActive: true, passwordHash: null }],
|
|
212
|
+
});
|
|
213
|
+
await createPasswordReset(db, 'a@example.com', {
|
|
214
|
+
siteUrl: 'https://example.com/',
|
|
215
|
+
adminPath: '/securelogin',
|
|
216
|
+
platform: TEST_CONFIG.platform,
|
|
217
|
+
});
|
|
218
|
+
const sent = TEST_CONFIG.platform.email.send.mock.calls[0][0];
|
|
219
|
+
expect(sent.html).toContain('https://example.com/securelogin/reset-password?token=');
|
|
220
|
+
expect(sent.html).not.toContain('//securelogin');
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
// ─── Registered email sender fallback ───────────────────────────────────
|
|
224
|
+
//
|
|
225
|
+
// Regression: createPasswordReset previously only sent when an explicit
|
|
226
|
+
// `platform.email` adapter was passed. Apps that configure email purely via
|
|
227
|
+
// `emailPlugin()` (the common case) register a sender through the core email
|
|
228
|
+
// registry instead, so the reset flow must fall back to it.
|
|
229
|
+
describe('createPasswordReset — registered sender fallback', () => {
|
|
230
|
+
afterEach(() => {
|
|
231
|
+
setEmailSender(null);
|
|
232
|
+
});
|
|
233
|
+
it('sends via the registered sender when no platform adapter is passed', async () => {
|
|
234
|
+
const send = vi.fn(async (_o) => { });
|
|
235
|
+
setEmailSender({ send });
|
|
236
|
+
const db = createFakeDb({
|
|
237
|
+
users: [{ id: 'u_1', email: 'a@example.com', name: 'A', isActive: true, passwordHash: null }],
|
|
238
|
+
});
|
|
239
|
+
await createPasswordReset(db, 'a@example.com', { siteUrl: 'https://e.com' });
|
|
240
|
+
expect(db.passwordResetToken.create).toHaveBeenCalledOnce();
|
|
241
|
+
expect(send).toHaveBeenCalledOnce();
|
|
242
|
+
const sent = send.mock.calls[0][0];
|
|
243
|
+
expect(sent.to).toBe('a@example.com');
|
|
244
|
+
expect(sent.html).toContain('/admin/reset-password?token=');
|
|
245
|
+
});
|
|
246
|
+
it('prefers an explicit platform adapter over the registered sender', async () => {
|
|
247
|
+
const registered = vi.fn(async (_o) => { });
|
|
248
|
+
setEmailSender({ send: registered });
|
|
249
|
+
const db = createFakeDb({
|
|
250
|
+
users: [{ id: 'u_1', email: 'a@example.com', name: 'A', isActive: true, passwordHash: null }],
|
|
251
|
+
});
|
|
252
|
+
await createPasswordReset(db, 'a@example.com', {
|
|
253
|
+
siteUrl: 'https://e.com',
|
|
254
|
+
platform: TEST_CONFIG.platform,
|
|
255
|
+
});
|
|
256
|
+
expect(TEST_CONFIG.platform.email.send).toHaveBeenCalledOnce();
|
|
257
|
+
expect(registered).not.toHaveBeenCalled();
|
|
258
|
+
});
|
|
208
259
|
});
|
|
209
260
|
// ─── executePasswordReset (consume flow) ────────────────────────────────
|
|
210
261
|
describe('executePasswordReset', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reset.test.js","sourceRoot":"","sources":["../../../src/__tests__/auth/reset.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"reset.test.js","sourceRoot":"","sources":["../../../src/__tests__/auth/reset.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"totp.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/auth/totp.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { generateBackupCodes, generateTOTPSecret, generateTOTPUri, verifyTOTP, normalizeBackupCode, findBackupCodeMatch, } from '../../auth/totp.js';
|
|
3
|
+
describe('totp helpers', () => {
|
|
4
|
+
it('generates a scannable otpauth URI for the given account', () => {
|
|
5
|
+
const secret = generateTOTPSecret();
|
|
6
|
+
const uri = generateTOTPUri(secret, 'admin@example.com');
|
|
7
|
+
expect(uri.startsWith('otpauth://totp/')).toBe(true);
|
|
8
|
+
expect(uri).toContain(`secret=${secret}`);
|
|
9
|
+
expect(uri).toContain('issuer=Actuate%20CMS');
|
|
10
|
+
expect(uri).toContain(encodeURIComponent('admin@example.com'));
|
|
11
|
+
});
|
|
12
|
+
it('verifies a TOTP code derived from the same secret', async () => {
|
|
13
|
+
// Derive the current code the same way the verifier does, then confirm it
|
|
14
|
+
// round-trips. Importing the private HOTP isn't exposed, so we lean on the
|
|
15
|
+
// window tolerance: a freshly generated secret should not validate a random
|
|
16
|
+
// 6-digit guess.
|
|
17
|
+
const secret = generateTOTPSecret();
|
|
18
|
+
expect(verifyTOTP('000000', secret)).toBe(false);
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
describe('backup codes', () => {
|
|
22
|
+
it('generates the requested number of unique 8-char hex codes', () => {
|
|
23
|
+
const codes = generateBackupCodes(8);
|
|
24
|
+
expect(codes).toHaveLength(8);
|
|
25
|
+
expect(new Set(codes).size).toBe(8);
|
|
26
|
+
for (const code of codes) {
|
|
27
|
+
expect(code).toMatch(/^[0-9a-f]{8}$/);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
it('normalizes whitespace, dashes and case', () => {
|
|
31
|
+
expect(normalizeBackupCode('ABCD-1234')).toBe('abcd1234');
|
|
32
|
+
expect(normalizeBackupCode(' ab cd 12 34 ')).toBe('abcd1234');
|
|
33
|
+
expect(normalizeBackupCode('')).toBe('');
|
|
34
|
+
});
|
|
35
|
+
it('matches a stored code regardless of formatting and returns its index', () => {
|
|
36
|
+
const codes = ['aaaa1111', 'bbbb2222', 'cccc3333'];
|
|
37
|
+
expect(findBackupCodeMatch(codes, 'BBBB-2222')).toBe(1);
|
|
38
|
+
expect(findBackupCodeMatch(codes, ' cccc 3333 ')).toBe(2);
|
|
39
|
+
});
|
|
40
|
+
it('returns -1 for a non-matching or empty submission', () => {
|
|
41
|
+
const codes = ['aaaa1111', 'bbbb2222'];
|
|
42
|
+
expect(findBackupCodeMatch(codes, 'deadbeef')).toBe(-1);
|
|
43
|
+
expect(findBackupCodeMatch(codes, '')).toBe(-1);
|
|
44
|
+
expect(findBackupCodeMatch([], 'aaaa1111')).toBe(-1);
|
|
45
|
+
});
|
|
46
|
+
it('does not match a code that only shares a prefix (length-aware compare)', () => {
|
|
47
|
+
const codes = ['aaaa1111'];
|
|
48
|
+
expect(findBackupCodeMatch(codes, 'aaaa111')).toBe(-1);
|
|
49
|
+
expect(findBackupCodeMatch(codes, 'aaaa11110')).toBe(-1);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
//# sourceMappingURL=totp.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"totp.test.js","sourceRoot":"","sources":["../../../src/__tests__/auth/totp.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sender.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/email/sender.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { describe, it, expect, afterEach, vi } from 'vitest';
|
|
2
|
+
import { setEmailSender, getRegisteredEmailSender, resolveEmailSender } from '../../email/sender.js';
|
|
3
|
+
import { setActuateConfig } from '../../config/runtime.js';
|
|
4
|
+
afterEach(() => {
|
|
5
|
+
setEmailSender(null);
|
|
6
|
+
setActuateConfig(undefined);
|
|
7
|
+
});
|
|
8
|
+
describe('email sender registry', () => {
|
|
9
|
+
it('round-trips a registered sender', () => {
|
|
10
|
+
expect(getRegisteredEmailSender()).toBeNull();
|
|
11
|
+
const sender = { send: vi.fn(async () => { }) };
|
|
12
|
+
setEmailSender(sender);
|
|
13
|
+
expect(getRegisteredEmailSender()).toBe(sender);
|
|
14
|
+
setEmailSender(null);
|
|
15
|
+
expect(getRegisteredEmailSender()).toBeNull();
|
|
16
|
+
});
|
|
17
|
+
it('resolves null when nothing is configured', () => {
|
|
18
|
+
expect(resolveEmailSender()).toBeNull();
|
|
19
|
+
});
|
|
20
|
+
it('resolves the registered sender when no platform adapter is set', () => {
|
|
21
|
+
const sender = { send: vi.fn(async () => { }) };
|
|
22
|
+
setEmailSender(sender);
|
|
23
|
+
expect(resolveEmailSender()).toBe(sender);
|
|
24
|
+
});
|
|
25
|
+
it('prefers the platform adapter over a registered sender', () => {
|
|
26
|
+
const registered = { send: vi.fn(async () => { }) };
|
|
27
|
+
const platform = { send: vi.fn(async () => { }) };
|
|
28
|
+
setEmailSender(registered);
|
|
29
|
+
setActuateConfig({ platform: { email: platform } });
|
|
30
|
+
expect(resolveEmailSender()).toBe(platform);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=sender.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sender.test.js","sourceRoot":"","sources":["../../../src/__tests__/email/sender.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AACpG,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAE1D,SAAS,CAAC,GAAG,EAAE;IACb,cAAc,CAAC,IAAI,CAAC,CAAA;IACpB,gBAAgB,CAAC,SAAkB,CAAC,CAAA;AACtC,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,CAAC,wBAAwB,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC7C,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,EAAE,CAAA;QAC9C,cAAc,CAAC,MAAM,CAAC,CAAA;QACtB,MAAM,CAAC,wBAAwB,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC/C,cAAc,CAAC,IAAI,CAAC,CAAA;QACpB,MAAM,CAAC,wBAAwB,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,EAAE,CAAA;QAC9C,cAAc,CAAC,MAAM,CAAC,CAAA;QACtB,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,UAAU,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,EAAE,CAAA;QAClD,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,EAAE,CAAA;QAChD,cAAc,CAAC,UAAU,CAAC,CAAA;QAC1B,gBAAgB,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAW,CAAC,CAAA;QAC5D,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -47,4 +47,34 @@ describe('createCMSMiddleware route boundary', () => {
|
|
|
47
47
|
expect(res?.status).toBe(403);
|
|
48
48
|
});
|
|
49
49
|
});
|
|
50
|
+
describe('createCMSMiddleware missing CMS_SECRET', () => {
|
|
51
|
+
const origSecret = process.env.CMS_SECRET;
|
|
52
|
+
beforeEach(() => {
|
|
53
|
+
process.env.CMS_SECRET = '';
|
|
54
|
+
});
|
|
55
|
+
afterEach(() => {
|
|
56
|
+
process.env.CMS_SECRET = origSecret;
|
|
57
|
+
});
|
|
58
|
+
function req(path) {
|
|
59
|
+
return new Request(`https://example.com${path}`);
|
|
60
|
+
}
|
|
61
|
+
it('returns an actionable 503 HTML page for the admin UI', async () => {
|
|
62
|
+
const mw = createCMSMiddleware({ admin: { path: '/admin' } });
|
|
63
|
+
const res = await mw(req('/admin'));
|
|
64
|
+
expect(res?.status).toBe(503);
|
|
65
|
+
expect(res?.headers.get('Content-Type')).toContain('text/html');
|
|
66
|
+
const body = await res.text();
|
|
67
|
+
expect(body).toContain('CMS_SECRET');
|
|
68
|
+
// Must not leak any secret value — only the variable name + remediation.
|
|
69
|
+
expect(body).toContain('randomBytes');
|
|
70
|
+
});
|
|
71
|
+
it('still lets the setup API through so the wizard can run before a secret exists', async () => {
|
|
72
|
+
const mw = createCMSMiddleware({ admin: { path: '/admin' } });
|
|
73
|
+
expect(await mw(req('/api/cms/setup/status'))).toBeNull();
|
|
74
|
+
});
|
|
75
|
+
it('does not block public routes when the secret is missing', async () => {
|
|
76
|
+
const mw = createCMSMiddleware({ admin: { path: '/admin' } });
|
|
77
|
+
expect(await mw(req('/about'))).toBeNull();
|
|
78
|
+
});
|
|
79
|
+
});
|
|
50
80
|
//# sourceMappingURL=middleware.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.test.js","sourceRoot":"","sources":["../../src/__tests__/middleware.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"middleware.test.js","sourceRoot":"","sources":["../../src/__tests__/middleware.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
import { checkSetupRequired, createInitialAdmin, isDatabaseUnavailableError, } from '../../setup/index.js';
|
|
2
|
+
import { checkSetupRequired, createInitialAdmin, isDatabaseUnavailableError, isSchemaMissingError, } from '../../setup/index.js';
|
|
3
3
|
function connectionError(code) {
|
|
4
4
|
const err = new Error(`Can't reach database server`);
|
|
5
5
|
err.code = code;
|
|
6
6
|
return err;
|
|
7
7
|
}
|
|
8
|
+
function schemaMissingError() {
|
|
9
|
+
const err = new Error('The table `public.actuate_users` does not exist in the current database.');
|
|
10
|
+
err.code = 'P2021';
|
|
11
|
+
return err;
|
|
12
|
+
}
|
|
8
13
|
describe('isDatabaseUnavailableError', () => {
|
|
9
14
|
it('detects Prisma connection codes', () => {
|
|
10
15
|
expect(isDatabaseUnavailableError(connectionError('P1001'))).toBe(true);
|
|
@@ -37,10 +42,34 @@ describe('checkSetupRequired', () => {
|
|
|
37
42
|
const db = { user: { count: vi.fn().mockRejectedValue(connectionError('ECONNREFUSED')) } };
|
|
38
43
|
await expect(checkSetupRequired(db)).rejects.toThrow(/reach database/i);
|
|
39
44
|
});
|
|
40
|
-
it('still treats non-connection errors as setup-required', async () => {
|
|
45
|
+
it('still treats unknown non-connection errors as setup-required', async () => {
|
|
41
46
|
const db = { user: { count: vi.fn().mockRejectedValue(new Error('table missing')) } };
|
|
42
47
|
await expect(checkSetupRequired(db)).resolves.toEqual({ setupRequired: true, userCount: 0 });
|
|
43
48
|
});
|
|
49
|
+
it('reports migrationsRequired when the tables do not exist yet', async () => {
|
|
50
|
+
const db = { user: { count: vi.fn().mockRejectedValue(schemaMissingError()) } };
|
|
51
|
+
await expect(checkSetupRequired(db)).resolves.toEqual({
|
|
52
|
+
setupRequired: false,
|
|
53
|
+
userCount: 0,
|
|
54
|
+
migrationsRequired: true,
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
describe('isSchemaMissingError', () => {
|
|
59
|
+
it('detects Prisma P2021/P2022 codes', () => {
|
|
60
|
+
expect(isSchemaMissingError(schemaMissingError())).toBe(true);
|
|
61
|
+
const colErr = new Error('column missing');
|
|
62
|
+
colErr.code = 'P2022';
|
|
63
|
+
expect(isSchemaMissingError(colErr)).toBe(true);
|
|
64
|
+
});
|
|
65
|
+
it('detects table-missing errors by message', () => {
|
|
66
|
+
expect(isSchemaMissingError(new Error('relation "actuate_users" does not exist'))).toBe(true);
|
|
67
|
+
});
|
|
68
|
+
it('does not flag connection errors or ordinary errors', () => {
|
|
69
|
+
expect(isSchemaMissingError(connectionError('P1001'))).toBe(false);
|
|
70
|
+
expect(isSchemaMissingError(new Error('something else'))).toBe(false);
|
|
71
|
+
expect(isSchemaMissingError(null)).toBe(false);
|
|
72
|
+
});
|
|
44
73
|
});
|
|
45
74
|
describe('createInitialAdmin', () => {
|
|
46
75
|
const validInput = {
|
|
@@ -59,6 +88,12 @@ describe('createInitialAdmin', () => {
|
|
|
59
88
|
};
|
|
60
89
|
await expect(createInitialAdmin(db, validInput)).rejects.toThrow(/reach database/i);
|
|
61
90
|
});
|
|
91
|
+
it('rethrows schema-missing errors so the route can prompt for migrations', async () => {
|
|
92
|
+
const db = {
|
|
93
|
+
$transaction: vi.fn().mockRejectedValue(schemaMissingError()),
|
|
94
|
+
};
|
|
95
|
+
await expect(createInitialAdmin(db, validInput)).rejects.toThrow(/does not exist/i);
|
|
96
|
+
});
|
|
62
97
|
it('returns a friendly error when setup was already completed', async () => {
|
|
63
98
|
const db = {
|
|
64
99
|
$transaction: vi.fn(async (fn) => fn({ user: { count: vi.fn().mockResolvedValue(1) } })),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../src/__tests__/setup/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,0BAA0B,
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../src/__tests__/setup/index.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/api/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/api/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAggC5C,iFAAiF;AACjF,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AA8JD,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAS9E;AAoTD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+lVzD"}
|
package/dist/api/handlers.js
CHANGED
|
@@ -3,7 +3,8 @@ import { populateRelations, parsePopulateParam } from '../fields/relations.js';
|
|
|
3
3
|
import { verifyPassword, hashPassword, needsRehash, compareToDummyHash } from '../auth/password.js';
|
|
4
4
|
import { createSession, verifySession, revokeSession } from '../auth/session.js';
|
|
5
5
|
import { createPasswordReset, executePasswordReset } from '../auth/reset.js';
|
|
6
|
-
import {
|
|
6
|
+
import { createUserInvite } from '../auth/invite.js';
|
|
7
|
+
import { checkSetupRequired, createInitialAdmin, isSchemaMissingError } from '../setup/index.js';
|
|
7
8
|
import { getDB } from '../db.js';
|
|
8
9
|
import { generateCodeVerifier, generateCodeChallenge, generateState, generateOAuthNonce, getAuthorizationUrl, handleOAuthCallback, } from '../auth/oauth.js';
|
|
9
10
|
import { createMfaPendingToken, verifyMfaPendingToken, computeRequestFingerprint, } from '../auth/mfa-pending.js';
|
|
@@ -33,7 +34,7 @@ import { sendFormNotifications } from '../forms/notify.js';
|
|
|
33
34
|
import { checkForUpdates } from '../upgrade/version-check.js';
|
|
34
35
|
import { createUpgradePR } from '../upgrade/upgrade-pr.js';
|
|
35
36
|
import { encryptField, decryptField } from '../security/encrypted-fields.js';
|
|
36
|
-
import { encryptSecret, decryptSecret, encryptStringArray, } from '../security/secret-storage.js';
|
|
37
|
+
import { encryptSecret, decryptSecret, encryptStringArray, decryptStringArray, } from '../security/secret-storage.js';
|
|
37
38
|
import { createRateLimiter } from '../security/rate-limit.js';
|
|
38
39
|
import { generateOpenAPISpec } from './openapi.js';
|
|
39
40
|
import { createSSEPresenceAdapter } from '../presence/index.js';
|
|
@@ -1076,6 +1077,9 @@ function requireRole(role, allowedRoles) {
|
|
|
1076
1077
|
return null;
|
|
1077
1078
|
}
|
|
1078
1079
|
const loginLimiter = createRateLimiter({ maxRequests: 5, windowMs: 15 * 60 * 1000 });
|
|
1080
|
+
// Admin-gated, but bounds invitation-email volume (and accidental loops) per
|
|
1081
|
+
// admin: enough to onboard a team, low enough to deter abuse.
|
|
1082
|
+
const inviteLimiter = createRateLimiter({ maxRequests: 20, windowMs: 60 * 60 * 1000 });
|
|
1079
1083
|
const totpLimiter = createRateLimiter({ maxRequests: 10, windowMs: 15 * 60 * 1000 });
|
|
1080
1084
|
const formLimiterGlobal = createRateLimiter({ maxRequests: 10, windowMs: 60_000 });
|
|
1081
1085
|
const aiGenerateLimiter = createRateLimiter({ maxRequests: 20, windowMs: 60 * 60 * 1000 });
|
|
@@ -1687,6 +1691,7 @@ export function registerCMSRoutes(router) {
|
|
|
1687
1691
|
const cmsConfig = getActuateConfig();
|
|
1688
1692
|
await createPasswordReset(d, email.toLowerCase().trim(), {
|
|
1689
1693
|
siteUrl,
|
|
1694
|
+
adminPath: cmsConfig?.admin?.path ?? '/admin',
|
|
1690
1695
|
platform: cmsConfig?.platform,
|
|
1691
1696
|
});
|
|
1692
1697
|
await logEvent({
|
|
@@ -1741,7 +1746,14 @@ export function registerCMSRoutes(router) {
|
|
|
1741
1746
|
return auth.error;
|
|
1742
1747
|
const user = await db().user.findUnique({
|
|
1743
1748
|
where: { id: auth.session.userId },
|
|
1744
|
-
select: {
|
|
1749
|
+
select: {
|
|
1750
|
+
id: true,
|
|
1751
|
+
email: true,
|
|
1752
|
+
name: true,
|
|
1753
|
+
role: true,
|
|
1754
|
+
isActive: true,
|
|
1755
|
+
totpEnabled: true,
|
|
1756
|
+
},
|
|
1745
1757
|
});
|
|
1746
1758
|
if (!user) {
|
|
1747
1759
|
return errorResponse('User not found', 404);
|
|
@@ -1915,6 +1927,7 @@ export function registerCMSRoutes(router) {
|
|
|
1915
1927
|
role: true,
|
|
1916
1928
|
totpSecret: true,
|
|
1917
1929
|
totpEnabled: true,
|
|
1930
|
+
backupCodes: true,
|
|
1918
1931
|
isActive: true,
|
|
1919
1932
|
},
|
|
1920
1933
|
});
|
|
@@ -1922,7 +1935,34 @@ export function registerCMSRoutes(router) {
|
|
|
1922
1935
|
return errorResponse('Invalid request', 400);
|
|
1923
1936
|
}
|
|
1924
1937
|
const decryptedSecret = await decryptSecret(user.totpSecret);
|
|
1925
|
-
|
|
1938
|
+
let valid = verifyTOTP(body.code, decryptedSecret);
|
|
1939
|
+
let usedBackupCode = false;
|
|
1940
|
+
// Backup-code fallback. A user who has lost their authenticator can sign
|
|
1941
|
+
// in with one of the one-time recovery codes issued at enrollment. Each
|
|
1942
|
+
// code is single-use: on a match we remove it and re-persist the
|
|
1943
|
+
// remaining codes so it can never be replayed. We compare against every
|
|
1944
|
+
// stored code in constant time to avoid leaking which/whether one matched.
|
|
1945
|
+
const storedBackups = Array.isArray(user.backupCodes) ? user.backupCodes : [];
|
|
1946
|
+
if (!valid && storedBackups.length > 0) {
|
|
1947
|
+
try {
|
|
1948
|
+
const { findBackupCodeMatch } = await import('../auth/totp.js');
|
|
1949
|
+
const codes = await decryptStringArray(storedBackups);
|
|
1950
|
+
const matchIdx = findBackupCodeMatch(codes, body.code);
|
|
1951
|
+
if (matchIdx !== -1) {
|
|
1952
|
+
valid = true;
|
|
1953
|
+
usedBackupCode = true;
|
|
1954
|
+
const remaining = codes.filter((_, i) => i !== matchIdx);
|
|
1955
|
+
await db().user.update({
|
|
1956
|
+
where: { id: user.id },
|
|
1957
|
+
data: { backupCodes: await encryptStringArray(remaining) },
|
|
1958
|
+
});
|
|
1959
|
+
}
|
|
1960
|
+
}
|
|
1961
|
+
catch {
|
|
1962
|
+
// Decryption failure (e.g. the encryption key was rotated) — treat
|
|
1963
|
+
// as no match rather than throwing a 500 at the login screen.
|
|
1964
|
+
}
|
|
1965
|
+
}
|
|
1926
1966
|
if (!valid) {
|
|
1927
1967
|
await logEvent({
|
|
1928
1968
|
event: 'login_failed',
|
|
@@ -1952,7 +1992,7 @@ export function registerCMSRoutes(router) {
|
|
|
1952
1992
|
userId: user.id,
|
|
1953
1993
|
ipAddress: isResolvedIp(ip) ? ip : undefined,
|
|
1954
1994
|
userAgent: userAgent ?? undefined,
|
|
1955
|
-
details: { mfa: 'totp' },
|
|
1995
|
+
details: { mfa: usedBackupCode ? 'backup_code' : 'totp' },
|
|
1956
1996
|
});
|
|
1957
1997
|
const isProduction = process.env.NODE_ENV === 'production';
|
|
1958
1998
|
const sessionCookie = [
|
|
@@ -3436,6 +3476,9 @@ export function registerCMSRoutes(router) {
|
|
|
3436
3476
|
return json({ data: result }, 201);
|
|
3437
3477
|
}
|
|
3438
3478
|
catch (err) {
|
|
3479
|
+
if (isSchemaMissingError(err)) {
|
|
3480
|
+
return errorResponse('Database not migrated: the Actuate CMS tables do not exist yet. Run `prisma migrate deploy` against your database, then try again.', 503);
|
|
3481
|
+
}
|
|
3439
3482
|
return internalError(err);
|
|
3440
3483
|
}
|
|
3441
3484
|
});
|
|
@@ -4292,6 +4335,61 @@ export function registerCMSRoutes(router) {
|
|
|
4292
4335
|
return internalError(err, 'users search');
|
|
4293
4336
|
}
|
|
4294
4337
|
});
|
|
4338
|
+
router.post('/users/invite', async (request) => {
|
|
4339
|
+
try {
|
|
4340
|
+
const auth = await requireAuth(request);
|
|
4341
|
+
if (auth.error)
|
|
4342
|
+
return auth.error;
|
|
4343
|
+
const roleErr = requireRole(auth.session.role, ADMIN_ROLES);
|
|
4344
|
+
if (roleErr)
|
|
4345
|
+
return roleErr;
|
|
4346
|
+
if (!(await checkRateLimitAsync(inviteLimiter, `invite:${auth.session.userId}`))) {
|
|
4347
|
+
return errorResponse('Too many invitations. Please try again later.', 429);
|
|
4348
|
+
}
|
|
4349
|
+
const d = db();
|
|
4350
|
+
if (!hasModel(d, 'user'))
|
|
4351
|
+
return modelNotAvailable('user');
|
|
4352
|
+
const body = (await request.json());
|
|
4353
|
+
if (!body.email)
|
|
4354
|
+
return errorResponse('Email is required', 400);
|
|
4355
|
+
const cmsConfig = getActuateConfig();
|
|
4356
|
+
const siteUrl = process.env.NEXT_PUBLIC_SITE_URL ?? new URL(request.url).origin;
|
|
4357
|
+
const inviter = await d.user.findUnique({
|
|
4358
|
+
where: { id: auth.session.userId },
|
|
4359
|
+
select: { name: true },
|
|
4360
|
+
});
|
|
4361
|
+
const result = await createUserInvite(d, { email: body.email, name: body.name, role: body.role ?? 'AUTHOR' }, {
|
|
4362
|
+
siteUrl,
|
|
4363
|
+
adminPath: cmsConfig?.admin?.path ?? '/admin',
|
|
4364
|
+
invitedByName: inviter?.name ?? undefined,
|
|
4365
|
+
siteName: cmsConfig?.admin?.branding?.name ??
|
|
4366
|
+
undefined,
|
|
4367
|
+
});
|
|
4368
|
+
if (!result.success) {
|
|
4369
|
+
return errorResponse(result.error ?? 'Could not create invitation', 400);
|
|
4370
|
+
}
|
|
4371
|
+
await logEvent({
|
|
4372
|
+
event: 'user_invited',
|
|
4373
|
+
userId: auth.session.userId,
|
|
4374
|
+
details: {
|
|
4375
|
+
targetEmail: result.user?.email,
|
|
4376
|
+
role: result.user?.role,
|
|
4377
|
+
emailed: result.emailed,
|
|
4378
|
+
},
|
|
4379
|
+
});
|
|
4380
|
+
return json({
|
|
4381
|
+
data: {
|
|
4382
|
+
success: true,
|
|
4383
|
+
user: result.user,
|
|
4384
|
+
emailed: result.emailed,
|
|
4385
|
+
inviteUrl: result.inviteUrl,
|
|
4386
|
+
},
|
|
4387
|
+
});
|
|
4388
|
+
}
|
|
4389
|
+
catch (err) {
|
|
4390
|
+
return internalError(err, 'user invite');
|
|
4391
|
+
}
|
|
4392
|
+
});
|
|
4295
4393
|
router.delete('/users/:id', async (request, params) => {
|
|
4296
4394
|
try {
|
|
4297
4395
|
const auth = await requireAuth(request);
|
|
@@ -9018,6 +9116,44 @@ export function registerCMSRoutes(router) {
|
|
|
9018
9116
|
return internalError(err, 'security GET');
|
|
9019
9117
|
}
|
|
9020
9118
|
});
|
|
9119
|
+
// Read-only AI status. The dashboard cannot configure AI — it is wired up
|
|
9120
|
+
// server-side via `aiPlugin({ provider, apiKey })` reading environment
|
|
9121
|
+
// variables. This endpoint just reports whether the plugin is installed and
|
|
9122
|
+
// a provider is configured so the admin UI can show an honest status instead
|
|
9123
|
+
// of a decorative key field. Never returns secret values.
|
|
9124
|
+
router.get('/ai/status', async (request) => {
|
|
9125
|
+
try {
|
|
9126
|
+
const auth = await requireAuth(request);
|
|
9127
|
+
if (auth.error)
|
|
9128
|
+
return auth.error;
|
|
9129
|
+
const adminErr = requireAdminScope(auth.session);
|
|
9130
|
+
if (adminErr)
|
|
9131
|
+
return adminErr;
|
|
9132
|
+
let installed = false;
|
|
9133
|
+
let configured = false;
|
|
9134
|
+
try {
|
|
9135
|
+
const aiMod = await importAIPlugin();
|
|
9136
|
+
installed = true;
|
|
9137
|
+
if (typeof aiMod?.getAIProvider === 'function') {
|
|
9138
|
+
configured = aiMod.getAIProvider() != null;
|
|
9139
|
+
}
|
|
9140
|
+
}
|
|
9141
|
+
catch {
|
|
9142
|
+
installed = false;
|
|
9143
|
+
}
|
|
9144
|
+
// Best-effort provider hint from the environment. We only expose which
|
|
9145
|
+
// provider env var is present, never the key value itself.
|
|
9146
|
+
const provider = process.env.ANTHROPIC_API_KEY
|
|
9147
|
+
? 'anthropic'
|
|
9148
|
+
: process.env.OPENAI_API_KEY
|
|
9149
|
+
? 'openai'
|
|
9150
|
+
: null;
|
|
9151
|
+
return json({ data: { installed, configured, provider } });
|
|
9152
|
+
}
|
|
9153
|
+
catch (err) {
|
|
9154
|
+
return internalError(err, 'ai status');
|
|
9155
|
+
}
|
|
9156
|
+
});
|
|
9021
9157
|
router.put('/security', async (request) => {
|
|
9022
9158
|
try {
|
|
9023
9159
|
const auth = await requireAuth(request);
|