diff --git a/ui/app/(prowler)/page.tsx b/ui/app/(prowler)/page.tsx index 29ebeb06bf..f6850914e4 100644 --- a/ui/app/(prowler)/page.tsx +++ b/ui/app/(prowler)/page.tsx @@ -8,12 +8,24 @@ import { getProvidersOverview, } from "@/actions/overview/overview"; import { FilterControls } from "@/components/filters"; +import { + DonutChart, + HorizontalBarChart, + LineChart, + RadarChart, + RadialChart, + SankeyChart, + ScatterPlot, + ThreatMap, +} from "@/components/graphs"; import { LighthouseBanner } from "@/components/lighthouse"; import { FindingsBySeverityChart, FindingsByStatusChart, LinkToFindings, ProvidersOverview, + RadarChartWithSelection, + ScatterPlotWithSelection, SkeletonFindingsBySeverityChart, SkeletonFindingsByStatusChart, SkeletonProvidersOverview, @@ -27,6 +39,645 @@ import { FindingProps, SearchParamsProps } from "@/types"; const FILTER_PREFIX = "filter["; +// Sample data for ThreatMap component +const RISK_LEVELS = { + LOW_HIGH: "low-high", + HIGH: "high", + CRITICAL: "critical", +} as const; + +const sampleThreatMapData = { + regions: ["US East", "US West", "Europe", "Asia Pacific", "South America"], + locations: [ + { + id: "us-east-1", + name: "US East-1", + region: "US East", + coordinates: [-77.4875, 39.0438] as [number, number], + totalFindings: 455, + riskLevel: RISK_LEVELS.LOW_HIGH, + change: 21, + severityData: [ + { name: "Info", value: 10, percentage: 3, color: "var(--chart-info)" }, + { + name: "Low", + value: 543, + percentage: 25, + color: "var(--chart-warning)", + }, + { + name: "Medium", + value: 221, + percentage: 18, + color: "var(--chart-warning-emphasis)", + }, + { + name: "High", + value: 1232, + percentage: 32, + color: "var(--chart-danger)", + }, + { + name: "Critical", + value: 432, + percentage: 22, + color: "var(--chart-danger-emphasis)", + }, + ], + }, + { + id: "us-west-2", + name: "US West-2", + region: "US West", + coordinates: [-121.7269, 45.6387] as [number, number], + totalFindings: 324, + riskLevel: RISK_LEVELS.HIGH, + severityData: [ + { name: "Info", value: 8, percentage: 2, color: "var(--chart-info)" }, + { + name: "Low", + value: 89, + percentage: 15, + color: "var(--chart-warning)", + }, + { + name: "Medium", + value: 156, + percentage: 28, + color: "var(--chart-warning-emphasis)", + }, + { + name: "High", + value: 187, + percentage: 35, + color: "var(--chart-danger)", + }, + { + name: "Critical", + value: 124, + percentage: 20, + color: "var(--chart-danger-emphasis)", + }, + ], + }, + { + id: "eu-west-1", + name: "EU West-1", + region: "Europe", + coordinates: [-6.2603, 53.3498] as [number, number], + totalFindings: 567, + riskLevel: RISK_LEVELS.CRITICAL, + change: 15, + severityData: [ + { name: "Info", value: 12, percentage: 2, color: "var(--chart-info)" }, + { + name: "Low", + value: 98, + percentage: 10, + color: "var(--chart-warning)", + }, + { + name: "Medium", + value: 203, + percentage: 22, + color: "var(--chart-warning-emphasis)", + }, + { + name: "High", + value: 354, + percentage: 38, + color: "var(--chart-danger)", + }, + { + name: "Critical", + value: 267, + percentage: 28, + color: "var(--chart-danger-emphasis)", + }, + ], + }, + { + id: "eu-central-1", + name: "EU Central-1", + region: "Europe", + coordinates: [8.6821, 50.1109] as [number, number], + totalFindings: 289, + riskLevel: RISK_LEVELS.LOW_HIGH, + severityData: [ + { name: "Info", value: 15, percentage: 5, color: "var(--chart-info)" }, + { + name: "Low", + value: 134, + percentage: 32, + color: "var(--chart-warning)", + }, + { + name: "Medium", + value: 87, + percentage: 22, + color: "var(--chart-warning-emphasis)", + }, + { + name: "High", + value: 103, + percentage: 28, + color: "var(--chart-danger)", + }, + { + name: "Critical", + value: 43, + percentage: 13, + color: "var(--chart-danger-emphasis)", + }, + ], + }, + { + id: "ap-northeast-1", + name: "AP Northeast-1", + region: "Asia Pacific", + coordinates: [139.6917, 35.6895] as [number, number], + totalFindings: 412, + riskLevel: RISK_LEVELS.HIGH, + severityData: [ + { name: "Info", value: 9, percentage: 2, color: "var(--chart-info)" }, + { + name: "Low", + value: 87, + percentage: 18, + color: "var(--chart-warning)", + }, + { + name: "Medium", + value: 145, + percentage: 26, + color: "var(--chart-warning-emphasis)", + }, + { + name: "High", + value: 198, + percentage: 34, + color: "var(--chart-danger)", + }, + { + name: "Critical", + value: 112, + percentage: 20, + color: "var(--chart-danger-emphasis)", + }, + ], + }, + { + id: "ap-southeast-1", + name: "AP Southeast-1", + region: "Asia Pacific", + coordinates: [103.8198, 1.3521] as [number, number], + totalFindings: 378, + riskLevel: RISK_LEVELS.HIGH, + severityData: [ + { name: "Info", value: 11, percentage: 3, color: "var(--chart-info)" }, + { + name: "Low", + value: 76, + percentage: 16, + color: "var(--chart-warning)", + }, + { + name: "Medium", + value: 132, + percentage: 25, + color: "var(--chart-warning-emphasis)", + }, + { + name: "High", + value: 187, + percentage: 36, + color: "var(--chart-danger)", + }, + { + name: "Critical", + value: 94, + percentage: 20, + color: "var(--chart-danger-emphasis)", + }, + ], + }, + { + id: "ap-south-1", + name: "AP South-1", + region: "Asia Pacific", + coordinates: [72.8777, 19.076] as [number, number], + totalFindings: 234, + riskLevel: RISK_LEVELS.LOW_HIGH, + change: -8, + severityData: [ + { name: "Info", value: 7, percentage: 3, color: "var(--chart-info)" }, + { + name: "Low", + value: 98, + percentage: 28, + color: "var(--chart-warning)", + }, + { + name: "Medium", + value: 76, + percentage: 24, + color: "var(--chart-warning-emphasis)", + }, + { + name: "High", + value: 89, + percentage: 30, + color: "var(--chart-danger)", + }, + { + name: "Critical", + value: 43, + percentage: 15, + color: "var(--chart-danger-emphasis)", + }, + ], + }, + { + id: "sa-east-1", + name: "SA East-1", + region: "South America", + coordinates: [-46.6333, -23.5505] as [number, number], + totalFindings: 189, + riskLevel: RISK_LEVELS.LOW_HIGH, + severityData: [ + { name: "Info", value: 6, percentage: 3, color: "var(--chart-info)" }, + { + name: "Low", + value: 87, + percentage: 30, + color: "var(--chart-warning)", + }, + { + name: "Medium", + value: 54, + percentage: 22, + color: "var(--chart-warning-emphasis)", + }, + { + name: "High", + value: 67, + percentage: 28, + color: "var(--chart-danger)", + }, + { + name: "Critical", + value: 32, + percentage: 17, + color: "var(--chart-danger-emphasis)", + }, + ], + }, + { + id: "ca-central-1", + name: "CA Central-1", + region: "US East", + coordinates: [-73.5673, 45.5017] as [number, number], + totalFindings: 267, + riskLevel: RISK_LEVELS.LOW_HIGH, + severityData: [ + { name: "Info", value: 8, percentage: 3, color: "var(--chart-info)" }, + { + name: "Low", + value: 112, + percentage: 27, + color: "var(--chart-warning)", + }, + { + name: "Medium", + value: 87, + percentage: 23, + color: "var(--chart-warning-emphasis)", + }, + { + name: "High", + value: 98, + percentage: 30, + color: "var(--chart-danger)", + }, + { + name: "Critical", + value: 54, + percentage: 17, + color: "var(--chart-danger-emphasis)", + }, + ], + }, + { + id: "ap-southeast-2", + name: "AP Southeast-2", + region: "Asia Pacific", + coordinates: [151.2093, -33.8688] as [number, number], + totalFindings: 345, + riskLevel: RISK_LEVELS.HIGH, + severityData: [ + { name: "Info", value: 10, percentage: 3, color: "var(--chart-info)" }, + { + name: "Low", + value: 78, + percentage: 17, + color: "var(--chart-warning)", + }, + { + name: "Medium", + value: 121, + percentage: 25, + color: "var(--chart-warning-emphasis)", + }, + { + name: "High", + value: 167, + percentage: 35, + color: "var(--chart-danger)", + }, + { + name: "Critical", + value: 89, + percentage: 20, + color: "var(--chart-danger-emphasis)", + }, + ], + }, + { + id: "eu-west-2", + name: "EU West-2", + region: "Europe", + coordinates: [-0.1278, 51.5074] as [number, number], + totalFindings: 423, + riskLevel: RISK_LEVELS.HIGH, + severityData: [ + { name: "Info", value: 11, percentage: 3, color: "var(--chart-info)" }, + { + name: "Low", + value: 98, + percentage: 19, + color: "var(--chart-warning)", + }, + { + name: "Medium", + value: 154, + percentage: 26, + color: "var(--chart-warning-emphasis)", + }, + { + name: "High", + value: 189, + percentage: 32, + color: "var(--chart-danger)", + }, + { + name: "Critical", + value: 112, + percentage: 20, + color: "var(--chart-danger-emphasis)", + }, + ], + }, + { + id: "us-east-2", + name: "US East-2", + region: "US East", + coordinates: [-82.9988, 39.9612] as [number, number], + totalFindings: 298, + riskLevel: RISK_LEVELS.LOW_HIGH, + severityData: [ + { name: "Info", value: 9, percentage: 3, color: "var(--chart-info)" }, + { + name: "Low", + value: 123, + percentage: 28, + color: "var(--chart-warning)", + }, + { + name: "Medium", + value: 89, + percentage: 23, + color: "var(--chart-warning-emphasis)", + }, + { + name: "High", + value: 101, + percentage: 29, + color: "var(--chart-danger)", + }, + { + name: "Critical", + value: 54, + percentage: 17, + color: "var(--chart-danger-emphasis)", + }, + ], + }, + { + id: "us-west-1", + name: "US West-1", + region: "US West", + coordinates: [-121.8863, 37.3382] as [number, number], + totalFindings: 389, + riskLevel: RISK_LEVELS.HIGH, + severityData: [ + { name: "Info", value: 10, percentage: 3, color: "var(--chart-info)" }, + { + name: "Low", + value: 87, + percentage: 18, + color: "var(--chart-warning)", + }, + { + name: "Medium", + value: 143, + percentage: 26, + color: "var(--chart-warning-emphasis)", + }, + { + name: "High", + value: 176, + percentage: 33, + color: "var(--chart-danger)", + }, + { + name: "Critical", + value: 98, + percentage: 20, + color: "var(--chart-danger-emphasis)", + }, + ], + }, + { + id: "eu-north-1", + name: "EU North-1", + region: "Europe", + coordinates: [18.0686, 59.3293] as [number, number], + totalFindings: 213, + riskLevel: RISK_LEVELS.LOW_HIGH, + severityData: [ + { name: "Info", value: 7, percentage: 3, color: "var(--chart-info)" }, + { + name: "Low", + value: 89, + percentage: 29, + color: "var(--chart-warning)", + }, + { + name: "Medium", + value: 67, + percentage: 23, + color: "var(--chart-warning-emphasis)", + }, + { + name: "High", + value: 76, + percentage: 28, + color: "var(--chart-danger)", + }, + { + name: "Critical", + value: 43, + percentage: 17, + color: "var(--chart-danger-emphasis)", + }, + ], + }, + ], +}; + +// Sample data for DonutChart +const sampleDonutChartData = [ + { + name: "AWS", + value: 1840, + percentage: 45, + color: "var(--chart-provider-aws)", + change: 5, + }, + { + name: "Azure", + value: 1280, + percentage: 32, + color: "var(--chart-provider-azure)", + change: -2, + }, + { + name: "Google", + value: 920, + percentage: 23, + color: "var(--chart-provider-google)", + change: 8, + }, +]; + +// Sample data for LineChart +const sampleLineChartData = [ + { date: "Jan", critical: 385, high: 1100, medium: 820, low: 450 }, + { date: "Feb", critical: 398, high: 1150, medium: 870, low: 480 }, + { date: "Mar", critical: 410, high: 1180, medium: 890, low: 510 }, + { date: "Apr", critical: 425, high: 1210, medium: 915, low: 530 }, + { date: "May", critical: 418, high: 1195, medium: 905, low: 520 }, + { date: "Jun", critical: 432, high: 1232, medium: 925, low: 543 }, +]; + +const sampleLineConfig = [ + { + dataKey: "critical", + color: "var(--chart-danger-emphasis)", + label: "Critical", + }, + { dataKey: "high", color: "var(--chart-danger)", label: "High" }, + { + dataKey: "medium", + color: "var(--chart-warning-emphasis)", + label: "Medium", + }, + { dataKey: "low", color: "var(--chart-warning)", label: "Low" }, +]; + +// Sample data for HorizontalBarChart (Severity Distribution) +const sampleHorizontalBarData = [ + { + name: "Critical", + value: 432, + percentage: 22, + newFindings: 15, + change: 5, + }, + { name: "High", value: 1232, percentage: 32, newFindings: 45, change: 8 }, + { + name: "Medium", + value: 925, + percentage: 28, + newFindings: 32, + change: -3, + }, + { name: "Low", value: 543, percentage: 15, newFindings: 18, change: -2 }, + { name: "Info", value: 108, percentage: 3, newFindings: 5, change: 0 }, +]; + +// Sample data for SankeyChart +const sampleSankeyData = { + nodes: [ + { name: "Success" }, + { name: "Fail" }, + { name: "AWS" }, + { name: "Azure" }, + { name: "Google" }, + { name: "Critical", newFindings: 5, change: 15 }, + { name: "High", newFindings: 12, change: 8 }, + { name: "Medium", newFindings: 28, change: -3 }, + { name: "Low", newFindings: 45, change: -8 }, + { name: "Info", newFindings: 18, change: 2 }, + ], + links: [ + // Success to Providers + { source: 0, target: 2, value: 300 }, // Success -> AWS + { source: 0, target: 3, value: 283 }, // Success -> Azure + { source: 0, target: 4, value: 300 }, // Success -> Google + + // Fail to Providers + { source: 1, target: 2, value: 200 }, // Fail -> AWS + { source: 1, target: 3, value: 300 }, // Fail -> Azure + { source: 1, target: 4, value: 500 }, // Fail -> Google + + // AWS to Severities (Critical to Info order) + { source: 2, target: 5, value: 8 }, // AWS -> Critical + { source: 2, target: 6, value: 25 }, // AWS -> High + { source: 2, target: 7, value: 67 }, // AWS -> Medium + { source: 2, target: 8, value: 80 }, // AWS -> Low + { source: 2, target: 9, value: 20 }, // AWS -> Info + + // Azure to Severities + { source: 3, target: 5, value: 10 }, // Azure -> Critical + { source: 3, target: 6, value: 35 }, // Azure -> High + { source: 3, target: 7, value: 95 }, // Azure -> Medium + { source: 3, target: 8, value: 130 }, // Azure -> Low + { source: 3, target: 9, value: 30 }, // Azure -> Info + + // Google to Severities + { source: 4, target: 5, value: 7 }, // Google -> Critical + { source: 4, target: 6, value: 40 }, // Google -> High + { source: 4, target: 7, value: 163 }, // Google -> Medium + { source: 4, target: 8, value: 190 }, // Google -> Low + { source: 4, target: 9, value: 100 }, // Google -> Info + ], +}; + +// Sample data for ScatterPlot +const sampleScatterPlotData = [ + { x: 8.2, y: 45, provider: "AWS", name: "S3 Buckets", size: 120 }, + { x: 7.5, y: 62, provider: "AWS", name: "EC2 Instances", size: 95 }, + { x: 6.8, y: 78, provider: "Azure", name: "Storage Accounts", size: 85 }, + { x: 9.1, y: 32, provider: "AWS", name: "RDS Databases", size: 110 }, + { x: 5.4, y: 88, provider: "Google", name: "Cloud Storage", size: 75 }, + { x: 7.9, y: 55, provider: "Azure", name: "Virtual Machines", size: 90 }, + { x: 8.5, y: 48, provider: "AWS", name: "Lambda Functions", size: 105 }, + { x: 6.2, y: 82, provider: "Google", name: "Compute Engine", size: 80 }, + { x: 7.2, y: 68, provider: "Azure", name: "SQL Databases", size: 88 }, + { x: 8.8, y: 41, provider: "AWS", name: "IAM Users", size: 115 }, +]; + // Extract only query params that start with "filter[" for API calls function pickFilterParams( params: SearchParamsProps | undefined | null, @@ -76,6 +727,90 @@ export default async function Home({ + +
+ +

+ Security Categories +

+ +
+ +
+ +

Threat Map

+ +
+ +
+ +

+ Findings by Severity +

+ +
+ +
+ +

+ Provider Distribution +

+ +
+ +
+ +

+ Findings Trend Over Time +

+ +
+ +
+ +

+ Provider to Severity Flow +

+ +
+ +
+ +

Compliance Score

+ +
+ +
+ +

+ Risk Score vs Compliance by Service +

+ +
);