mirror of
https://github.com/prowler-cloud/prowler.git
synced 2026-10-25 12:54:18 +00:00
328 lines
8.9 KiB
TypeScript
328 lines
8.9 KiB
TypeScript
import {
|
|
Code,
|
|
CreditCard,
|
|
FileText,
|
|
GitBranch,
|
|
LayoutGrid,
|
|
MessageCircleQuestion,
|
|
Settings,
|
|
ShieldCheck,
|
|
SquareChartGantt,
|
|
Tag,
|
|
Timer,
|
|
Users,
|
|
Warehouse,
|
|
} from "lucide-react";
|
|
|
|
import { LighthouseIcon } from "@/components/icons/Icons";
|
|
import { isCloud } from "@/lib/shared/env";
|
|
import type { CloudUpgradeFeature } from "@/types/cloud-upgrade";
|
|
import { CLOUD_UPGRADE_FEATURE } from "@/types/cloud-upgrade";
|
|
import type { RolePermissionAttributes } from "@/types/users";
|
|
|
|
import {
|
|
NAVIGATION_ITEM_KIND,
|
|
NAVIGATION_PERMISSION,
|
|
type NavigationChild,
|
|
type NavigationItem,
|
|
type NavigationSection,
|
|
} from "./types";
|
|
|
|
interface NavigationConfigOptions {
|
|
pathname: string;
|
|
apiDocsUrl?: string | null;
|
|
cloudBillingEnabled?: boolean;
|
|
permissions?: RolePermissionAttributes;
|
|
}
|
|
|
|
interface CloudFeatureOptions {
|
|
isCloudEnvironment: boolean;
|
|
href: string;
|
|
label: string;
|
|
active: boolean;
|
|
feature: CloudUpgradeFeature;
|
|
}
|
|
|
|
function getCloudFeature({
|
|
isCloudEnvironment,
|
|
href,
|
|
label,
|
|
active,
|
|
feature,
|
|
}: CloudFeatureOptions): NavigationChild {
|
|
if (!isCloudEnvironment) {
|
|
return {
|
|
kind: NAVIGATION_ITEM_KIND.CLOUD_UPGRADE,
|
|
label,
|
|
cloudUpgradeFeature: feature,
|
|
};
|
|
}
|
|
|
|
return {
|
|
kind: NAVIGATION_ITEM_KIND.LINK,
|
|
href,
|
|
label,
|
|
active,
|
|
highlight: true,
|
|
};
|
|
}
|
|
|
|
function isRouteActive(pathname: string, href: string) {
|
|
return pathname === href || pathname.startsWith(`${href}/`);
|
|
}
|
|
|
|
function hasRequiredPermission(
|
|
item: NavigationItem | NavigationChild,
|
|
permissions?: RolePermissionAttributes,
|
|
) {
|
|
return (
|
|
item.requiredPermission === undefined ||
|
|
permissions?.[item.requiredPermission] !== false
|
|
);
|
|
}
|
|
|
|
export function filterNavigationByPermissions(
|
|
sections: NavigationSection[],
|
|
permissions?: RolePermissionAttributes,
|
|
) {
|
|
return sections
|
|
.map((section) => ({
|
|
...section,
|
|
items: section.items
|
|
.filter((item) => hasRequiredPermission(item, permissions))
|
|
.map((item) =>
|
|
item.kind === NAVIGATION_ITEM_KIND.COLLAPSIBLE
|
|
? {
|
|
...item,
|
|
children: item.children.filter((child) =>
|
|
hasRequiredPermission(child, permissions),
|
|
),
|
|
}
|
|
: item,
|
|
),
|
|
}))
|
|
.filter((section) => section.items.length > 0);
|
|
}
|
|
|
|
export function getNavigationConfig({
|
|
pathname,
|
|
apiDocsUrl = null,
|
|
cloudBillingEnabled = false,
|
|
permissions,
|
|
}: NavigationConfigOptions): NavigationSection[] {
|
|
const isCloudEnvironment = isCloud();
|
|
const apiReferenceUrl = isCloudEnvironment
|
|
? "https://api.prowler.com/api/v1/docs"
|
|
: apiDocsUrl;
|
|
|
|
const sections: NavigationSection[] = [
|
|
{
|
|
items: [
|
|
{
|
|
kind: NAVIGATION_ITEM_KIND.LINK,
|
|
href: "/",
|
|
label: "Overview",
|
|
icon: SquareChartGantt,
|
|
active: pathname === "/",
|
|
},
|
|
...(!isCloudEnvironment
|
|
? [
|
|
{
|
|
kind: NAVIGATION_ITEM_KIND.LINK,
|
|
href: "/lighthouse",
|
|
label: "Lighthouse AI",
|
|
icon: LighthouseIcon,
|
|
active:
|
|
isRouteActive(pathname, "/lighthouse") &&
|
|
!isRouteActive(pathname, "/lighthouse/settings"),
|
|
} as const,
|
|
]
|
|
: []),
|
|
],
|
|
},
|
|
{
|
|
label: "SECURITY",
|
|
items: [
|
|
{
|
|
kind: NAVIGATION_ITEM_KIND.LINK,
|
|
href: "/compliance",
|
|
label: "Compliance",
|
|
icon: ShieldCheck,
|
|
active: isRouteActive(pathname, "/compliance"),
|
|
},
|
|
{
|
|
kind: NAVIGATION_ITEM_KIND.LINK,
|
|
href: "/findings?filter[muted]=false&filter[status__in]=FAIL",
|
|
label: "Findings",
|
|
icon: Tag,
|
|
active: isRouteActive(pathname, "/findings"),
|
|
},
|
|
{
|
|
kind: NAVIGATION_ITEM_KIND.LINK,
|
|
href: "/attack-paths",
|
|
label: "Attack Paths",
|
|
icon: GitBranch,
|
|
active: isRouteActive(pathname, "/attack-paths"),
|
|
},
|
|
{
|
|
kind: NAVIGATION_ITEM_KIND.LINK,
|
|
href: "/scans",
|
|
label: "Scans",
|
|
icon: Timer,
|
|
active:
|
|
isRouteActive(pathname, "/scans") &&
|
|
!isRouteActive(pathname, "/scans/config"),
|
|
},
|
|
{
|
|
kind: NAVIGATION_ITEM_KIND.LINK,
|
|
href: "/resources",
|
|
label: "Resources",
|
|
icon: Warehouse,
|
|
active: isRouteActive(pathname, "/resources"),
|
|
},
|
|
],
|
|
},
|
|
{
|
|
label: "SETTINGS",
|
|
items: [
|
|
{
|
|
kind: NAVIGATION_ITEM_KIND.COLLAPSIBLE,
|
|
label: "Configuration",
|
|
icon: Settings,
|
|
defaultOpen: true,
|
|
children: [
|
|
{
|
|
kind: NAVIGATION_ITEM_KIND.LINK,
|
|
href: "/providers",
|
|
label: "Providers",
|
|
active: isRouteActive(pathname, "/providers"),
|
|
},
|
|
getCloudFeature({
|
|
isCloudEnvironment,
|
|
href: "/alerts",
|
|
label: "Alerts",
|
|
active: isRouteActive(pathname, "/alerts"),
|
|
feature: CLOUD_UPGRADE_FEATURE.ALERTS,
|
|
}),
|
|
{
|
|
kind: NAVIGATION_ITEM_KIND.LINK,
|
|
href: "/mutelist",
|
|
label: "Mutelist",
|
|
active: pathname === "/mutelist",
|
|
},
|
|
getCloudFeature({
|
|
isCloudEnvironment,
|
|
href: "/scans/config",
|
|
label: "Scans",
|
|
active: isRouteActive(pathname, "/scans/config"),
|
|
feature: CLOUD_UPGRADE_FEATURE.SCAN_CONFIGURATION,
|
|
}),
|
|
...(!isCloudEnvironment
|
|
? [
|
|
{
|
|
kind: NAVIGATION_ITEM_KIND.CLOUD_UPGRADE,
|
|
label: "CLI Import",
|
|
cloudUpgradeFeature: CLOUD_UPGRADE_FEATURE.CLI_IMPORT,
|
|
} as const,
|
|
]
|
|
: []),
|
|
{
|
|
kind: NAVIGATION_ITEM_KIND.LINK,
|
|
href: "/integrations",
|
|
label: "Integrations",
|
|
requiredPermission: NAVIGATION_PERMISSION.MANAGE_INTEGRATIONS,
|
|
active: isRouteActive(pathname, "/integrations"),
|
|
},
|
|
{
|
|
kind: NAVIGATION_ITEM_KIND.LINK,
|
|
href: "/lighthouse/settings",
|
|
label: "Lighthouse AI",
|
|
active: isRouteActive(pathname, "/lighthouse/settings"),
|
|
},
|
|
],
|
|
},
|
|
{
|
|
kind: NAVIGATION_ITEM_KIND.COLLAPSIBLE,
|
|
label: "Organization",
|
|
icon: Users,
|
|
defaultOpen: false,
|
|
children: [
|
|
{
|
|
kind: NAVIGATION_ITEM_KIND.LINK,
|
|
href: "/users",
|
|
label: "Users",
|
|
active: isRouteActive(pathname, "/users"),
|
|
},
|
|
{
|
|
kind: NAVIGATION_ITEM_KIND.LINK,
|
|
href: "/invitations",
|
|
label: "Invitations",
|
|
active: isRouteActive(pathname, "/invitations"),
|
|
},
|
|
{
|
|
kind: NAVIGATION_ITEM_KIND.LINK,
|
|
href: "/roles",
|
|
label: "Roles",
|
|
active: isRouteActive(pathname, "/roles"),
|
|
},
|
|
],
|
|
},
|
|
...(isCloudEnvironment && cloudBillingEnabled
|
|
? [
|
|
{
|
|
kind: NAVIGATION_ITEM_KIND.LINK,
|
|
href: "/billing",
|
|
label: "Billing",
|
|
icon: CreditCard,
|
|
requiredPermission: NAVIGATION_PERMISSION.MANAGE_BILLING,
|
|
active: isRouteActive(pathname, "/billing"),
|
|
} as const,
|
|
]
|
|
: []),
|
|
],
|
|
},
|
|
{
|
|
label: "HELP",
|
|
items: [
|
|
{
|
|
kind: NAVIGATION_ITEM_KIND.LINK,
|
|
href: "https://docs.prowler.com/",
|
|
label: "Documentation",
|
|
icon: FileText,
|
|
target: "_blank",
|
|
},
|
|
...(apiReferenceUrl
|
|
? [
|
|
{
|
|
kind: NAVIGATION_ITEM_KIND.LINK,
|
|
href: apiReferenceUrl,
|
|
label: "API Reference",
|
|
icon: Code,
|
|
target: "_blank",
|
|
} as const,
|
|
]
|
|
: []),
|
|
{
|
|
kind: NAVIGATION_ITEM_KIND.LINK,
|
|
href: isCloudEnvironment
|
|
? "https://customer.support.prowler.com/servicedesk/customer/portal/9/create/102"
|
|
: "https://github.com/prowler-cloud/prowler/issues",
|
|
label: isCloudEnvironment ? "Support Desk" : "Community Support",
|
|
icon: MessageCircleQuestion,
|
|
target: "_blank",
|
|
},
|
|
{
|
|
kind: NAVIGATION_ITEM_KIND.LINK,
|
|
href: "https://hub.prowler.com/",
|
|
label: "Prowler Hub",
|
|
icon: LayoutGrid,
|
|
target: "_blank",
|
|
tooltip: "Looking for all available checks? learn more.",
|
|
},
|
|
],
|
|
},
|
|
];
|
|
|
|
return filterNavigationByPermissions(sections, permissions);
|
|
}
|