From cee3af3c3a2f59d197c21bcdcb79e475d9d7ec10 Mon Sep 17 00:00:00 2001 From: defiQUG Date: Tue, 28 Jul 2026 12:19:41 -0700 Subject: [PATCH] secure atlas access --- portal/src/app/admin/page.tsx | 7 +++++++ portal/src/app/atlas/page.tsx | 2 ++ .../components/corporate/CorporateFooter.tsx | 17 ++++++++--------- portal/src/lib/corporate-site-data.ts | 1 - 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/portal/src/app/admin/page.tsx b/portal/src/app/admin/page.tsx index f834923..5fdd484 100644 --- a/portal/src/app/admin/page.tsx +++ b/portal/src/app/admin/page.tsx @@ -46,6 +46,13 @@ export default function AdminPortalPage() { href: '/admin/openpayd', features: ['Sandbox probes', 'Production gates', 'Evidence export'], }, + { + title: 'Ecosystem Atlas', + description: 'Review the internal Project Atlas route map, hidden inventory, and revision notes.', + icon: Shield, + href: '/atlas', + features: ['Admin-only route map', 'Inventory awareness', 'Revision history'], + }, ]; return ( diff --git a/portal/src/app/atlas/page.tsx b/portal/src/app/atlas/page.tsx index 28905f2..69fb796 100644 --- a/portal/src/app/atlas/page.tsx +++ b/portal/src/app/atlas/page.tsx @@ -2,6 +2,7 @@ import type { Metadata } from 'next'; import AtlasDashboard from '@/components/atlas/AtlasDashboard'; import { loadAtlasSnapshot } from '@/lib/atlas'; +import { requirePortalRoles } from '@/lib/server-role-guard'; export const dynamic = 'force-dynamic'; export const revalidate = 0; @@ -16,6 +17,7 @@ export const metadata: Metadata = { }; export default async function AtlasPage() { + await requirePortalRoles(['admin', 'tenant-admin', 'ADMIN', 'TENANT_ADMIN'], '/atlas'); const snapshot = await loadAtlasSnapshot(); return ( diff --git a/portal/src/components/corporate/CorporateFooter.tsx b/portal/src/components/corporate/CorporateFooter.tsx index 19413e4..9854453 100644 --- a/portal/src/components/corporate/CorporateFooter.tsx +++ b/portal/src/components/corporate/CorporateFooter.tsx @@ -26,15 +26,14 @@ const footerColumns = [ { label: 'Marketplace', href: 'https://portal.sankofa.nexus' }, ], }, - { - title: 'Company', - links: [ - { label: 'About Sankofa', href: '#resources' }, - { label: 'Ecosystem Atlas', href: '/atlas' }, - { label: 'Institutional registry', href: 'https://d-bis.org/cb/dbis' }, - { label: 'Partner program', href: '/partner' }, - { label: 'Contact', href: 'https://portal.sankofa.nexus' }, - ], + { + title: 'Company', + links: [ + { label: 'About Sankofa', href: '#resources' }, + { label: 'Institutional registry', href: 'https://d-bis.org/cb/dbis' }, + { label: 'Partner program', href: '/partner' }, + { label: 'Contact', href: 'https://portal.sankofa.nexus' }, + ], }, { title: 'Access', diff --git a/portal/src/lib/corporate-site-data.ts b/portal/src/lib/corporate-site-data.ts index d140d51..7c43665 100644 --- a/portal/src/lib/corporate-site-data.ts +++ b/portal/src/lib/corporate-site-data.ts @@ -68,7 +68,6 @@ export const corporateNav: CorporateNavItem[] = [ { label: 'Institutional grade', href: '#institutional-grade' }, { label: 'Compliance', href: '#institutional-compliance' }, { label: 'Resources', href: '#resources' }, - { label: 'Atlas', href: '/atlas' }, ]; export const productDivisions: ProductDivision[] = [