Skip to content

Commit

Permalink
fix(uniqueCount): count vulns from data not from api response
Browse files Browse the repository at this point in the history
  • Loading branch information
lirantal committed Sep 5, 2019
2 parents 0345bbb + 6ca59da commit eb5fb6e
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 45 deletions.
41 changes: 27 additions & 14 deletions src/lib/snyk-to-html.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import marked = require('marked');
import moment = require('moment');
import path = require('path');

const severityMap = {low: 0, medium: 1, high: 2};
const severityMap = { low: 0, medium: 1, high: 2 };

function readFile(filePath: string, encoding: string): Promise<string> {
return new Promise<string>((resolve, reject) => {
Expand Down Expand Up @@ -51,17 +51,27 @@ function metadataForVuln(vuln: any) {

function groupVulns(vulns) {
const result = {};
if (!vulns || typeof vulns.length === 'undefined') {
return result;
let uniqueCount = 0;
let pathsCount = 0;

if (vulns && Array.isArray(vulns)) {
vulns.map(vuln => {
if (!result[vuln.id]) {
result[vuln.id] = { list: [vuln], metadata: metadataForVuln(vuln) };
pathsCount++;
uniqueCount++;
} else {
result[vuln.id].list.push(vuln);
pathsCount++;
}
});
}
vulns.map( vuln => {
if (!result[vuln.id]) {
result[vuln.id] = {list: [vuln], metadata: metadataForVuln(vuln)};
} else {
result[vuln.id].list.push(vuln);
}
});
return result;

return {
vulnerabilities: result,
vulnerabilitiesUniqueCount: uniqueCount,
vulnerabilitiesPathsCount: pathsCount,
};
}

async function compileTemplate(fileName: string): Promise<HandlebarsTemplateDelegate> {
Expand All @@ -76,7 +86,10 @@ async function registerPeerPartial(templatePath: string, name: string): Promise<
}

async function generateTemplate(data: any, template: string): Promise<string> {
data.vulnerabilities = groupVulns(data.vulnerabilities);
const vulnMetadata = groupVulns(data.vulnerabilities);
data.vulnerabilities = vulnMetadata.vulnerabilities;
data.uniqueCount = vulnMetadata.vulnerabilitiesUniqueCount;
data.summary = vulnMetadata.vulnerabilitiesPathsCount + ' vulnerable dependency paths';

await registerPeerPartial(template, 'inline-css');
await registerPeerPartial(template, 'vuln-card');
Expand All @@ -90,11 +103,11 @@ function mergeData(dataArray: any[]): any {
const aggregateVulnerabilities = [].concat(...vulnsArrays);

const totalUniqueCount =
dataArray.reduce((acc, item) => acc + item.uniqueCount || 0, 0);
dataArray.reduce((acc, item) => acc + item.vulnerabilities.length || 0, 0);
const totalDepCount =
dataArray.reduce((acc, item) => acc + item.dependencyCount || 0, 0);

const paths = dataArray.map(project => ({path: project.path, packageManager: project.packageManager}));
const paths = dataArray.map(project => ({ path: project.path, packageManager: project.packageManager }));

return {
vulnerabilities: aggregateVulnerabilities,
Expand Down
66 changes: 35 additions & 31 deletions template/test-report.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -8,53 +8,57 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Snyk test report</title>
<meta name="description" content="{{uniqueCount}} known vulnerabilities found in {{summary}}.">
<link rel="icon" type="image/png" href="https://res.cloudinary.com/snyk/image/upload/v1468845142/favicon/favicon.png" sizes="194x194">
<link rel="icon" type="image/png" href="https://res.cloudinary.com/snyk/image/upload/v1468845142/favicon/favicon.png"
sizes="194x194">
<link rel="shortcut icon" href="https://res.cloudinary.com/snyk/image/upload/v1468845142/favicon/favicon.ico">
{{> inline-css }}
</head>

<body class="section-projects">
<main class="layout-stacked">
<main class="layout-stacked">

<div class="layout-stacked__header header">
<header class="project__header">
<div class="layout-container--short">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">{{moment d "MMMM Do YYYY, h:mm:ss a"}}</p>
{{#if paths}}
<div class="layout-stacked__header header">
<header class="project__header">
<div class="layout-container--short">
<h1 class="project__header__title">Snyk test report</h1>
<p class="timestamp">{{moment d "MMMM Do YYYY, h:mm:ss a"}}</p>
{{#if paths}}
<div class="source-panel">
<span>Scanned the following paths:</span>
<ul>
{{#each paths}}<li>{{path}} ({{packageManager}})</li>{{/each}}
</ul>
</div>
{{/if}}
{{#if path}}
{{/if}}
{{#if path}}
<div class="source-panel">
<span>Scanned the following path:</span>
<ul><li>{{path}} ({{packageManager}})</li></ul>
<ul>
<li>{{path}} ({{packageManager}})</li>
</ul>
</div>
{{/if}}
{{/if}}

<div class="meta-counts">
<div class="meta-count"><span>{{uniqueCount}}</span> <span>known vulnerabilities</span></div>
<div class="meta-count"><span>{{summary}}</span></div>
<div class="meta-count"><span>{{dependencyCount}}</span> <span>dependencies</span></div>
</div><!-- .meta-counts -->
</div><!-- .layout-container--short -->
</header><!-- .project__header -->
</div><!-- .layout-stacked__header -->
<div class="meta-counts">
<div class="meta-count"><span>{{uniqueCount}}</span> <span>known vulnerabilities</span></div>
<div class="meta-count"><span>{{summary}}</span></div>
<div class="meta-count"><span>{{dependencyCount}}</span> <span>dependencies</span></div>
</div><!-- .meta-counts -->
</div><!-- .layout-container--short -->
</header><!-- .project__header -->
</div><!-- .layout-stacked__header -->

<div class="layout-stacked__content">
<div class="layout-container--short" style="padding-top: 35px;">
<div class="cards--vuln filter--patch filter--ignore">
{{#each vulnerabilities}}
{{> vuln-card }}
{{/each}}
</div><!-- cards -->
</div>
</div><!-- .layout-container -->
<div class="layout-stacked__content">
<div class="layout-container--short" style="padding-top: 35px;">
<div class="cards--vuln filter--patch filter--ignore">
{{#each vulnerabilities}}
{{> vuln-card }}
{{/each}}
</div><!-- cards -->
</div>
</div><!-- .layout-container -->

</main><!-- .layout-stacked__content -->
</main><!-- .layout-stacked__content -->
</body>
</html>

</html>

0 comments on commit eb5fb6e

Please sign in to comment.