@actuate-media/cms-admin 0.28.0 → 0.29.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 (50) hide show
  1. package/dist/AdminRoot.d.ts +7 -0
  2. package/dist/AdminRoot.d.ts.map +1 -1
  3. package/dist/AdminRoot.js +7 -2
  4. package/dist/AdminRoot.js.map +1 -1
  5. package/dist/__tests__/views/account-security.render.test.d.ts +2 -0
  6. package/dist/__tests__/views/account-security.render.test.d.ts.map +1 -0
  7. package/dist/__tests__/views/account-security.render.test.js +98 -0
  8. package/dist/__tests__/views/account-security.render.test.js.map +1 -0
  9. package/dist/__tests__/views/login-mfa.render.test.d.ts +2 -0
  10. package/dist/__tests__/views/login-mfa.render.test.d.ts.map +1 -0
  11. package/dist/__tests__/views/login-mfa.render.test.js +73 -0
  12. package/dist/__tests__/views/login-mfa.render.test.js.map +1 -0
  13. package/dist/actuate-admin.css +1 -1
  14. package/dist/components/Breadcrumbs.d.ts.map +1 -1
  15. package/dist/components/Breadcrumbs.js +1 -0
  16. package/dist/components/Breadcrumbs.js.map +1 -1
  17. package/dist/views/Login.d.ts +16 -1
  18. package/dist/views/Login.d.ts.map +1 -1
  19. package/dist/views/Login.js +55 -3
  20. package/dist/views/Login.js.map +1 -1
  21. package/dist/views/Profile.d.ts +12 -0
  22. package/dist/views/Profile.d.ts.map +1 -0
  23. package/dist/views/Profile.js +16 -0
  24. package/dist/views/Profile.js.map +1 -0
  25. package/dist/views/profile/AccountSecurity.d.ts +2 -0
  26. package/dist/views/profile/AccountSecurity.d.ts.map +1 -0
  27. package/dist/views/profile/AccountSecurity.js +117 -0
  28. package/dist/views/profile/AccountSecurity.js.map +1 -0
  29. package/dist/views/profile/useMfaEnrollment.d.ts +35 -0
  30. package/dist/views/profile/useMfaEnrollment.d.ts.map +1 -0
  31. package/dist/views/profile/useMfaEnrollment.js +103 -0
  32. package/dist/views/profile/useMfaEnrollment.js.map +1 -0
  33. package/dist/views/settings/AuthMfaCard.d.ts +2 -1
  34. package/dist/views/settings/AuthMfaCard.d.ts.map +1 -1
  35. package/dist/views/settings/AuthMfaCard.js +3 -2
  36. package/dist/views/settings/AuthMfaCard.js.map +1 -1
  37. package/dist/views/settings/SecurityTab.d.ts.map +1 -1
  38. package/dist/views/settings/SecurityTab.js +1 -1
  39. package/dist/views/settings/SecurityTab.js.map +1 -1
  40. package/package.json +3 -2
  41. package/src/AdminRoot.tsx +18 -0
  42. package/src/__tests__/views/account-security.render.test.tsx +140 -0
  43. package/src/__tests__/views/login-mfa.render.test.tsx +88 -0
  44. package/src/components/Breadcrumbs.tsx +1 -0
  45. package/src/views/Login.tsx +247 -94
  46. package/src/views/Profile.tsx +54 -0
  47. package/src/views/profile/AccountSecurity.tsx +406 -0
  48. package/src/views/profile/useMfaEnrollment.ts +120 -0
  49. package/src/views/settings/AuthMfaCard.tsx +19 -4
  50. package/src/views/settings/SecurityTab.tsx +1 -0
@@ -116,12 +116,19 @@ async function getCaptchaToken(provider, siteKey, action) {
116
116
  }
117
117
  return '';
118
118
  }
