/* * Copyright (c) All respective contributors to the Peridot Project. All rights reserved. * Copyright (c) 2021-2022 Rocky Enterprise Software Foundation, Inc. All rights reserved. * Copyright (c) 2021-2022 Ctrl IQ, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. Neither the name of the copyright holder nor the names of its contributors * may be used to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ import { Alert, AlertDescription, AlertIcon, AlertTitle, Box, Breadcrumb, BreadcrumbItem, BreadcrumbLink, Heading, HStack, Link, ListItem, Spinner, Tab, TabList, TabPanel, TabPanels, Tabs, Text, UnorderedList, useColorModeValue, VStack, } from '@chakra-ui/react'; import { severityToBadge, severityToText, typeToText, } from 'apollo/ui/src/enumToText'; import { V1Advisory, V1AdvisoryType, } from 'bazel-bin/apollo/proto/v1/client_typescript'; import { reqap } from 'common/ui/reqap'; import React, { useState } from 'react'; import { RouteComponentProps } from 'react-router'; import { Link as RouterLink } from 'react-router-dom'; import { api } from '../api'; import { COLOR_RESF_GREEN } from '../styles'; interface ShowErrataParams { id: string; } export interface ShowErrataProps extends RouteComponentProps {} export const ShowErrata = (props: ShowErrataProps) => { const id = props.match.params.id; const cardBg = useColorModeValue('white', 'gray.800'); const sideBg = useColorModeValue('gray.100', 'gray.700'); const linkBlue = useColorModeValue('blue.600', 'blue.300'); const linkPurple = useColorModeValue('purple.600', 'purple.300'); const [errata, setErrata] = useState(); const [isLoading, setIsLoading] = useState(true); const [isError, setIsError] = useState(false); React.useEffect(() => { const fetch = async () => { setIsLoading(true); const [err, res] = await reqap(() => api.getAdvisory({ id })); setIsLoading(false); if (err || !res) { setIsError(true); setErrata(undefined); return; } setIsError(false); setErrata(res.advisory); }; fetch(); }, [id]); return ( Product Errata {id} {isLoading ? ( ) : isError ? ( Something has gone wrong Failed to load errata ) : ( errata && ( <> {severityToBadge(errata.severity, errata.type, 40)} {errata.name} {errata.synopsis} Erratum Affected Packages Topic {errata.topic?.split('\n').map((p, i) => ( {p} ))} Description {errata.description?.split('\n').map((p, i) => ( {p} ))} {Object.keys(errata.rpms || {}).map((product) => (
{product} SRPMs {errata.rpms?.[product]?.nvras ?.filter((x) => x.indexOf('.src.rpm') !== -1) .map((x) => ( {x} ))} RPMs {errata.rpms?.[product]?.nvras ?.filter((x) => x.indexOf('.src.rpm') === -1) .map((x) => ( {x} ))}
))}
Issued: {errata.publishedAt?.toLocaleDateString()} Type: {typeToText(errata.type)} {errata.type === V1AdvisoryType.Security && ( Severity: {severityToText(errata.severity)} )} Affected Product {(errata.affectedProducts?.length || 0) > 1 ? 's' : ''} {errata.affectedProducts?.map((x, idx) => ( {x} ))} Fixes {errata.fixes?.map((x, idx) => ( {x.sourceBy} - {x.ticket} ))} CVEs {!!errata.cves?.length ? ( errata.cves?.map((x, idx) => { let text = `${x.name}${ x.sourceBy !== '' && ` (Source: ${x.sourceBy})` }`; return ( {x.sourceLink === '' ? ( {text} ) : ( {text} )} ); }) ) : ( No CVEs )} References {!!errata.references?.length ? ( errata.references?.map((x, idx) => ( {x} )) ) : ( No references )}
) )}
); };