Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import React from 'react';
import type { ReactElement } from 'react';
import {
Chip,
ChipGroup,
Expand All @@ -11,7 +12,8 @@ import {
Title,
} from '@patternfly/react-core';

import { ViewBasedReportSnapshot } from 'services/ReportsService.types';
import useFeatureFlags from 'hooks/useFeatureFlags';
import type { ViewBasedReportSnapshot } from 'services/ReportsService.types';
import VulnerabilitySeverityIconText from 'Components/PatternFly/IconText/VulnerabilitySeverityIconText';
import { getSearchFilterFromSearchString } from 'utils/searchUtils';

Expand All @@ -20,6 +22,52 @@ export type ViewBasedReportJobDetailsProps = {
};

function ViewBasedReportJobDetails({ reportSnapshot }: ViewBasedReportJobDetailsProps) {
// TODO Analyze pro and con of redundancy with ReportParametersDedtails component.
const { isFeatureFlagEnabled } = useFeatureFlags();
const optionalColumnsDescriptions: ReactElement[] = [];
if (isFeatureFlagEnabled('ROX_SCANNER_V4') && reportSnapshot.vulnReportFilters.includeNvdCvss) {
optionalColumnsDescriptions.push(
<DescriptionListDescription key="includeNvdCvss">NVDCVSS</DescriptionListDescription>
);
}
if (
isFeatureFlagEnabled('ROX_SCANNER_V4') &&
reportSnapshot.vulnReportFilters.includeEpssProbability
) {
optionalColumnsDescriptions.push(
<DescriptionListDescription key="includeEpssProbability">
EPSS Probability Percentage
</DescriptionListDescription>
);
}
/*
if (
isFeatureFlagEnabled('ROX_SCANNER_V4') &&
reportSnapshot.vulnReportFilters.includeAdvisory
) {
optionalColumnsDescriptions.push(
<DescriptionListDescription key="includeAdvisory">
Advisory Name and Advisory Link
</DescriptionListDescription>
);
}
*/
/*
// Ross CISA KEV includeKnownExploit?
// Probably for 4.9 because optional columns might not be up to date for view-based reports.
if (
isFeatureFlagEnabled('ROX_SCANNER_V4') &&
isFeatureFlagEnabled('ROX_WHATEVER') &&
formValues.reportParameters.includeKnownExploit
) {
optionalColumnsDescriptions.push(
<DescriptionListDescription key="includeKnownExploit">
Known exploit
</DescriptionListDescription>
);
}
*/

// @TODO: We need to separate the "CVE Severity" and "CVEs discovered since" filters from the rest of the filters.
// The relevant search terms are called "Severity" and "CVE Discovered Time".
const query = getSearchFilterFromSearchString(reportSnapshot.vulnReportFilters.query);
Expand Down Expand Up @@ -108,17 +156,12 @@ function ViewBasedReportJobDetails({ reportSnapshot }: ViewBasedReportJobDetails
<DescriptionListTerm>CVEs discovered since</DescriptionListTerm>
<DescriptionListDescription>All time</DescriptionListDescription>
</DescriptionListGroup>
<DescriptionListGroup>
<DescriptionListTerm>Optional columns</DescriptionListTerm>
<DescriptionListDescription>
<Stack>
{reportSnapshot.vulnReportFilters.includeNvdCvss && <div>NVD CVSS</div>}
{reportSnapshot.vulnReportFilters.includeEpssProbability && (
<div>EPSS probability</div>
)}
</Stack>
</DescriptionListDescription>
</DescriptionListGroup>
{optionalColumnsDescriptions.length !== 0 && (
<DescriptionListGroup>
<DescriptionListTerm>Optional columns</DescriptionListTerm>
{optionalColumnsDescriptions}
</DescriptionListGroup>
)}
</DescriptionList>
</Flex>
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import React from 'react';
import type { ReactElement } from 'react';
import {
DescriptionList,
DescriptionListDescription,
Expand All @@ -7,7 +9,6 @@ import {
FlexItem,
Title,
} from '@patternfly/react-core';
import React, { ReactElement } from 'react';

import { ReportFormValues } from 'Containers/Vulnerabilities/VulnerablityReporting/forms/useReportFormValues';
import { fixabilityLabels } from 'constants/reportConstants';
Expand All @@ -29,14 +30,43 @@ function ReportParametersDetails({
formValues,
}: ReportParametersDetailsProps): ReactElement {
const { isFeatureFlagEnabled } = useFeatureFlags();
const isIncludeAdvisoryEnabled = isFeatureFlagEnabled('ROX_SCANNER_V4');
const hasIncludeAdvisory =
isIncludeAdvisoryEnabled && formValues.reportParameters.includeAdvisory;
const isIncludeEpssProbabilityEnabled = isFeatureFlagEnabled('ROX_SCANNER_V4');
const hasIncludeEpssProbability =
isIncludeEpssProbabilityEnabled && formValues.reportParameters.includeEpssProbability;
const isIncludeNvdCvssEnabled = isFeatureFlagEnabled('ROX_SCANNER_V4');
const hasIncludeNvdCvss = isIncludeNvdCvssEnabled && formValues.reportParameters.includeNvdCvss;
const optionalColumnsDescriptions: ReactElement[] = [];
if (isFeatureFlagEnabled('ROX_SCANNER_V4') && formValues.reportParameters.includeNvdCvss) {
optionalColumnsDescriptions.push(
<DescriptionListDescription key="includeNvdCvss">NVDCVSS</DescriptionListDescription>
);
}
if (
isFeatureFlagEnabled('ROX_SCANNER_V4') &&
formValues.reportParameters.includeEpssProbability
) {
optionalColumnsDescriptions.push(
<DescriptionListDescription key="includeEpssProbability">
EPSS Probability Percentage
</DescriptionListDescription>
);
}
if (isFeatureFlagEnabled('ROX_SCANNER_V4') && formValues.reportParameters.includeAdvisory) {
optionalColumnsDescriptions.push(
<DescriptionListDescription key="includeAdvisory">
Advisory Name and Advisory Link
</DescriptionListDescription>
);
}
/*
// Ross CISA KEV includeKnownExploit?
if (
isFeatureFlagEnabled('ROX_SCANNER_V4') &&
isFeatureFlagEnabled('ROX_WHATEVER') &&
formValues.reportParameters.includeKnownExploit
) {
optionalColumnsDescriptions.push(
<DescriptionListDescription key="includeKnownExploit">
Known exploit
</DescriptionListDescription>
);
}
*/

const cveSeverities =
formValues.reportParameters.cveSeverities.length !== 0 ? (
Expand Down Expand Up @@ -136,22 +166,10 @@ function ReportParametersDetails({
<DescriptionListDescription>Discovered At</DescriptionListDescription>
<DescriptionListDescription>Reference</DescriptionListDescription>
</DescriptionListGroup>
{(hasIncludeNvdCvss || hasIncludeEpssProbability || hasIncludeAdvisory) && (
{optionalColumnsDescriptions.length !== 0 && (
<DescriptionListGroup>
<DescriptionListTerm>Optional columns</DescriptionListTerm>
{hasIncludeNvdCvss && (
<DescriptionListDescription>NVDCVSS</DescriptionListDescription>
)}
{hasIncludeEpssProbability && (
<DescriptionListDescription>
EPSS Probability Percentage
</DescriptionListDescription>
)}
{hasIncludeAdvisory && (
<DescriptionListDescription>
Advisory Name and Advisory Link
</DescriptionListDescription>
)}
{optionalColumnsDescriptions}
</DescriptionListGroup>
)}
</DescriptionList>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import React, { ChangeEvent, FormEvent, ReactElement } from 'react';
import React from 'react';
import type { ChangeEvent, FormEvent, ReactElement } from 'react';
import {
Checkbox,
DatePicker,
Expand All @@ -13,7 +14,7 @@ import {
TextInput,
Title,
} from '@patternfly/react-core';
import { FormikProps } from 'formik';
import type { FormikProps } from 'formik';
import { cloneDeep } from 'lodash';

import {
Expand All @@ -31,8 +32,8 @@ import SelectSingle from 'Components/SelectSingle/SelectSingle';
import VulnerabilitySeverityIconText from 'Components/PatternFly/IconText/VulnerabilitySeverityIconText';
import FormLabelGroup from 'Components/PatternFly/FormLabelGroup';
import useFeatureFlags from 'hooks/useFeatureFlags';
import { CollectionSlim } from 'services/CollectionsService';
import { NotifierConfiguration } from 'services/ReportsService.types';
import type { CollectionSlim } from 'services/CollectionsService';
import type { NotifierConfiguration } from 'services/ReportsService.types';
import CollectionSelection from './CollectionSelection';

export type ReportParametersFormProps = {
Expand All @@ -42,9 +43,54 @@ export type ReportParametersFormProps = {

function ReportParametersForm({ title, formik }: ReportParametersFormProps): ReactElement {
const { isFeatureFlagEnabled } = useFeatureFlags();
const isIncludeAdvisoryEnabled = isFeatureFlagEnabled('ROX_SCANNER_V4');
const isIncludeEpssProbabilityEnabled = isFeatureFlagEnabled('ROX_SCANNER_V4');
const isIncludeNvdCvssEnabled = isFeatureFlagEnabled('ROX_SCANNER_V4');
const optionalColumnsCheckboxes: ReactElement[] = [];
if (isFeatureFlagEnabled('ROX_SCANNER_V4')) {
optionalColumnsCheckboxes.push(
<Checkbox
key="includeNvdCvss"
label="NVD CVSS"
id="reportParameters.includeNvdCvss"
isChecked={formik.values.reportParameters.includeNvdCvss}
onChange={onChange}
/>
);
}
if (isFeatureFlagEnabled('ROX_SCANNER_V4')) {
optionalColumnsCheckboxes.push(
<Checkbox
key="includeEpssProbability"
label="EPSS probability"
id="reportParameters.includeEpssProbability"
isChecked={formik.values.reportParameters.includeEpssProbability}
onChange={onChange}
/>
);
}
if (isFeatureFlagEnabled('ROX_SCANNER_V4')) {
optionalColumnsCheckboxes.push(
<Checkbox
key="includeAdvisory"
label="Advisory Name and Advisory Link"
id="reportParameters.includeAdvisory"
isChecked={formik.values.reportParameters.includeAdvisory}
onChange={onChange}
/>
);
}
/*
// Ross CISA KEV includeKnownExploit?
if (isFeatureFlagEnabled('ROX_SCANNER_V4') && isFeatureFlagEnabled('ROX_WHATEVER')) {
optionalColumnsCheckboxes.push(
<Checkbox
key="includeKnownExploit"
label="known exploit"
id="reportParameters.includeKnownExploit"
isChecked={formik.values.reportParameters.includeKnownExploit}
onChange={onChange}
/>
);
}
*/

const handleTextChange =
(fieldName: string) =>
Expand Down Expand Up @@ -291,34 +337,9 @@ function ReportParametersForm({ title, formik }: ReportParametersFormProps): Rea
/>
</FormLabelGroup>
)}
{(isIncludeNvdCvssEnabled ||
isIncludeEpssProbabilityEnabled ||
isIncludeAdvisoryEnabled) && (
{optionalColumnsCheckboxes.length !== 0 && (
<FormGroup label="Optional columns" isInline isStack>
{isIncludeNvdCvssEnabled && (
<Checkbox
label="Include NVD CVSS"
id="reportParameters.includeNvdCvss"
isChecked={formik.values.reportParameters.includeNvdCvss}
onChange={onChange}
/>
)}
{isIncludeEpssProbabilityEnabled && (
<Checkbox
label="Include EPSS probability"
id="reportParameters.includeEpssProbability"
isChecked={formik.values.reportParameters.includeEpssProbability}
onChange={onChange}
/>
)}
{isIncludeAdvisoryEnabled && (
<Checkbox
label="Include advisory name and link"
id="reportParameters.includeAdvisory"
isChecked={formik.values.reportParameters.includeAdvisory}
onChange={onChange}
/>
)}
{optionalColumnsCheckboxes}
</FormGroup>
)}
<FormLabelGroup
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ export type ReportParametersFormValues = {
cvesDiscoveredStartDate: CVESDiscoveredStartDate;
includeAdvisory: boolean;
includeEpssProbability: boolean;
// Ross CISA KEV includeKnownExploit?
includeNvdCvss: boolean;
reportScope: ReportScope | null;
};
Expand Down Expand Up @@ -82,6 +83,7 @@ export const defaultReportFormValues: ReportFormValues = {
cvesDiscoveredStartDate: undefined,
includeAdvisory: false,
includeEpssProbability: false,
// Ross CISA KEV includeKnownExploit?
includeNvdCvss: false,
reportScope: null,
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ describe('utils', () => {
imageType: [],
includeAdvisory: false,
includeEpssProbability: false,
// Ross CISA KEV includeKnownExploit?
includeNvdCvss: false,
cvesDiscoveredSince: 'ALL_VULN',
cvesDiscoveredStartDate: undefined,
Expand All @@ -103,6 +104,7 @@ describe('utils', () => {
imageType: [],
includeAdvisory: false,
includeEpssProbability: false,
// Ross CISA KEV includeKnownExploit?
includeNvdCvss: false,
cvesDiscoveredSince: 'SINCE_LAST_REPORT',
cvesDiscoveredStartDate: undefined,
Expand All @@ -123,6 +125,7 @@ describe('utils', () => {
imageType: [],
includeAdvisory: false,
includeEpssProbability: false,
// Ross CISA KEV includeKnownExploit?
includeNvdCvss: false,
cvesDiscoveredSince: 'START_DATE',
cvesDiscoveredStartDate: '2023-10-02',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ export function getReportConfigurationFromFormValues(
imageTypes: reportParameters.imageType,
includeAdvisory: reportParameters.includeAdvisory,
includeEpssProbability: reportParameters.includeEpssProbability,
// Ross CISA KEV includeKnownExploit?
includeNvdCvss: reportParameters.includeNvdCvss,
};
let vulnReportFilters: VulnerabilityReportFilters;
Expand Down Expand Up @@ -191,6 +192,7 @@ export function getReportFormValuesFromConfiguration(
cvesDiscoveredStartDate,
includeAdvisory: vulnReportFilters.includeAdvisory,
includeEpssProbability: vulnReportFilters.includeEpssProbability,
// Ross CISA KEV includeKnownExploit?
includeNvdCvss: vulnReportFilters.includeNvdCvss,
reportScope: {
id: resourceScope.collectionScope.collectionId,
Expand Down
Loading