mirror of
https://github.com/fleetdm/fleet
synced 2026-05-24 09:28:54 +00:00
111 lines
3.1 KiB
TypeScript
111 lines
3.1 KiB
TypeScript
import React from "react";
|
|
import CustomLink from "components/CustomLink";
|
|
import EmptyTable from "components/EmptyTable";
|
|
import { IEmptyTableProps } from "interfaces/empty_table";
|
|
import { IVulnerabilitiesEmptyStateReason } from "services/entities/vulnerabilities";
|
|
|
|
export interface IEmptyVulnerabilitiesTableProps {
|
|
isPremiumTier?: boolean;
|
|
teamId?: number;
|
|
exploitedFilter?: boolean;
|
|
isSoftwareDisabled?: boolean;
|
|
emptyStateReason?: IVulnerabilitiesEmptyStateReason;
|
|
}
|
|
|
|
const LearnMoreLink = () => (
|
|
<CustomLink
|
|
url="https://fleetdm.com/learn-more-about/vulnerability-processing"
|
|
text="Learn more"
|
|
newTab
|
|
/>
|
|
);
|
|
|
|
const emptyStateDetails: Record<
|
|
IVulnerabilitiesEmptyStateReason,
|
|
Partial<IEmptyTableProps>
|
|
> = {
|
|
"no-vulns-detected": {
|
|
graphicName: "empty-search-question",
|
|
header: "No vulnerabilities detected",
|
|
info: "Expecting to see vulnerabilities? Check back later.",
|
|
},
|
|
"no-matching-items": {
|
|
graphicName: "empty-search-question",
|
|
header: "No items match the current search criteria",
|
|
info: "Expecting to see vulnerabilities? Check back later.",
|
|
},
|
|
"invalid-cve": {
|
|
graphicName: "empty-search-exclamation",
|
|
header: "That vulnerability (CVE) is not valid",
|
|
info:
|
|
'Try updating your search to use CVE format: "CVE-YYYY-<4 or more digits>"',
|
|
},
|
|
"unknown-cve": {
|
|
graphicName: "empty-search-question",
|
|
header: "This is not a known CVE",
|
|
info: "None of Fleet's vulnerability sources are aware of this CVE.",
|
|
additionalInfo: <LearnMoreLink />,
|
|
},
|
|
"known-vuln": {
|
|
graphicName: "empty-search-check",
|
|
header:
|
|
"This is a known vulnerability (CVE), but it wasn't detected on any hosts",
|
|
additionalInfo: <LearnMoreLink />,
|
|
},
|
|
};
|
|
|
|
const EmptyVulnerabilitiesTable: React.FC<IEmptyVulnerabilitiesTableProps> = ({
|
|
isPremiumTier,
|
|
teamId,
|
|
exploitedFilter,
|
|
isSoftwareDisabled,
|
|
emptyStateReason,
|
|
}) => {
|
|
if (isSoftwareDisabled) {
|
|
return (
|
|
<EmptyTable
|
|
graphicName="empty-search-question"
|
|
header="Software inventory disabled"
|
|
info={
|
|
<>
|
|
Users with the admin role can{" "}
|
|
<CustomLink
|
|
url="https://fleetdm.com/docs/using-fleet/vulnerability-processing#configuration"
|
|
text="turn on software inventory"
|
|
newTab
|
|
/>
|
|
.
|
|
</>
|
|
}
|
|
/>
|
|
);
|
|
}
|
|
|
|
const defaultEmptyState: IEmptyTableProps = {
|
|
graphicName: "empty-search-question",
|
|
header: "No items match the current search criteria",
|
|
info: "Expecting to see vulnerabilities? Check back later.",
|
|
};
|
|
|
|
const emptyState = emptyStateReason
|
|
? { ...defaultEmptyState, ...emptyStateDetails[emptyStateReason] }
|
|
: defaultEmptyState;
|
|
|
|
if (emptyStateReason === "known-vuln" && teamId !== undefined) {
|
|
emptyState.header += " in this team";
|
|
}
|
|
|
|
if (
|
|
isPremiumTier &&
|
|
exploitedFilter &&
|
|
emptyStateReason !== "unknown-cve" &&
|
|
emptyStateReason !== "invalid-cve"
|
|
) {
|
|
emptyState.info =
|
|
"Try removing the exploited vulnerabilities filter to expand your search.";
|
|
}
|
|
|
|
return <EmptyTable {...emptyState} />;
|
|
};
|
|
|
|
export default EmptyVulnerabilitiesTable;
|