diff --git a/CHANGELOG.md b/CHANGELOG.md index e02eee3dc6..91b5257735 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -83,6 +83,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - The CVSS v2 BaseScore calculator calculates the score on the client side now. [#2536](https://github.com/greenbone/gsa/pull/2536) ### Fixed +- Added the deprecatedBy field to CPEs [#2751](https://github.com/greenbone/gsa/pull/2751) - Fixed the severity for different advisories [#2611](https://github.com/greenbone/gsa/pull/2611) ### Removed diff --git a/gsa/src/gmp/models/__tests__/cpe.js b/gsa/src/gmp/models/__tests__/cpe.js index 3c19a8a76c..b583b0f223 100644 --- a/gsa/src/gmp/models/__tests__/cpe.js +++ b/gsa/src/gmp/models/__tests__/cpe.js @@ -100,4 +100,18 @@ describe('CPE model tests', () => { expect(cpe.update_time).toBeUndefined(); expect(isDate(cpe.updateTime)).toBe(true); }); + + test('should parse deprecatedBy', () => { + const cpe = Cpe.fromElement({ + raw_data: {'cpe-item': {_deprecated_by: 'foo:/bar'}}, + }); + + expect(cpe.deprecatedBy).toEqual('foo:/bar'); + }); + + test('should not parse deprecatedBy', () => { + const cpe = Cpe.fromElement({raw_data: {'cpe-item': {}}}); + + expect(cpe.deprecatedBy).toBeUndefined(); + }); }); diff --git a/gsa/src/gmp/models/cpe.js b/gsa/src/gmp/models/cpe.js index f64615ddd8..c3964a331e 100644 --- a/gsa/src/gmp/models/cpe.js +++ b/gsa/src/gmp/models/cpe.js @@ -63,11 +63,21 @@ class Cpe extends Info { delete ret.status; } + if (isDefined(ret.nvd_id)) { + ret.nvdId = ret.nvd_id; + } + if (isDefined(ret.update_time)) { ret.updateTime = parseDate(ret.update_time); delete ret.update_time; } + if (isDefined(ret.raw_data) && isDefined(ret.raw_data['cpe-item'])) { + const cpeItem = ret.raw_data['cpe-item']; + if (isDefined(cpeItem._deprecated_by)) { + ret.deprecatedBy = cpeItem._deprecated_by; + } + } return ret; } } diff --git a/gsa/src/web/graphql/__mocks__/cpes.js b/gsa/src/web/graphql/__mocks__/cpes.js index fc4d436287..f27ed62911 100644 --- a/gsa/src/web/graphql/__mocks__/cpes.js +++ b/gsa/src/web/graphql/__mocks__/cpes.js @@ -54,6 +54,7 @@ export const cpeEntity = deepFreeze({ severity: 1.8, }, ], + deprecatedBy: 'cpe:/a:foo:bar', score: 98, status: 'FINAL', }); diff --git a/gsa/src/web/graphql/cpes.js b/gsa/src/web/graphql/cpes.js index 68b843e3b3..79f1cfd2a9 100644 --- a/gsa/src/web/graphql/cpes.js +++ b/gsa/src/web/graphql/cpes.js @@ -55,6 +55,7 @@ export const GET_CPE = gql` id severity } + deprecatedBy score status } @@ -94,6 +95,7 @@ export const GET_CPES = gql` id severity } + deprecatedBy score status } diff --git a/gsa/src/web/pages/cpes/__tests__/detailspage.js b/gsa/src/web/pages/cpes/__tests__/detailspage.js index a68478fdab..a76d478f55 100644 --- a/gsa/src/web/pages/cpes/__tests__/detailspage.js +++ b/gsa/src/web/pages/cpes/__tests__/detailspage.js @@ -148,6 +148,7 @@ describe('CPE Detailspage tests', () => { // test page content expect(baseElement).toHaveTextContent('StatusFINAL'); + expect(baseElement).toHaveTextContent('Deprecated Bycpe:/a:foo:bar'); // severity bar(s) const progressBars = getAllByTestId('progressbar-box'); diff --git a/gsa/src/web/pages/cpes/details.js b/gsa/src/web/pages/cpes/details.js index c257d18b71..f6afcb5256 100644 --- a/gsa/src/web/pages/cpes/details.js +++ b/gsa/src/web/pages/cpes/details.js @@ -25,7 +25,9 @@ import SeverityBar from 'web/components/bar/severitybar'; import DateTime from 'web/components/date/datetime'; -import Layout from 'web/components/layout/layout'; +import DetailsLink from 'web/components/link/detailslink'; + +import Layout from 'web/components/layout/layout.js'; import InfoTable from 'web/components/table/infotable'; import TableBody from 'web/components/table/body'; @@ -36,8 +38,9 @@ import {Col} from 'web/entity/page'; import PropTypes from 'web/utils/proptypes'; -const CpeDetails = ({entity}) => { +const CpeDetails = ({entity, links = true}) => { const {title, nvdId, deprecatedBy, updateTime, status, severity} = entity; + return ( {!isDefined(title) && ( @@ -70,7 +73,11 @@ const CpeDetails = ({entity}) => { {isDefined(deprecatedBy) && ( {_('Deprecated By')} - {deprecatedBy} + + + {deprecatedBy} + + )} {isDefined(updateTime) && ( @@ -103,6 +110,7 @@ const CpeDetails = ({entity}) => { CpeDetails.propTypes = { entity: PropTypes.model.isRequired, + links: PropTypes.bool, }; export default CpeDetails;