119
- export function Login({ onLogin, onNavigate, oauthProviders, captchaConfig, branding, }) {
119
+ export function Login({ onLogin, onVerifyTotp, onNavigate, oauthProviders, captchaConfig, branding, }) {
120
120
  const [email, setEmail] = useState('');
121
121
  const [password, setPassword] = useState('');
122
122
  const [showPassword, setShowPassword] = useState(false);
123
123
  const [submitting, setSubmitting] = useState(false);
124
124
  const [error, setError] = useState('');
125
+ // Second-factor challenge state. When `mfaPendingToken` is set we swap the
126
+ // email/password form for the TOTP code entry.
127
+ const [mfaPendingToken, setMfaPendingToken] = useState(null);
128
+ const [totpCode, setTotpCode] = useState('');
129
+ const [useBackupCode, setUseBackupCode] = useState(false);
130
+ const [totpError, setTotpError] = useState('');
131
+ const [verifying, setVerifying] = useState(false);
125
132
  useCaptchaScript(captchaConfig?.provider, captchaConfig?.siteKey);
126
133
  const canSubmit = email.trim() && password && !submitting;
127
134
  const handleSubmit = async (e) => {
@@ -141,6 +148,12 @@ export function Login({ onLogin, onNavigate, oauthProviders, captchaConfig, bran
141
148
  }
142
149
  }
143
150
  const result = await onLogin(email.trim(), password, captchaToken);
151
+ if (result.requiresTOTP && result.mfaPendingToken) {
152
+ // Password verified — advance to the second-factor step.
153
+ setMfaPendingToken(result.mfaPendingToken);
154
+ setPassword('');
155
+ return;
156
+ }
144
157
  if (!result.success) {
145
158
  setError(result.error ?? 'Invalid email or password');
146
159
  }
@@ -152,6 +165,37 @@ export function Login({ onLogin, onNavigate, oauthProviders, captchaConfig, bran
152
165
  setSubmitting(false);
153
166
  }
154
167
  };
168
+ const handleVerifyTotp = async (e) => {
169
+ e.preventDefault();
170
+ const code = totpCode.trim();
171
+ if (!code || !mfaPendingToken)
172
+ return;
173
+ setTotpError('');
174
+ if (!onVerifyTotp) {
175
+ setTotpError('Two-factor sign-in is not available. Contact your administrator.');
176
+ return;
177
+ }
178
+ setVerifying(true);
179
+ try {
180
+ const result = await onVerifyTotp(mfaPendingToken, code);
181
+ if (!result.success) {
182
+ setTotpError(result.error ?? 'That code was not accepted. Try again.');
183
+ }
184
+ }
185
+ catch (err) {
186
+ setTotpError(err instanceof Error ? err.message : 'An unexpected error occurred');
187
+ }
188
+ finally {
189
+ setVerifying(false);
190
+ }
191
+ };
192
+ const resetToPasswordStep = () => {
193
+ setMfaPendingToken(null);
194
+ setTotpCode('');
195
+ setUseBackupCode(false);
196
+ setTotpError('');
197
+ setError('');
198
+ };
155
199
  const handleOAuthClick = (provider) => {
156
200
  window.location.href = `/api/cms/auth/oauth/${provider}`;
157
201
  };
@@ -165,9 +209,17 @@ export function Login({ onLogin, onNavigate, oauthProviders, captchaConfig, bran
165
209
  const brandTagline = branding?.tagline ?? 'Sign in to your account';
166
210
  const showLogo = customLogo !== null;
167
211
  return (_jsx("div", { className: "flex min-h-screen items-center justify-center bg-gray-50 px-4", children: _jsxs("div", { className: "w-full max-w-md", children: [_jsxs("div", { className: "mb-8 text-center", children: [showLogo &&
168
- (customLogo ? (_jsx("img", { src: customLogo, alt: brandName, className: "mx-auto mb-4 max-h-16 w-auto object-contain", draggable: false })) : (_jsx(ActuateBrandLogo, { className: "mx-auto mb-4 h-14 w-auto" }))), _jsx("h1", { className: "text-2xl font-bold text-gray-900", children: brandName }), _jsx("p", { className: "mt-2 text-gray-600", children: brandTagline })] }), _jsxs("form", { onSubmit: handleSubmit, className: "space-y-5 rounded-xl border border-gray-200 bg-white p-6 shadow-sm", children: [error && (_jsxs("div", { className: "flex items-start gap-3 rounded-lg border border-red-200 bg-red-50 p-3", children: [_jsx(AlertTriangle, { className: "mt-0.5 h-5 w-5 shrink-0 text-red-600" }), _jsx("p", { className: "text-sm text-red-800", children: error })] })), _jsxs("div", { children: [_jsx("label", { htmlFor: "login-email", className: "mb-1.5 block text-sm font-medium text-gray-700", children: "Email Address" }), _jsx("input", { id: "login-email", type: "email", value: email, onChange: (e) => setEmail(e.target.value), placeholder: "admin@example.com", className: "w-full rounded-lg border border-gray-300 px-3 py-2.5 text-sm focus:border-blue-500 focus:ring-2 focus:ring-blue-500 focus:outline-none", required: true, autoFocus: true, autoComplete: "email" })] }), _jsxs("div", { children: [_jsxs("div", { className: "mb-1.5 flex items-center justify-between", children: [_jsx("label", { htmlFor: "login-password", className: "block text-sm font-medium text-gray-700", children: "Password" }), onNavigate && (_jsx("button", { type: "button", onClick: () => onNavigate('/forgot-password'), className: "text-xs font-medium text-blue-600 hover:text-blue-700", children: "Forgot Password?" }))] }), _jsxs("div", { className: "relative", children: [_jsx("input", { id: "login-password", type: showPassword ? 'text' : 'password', value: password, onChange: (e) => setPassword(e.target.value), placeholder: "Enter your password", className: "w-full rounded-lg border border-gray-300 px-3 py-2.5 pr-10 text-sm focus:border-blue-500 focus:ring-2 focus:ring-blue-500 focus:outline-none", required: true, autoComplete: "current-password" }), _jsx("button", { type: "button", onClick: () => setShowPassword(!showPassword), className: "absolute top-1/2 right-3 -translate-y-1/2 text-gray-400 hover:text-gray-600", tabIndex: -1, children: showPassword ? _jsx(EyeOff, { className: "h-4 w-4" }) : _jsx(Eye, { className: "h-4 w-4" }) })] })] }), _jsx("button", { type: "submit", disabled: !canSubmit, className: "flex w-full items-center justify-center gap-2 rounded-lg bg-blue-600 py-2.5 font-medium text-white transition-colors hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-50", children: submitting ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "h-4 w-4 animate-spin" }), "Signing in..."] })) : ('Sign In') }), enabledProviders.length > 0 && (_jsxs(_Fragment, { children: [_jsxs("div", { className: "relative", children: [_jsx("div", { className: "absolute inset-0 flex items-center", children: _jsx("div", { className: "w-full border-t border-gray-200" }) }), _jsx("div", { className: "relative flex justify-center text-sm", children: _jsx("span", { className: "bg-white px-3 text-gray-500", children: "Or continue with" }) })] }), _jsx("div", { className: "grid gap-3", children: enabledProviders.map((provider) => {
212
+ (customLogo ? (_jsx("img", { src: customLogo, alt: brandName, className: "mx-auto mb-4 max-h-16 w-auto object-contain", draggable: false })) : (_jsx(ActuateBrandLogo, { className: "mx-auto mb-4 h-14 w-auto" }))), _jsx("h1", { className: "text-2xl font-bold text-gray-900", children: brandName }), _jsx("p", { className: "mt-2 text-gray-600", children: brandTagline })] }), mfaPendingToken ? (_jsxs("form", { onSubmit: handleVerifyTotp, className: "space-y-5 rounded-xl border border-gray-200 bg-white p-6 shadow-sm", children: [_jsxs("div", { children: [_jsx("h2", { className: "text-lg font-semibold text-gray-900", children: "Two-factor authentication" }), _jsx("p", { className: "mt-1 text-sm text-gray-600", children: useBackupCode
213
+ ? 'Enter one of your one-time backup codes.'
214
+ : 'Enter the 6-digit code from your authenticator app.' })] }), totpError && (_jsxs("div", { className: "flex items-start gap-3 rounded-lg border border-red-200 bg-red-50 p-3", children: [_jsx(AlertTriangle, { className: "mt-0.5 h-5 w-5 shrink-0 text-red-600" }), _jsx("p", { className: "text-sm text-red-800", children: totpError })] })), _jsxs("div", { children: [_jsx("label", { htmlFor: "totp-code", className: "mb-1.5 block text-sm font-medium text-gray-700", children: useBackupCode ? 'Backup code' : 'Authentication code' }), _jsx("input", { id: "totp-code", type: "text", inputMode: useBackupCode ? 'text' : 'numeric', autoComplete: "one-time-code", value: totpCode, onChange: (e) => setTotpCode(useBackupCode
215
+ ? e.target.value.trim()
216
+ : e.target.value.replace(/\D/g, '').slice(0, 6)), placeholder: useBackupCode ? 'abcd1234' : '123456', className: "w-full rounded-lg border border-gray-300 px-3 py-2.5 text-center font-mono text-lg tracking-[0.3em] focus:border-blue-500 focus:ring-2 focus:ring-blue-500 focus:outline-none", autoFocus: true, required: true })] }), _jsx("button", { type: "submit", disabled: !totpCode.trim() || verifying, className: "flex w-full items-center justify-center gap-2 rounded-lg bg-blue-600 py-2.5 font-medium text-white transition-colors hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-50", children: verifying ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "h-4 w-4 animate-spin" }), "Verifying..."] })) : ('Verify') }), _jsxs("div", { className: "flex items-center justify-between text-xs", children: [_jsx("button", { type: "button", onClick: () => {
217
+ setUseBackupCode((v) => !v);
218
+ setTotpCode('');
219
+ setTotpError('');
220
+ }, className: "font-medium text-blue-600 hover:text-blue-700", children: useBackupCode ? 'Use authenticator app instead' : 'Use a backup code' }), _jsx("button", { type: "button", onClick: resetToPasswordStep, className: "font-medium text-gray-500 hover:text-gray-700", children: "Back to sign in" })] })] })) : (_jsxs("form", { onSubmit: handleSubmit, className: "space-y-5 rounded-xl border border-gray-200 bg-white p-6 shadow-sm", children: [error && (_jsxs("div", { className: "flex items-start gap-3 rounded-lg border border-red-200 bg-red-50 p-3", children: [_jsx(AlertTriangle, { className: "mt-0.5 h-5 w-5 shrink-0 text-red-600" }), _jsx("p", { className: "text-sm text-red-800", children: error })] })), _jsxs("div", { children: [_jsx("label", { htmlFor: "login-email", className: "mb-1.5 block text-sm font-medium text-gray-700", children: "Email Address" }), _jsx("input", { id: "login-email", type: "email", value: email, onChange: (e) => setEmail(e.target.value), placeholder: "admin@example.com", className: "w-full rounded-lg border border-gray-300 px-3 py-2.5 text-sm focus:border-blue-500 focus:ring-2 focus:ring-blue-500 focus:outline-none", required: true, autoFocus: true, autoComplete: "email" })] }), _jsxs("div", { children: [_jsxs("div", { className: "mb-1.5 flex items-center justify-between", children: [_jsx("label", { htmlFor: "login-password", className: "block text-sm font-medium text-gray-700", children: "Password" }), onNavigate && (_jsx("button", { type: "button", onClick: () => onNavigate('/forgot-password'), className: "text-xs font-medium text-blue-600 hover:text-blue-700", children: "Forgot Password?" }))] }), _jsxs("div", { className: "relative", children: [_jsx("input", { id: "login-password", type: showPassword ? 'text' : 'password', value: password, onChange: (e) => setPassword(e.target.value), placeholder: "Enter your password", className: "w-full rounded-lg border border-gray-300 px-3 py-2.5 pr-10 text-sm focus:border-blue-500 focus:ring-2 focus:ring-blue-500 focus:outline-none", required: true, autoComplete: "current-password" }), _jsx("button", { type: "button", onClick: () => setShowPassword(!showPassword), className: "absolute top-1/2 right-3 -translate-y-1/2 text-gray-400 hover:text-gray-600", tabIndex: -1, children: showPassword ? _jsx(EyeOff, { className: "h-4 w-4" }) : _jsx(Eye, { className: "h-4 w-4" }) })] })] }), _jsx("button", { type: "submit", disabled: !canSubmit, className: "flex w-full items-center justify-center gap-2 rounded-lg bg-blue-600 py-2.5 font-medium text-white transition-colors hover:bg-blue-700 disabled:cursor-not-allowed disabled:opacity-50", children: submitting ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "h-4 w-4 animate-spin" }), "Signing in..."] })) : ('Sign In') }), enabledProviders.length > 0 && (_jsxs(_Fragment, { children: [_jsxs("div", { className: "relative", children: [_jsx("div", { className: "absolute inset-0 flex items-center", children: _jsx("div", { className: "w-full border-t border-gray-200" }) }), _jsx("div", { className: "relative flex justify-center text-sm", children: _jsx("span", { className: "bg-white px-3 text-gray-500", children: "Or continue with" }) })] }), _jsx("div", { className: "grid gap-3", children: enabledProviders.map((provider) => {
169
221
  const colors = OAUTH_COLORS[provider] ?? OAUTH_COLORS.google;
170
222
  return (_jsxs("button", { type: "button", onClick: () => handleOAuthClick(provider), className: `flex w-full items-center justify-center gap-3 border px-4 py-2.5 ${colors?.border ?? ''} ${colors?.bg ?? ''} ${colors?.text ?? ''} rounded-lg text-sm font-medium ${colors?.hover ?? ''} transition-colors`, children: [_jsx(OAuthIcon, { provider: provider }), OAUTH_LABELS[provider] ?? provider] }, provider));
171
- }) })] }))] })] }) }));
223
+ }) })] }))] }))] }) }));
172
224
  }
