@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.
- package/dist/AdminRoot.d.ts +7 -0
- package/dist/AdminRoot.d.ts.map +1 -1
- package/dist/AdminRoot.js +7 -2
- package/dist/AdminRoot.js.map +1 -1
- package/dist/__tests__/views/account-security.render.test.d.ts +2 -0
- package/dist/__tests__/views/account-security.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/account-security.render.test.js +98 -0
- package/dist/__tests__/views/account-security.render.test.js.map +1 -0
- package/dist/__tests__/views/login-mfa.render.test.d.ts +2 -0
- package/dist/__tests__/views/login-mfa.render.test.d.ts.map +1 -0
- package/dist/__tests__/views/login-mfa.render.test.js +73 -0
- package/dist/__tests__/views/login-mfa.render.test.js.map +1 -0
- package/dist/actuate-admin.css +1 -1
- package/dist/components/Breadcrumbs.d.ts.map +1 -1
- package/dist/components/Breadcrumbs.js +1 -0
- package/dist/components/Breadcrumbs.js.map +1 -1
- package/dist/views/Login.d.ts +16 -1
- package/dist/views/Login.d.ts.map +1 -1
- package/dist/views/Login.js +55 -3
- package/dist/views/Login.js.map +1 -1
- package/dist/views/Profile.d.ts +12 -0
- package/dist/views/Profile.d.ts.map +1 -0
- package/dist/views/Profile.js +16 -0
- package/dist/views/Profile.js.map +1 -0
- package/dist/views/profile/AccountSecurity.d.ts +2 -0
- package/dist/views/profile/AccountSecurity.d.ts.map +1 -0
- package/dist/views/profile/AccountSecurity.js +117 -0
- package/dist/views/profile/AccountSecurity.js.map +1 -0
- package/dist/views/profile/useMfaEnrollment.d.ts +35 -0
- package/dist/views/profile/useMfaEnrollment.d.ts.map +1 -0
- package/dist/views/profile/useMfaEnrollment.js +103 -0
- package/dist/views/profile/useMfaEnrollment.js.map +1 -0
- package/dist/views/settings/AuthMfaCard.d.ts +2 -1
- package/dist/views/settings/AuthMfaCard.d.ts.map +1 -1
- package/dist/views/settings/AuthMfaCard.js +3 -2
- package/dist/views/settings/AuthMfaCard.js.map +1 -1
- package/dist/views/settings/SecurityTab.d.ts.map +1 -1
- package/dist/views/settings/SecurityTab.js +1 -1
- package/dist/views/settings/SecurityTab.js.map +1 -1
- package/package.json +3 -2
- package/src/AdminRoot.tsx +18 -0
- package/src/__tests__/views/account-security.render.test.tsx +140 -0
- package/src/__tests__/views/login-mfa.render.test.tsx +88 -0
- package/src/components/Breadcrumbs.tsx +1 -0
- package/src/views/Login.tsx +247 -94
- package/src/views/Profile.tsx +54 -0
- package/src/views/profile/AccountSecurity.tsx +406 -0
- package/src/views/profile/useMfaEnrollment.ts +120 -0
- package/src/views/settings/AuthMfaCard.tsx +19 -4
- package/src/views/settings/SecurityTab.tsx +1 -0
package/dist/views/Login.js
CHANGED
|
@@ -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:
|
|
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
|
package/dist/views/Login.js.map
CHANGED
|
@@ -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 @@
|
|
|
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":"
|
|
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,
|
|
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,
|
|
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"}
|