Skip to content

Commit 1d2a76b

Browse files
committed
feat: sort by severity on post-release
Signed-off-by: RafaelGSS <rafael.nunu@hotmail.com>
1 parent a90623b commit 1d2a76b

2 files changed

Lines changed: 36 additions & 1 deletion

File tree

lib/security_blog.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import {
1414
import auth from './auth.js';
1515
import Request from './request.js';
1616

17+
const SEVERITY_ORDER = ['critical', 'high', 'medium', 'low'];
18+
1719
export default class SecurityBlog extends SecurityRelease {
1820
req;
1921

@@ -256,7 +258,8 @@ export default class SecurityBlog extends SecurityRelease {
256258
}
257259

258260
async getReportsTemplate(content) {
259-
const reports = content.reports;
261+
const reports = [...content.reports].sort((a, b) =>
262+
this.getSeverityOrder(a) - this.getSeverityOrder(b));
260263
let template = '';
261264
for (const report of reports) {
262265
const cveId = report.cveIds?.join(', ');
@@ -282,6 +285,13 @@ export default class SecurityBlog extends SecurityRelease {
282285
return template;
283286
}
284287

288+
getSeverityOrder(report) {
289+
const rating = report.severity?.rating?.toLowerCase();
290+
const index = SEVERITY_ORDER.indexOf(rating);
291+
if (index === -1) return SEVERITY_ORDER.length;
292+
return index;
293+
}
294+
285295
getDependencyUpdatesTemplate(dependencyUpdates) {
286296
if (typeof dependencyUpdates !== 'object') return '';
287297
if (Object.keys(dependencyUpdates).length === 0) return '';

test/unit/security_release.test.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -817,6 +817,31 @@ describe('security_blog: post-release severity wording', () => {
817817
assert.throws(() => blog.getVulnerabilities(content), /severity\.rating not found for report 1/);
818818
});
819819

820+
it('sorts post-release reports by severity', async() => {
821+
const blog = new SecurityBlog();
822+
const createReport = (title, rating) => ({
823+
title,
824+
cveIds: [`CVE-2026-${title}`],
825+
severity: { rating },
826+
summary: 'summary',
827+
affectedVersions: ['24.x'],
828+
patchAuthors: ['nodejs'],
829+
reporter: 'reporter',
830+
link: `https://hackerone.com/reports/${title}`
831+
});
832+
833+
const output = await blog.getReportsTemplate({
834+
reports: [
835+
createReport('low-report', 'low'),
836+
createReport('high-report', 'high'),
837+
createReport('medium-report', 'medium')
838+
]
839+
});
840+
841+
assert.ok(output.indexOf('## high-report') < output.indexOf('## medium-report'));
842+
assert.ok(output.indexOf('## medium-report') < output.indexOf('## low-report'));
843+
});
844+
820845
it('formats dependency update object versions', () => {
821846
const blog = new SecurityBlog();
822847

0 commit comments

Comments
 (0)