173
225
  //# sourceMappingURL=Login.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Login.js","sourceRoot":"","sources":["../../src/views/Login.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Login.js","sourceRoot":"","sources":["../../src/views/Login.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface ProfileProps {
2
+ onNavigate?: (path: string) => void;
3
+ session?: {
4
+ user?: {
5
+ name?: string;
6
+ email?: string;
7
+ role?: string;
8
+ };
9
+ };
10
+ }
11
+ export declare function Profile({ session }?: ProfileProps): import("react/jsx-runtime").JSX.Element;
12
+ //# sourceMappingURL=Profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Profile.d.ts","sourceRoot":"","sources":["../../src/views/Profile.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAA;CACtE;AAOD,wBAAgB,OAAO,CAAC,EAAE,OAAO,EAAE,GAAE,YAAiB,2CAqCrD"}
@@ -0,0 +1,16 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useId } from 'react';
4
+ import { SecurityCard } from './settings/securityPrimitives.js';
5
+ import { AccountSecurity } from './profile/AccountSecurity.js';
6
+ function roleLabel(role) {
7
+ if (!role)
8
+ return 'Member';
9
+ return role.charAt(0).toUpperCase() + role.slice(1).toLowerCase();
10
+ }
11
+ export function Profile({ session } = {}) {
12
+ const accountHeadingId = useId();
13
+ const user = session?.user;
14
+ return (_jsxs("div", { className: "p-3 pr-6 sm:p-4 sm:pr-8", children: [_jsxs("div", { className: "mb-4", children: [_jsx("h1", { className: "mb-1 text-2xl font-semibold text-gray-900", children: "Your profile" }), _jsx("p", { className: "text-sm text-gray-600", children: "Manage your account details and sign-in security." })] }), _jsxs("div", { className: "grid max-w-3xl gap-4", children: [_jsx(SecurityCard, { headingId: accountHeadingId, title: "Account", description: "Your identity within this CMS. Contact an administrator to change your role.", children: _jsxs("dl", { className: "divide-border divide-y text-sm", children: [_jsxs("div", { className: "flex items-center justify-between gap-3 py-2", children: [_jsx("dt", { className: "text-muted-foreground", children: "Name" }), _jsx("dd", { className: "text-foreground", children: user?.name ?? '—' })] }), _jsxs("div", { className: "flex items-center justify-between gap-3 py-2", children: [_jsx("dt", { className: "text-muted-foreground", children: "Email" }), _jsx("dd", { className: "text-foreground", children: user?.email ?? '—' })] }), _jsxs("div", { className: "flex items-center justify-between gap-3 py-2", children: [_jsx("dt", { className: "text-muted-foreground", children: "Role" }), _jsx("dd", { className: "text-foreground", children: roleLabel(user?.role) })] })] }) }), _jsx(AccountSecurity, {})] })] }));
15
+ }
16
+ //# sourceMappingURL=Profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Profile.js","sourceRoot":"","sources":["../../src/views/Profile.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAO9D,SAAS,SAAS,CAAC,IAAa;IAC9B,IAAI,CAAC,IAAI;QAAE,OAAO,QAAQ,CAAA;IAC1B,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;AACnE,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,EAAE,OAAO,KAAmB,EAAE;IACpD,MAAM,gBAAgB,GAAG,KAAK,EAAE,CAAA;IAChC,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,CAAA;IAE1B,OAAO,CACL,eAAK,SAAS,EAAC,yBAAyB,aACtC,eAAK,SAAS,EAAC,MAAM,aACnB,aAAI,SAAS,EAAC,2CAA2C,6BAAkB,EAC3E,YAAG,SAAS,EAAC,uBAAuB,kEAAsD,IACtF,EAEN,eAAK,SAAS,EAAC,sBAAsB,aACnC,KAAC,YAAY,IACX,SAAS,EAAE,gBAAgB,EAC3B,KAAK,EAAC,SAAS,EACf,WAAW,EAAC,8EAA8E,YAE1F,cAAI,SAAS,EAAC,gCAAgC,aAC5C,eAAK,SAAS,EAAC,8CAA8C,aAC3D,aAAI,SAAS,EAAC,uBAAuB,qBAAU,EAC/C,aAAI,SAAS,EAAC,iBAAiB,YAAE,IAAI,EAAE,IAAI,IAAI,GAAG,GAAM,IACpD,EACN,eAAK,SAAS,EAAC,8CAA8C,aAC3D,aAAI,SAAS,EAAC,uBAAuB,sBAAW,EAChD,aAAI,SAAS,EAAC,iBAAiB,YAAE,IAAI,EAAE,KAAK,IAAI,GAAG,GAAM,IACrD,EACN,eAAK,SAAS,EAAC,8CAA8C,aAC3D,aAAI,SAAS,EAAC,uBAAuB,qBAAU,EAC/C,aAAI,SAAS,EAAC,iBAAiB,YAAE,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,GAAM,IACxD,IACH,GACQ,EAEf,KAAC,eAAe,KAAG,IACf,IACF,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function AccountSecurity(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=AccountSecurity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccountSecurity.d.ts","sourceRoot":"","sources":["../../../src/views/profile/AccountSecurity.tsx"],"names":[],"mappings":"AA4BA,wBAAgB,eAAe,4CAyX9B"}
@@ -0,0 +1,117 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useId, useRef, useState } from 'react';
4
+ import { QRCodeSVG } from 'qrcode.react';
5
+ import { toast } from 'sonner';
6
+ import { AlertTriangle, Check, Copy, Download, Loader2, ShieldCheck, ShieldAlert, } from 'lucide-react';
7
+ import { SecurityCard, StatusRow } from '../settings/securityPrimitives.js';
8
+ import { useMfaEnrollment } from './useMfaEnrollment.js';
9
+ function FieldError({ id, message }) {
10
+ if (!message)
11
+ return null;
12
+ return (_jsx("p", { id: id, role: "alert", className: "text-destructive mt-1.5 text-sm", children: message }));
13
+ }
14
+ export function AccountSecurity() {
15
+ const headingId = useId();
16
+ const pwId = useId();
17
+ const pwErrId = useId();
18
+ const codeId = useId();
19
+ const codeErrId = useId();
20
+ const disablePwId = useId();
21
+ const disableErrId = useId();
22
+ const mfa = useMfaEnrollment();
23
+ const [step, setStep] = useState('idle');
24
+ const [password, setPassword] = useState('');
25
+ const [verifyCode, setVerifyCode] = useState('');
26
+ const [setupError, setSetupError] = useState(null);
27
+ const [codeError, setCodeError] = useState(null);
28
+ const [savedAcknowledged, setSavedAcknowledged] = useState(false);
29
+ const [disabling, setDisabling] = useState(false);
30
+ const [disablePassword, setDisablePassword] = useState('');
31
+ const [disableError, setDisableError] = useState(null);
32
+ const codeInputRef = useRef(null);
33
+ function resetSetup() {
34
+ mfa.cancelSetup();
35
+ setStep('idle');
36
+ setPassword('');
37
+ setVerifyCode('');
38
+ setSetupError(null);
39
+ setCodeError(null);
40
+ setSavedAcknowledged(false);
41
+ }
42
+ async function handleBeginSetup() {
43
+ setSetupError(null);
44
+ const result = await mfa.beginSetup(password);
45
+ if (!result.ok) {
46
+ setSetupError(result.error ?? 'Could not start MFA setup.');
47
+ return;
48
+ }
49
+ setPassword('');
50
+ setStep('enroll');
51
+ // Move focus to the code field once the QR is shown.
52
+ requestAnimationFrame(() => codeInputRef.current?.focus());
53
+ }
54
+ async function handleConfirmSetup() {
55
+ setCodeError(null);
56
+ const result = await mfa.confirmSetup(verifyCode);
57
+ if (!result.ok) {
58
+ setCodeError(result.error ?? 'That code did not match. Try the current one.');
59
+ return;
60
+ }
61
+ toast.success('Two-factor authentication is now enabled.');
62
+ resetSetup();
63
+ }
64
+ async function handleDisable() {
65
+ setDisableError(null);
66
+ const result = await mfa.disable(disablePassword);
67
+ if (!result.ok) {
68
+ setDisableError(result.error ?? 'Could not disable MFA.');
69
+ return;
70
+ }
71
+ toast.success('Two-factor authentication has been disabled.');
72
+ setDisabling(false);
73
+ setDisablePassword('');
74
+ }
75
+ function copyBackupCodes() {
76
+ if (!mfa.enrollment)
77
+ return;
78
+ void navigator.clipboard
79
+ ?.writeText(mfa.enrollment.backupCodes.join('\n'))
80
+ .then(() => toast.success('Backup codes copied to clipboard.'))
81
+ .catch(() => toast.error('Could not copy codes. Copy them manually.'));
82
+ }
83
+ function downloadBackupCodes() {
84
+ if (!mfa.enrollment)
85
+ return;
86
+ const blob = new Blob([
87
+ 'Actuate CMS — two-factor backup codes\n',
88
+ 'Each code can be used once if you lose access to your authenticator app.\n\n',
89
+ mfa.enrollment.backupCodes.join('\n'),
90
+ '\n',
91
+ ], { type: 'text/plain' });
92
+ const url = URL.createObjectURL(blob);
93
+ const a = document.createElement('a');
94
+ a.href = url;
95
+ a.download = 'actuate-backup-codes.txt';
96
+ a.click();
97
+ URL.revokeObjectURL(url);
98
+ }
99
+ return (_jsxs(SecurityCard, { headingId: headingId, title: "Two-factor authentication", description: "Add a one-time code from an authenticator app to your sign-in for an extra layer of protection.", children: [mfa.status === 'loading' && (_jsxs("div", { className: "text-muted-foreground flex items-center gap-2 text-sm", children: [_jsx(Loader2, { size: 16, className: "animate-spin", "aria-hidden": "true" }), "Checking your MFA status\u2026"] })), mfa.status === 'error' && (_jsxs("div", { className: "flex items-center justify-between gap-3", children: [_jsx("p", { className: "text-muted-foreground text-sm", children: "Could not load your MFA status." }), _jsx("button", { type: "button", onClick: () => void mfa.refresh(), className: "border-border text-foreground hover:bg-accent rounded-md border px-3 py-1.5 text-sm transition-colors", children: "Retry" })] })), mfa.status === 'enabled' && (_jsxs("div", { className: "space-y-4", children: [_jsx(StatusRow, { status: "pass", label: "Two-factor authentication", value: "Enabled" }), !disabling ? (_jsxs("button", { type: "button", onClick: () => {
100
+ setDisabling(true);
101
+ setDisableError(null);
102
+ }, className: "border-border text-foreground hover:bg-accent inline-flex items-center gap-2 rounded-md border px-3 py-2 text-sm transition-colors", children: [_jsx(ShieldAlert, { size: 16, "aria-hidden": "true" }), "Disable two-factor"] })) : (_jsxs("div", { className: "border-destructive/30 bg-destructive/5 space-y-3 rounded-md border p-3", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx(AlertTriangle, { size: 16, className: "text-destructive mt-0.5 shrink-0", "aria-hidden": "true" }), _jsx("p", { className: "text-foreground text-sm", children: "Disabling two-factor makes your account password-only and signs out your other sessions. Confirm your password to continue." })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: disablePwId, className: "text-foreground mb-1 block text-sm font-medium", children: "Current password" }), _jsx("input", { id: disablePwId, type: "password", autoComplete: "current-password", value: disablePassword, onChange: (e) => setDisablePassword(e.target.value), "aria-invalid": disableError ? true : undefined, "aria-describedby": disableError ? disableErrId : undefined, className: "border-border bg-input-background text-foreground focus-visible:ring-ring w-full rounded-md border px-3 py-2 text-sm focus-visible:ring-2 focus-visible:outline-none" }), _jsx(FieldError, { id: disableErrId, message: disableError })] }), _jsxs("div", { className: "flex items-center justify-end gap-3", children: [_jsx("button", { type: "button", onClick: () => {
103
+ setDisabling(false);
104
+ setDisablePassword('');
105
+ setDisableError(null);
106
+ }, className: "text-muted-foreground hover:text-foreground rounded-md px-3 py-2 text-sm transition-colors", children: "Cancel" }), _jsxs("button", { type: "button", onClick: () => void handleDisable(), disabled: mfa.busy || !disablePassword, className: "bg-destructive text-destructive-foreground inline-flex items-center gap-2 rounded-md px-4 py-2 text-sm font-medium transition-opacity hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-50", children: [mfa.busy && _jsx(Loader2, { size: 16, className: "animate-spin", "aria-hidden": "true" }), "Disable two-factor"] })] })] }))] })), mfa.status === 'disabled' && step === 'idle' && (_jsxs("div", { className: "space-y-4", children: [_jsx(StatusRow, { status: "warning", label: "Two-factor authentication", value: "Not set up" }), _jsxs("button", { type: "button", onClick: () => {
107
+ setStep('reauth');
108
+ setSetupError(null);
109
+ }, className: "bg-brand text-brand-foreground focus-visible:ring-ring inline-flex items-center gap-2 rounded-md px-4 py-2 text-sm font-medium transition-opacity hover:opacity-90 focus-visible:ring-2 focus-visible:outline-none", children: [_jsx(ShieldCheck, { size: 16, "aria-hidden": "true" }), "Set up two-factor"] })] })), mfa.status === 'disabled' && step === 'reauth' && (_jsxs("div", { className: "space-y-3", children: [_jsx("p", { className: "text-muted-foreground text-sm", children: "Confirm your current password to begin setting up two-factor authentication." }), _jsxs("div", { children: [_jsx("label", { htmlFor: pwId, className: "text-foreground mb-1 block text-sm font-medium", children: "Current password" }), _jsx("input", { id: pwId, type: "password", autoComplete: "current-password", value: password, onChange: (e) => setPassword(e.target.value), autoFocus: true, "aria-invalid": setupError ? true : undefined, "aria-describedby": setupError ? pwErrId : undefined, onKeyDown: (e) => {
110
+ if (e.key === 'Enter' && password && !mfa.busy)
111
+ void handleBeginSetup();
112
+ }, className: "border-border bg-input-background text-foreground focus-visible:ring-ring w-full rounded-md border px-3 py-2 text-sm focus-visible:ring-2 focus-visible:outline-none" }), _jsx(FieldError, { id: pwErrId, message: setupError })] }), _jsxs("div", { className: "flex items-center justify-end gap-3", children: [_jsx("button", { type: "button", onClick: resetSetup, className: "text-muted-foreground hover:text-foreground rounded-md px-3 py-2 text-sm transition-colors", children: "Cancel" }), _jsxs("button", { type: "button", onClick: () => void handleBeginSetup(), disabled: mfa.busy || !password, className: "bg-brand text-brand-foreground inline-flex items-center gap-2 rounded-md px-4 py-2 text-sm font-medium transition-opacity hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-50", children: [mfa.busy && _jsx(Loader2, { size: 16, className: "animate-spin", "aria-hidden": "true" }), "Continue"] })] })] })), mfa.status === 'disabled' && step === 'enroll' && mfa.enrollment && (_jsxs("div", { className: "space-y-5", children: [_jsxs("ol", { className: "text-foreground list-decimal space-y-4 pl-5 text-sm", children: [_jsxs("li", { children: [_jsx("p", { className: "font-medium", children: "Scan this QR code with your authenticator app." }), _jsx("div", { className: "border-border mt-2 inline-flex rounded-lg border bg-white p-3", children: _jsx(QRCodeSVG, { value: mfa.enrollment.uri, size: 160, role: "img", "aria-label": "Two-factor setup QR code" }) }), _jsx("p", { className: "text-muted-foreground mt-2", children: "Can't scan? Enter this key manually:" }), _jsx("code", { className: "border-border bg-muted text-foreground mt-1 inline-block rounded border px-2 py-1 font-mono text-xs break-all", children: mfa.enrollment.secret })] }), _jsxs("li", { children: [_jsx("p", { className: "font-medium", children: "Save your backup codes." }), _jsx("p", { className: "text-muted-foreground mt-0.5", children: "Each code works once if you lose your authenticator. They won't be shown again." }), _jsx("ul", { className: "border-border bg-muted/40 mt-2 grid grid-cols-2 gap-x-6 gap-y-1 rounded-md border p-3 font-mono text-xs sm:grid-cols-4", children: mfa.enrollment.backupCodes.map((code) => (_jsx("li", { className: "text-foreground", children: code }, code))) }), _jsxs("div", { className: "mt-2 flex flex-wrap gap-2", children: [_jsxs("button", { type: "button", onClick: copyBackupCodes, className: "border-border text-foreground hover:bg-accent inline-flex items-center gap-1.5 rounded-md border px-2.5 py-1.5 text-xs transition-colors", children: [_jsx(Copy, { size: 14, "aria-hidden": "true" }), "Copy codes"] }), _jsxs("button", { type: "button", onClick: downloadBackupCodes, className: "border-border text-foreground hover:bg-accent inline-flex items-center gap-1.5 rounded-md border px-2.5 py-1.5 text-xs transition-colors", children: [_jsx(Download, { size: 14, "aria-hidden": "true" }), "Download"] })] }), _jsxs("label", { className: "text-foreground mt-2 flex items-center gap-2 text-sm", children: [_jsx("input", { type: "checkbox", checked: savedAcknowledged, onChange: (e) => setSavedAcknowledged(e.target.checked), className: "accent-brand h-4 w-4" }), "I've saved my backup codes somewhere safe."] })] }), _jsxs("li", { children: [_jsx("p", { className: "font-medium", children: "Enter the 6-digit code from your app to finish." }), _jsxs("div", { className: "mt-2", children: [_jsx("label", { htmlFor: codeId, className: "sr-only", children: "Authentication code" }), _jsx("input", { id: codeId, ref: codeInputRef, inputMode: "numeric", autoComplete: "one-time-code", maxLength: 6, placeholder: "123456", value: verifyCode, onChange: (e) => setVerifyCode(e.target.value.replace(/\D/g, '')), "aria-invalid": codeError ? true : undefined, "aria-describedby": codeError ? codeErrId : undefined, onKeyDown: (e) => {
113
+ if (e.key === 'Enter' && savedAcknowledged && !mfa.busy)
114
+ void handleConfirmSetup();
115
+ }, className: "border-border bg-input-background text-foreground focus-visible:ring-ring w-40 rounded-md border px-3 py-2 text-center font-mono text-lg tracking-[0.3em] focus-visible:ring-2 focus-visible:outline-none" }), _jsx(FieldError, { id: codeErrId, message: codeError })] })] })] }), _jsxs("div", { className: "flex items-center justify-end gap-3", children: [_jsx("button", { type: "button", onClick: resetSetup, className: "text-muted-foreground hover:text-foreground rounded-md px-3 py-2 text-sm transition-colors", children: "Cancel" }), _jsxs("button", { type: "button", onClick: () => void handleConfirmSetup(), disabled: mfa.busy || !savedAcknowledged || verifyCode.length !== 6, className: "bg-brand text-brand-foreground inline-flex items-center gap-2 rounded-md px-4 py-2 text-sm font-medium transition-opacity hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-50", children: [mfa.busy ? (_jsx(Loader2, { size: 16, className: "animate-spin", "aria-hidden": "true" })) : (_jsx(Check, { size: 16, "aria-hidden": "true" })), "Verify & enable"] })] })] }))] }));
116
+ }
117
+ //# sourceMappingURL=AccountSecurity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccountSecurity.js","sourceRoot":"","sources":["../../../src/views/profile/AccountSecurity.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export type MfaStatus = 'loading' | 'enabled' | 'disabled' | 'error';
2
+ export interface MfaEnrollment {
3
+ /** otpauth:// URI to render as a QR code. */
4
+ uri: string;
5
+ /** Base32 secret for manual entry when a camera isn't available. */
6
+ secret: string;
7
+ /** One-time recovery codes — shown once, never retrievable again. */
8
+ backupCodes: string[];
9
+ }
10
+ interface ActionResult {
11
+ ok: boolean;
12
+ error?: string;
13
+ }
14
+ /**
15
+ * Drives the per-user MFA (TOTP) enrollment loop against the real auth API:
16
+ * 1. `beginSetup(password)` — password reauth → POST /auth/totp/setup, which
17
+ * returns the provisioning URI + one-time backup codes.
18
+ * 2. `confirmSetup(code)` — POST /auth/totp/verify to flip totpEnabled on.
19
+ * 3. `disable(password)` — password reauth → POST /auth/totp/disable.
20
+ *
21
+ * The hook never holds the user's password and never persists the secret or
22
+ * backup codes beyond the in-memory enrollment object (cleared on cancel/finish).
23
+ */
24
+ export declare function useMfaEnrollment(): {
25
+ status: MfaStatus;
26
+ enrollment: MfaEnrollment | null;
27
+ busy: boolean;
28
+ refresh: () => Promise<void>;
29
+ beginSetup: (password: string) => Promise<ActionResult>;
30
+ confirmSetup: (code: string) => Promise<ActionResult>;
31
+ cancelSetup: () => void;
32
+ disable: (password: string) => Promise<ActionResult>;
33
+ };
34
+ export {};
35
+ //# sourceMappingURL=useMfaEnrollment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMfaEnrollment.d.ts","sourceRoot":"","sources":["../../../src/views/profile/useMfaEnrollment.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAA;AAEpE,MAAM,WAAW,aAAa;IAC5B,6CAA6C;IAC7C,GAAG,EAAE,MAAM,CAAA;IACX,oEAAoE;IACpE,MAAM,EAAE,MAAM,CAAA;IACd,qEAAqE;IACrE,WAAW,EAAE,MAAM,EAAE,CAAA;CACtB;AAED,UAAU,YAAY;IACpB,EAAE,EAAE,OAAO,CAAA;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB;;;;;2BAkBkB,MAAM,KAAG,OAAO,CAAC,YAAY,CAAC;yBAmBhC,MAAM,KAAG,OAAO,CAAC,YAAY,CAAC;;wBAwB/B,MAAM,KAAG,OAAO,CAAC,YAAY,CAAC;EA2B5E"}
@@ -0,0 +1,103 @@
1
+ 'use client';
2
+ import { useCallback, useEffect, useState } from 'react';
3
+ import { cmsApi } from '../../lib/api.js';
4
+ /**
5
+ * Drives the per-user MFA (TOTP) enrollment loop against the real auth API:
6
+ * 1. `beginSetup(password)` — password reauth → POST /auth/totp/setup, which
7
+ * returns the provisioning URI + one-time backup codes.
8
+ * 2. `confirmSetup(code)` — POST /auth/totp/verify to flip totpEnabled on.
9
+ * 3. `disable(password)` — password reauth → POST /auth/totp/disable.
10
+ *
11
+ * The hook never holds the user's password and never persists the secret or
12
+ * backup codes beyond the in-memory enrollment object (cleared on cancel/finish).
13
+ */
14
+ export function useMfaEnrollment() {
15
+ const [status, setStatus] = useState('loading');
16
+ const [enrollment, setEnrollment] = useState(null);
17
+ const [busy, setBusy] = useState(false);
18
+ const refresh = useCallback(async () => {
19
+ const res = await cmsApi('/auth/me');
20
+ if (res.error || !res.data) {
21
+ setStatus('error');
22
+ return;
23
+ }
24
+ setStatus(res.data.totpEnabled ? 'enabled' : 'disabled');
25
+ }, []);
26
+ useEffect(() => {
27
+ void refresh();
28
+ }, [refresh]);
29
+ const beginSetup = useCallback(async (password) => {
30
+ if (!password)
31
+ return { ok: false, error: 'Enter your current password to continue.' };
32
+ setBusy(true);
33
+ try {
34
+ const res = await cmsApi('/auth/totp/setup', {
35
+ method: 'POST',
36
+ headers: { 'x-reauth-password': password },
37
+ body: JSON.stringify({}),
38
+ });
39
+ if (res.error || !res.data) {
40
+ return { ok: false, error: res.error ?? 'Could not start MFA setup.' };
41
+ }
42
+ setEnrollment(res.data);
43
+ return { ok: true };
44
+ }
45
+ finally {
46
+ setBusy(false);
47
+ }
48
+ }, []);
49
+ const confirmSetup = useCallback(async (code) => {
50
+ const trimmed = code.trim();
51
+ if (!/^\d{6}$/.test(trimmed)) {
52
+ return { ok: false, error: 'Enter the 6-digit code from your authenticator app.' };
53
+ }
54
+ setBusy(true);
55
+ try {
56
+ const res = await cmsApi('/auth/totp/verify', {
57
+ method: 'POST',
58
+ body: JSON.stringify({ code: trimmed }),
59
+ });
60
+ if (res.error)
61
+ return { ok: false, error: res.error };
62
+ setEnrollment(null);
63
+ setStatus('enabled');
64
+ return { ok: true };
65
+ }
66
+ finally {
67
+ setBusy(false);
68
+ }
69
+ }, []);
70
+ const cancelSetup = useCallback(() => {
71
+ setEnrollment(null);
72
+ }, []);
73
+ const disable = useCallback(async (password) => {
74
+ if (!password)
75
+ return { ok: false, error: 'Enter your current password to continue.' };
76
+ setBusy(true);
77
+ try {
78
+ const res = await cmsApi('/auth/totp/disable', {
79
+ method: 'POST',
80
+ headers: { 'x-reauth-password': password },
81
+ body: JSON.stringify({}),
82
+ });
83
+ if (res.error)
84
+ return { ok: false, error: res.error };
85
+ setStatus('disabled');
86
+ return { ok: true };
87
+ }
88
+ finally {
89
+ setBusy(false);
90
+ }
91
+ }, []);
92
+ return {
93
+ status,
94
+ enrollment,
95
+ busy,
96
+ refresh,
97
+ beginSetup,
98
+ confirmSetup,
99
+ cancelSetup,
100
+ disable,
101
+ };
102
+ }
103
+ //# sourceMappingURL=useMfaEnrollment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMfaEnrollment.js","sourceRoot":"","sources":["../../../src/views/profile/useMfaEnrollment.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,11 @@
1
1
  import type { SecurityForm } from './useSecuritySettings.js';
