From 1559387a7c69dd44f00b66ce3ba7f510945b14bb Mon Sep 17 00:00:00 2001 From: VPS 4 Builder Date: Fri, 19 Jun 2026 14:43:15 +0200 Subject: [PATCH] security/fix(front): fecha /update p/ superadmin + corrige deep-links MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - /update (migração de banco) sai da lista sempre-liberada do isViewAllowed; passa a exigir superadmin (não-superadmin cai na view padrão; deslogado vai p/ landing). - ROUTE_MAP ganha /comissoes e /glosas (existiam em VIEW_TO_ROUTE mas faltavam aqui; refresh/deep-link nessas telas caía em dashboard). - (cadastro-dentista já estava mapeado — correção de equívoco da auditoria.) - Validado em DEV: build compila, app sobe, rotas resolvem (HTTP 200 SPA). Co-Authored-By: Claude Opus 4.8 --- frontend/App.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/App.tsx b/frontend/App.tsx index 95e9480..6c4d7fe 100644 --- a/frontend/App.tsx +++ b/frontend/App.tsx @@ -151,6 +151,9 @@ const ROUTE_MAP: Record = { '/aguardando-convite': 'aguardando-convite', '/diretorio-profissionais': 'diretorio-profissionais', '/proteses': 'proteses', + // Corrige deep-link/refresh: existiam em VIEW_TO_ROUTE mas faltavam aqui (caíam em dashboard). + '/comissoes': 'comissoes', + '/glosas': 'glosas', }; const VIEW_TO_ROUTE: Record = { @@ -274,7 +277,8 @@ const App: React.FC = () => { const clinColor = activeWorkspace?.cor || '#2563eb'; const isViewAllowed = (view: ViewKey, role: string): boolean => { - if (['landing', 'login', 'public', 'update'].includes(view)) return true; + if (['landing', 'login', 'public'].includes(view)) return true; + // /update (migração de banco) é EXCLUSIVA do superadmin (liberado na linha seguinte). if (role === 'superadmin') return true; // Sync GLOBAL removido do app (substituído pelo backup por clínica em Configurações). if (view === 'sync') return false;