From 7a3a3c77bbb97022d42974998f1dfe728611c0e8 Mon Sep 17 00:00:00 2001 From: Manan Vaghasiya Date: Fri, 4 Oct 2024 13:20:18 +0530 Subject: [PATCH] Most exploitable dashboard changes (#2327) dashboard changes for most exploitable vulnerabilities --- .../components/landing/CardHeader.tsx | 18 +- .../landing/MostExploitablePromoCard.tsx | 34 + .../landing/VulnerabilitiesCountsCard.tsx | 31 - .../pages/MostExploitableVulnerabilities.tsx | 705 ------------------ .../vulnerabilities/pages/Vulnerability.tsx | 8 +- .../dashboard/src/queries/vulnerability.tsx | 175 ----- .../apps/dashboard/src/routes/private.tsx | 13 - 7 files changed, 47 insertions(+), 937 deletions(-) create mode 100644 deepfence_frontend/apps/dashboard/src/features/vulnerabilities/components/landing/MostExploitablePromoCard.tsx delete mode 100644 deepfence_frontend/apps/dashboard/src/features/vulnerabilities/pages/MostExploitableVulnerabilities.tsx diff --git a/deepfence_frontend/apps/dashboard/src/features/vulnerabilities/components/landing/CardHeader.tsx b/deepfence_frontend/apps/dashboard/src/features/vulnerabilities/components/landing/CardHeader.tsx index b15b242951..8659399a5c 100644 --- a/deepfence_frontend/apps/dashboard/src/features/vulnerabilities/components/landing/CardHeader.tsx +++ b/deepfence_frontend/apps/dashboard/src/features/vulnerabilities/components/landing/CardHeader.tsx @@ -11,20 +11,22 @@ export const CardHeader = ({ }: { icon: ReactNode; title: string; - path: string; + path?: string; }) => { return (
{icon} - -
- More -
- + {path && ( + +
+ More +
+ +
-
- + + )}
); }; diff --git a/deepfence_frontend/apps/dashboard/src/features/vulnerabilities/components/landing/MostExploitablePromoCard.tsx b/deepfence_frontend/apps/dashboard/src/features/vulnerabilities/components/landing/MostExploitablePromoCard.tsx new file mode 100644 index 0000000000..0ef1a2530c --- /dev/null +++ b/deepfence_frontend/apps/dashboard/src/features/vulnerabilities/components/landing/MostExploitablePromoCard.tsx @@ -0,0 +1,34 @@ +import { Button, Card } from 'ui-components'; + +import { DFLink } from '@/components/DFLink'; +import { ArrowLine } from '@/components/icons/common/ArrowLine'; +import { VulnerabilityIcon } from '@/components/sideNavigation/icons/Vulnerability'; +import { CardHeader } from '@/features/vulnerabilities/components/landing/CardHeader'; + +export const MostExploitablePromoCard = () => { + return ( + + } + title={'Most Exploitable Vulnerabilities'} + /> +
+
Too Many Vulnerabilities?
+ + + +
+
+ ); +}; diff --git a/deepfence_frontend/apps/dashboard/src/features/vulnerabilities/components/landing/VulnerabilitiesCountsCard.tsx b/deepfence_frontend/apps/dashboard/src/features/vulnerabilities/components/landing/VulnerabilitiesCountsCard.tsx index 0fe1e6fd58..8b504f0a5b 100644 --- a/deepfence_frontend/apps/dashboard/src/features/vulnerabilities/components/landing/VulnerabilitiesCountsCard.tsx +++ b/deepfence_frontend/apps/dashboard/src/features/vulnerabilities/components/landing/VulnerabilitiesCountsCard.tsx @@ -149,29 +149,6 @@ export const UniqueVulnerabilitiesCountsCard = () => { ); }; -export const MostExploitableVulnerabilitiesCountsCard = () => { - return ( - - } - title={'Most Exploitable Vulnerabilities'} - path={'/vulnerability/most-exploitable'} - /> -
- - -
- } - > - - -
- - ); -}; - const UniqueVulnerabilitiesCardContent = () => { const { data } = useSuspenseQuery({ ...queries.vulnerability.uniqueVulnerabilitiesCount(), @@ -180,14 +157,6 @@ const UniqueVulnerabilitiesCardContent = () => { return ; }; -const MostExploitableVulnerabilitiesCardContent = () => { - const { data } = useSuspenseQuery({ - ...queries.vulnerability.mostExploitableVulnerabilitiesCount(), - }); - - return ; -}; - const CardContent = ({ data, to, diff --git a/deepfence_frontend/apps/dashboard/src/features/vulnerabilities/pages/MostExploitableVulnerabilities.tsx b/deepfence_frontend/apps/dashboard/src/features/vulnerabilities/pages/MostExploitableVulnerabilities.tsx deleted file mode 100644 index 173176b9a6..0000000000 --- a/deepfence_frontend/apps/dashboard/src/features/vulnerabilities/pages/MostExploitableVulnerabilities.tsx +++ /dev/null @@ -1,705 +0,0 @@ -import { useSuspenseQuery } from '@suspensive/react-query'; -import { useIsFetching } from '@tanstack/react-query'; -import { capitalize, upperFirst } from 'lodash-es'; -import { Suspense, useMemo, useState } from 'react'; -import { - ActionFunctionArgs, - Outlet, - useFetcher, - useSearchParams, -} from 'react-router-dom'; -import { toast } from 'sonner'; -import { - Badge, - Breadcrumb, - BreadcrumbLink, - Button, - CircleSpinner, - Combobox, - ComboboxOption, - createColumnHelper, - Table, - TableSkeleton, -} from 'ui-components'; - -import { getReportsApiClient } from '@/api/api'; -import { - ApiDocsBadRequestResponse, - ModelGenerateReportReqReportTypeEnum, - ModelVulnerability, - UtilsReportFiltersScanTypeEnum, -} from '@/api/generated'; -import { DFLink } from '@/components/DFLink'; -import { FilterBadge } from '@/components/filters/FilterBadge'; -import { SearchableClusterList } from '@/components/forms/SearchableClusterList'; -import { SearchableContainerList } from '@/components/forms/SearchableContainerList'; -import { SearchableHostList } from '@/components/forms/SearchableHostList'; -import { SearchableImageList } from '@/components/forms/SearchableImageList'; -import { DownloadLineIcon } from '@/components/icons/common/DownloadLine'; -import { FilterIcon } from '@/components/icons/common/Filter'; -import { PopOutIcon } from '@/components/icons/common/PopOut'; -import { TimesIcon } from '@/components/icons/common/Times'; -import { SeverityBadgeIcon } from '@/components/SeverityBadge'; -import { VulnerabilityIcon } from '@/components/sideNavigation/icons/Vulnerability'; -import { TruncatedText } from '@/components/TruncatedText'; -import { BreadcrumbWrapper } from '@/features/common/BreadcrumbWrapper'; -import { FilterWrapper } from '@/features/common/FilterWrapper'; -import { SearchableCVEList } from '@/features/vulnerabilities/components/ScanResults/SearchableCVEList'; -import { queries } from '@/queries'; -import { useTheme } from '@/theme/ThemeContext'; -import { ScanTypeEnum, VulnerabilitySeverityType } from '@/types/common'; -import { get403Message } from '@/utils/403'; -import { apiWrapper, retryUntilResponseHasValue } from '@/utils/api'; -import { download } from '@/utils/download'; -import { getSeverityPrettyName, SeverityEnumList, SeverityValueType } from '@/utils/enum'; - -const DEFAULT_PAGE_SIZE = 10; - -enum FILTER_SEARCHPARAMS_KEYS_ENUM { - liveConnection = 'liveConnection', - severity = 'severity', - hosts = 'hosts', - containers = 'containers', - containerImages = 'containerImages', - clusters = 'clusters', - cveId = 'cveId', -} - -const FILTER_SEARCHPARAMS_DYNAMIC_KEYS = [ - FILTER_SEARCHPARAMS_KEYS_ENUM.hosts, - FILTER_SEARCHPARAMS_KEYS_ENUM.containerImages, - FILTER_SEARCHPARAMS_KEYS_ENUM.clusters, - FILTER_SEARCHPARAMS_KEYS_ENUM.containers, -]; - -const FILTER_SEARCHPARAMS: Record = { - liveConnection: 'Live connection', - severity: 'CVE severity', - hosts: 'Host', - containers: 'Container', - containerImages: 'Container image', - clusters: 'Cluster', - cveId: 'CVE ID', -}; - -const getPrettyNameForAppliedFilters = ({ - key, - value, -}: { - key: string; - value: string; -}) => { - switch (key) { - case 'severity': - return getSeverityPrettyName(value as SeverityValueType); - case 'liveConnection': - return upperFirst(value); - - default: - return value; - } -}; - -enum ActionEnumType { - DOWNLOAD = 'download', -} -const action = async ({ request }: ActionFunctionArgs): Promise => { - const formData = await request.formData(); - const actionType = formData.get('actionType'); - - if (actionType === ActionEnumType.DOWNLOAD) { - const getReportIdApi = apiWrapper({ - fn: getReportsApiClient().generateReport, - }); - - const getReportIdApiResponse = await getReportIdApi({ - modelGenerateReportReq: { - filters: { - node_type: 'host', - scan_type: UtilsReportFiltersScanTypeEnum.Vulnerability, - most_exploitable_report: true, - }, - report_type: ModelGenerateReportReqReportTypeEnum.Xlsx, - }, - }); - - if (!getReportIdApiResponse.ok) { - if (getReportIdApiResponse.error.response.status === 400) { - const modelResponse: ApiDocsBadRequestResponse = - await getReportIdApiResponse.error.response.json(); - const error = modelResponse.error_fields?.message; - if (error) { - toast.error(error); - return null; - } else { - toast.error('Something went wrong, please try again'); - return null; - } - } else if (getReportIdApiResponse.error.response.status === 403) { - const message = await get403Message(getReportIdApiResponse.error); - toast.error(message); - return null; - } - throw getReportIdApiResponse.error; - } - - const reportId = getReportIdApiResponse.value.report_id; - if (!reportId) { - toast.error('Somethings went wrong, please try again'); - console.error('Report id is missing in api response'); - return null; - } - const getReportApi = apiWrapper({ - fn: getReportsApiClient().getReport, - }); - - const reportResponse = await retryUntilResponseHasValue( - getReportApi, - [{ reportId }], - async (response) => { - if (response.ok) { - if (response.value.status === 'ERROR') { - toast.error( - 'Download failed, please find more details on Integrations > Report Downloads', - ); - return true; - } - const url = response.value.url; - if (!url) { - toast.message( - 'Download in progress, it may take some time however you can always find it on Integrations > Report Downloads', - ); - } - return !!url; - } else { - if (response.error.response.status === 400) { - const modelResponse: ApiDocsBadRequestResponse = - await response.error.response.json(); - const error = modelResponse.error_fields?.message; - if (error) { - toast.error(error); - return true; - } - } - toast.error('Something went wrong, please try again'); - return true; - } - }, - ); - - if (reportResponse.ok) { - const url = reportResponse.value.url; - if (url) { - download(url); - } else { - toast.error('Something went wrong, please try again'); - } - } - } - return null; -}; -const getAppliedFiltersCount = (searchParams: URLSearchParams) => { - return Object.keys(FILTER_SEARCHPARAMS).reduce((prev, curr) => { - return prev + searchParams.getAll(curr).length; - }, 0); -}; -const Filters = () => { - const [searchParams, setSearchParams] = useSearchParams(); - - const [severity, setSeverity] = useState(''); - const [liveConnection, setLiveConnection] = useState(''); - - const onFilterRemove = ({ key, value }: { key: string; value: string }) => { - return () => { - setSearchParams((prev) => { - const existingValues = prev.getAll(key); - prev.delete(key); - existingValues.forEach((existingValue) => { - if (existingValue !== value) prev.append(key, existingValue); - }); - prev.delete('page'); - return prev; - }); - }; - }; - - const appliedFilterCount = getAppliedFiltersCount(searchParams); - return ( - -
- FILTER_SEARCHPARAMS['severity']} - multiple - value={searchParams.getAll('severity')} - onChange={(values) => { - setSearchParams((prev) => { - prev.delete('severity'); - values.forEach((value) => { - prev.append('severity', value); - }); - prev.delete('page'); - return prev; - }); - }} - onQueryChange={(query) => { - setSeverity(query); - }} - clearAllElement="Clear" - onClearAll={() => { - setSearchParams((prev) => { - prev.delete('severity'); - prev.delete('page'); - return prev; - }); - }} - > - {SeverityEnumList.filter((item) => { - if (!severity.length) return true; - return item.includes(severity.toLowerCase()); - }).map((item) => { - return ( - - {capitalize(item)} - - ); - })} - - { - setSearchParams((prev) => { - prev.delete('cveId'); - values.forEach((value) => { - prev.append('cveId', value); - }); - prev.delete('page'); - return prev; - }); - }} - onClearAll={() => { - setSearchParams((prev) => { - prev.delete('cveId'); - prev.delete('page'); - return prev; - }); - }} - /> - FILTER_SEARCHPARAMS['liveConnection']} - multiple - value={searchParams.getAll('liveConnection')} - onChange={(values) => { - setSearchParams((prev) => { - prev.delete('liveConnection'); - values.forEach((value) => { - prev.append('liveConnection', value); - }); - prev.delete('page'); - return prev; - }); - }} - onQueryChange={(query) => { - setLiveConnection(query); - }} - clearAllElement="Clear" - onClearAll={() => { - setSearchParams((prev) => { - prev.delete('liveConnection'); - prev.delete('page'); - return prev; - }); - }} - > - {['active', 'in active'] - .filter((item) => { - if (!liveConnection.length) return true; - return item.includes(liveConnection.toLowerCase()); - }) - .map((item) => { - return ( - - {capitalize(item)} - - ); - })} - - { - setSearchParams((prev) => { - prev.delete('hosts'); - prev.delete('page'); - return prev; - }); - }} - onChange={(value) => { - setSearchParams((prev) => { - prev.delete('hosts'); - value.forEach((host) => { - prev.append('hosts', host); - }); - prev.delete('page'); - return prev; - }); - }} - /> - { - setSearchParams((prev) => { - prev.delete('containers'); - value.forEach((container) => { - prev.append('containers', container); - }); - prev.delete('page'); - return prev; - }); - }} - /> - { - setSearchParams((prev) => { - prev.delete('containerImages'); - prev.delete('page'); - return prev; - }); - }} - onChange={(value) => { - setSearchParams((prev) => { - prev.delete('containerImages'); - value.forEach((containerImage) => { - prev.append('containerImages', containerImage); - }); - prev.delete('page'); - return prev; - }); - }} - /> - { - setSearchParams((prev) => { - prev.delete('clusters'); - prev.delete('page'); - return prev; - }); - }} - onChange={(value) => { - setSearchParams((prev) => { - prev.delete('clusters'); - value.forEach((cluster) => { - prev.append('clusters', cluster); - }); - prev.delete('page'); - return prev; - }); - }} - /> -
- {appliedFilterCount > 0 ? ( -
- {( - Array.from(searchParams).filter(([key]) => { - return Object.keys(FILTER_SEARCHPARAMS).includes(key); - }) as Array<[FILTER_SEARCHPARAMS_KEYS_ENUM, string]> - ).map(([key, value]) => { - if (FILTER_SEARCHPARAMS_DYNAMIC_KEYS.includes(key)) { - return ( - { - if (key === FILTER_SEARCHPARAMS_KEYS_ENUM.hosts) { - return 'host'; - } else if (key === FILTER_SEARCHPARAMS_KEYS_ENUM.containerImages) { - return 'containerImage'; - } else if (key === FILTER_SEARCHPARAMS_KEYS_ENUM.clusters) { - return 'cluster'; - } else if (key === FILTER_SEARCHPARAMS_KEYS_ENUM.containers) { - return 'container'; - } - throw new Error('unknown key'); - })()} - onRemove={onFilterRemove({ key, value })} - id={value} - label={FILTER_SEARCHPARAMS[key]} - /> - ); - } - return ( - - ); - })} - -
- ) : null} -
- ); -}; -const MostExploitTable = () => { - const { mode: theme } = useTheme(); - const [searchParams] = useSearchParams(); - const columnHelper = createColumnHelper(); - const [pageSize, setPageSize] = useState(DEFAULT_PAGE_SIZE); - const columns = useMemo(() => { - const columns = [ - columnHelper.accessor('cve_id', { - enableResizing: true, - cell: (info) => ( - -
-
- -
-
- -
- ), - header: () => , - minSize: 100, - size: 150, - maxSize: 250, - }), - columnHelper.accessor('cve_caused_by_package', { - cell: (info) => , - header: () => , - minSize: 100, - size: 120, - maxSize: 125, - }), - columnHelper.accessor('cve_severity', { - enableResizing: false, - sortingFn: (rowA, rowB) => { - const severityA = rowA.original.cve_severity?.toLowerCase() || 'default'; - const severityB = rowB.original.cve_severity?.toLowerCase() || 'default'; - const severityMap: { [key: string]: number } = { - critical: 4, - high: 3, - medium: 2, - low: 1, - unknown: 0, - default: 0, - }; - return severityMap[severityA] - severityMap[severityB]; - }, - cell: (info) => ( -
- - {upperFirst(info.getValue())} -
- ), - header: () => , - minSize: 80, - size: 80, - maxSize: 100, - }), - columnHelper.accessor('cve_cvss_score', { - enableResizing: false, - cell: (info) => ( -
{info.getValue()}
- ), - header: () => , - minSize: 70, - size: 60, - maxSize: 85, - }), - columnHelper.accessor('cve_attack_vector', { - cell: (info) => { - if (!info.getValue().length) { - return
; - } - return ; - }, - header: () => , - minSize: 100, - size: 120, - maxSize: 250, - }), - columnHelper.accessor('has_live_connection', { - enableResizing: false, - cell: (info) =>
{info.getValue() === true ? 'Active' : 'In Active'}
, - header: () => 'Live', - minSize: 60, - size: 70, - maxSize: 70, - }), - columnHelper.accessor('exploit_poc', { - enableSorting: false, - enableResizing: false, - cell: (info) => { - if (!info.getValue().length) { - return
; - } - return ( - -
- -
-
- ); - }, - header: () => , - minSize: 60, - size: 60, - maxSize: 70, - }), - columnHelper.accessor('cve_description', { - enableSorting: false, - enableResizing: true, - cell: (info) => , - header: () => , - minSize: 200, - size: 200, - maxSize: 210, - }), - ]; - - return columns; - }, [searchParams, theme]); - - const { data } = useSuspenseQuery({ - ...queries.vulnerability.mostExploitableVulnerabilities({ - liveConnection: searchParams.getAll('liveConnection'), - severity: searchParams.getAll('severity'), - hostIds: searchParams.getAll('hosts'), - containerIds: searchParams.getAll('containers'), - containerImageIds: searchParams.getAll('containerImages'), - clusterIds: searchParams.getAll('clusters'), - cve: searchParams.getAll('cveId'), - }), - }); - - return ( - { - setPageSize(newSize); - }} - /> - ); -}; - -const MostExploitableVulnerabilities = () => { - const isFetching = useIsFetching({ - queryKey: queries.vulnerability.mostExploitableVulnerabilities._def, - }); - const [filtersExpanded, setFiltersExpanded] = useState(false); - const [searchParams] = useSearchParams(); - const fetcher = useFetcher(); - - return ( -
- - - } isLink> - - Vulnerabilities - - - - Most Exploitable Vulnerabilities - - - -
- {isFetching ? : null} -
-
-
-
-
- - -
-
- {filtersExpanded ? : null} - }> - - -
- -
- ); -}; - -export const module = { - element: , - action, -}; diff --git a/deepfence_frontend/apps/dashboard/src/features/vulnerabilities/pages/Vulnerability.tsx b/deepfence_frontend/apps/dashboard/src/features/vulnerabilities/pages/Vulnerability.tsx index d3bbb44790..f490db6f82 100644 --- a/deepfence_frontend/apps/dashboard/src/features/vulnerabilities/pages/Vulnerability.tsx +++ b/deepfence_frontend/apps/dashboard/src/features/vulnerabilities/pages/Vulnerability.tsx @@ -6,12 +6,10 @@ import { FileLineIcon } from '@/components/icons/common/FileLine'; import { SeverityLegend } from '@/components/SeverityBadge'; import { VulnerabilityIcon } from '@/components/sideNavigation/icons/Vulnerability'; import { BreadcrumbWrapper } from '@/features/common/BreadcrumbWrapper'; +import { MostExploitablePromoCard } from '@/features/vulnerabilities/components/landing/MostExploitablePromoCard'; import { TopAttackPaths } from '@/features/vulnerabilities/components/landing/TopAttackPaths'; import { TopNVulnerableCard } from '@/features/vulnerabilities/components/landing/TopNVulnerableCard'; -import { - MostExploitableVulnerabilitiesCountsCard, - UniqueVulnerabilitiesCountsCard, -} from '@/features/vulnerabilities/components/landing/VulnerabilitiesCountsCard'; +import { UniqueVulnerabilitiesCountsCard } from '@/features/vulnerabilities/components/landing/VulnerabilitiesCountsCard'; const Vulnerability = () => { return ( @@ -64,7 +62,7 @@ const Vulnerability = () => {
- +
diff --git a/deepfence_frontend/apps/dashboard/src/queries/vulnerability.tsx b/deepfence_frontend/apps/dashboard/src/queries/vulnerability.tsx index c032c0620c..e866effb4c 100644 --- a/deepfence_frontend/apps/dashboard/src/queries/vulnerability.tsx +++ b/deepfence_frontend/apps/dashboard/src/queries/vulnerability.tsx @@ -844,181 +844,6 @@ export const vulnerabilityQueries = createQueryKeys('vulnerability', { }, }; }, - mostExploitableVulnerabilities: (filters: { - severity: string[]; - liveConnection: string[]; - hostIds: string[]; - containerIds: string[]; - containerImageIds: string[]; - clusterIds: string[]; - cve: string[]; - }) => { - const { - severity, - liveConnection, - hostIds, - containerIds, - containerImageIds, - clusterIds, - cve, - } = filters; - return { - queryKey: [{ filters }], - queryFn: async () => { - const results: { - vulnerabilities: Array; - currentPage: number; - totalRows: number; - message?: string; - } = { - currentPage: 1, - totalRows: 0, - vulnerabilities: [], - }; - - const searchVulnerabilitiesRequestParams: SearchSearchNodeReq = { - extended_node_filter: { - in_field_filter: null, - filters: { - order_filter: { - order_fields: [{ descending: true, field_name: 'cve_cvss_score' }], - }, - compare_filter: null, - contains_filter: { filter_in: {} }, - match_filter: { filter_in: {} }, - not_contains_filter: { filter_in: {} }, - }, - window: { - offset: 0, - size: 0, - }, - }, - node_filter: { - filters: { - contains_filter: { filter_in: { exploitability_score: [1, 2, 3] } }, - order_filter: { - order_fields: [ - { - size: 1000, - field_name: 'exploitability_score', - descending: true, - }, - ], - }, - match_filter: { filter_in: {} }, - compare_filter: null, - }, - in_field_filter: null, - window: { - offset: 0, - size: 0, - }, - }, - window: { offset: 0, size: 1000 }, - }; - - const nodeIds = [...hostIds, ...containerIds, ...containerImageIds]; - - if (nodeIds.length || clusterIds.length) { - const nodeTypes = []; - if (hostIds.length) { - nodeTypes.push('host'); - } - if (containerIds.length) { - nodeTypes.push('container'); - } - if (containerImageIds.length) { - nodeTypes.push('container_image'); - } - - const containsFilter = { - filter_in: {}, - }; - if (nodeIds.length) { - containsFilter.filter_in = { - node_id: nodeIds, - node_type: nodeTypes, - }; - } - if (clusterIds.length) { - containsFilter.filter_in = { - ...containsFilter.filter_in, - kubernetes_cluster_id: clusterIds, - }; - } - searchVulnerabilitiesRequestParams.related_node_filter = { - relation_ship: 'DETECTED', - node_filter: { - filters: { - contains_filter: { filter_in: {} }, - order_filter: { order_fields: [] }, - match_filter: { filter_in: {} }, - compare_filter: null, - }, - in_field_filter: null, - window: { - offset: 0, - size: 0, - }, - }, - next_filter: { - relation_ship: 'SCANNED', - node_filter: { - filters: { - contains_filter: containsFilter, - compare_filter: [], - match_filter: { filter_in: {} }, - order_filter: { order_fields: [] }, - }, - in_field_filter: [], - window: { - offset: 0, - size: 0, - }, - }, - }, - }; - } - - if (cve.length) { - searchVulnerabilitiesRequestParams!.extended_node_filter!.filters.contains_filter.filter_in![ - 'cve_id' - ] = cve; - } - - const searchVulnerabilitiesApi = apiWrapper({ - fn: getSearchApiClient().searchVulnerabilities, - }); - const searchVulnerabilitiesResponse = await searchVulnerabilitiesApi({ - searchSearchNodeReq: searchVulnerabilitiesRequestParams, - }); - - if (!searchVulnerabilitiesResponse.ok) { - throw searchVulnerabilitiesResponse.error; - } - - results.vulnerabilities = searchVulnerabilitiesResponse.value; - - if (severity?.length || liveConnection?.length) { - results.vulnerabilities = results.vulnerabilities.filter((v) => { - let match = true; - if (severity.length && !severity.includes(v.cve_severity)) { - match = false; - } - if ( - liveConnection.length && - !liveConnection.includes(v.has_live_connection ? 'active' : 'inActive') - ) { - match = false; - } - return match; - }); - } - - return results; - }, - }; - }, top5VulnerableAssets: (filters: { nodeType: 'image' | 'host' | 'container' }) => { const { nodeType } = filters; return { diff --git a/deepfence_frontend/apps/dashboard/src/routes/private.tsx b/deepfence_frontend/apps/dashboard/src/routes/private.tsx index 5975924f23..67950266f1 100644 --- a/deepfence_frontend/apps/dashboard/src/routes/private.tsx +++ b/deepfence_frontend/apps/dashboard/src/routes/private.tsx @@ -89,7 +89,6 @@ import { module as cloudResourceTable } from '@/features/topology/pages/CloudRes import { module as inventory } from '@/features/topology/pages/Inventory'; import { module as llm } from '@/features/topology/pages/LLM'; import { module as visual } from '@/features/topology/pages/ViewType'; -import { module as mostExploitableVulnerabilities } from '@/features/vulnerabilities/pages/MostExploitableVulnerabilities'; import { module as runtimeBom } from '@/features/vulnerabilities/pages/RuntimeBom'; import { module as uniqueVulnerabilities } from '@/features/vulnerabilities/pages/UniqueVulnerabilities'; import { module as vulnerability } from '@/features/vulnerabilities/pages/Vulnerability'; @@ -359,18 +358,6 @@ export const privateRoutes: CustomRouteObject[] = [ }, ], }, - { - path: 'vulnerability/most-exploitable', - ...mostExploitableVulnerabilities, - meta: { title: 'Most Exploitable Vulnerabilities' }, - children: [ - { - path: ':cveId', - ...vulnerabilityDetails, - meta: { title: 'Most Exploitable Vulnerability Details' }, - }, - ], - }, { path: 'vulnerability/unique-vulnerabilities', ...uniqueVulnerabilities,