2
- export declare function AuthMfaCard({ form, setField, canEdit, viewerHasMfa, withMfa, totalAdmins, }: {
2
+ export declare function AuthMfaCard({ form, setField, canEdit, viewerHasMfa, withMfa, totalAdmins, onNavigate, }: {
3
3
  form: SecurityForm;
4
4
  setField: <K extends keyof SecurityForm>(key: K, value: SecurityForm[K]) => void;
5
5
  canEdit: boolean;
6
6
  viewerHasMfa: boolean;
7
7
  withMfa: number;
8
8
  totalAdmins: number;
9
+ onNavigate?: (path: string) => void;
9
10
  }): import("react/jsx-runtime").JSX.Element;
10
11
  //# sourceMappingURL=AuthMfaCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AuthMfaCard.d.ts","sourceRoot":"","sources":["../../../src/views/settings/AuthMfaCard.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAQ5D,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,OAAO,EACP,WAAW,GACZ,EAAE;IACD,IAAI,EAAE,YAAY,CAAA;IAClB,QAAQ,EAAE,CAAC,CAAC,SAAS,MAAM,YAAY,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;IAChF,OAAO,EAAE,OAAO,CAAA;IAChB,YAAY,EAAE,OAAO,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;CACpB,2CAyFA"}
1
+ {"version":3,"file":"AuthMfaCard.d.ts","sourceRoot":"","sources":["../../../src/views/settings/AuthMfaCard.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAQ5D,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,OAAO,EACP,WAAW,EACX,UAAU,GACX,EAAE;IACD,IAAI,EAAE,YAAY,CAAA;IAClB,QAAQ,EAAE,CAAC,CAAC,SAAS,MAAM,YAAY,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;IAChF,OAAO,EAAE,OAAO,CAAA;IAChB,YAAY,EAAE,OAAO,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC,2CAqGA"}
@@ -1,6 +1,7 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useId, useState } from 'react';
4
+ import { ShieldCheck } from 'lucide-react';
4
5
  import { MFA_GRACE_PERIOD_OPTIONS } from '@actuate-media/cms-core/security-center';
5
6
  import { ConfirmDangerousSettingDialog, SettingsToggleRow } from './components.js';
6
7
  import { SecurityCard, StatusRow } from './securityPrimitives.js';
@@ -11,7 +12,7 @@ function graceLabel(days) {
11
12
  return '1 day';
12
13
  return `${days} days`;
13
14
  }
14
- export function AuthMfaCard({ form, setField, canEdit, viewerHasMfa, withMfa, totalAdmins, }) {
15
+ export function AuthMfaCard({ form, setField, canEdit, viewerHasMfa, withMfa, totalAdmins, onNavigate, }) {
15
16
  const headingId = useId();
16
17
  const graceId = useId();
17
18
  const [confirmEnable, setConfirmEnable] = useState(false);
@@ -25,7 +26,7 @@ export function AuthMfaCard({ form, setField, canEdit, viewerHasMfa, withMfa, to
25
26
  // Lockout-safe: the toggle can't be turned on until the acting admin has
26
27
  // their own MFA configured (the server enforces this too).
27
28
  const mfaToggleDisabled = !canEdit || (!form.mfaRequired && !viewerHasMfa);
28
- return (_jsxs(SecurityCard, { headingId: headingId, title: "Authentication & MFA", description: "Require multi-factor authentication for admin accounts and control the enrollment window.", children: [_jsxs("div", { className: "space-y-4", children: [_jsx(SettingsToggleRow, { label: "Require MFA for admin users", description: "Admins must set up a TOTP authenticator app. Existing admins are prompted to enroll within the grace period.", checked: form.mfaRequired, disabled: mfaToggleDisabled, onChange: requestMfaToggle }), _jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsxs("label", { htmlFor: graceId, className: "flex-1", children: [_jsx("span", { className: "text-foreground text-base font-medium", children: "Enrollment grace period" }), _jsx("p", { className: "text-muted-foreground mt-0.5 text-sm", children: "How long existing admins have to set up MFA before it is enforced." })] }), _jsx("select", { id: graceId, value: form.mfaGracePeriodDays, disabled: !canEdit || !form.mfaRequired, onChange: (e) => setField('mfaGracePeriodDays', Number(e.target.value)), className: "border-border bg-input-background text-foreground focus-visible:ring-ring rounded-md border px-3 py-2 text-sm focus-visible:ring-2 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50", children: MFA_GRACE_PERIOD_OPTIONS.map((d) => (_jsx("option", { value: d, children: graceLabel(d) }, d))) })] })] }), _jsxs("div", { className: "border-border mt-4 space-y-2 border-t pt-4", children: [_jsx(StatusRow, { status: viewerHasMfa ? 'pass' : 'warning', label: "Your account", value: viewerHasMfa ? 'MFA enabled' : 'MFA not set up' }), !viewerHasMfa && (_jsx("p", { className: "text-muted-foreground text-sm", children: "Set up MFA on your own account before requiring it for everyone, or you may lock yourself out." })), _jsx(StatusRow, { status: totalAdmins === 0 ? 'unknown' : withMfa === totalAdmins ? 'pass' : 'warning', label: "Admin MFA coverage", value: totalAdmins === 0 ? 'No admins' : `${withMfa} of ${totalAdmins} admins` })] }), _jsx(ConfirmDangerousSettingDialog, { open: confirmEnable, title: "Require MFA for all admin users?", description: `Admins without MFA will be prompted to enroll and must complete setup within the grace period (${graceLabel(form.mfaGracePeriodDays)}). Make sure your own account has MFA configured first.`, confirmLabel: "Require MFA", onConfirm: () => {
29
+ return (_jsxs(SecurityCard, { headingId: headingId, title: "Authentication & MFA", description: "Require multi-factor authentication for admin accounts and control the enrollment window.", children: [_jsxs("div", { className: "space-y-4", children: [_jsx(SettingsToggleRow, { label: "Require MFA for admin users", description: "Admins must set up a TOTP authenticator app. Existing admins are prompted to enroll within the grace period.", checked: form.mfaRequired, disabled: mfaToggleDisabled, onChange: requestMfaToggle }), _jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsxs("label", { htmlFor: graceId, className: "flex-1", children: [_jsx("span", { className: "text-foreground text-base font-medium", children: "Enrollment grace period" }), _jsx("p", { className: "text-muted-foreground mt-0.5 text-sm", children: "How long existing admins have to set up MFA before it is enforced." })] }), _jsx("select", { id: graceId, value: form.mfaGracePeriodDays, disabled: !canEdit || !form.mfaRequired, onChange: (e) => setField('mfaGracePeriodDays', Number(e.target.value)), className: "border-border bg-input-background text-foreground focus-visible:ring-ring rounded-md border px-3 py-2 text-sm focus-visible:ring-2 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50", children: MFA_GRACE_PERIOD_OPTIONS.map((d) => (_jsx("option", { value: d, children: graceLabel(d) }, d))) })] })] }), _jsxs("div", { className: "border-border mt-4 space-y-2 border-t pt-4", children: [_jsx(StatusRow, { status: viewerHasMfa ? 'pass' : 'warning', label: "Your account", value: viewerHasMfa ? 'MFA enabled' : 'MFA not set up' }), !viewerHasMfa && (_jsxs("div", { className: "space-y-2", children: [_jsx("p", { className: "text-muted-foreground text-sm", children: "Set up MFA on your own account before requiring it for everyone, or you may lock yourself out." }), onNavigate && (_jsxs("button", { type: "button", onClick: () => onNavigate('/profile'), className: "border-border text-foreground hover:bg-accent inline-flex items-center gap-2 rounded-md border px-3 py-1.5 text-sm transition-colors", children: [_jsx(ShieldCheck, { size: 15, "aria-hidden": "true" }), "Set up MFA"] }))] })), _jsx(StatusRow, { status: totalAdmins === 0 ? 'unknown' : withMfa === totalAdmins ? 'pass' : 'warning', label: "Admin MFA coverage", value: totalAdmins === 0 ? 'No admins' : `${withMfa} of ${totalAdmins} admins` })] }), _jsx(ConfirmDangerousSettingDialog, { open: confirmEnable, title: "Require MFA for all admin users?", description: `Admins without MFA will be prompted to enroll and must complete setup within the grace period (${graceLabel(form.mfaGracePeriodDays)}). Make sure your own account has MFA configured first.`, confirmLabel: "Require MFA", onConfirm: () => {
29
30
  setField('mfaRequired', true);
30
31
  setConfirmEnable(false);
31
32
  }, onCancel: () => setConfirmEnable(false) })] }));
@@ -1 +1 @@
1
- {"version":3,"file":"AuthMfaCard.js","sourceRoot":"","sources":["../../../src/views/settings/AuthMfaCard.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACvC,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAA;AAClF,OAAO,EAAE,6BAA6B,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAClF,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAGjE,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,aAAa,CAAA;IACpC,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,OAAO,CAAA;IAC9B,OAAO,GAAG,IAAI,OAAO,CAAA;AACvB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,OAAO,EACP,WAAW,GAQZ;IACC,MAAM,SAAS,GAAG,KAAK,EAAE,CAAA;IACzB,MAAM,OAAO,GAAG,KAAK,EAAE,CAAA;IACvB,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEzD,SAAS,gBAAgB,CAAC,KAAc;QACtC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAC/B,gBAAgB,CAAC,IAAI,CAAC,CAAA;YACtB,OAAM;QACR,CAAC;QACD,QAAQ,CAAC,aAAa,EAAE,KAAK,CAAC,CAAA;IAChC,CAAC;IAED,yEAAyE;IACzE,2DAA2D;IAC3D,MAAM,iBAAiB,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,YAAY,CAAC,CAAA;IAE1E,OAAO,CACL,MAAC,YAAY,IACX,SAAS,EAAE,SAAS,EACpB,KAAK,EAAC,sBAAsB,EAC5B,WAAW,EAAC,2FAA2F,aAEvG,eAAK,SAAS,EAAC,WAAW,aACxB,KAAC,iBAAiB,IAChB,KAAK,EAAC,6BAA6B,EACnC,WAAW,EAAC,8GAA8G,EAC1H,OAAO,EAAE,IAAI,CAAC,WAAW,EACzB,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,EAAE,gBAAgB,GAC1B,EAEF,eAAK,SAAS,EAAC,yCAAyC,aACtD,iBAAO,OAAO,EAAE,OAAO,EAAE,SAAS,EAAC,QAAQ,aACzC,eAAM,SAAS,EAAC,uCAAuC,wCAA+B,EACtF,YAAG,SAAS,EAAC,sCAAsC,mFAE/C,IACE,EACR,iBACE,EAAE,EAAE,OAAO,EACX,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAC9B,QAAQ,EAAE,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EACvC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EACvE,SAAS,EAAC,+MAA+M,YAExN,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACnC,iBAAgB,KAAK,EAAE,CAAC,YACrB,UAAU,CAAC,CAAC,CAAC,IADH,CAAC,CAEL,CACV,CAAC,GACK,IACL,IACF,EAEN,eAAK,SAAS,EAAC,4CAA4C,aACzD,KAAC,SAAS,IACR,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EACzC,KAAK,EAAC,cAAc,EACpB,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB,GACtD,EACD,CAAC,YAAY,IAAI,CAChB,YAAG,SAAS,EAAC,+BAA+B,+GAGxC,CACL,EACD,KAAC,SAAS,IACR,MAAM,EAAE,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EACpF,KAAK,EAAC,oBAAoB,EAC1B,KAAK,EAAE,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,OAAO,WAAW,SAAS,GAC9E,IACE,EAEN,KAAC,6BAA6B,IAC5B,IAAI,EAAE,aAAa,EACnB,KAAK,EAAC,kCAAkC,EACxC,WAAW,EAAE,kGAAkG,UAAU,CACvH,IAAI,CAAC,kBAAkB,CACxB,yDAAyD,EAC1D,YAAY,EAAC,aAAa,EAC1B,SAAS,EAAE,GAAG,EAAE;oBACd,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,CAAA;oBAC7B,gBAAgB,CAAC,KAAK,CAAC,CAAA;gBACzB,CAAC,EACD,QAAQ,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,GACvC,IACW,CAChB,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"AuthMfaCard.js","sourceRoot":"","sources":["../../../src/views/settings/AuthMfaCard.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SecurityTab.d.ts","sourceRoot":"","sources":["../../../src/views/settings/SecurityTab.tsx"],"names":[],"mappings":"AAyBA,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,UAAU,GACX,EAAE;IACD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC,2CAkIA"}
1
+ {"version":3,"file":"SecurityTab.d.ts","sourceRoot":"","sources":["../../../src/views/settings/SecurityTab.tsx"],"names":[],"mappings":"AAyBA,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,UAAU,GACX,EAAE;IACD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC,2CAmIA"}