diff --git a/.changeset/settings-admin-gate.md b/.changeset/settings-admin-gate.md new file mode 100644 index 0000000000..9f4b64c28d --- /dev/null +++ b/.changeset/settings-admin-gate.md @@ -0,0 +1,11 @@ +--- +"@emdash-cms/admin": patch +--- + +Fixes non-admin users being able to open admin-only screens in the admin UI. The **Settings** link in the user menu is now shown only to administrators, and a non-admin who opens a site-level settings page, **Users**, **WordPress import**, or a plugin's settings page by its URL now sees an "Access denied" message instead of a screen that fails to load or cannot save. + +#### Changes for Editors + +Editors could previously open **Settings → General**, **Social Links**, and **SEO** and read their values, although saving them already required an administrator. They can no longer open these pages. The **Settings** screen is also where the admin language is chosen, so Editors and other non-admins now choose the admin language on the sign-in screen. + +**Security** settings, where each user manages their own passkeys, remain available to every role from the user menu. diff --git a/packages/admin/src/components/Header.tsx b/packages/admin/src/components/Header.tsx index e60cb1fe5c..16344e4c18 100644 --- a/packages/admin/src/components/Header.tsx +++ b/packages/admin/src/components/Header.tsx @@ -11,6 +11,9 @@ import { ThemeToggle } from "./ThemeToggle"; export type { CurrentUser } from "../lib/api/current-user"; +// Role levels (matching @emdash-cms/auth) +const ROLE_ADMIN = 50; + async function handleLogout() { // Clear the public-site toolbar-bootstrap flag (see Shell.tsx). try { @@ -39,6 +42,8 @@ export function Header() { const { data: user } = useCurrentUser(); + const canManageSettings = (user?.role ?? 0) >= ROLE_ADMIN; + // Get display name and initials const displayName = user?.name || user?.email || t`User`; const initialsSource = user?.name || user?.email || "U"; @@ -92,14 +97,16 @@ export function Header() { {t`Security Settings`} - setUserMenuOpen(false)} - className="flex items-center gap-2 rounded-md px-3 py-2 text-sm hover:bg-kumo-tint" - > - - {t`Settings`} - + {canManageSettings && ( + setUserMenuOpen(false)} + className="flex items-center gap-2 rounded-md px-3 py-2 text-sm hover:bg-kumo-tint" + > + + {t`Settings`} + + )}