From 6d86bbd3534e997ca20a832c39eb83076d603129 Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Sun, 19 May 2019 07:06:16 +0200
Subject: [PATCH] fix(vulnerability-alerts): use datasources, not managers

---
 lib/workers/repository/init/vulnerability.js  | 42 ++++++++++---------
 .../__snapshots__/vulnerability.spec.js.snap  | 24 +++++------
 2 files changed, 34 insertions(+), 32 deletions(-)

diff --git a/lib/workers/repository/init/vulnerability.js b/lib/workers/repository/init/vulnerability.js
index 65075fcc33..6163ae5d61 100644
--- a/lib/workers/repository/init/vulnerability.js
+++ b/lib/workers/repository/init/vulnerability.js
@@ -34,29 +34,31 @@ async function detectVulnerabilityAlerts(input) {
         );
         continue; // eslint-disable-line no-continue
       }
-      const managerMapping = {
+      const datasourceMapping = {
         MAVEN: 'maven',
         NPM: 'npm',
         NUGET: 'nuget',
-        PIP: 'pip_requirements',
+        PIP: 'pypi',
         RUBYGEMS: 'bundler',
       };
-      const manager =
-        managerMapping[alert.securityVulnerability.package.ecosystem];
-      if (!combinedAlerts[manager]) {
-        combinedAlerts[manager] = {};
+      const datasource =
+        datasourceMapping[alert.securityVulnerability.package.ecosystem];
+      if (!combinedAlerts[datasource]) {
+        combinedAlerts[datasource] = {};
       }
       const depName = alert.securityVulnerability.package.name;
-      if (!combinedAlerts[manager][depName]) {
-        combinedAlerts[manager][depName] = {
+      if (!combinedAlerts[datasource][depName]) {
+        combinedAlerts[datasource][depName] = {
           advisories: [],
           fileNames: [],
         };
       }
-      combinedAlerts[manager][depName].advisories.push(alert.securityAdvisory);
+      combinedAlerts[datasource][depName].advisories.push(
+        alert.securityAdvisory
+      );
       const fileName = alert.vulnerableManifestFilename;
-      if (!combinedAlerts[manager][depName].fileNames.includes(fileName)) {
-        combinedAlerts[manager][depName].fileNames.push(fileName);
+      if (!combinedAlerts[datasource][depName].fileNames.includes(fileName)) {
+        combinedAlerts[datasource][depName].fileNames.push(fileName);
       }
       const firstPatchedVersion =
         alert.securityVulnerability.firstPatchedVersion.identifier;
@@ -67,21 +69,21 @@ async function detectVulnerabilityAlerts(input) {
         pip_requirements: 'pep440',
         rubygems: 'ruby',
       };
-      const versionScheme = versioning.get(versionSchemes[manager]);
+      const versionScheme = versioning.get(versionSchemes[datasource]);
       if (versionScheme.isVersion(firstPatchedVersion)) {
-        if (combinedAlerts[manager][depName].firstPatchedVersion) {
+        if (combinedAlerts[datasource][depName].firstPatchedVersion) {
           if (
             versionScheme.isGreaterThan(
               firstPatchedVersion,
-              combinedAlerts[manager][depName].firstPatchedVersion
+              combinedAlerts[datasource][depName].firstPatchedVersion
             )
           ) {
-            combinedAlerts[manager][
+            combinedAlerts[datasource][
               depName
             ].firstPatchedVersion = firstPatchedVersion;
           }
         } else {
-          combinedAlerts[manager][
+          combinedAlerts[datasource][
             depName
           ].firstPatchedVersion = firstPatchedVersion;
         }
@@ -93,7 +95,7 @@ async function detectVulnerabilityAlerts(input) {
     }
   }
   const alertPackageRules = [];
-  for (const [manager, dependencies] of Object.entries(combinedAlerts)) {
+  for (const [datasource, dependencies] of Object.entries(combinedAlerts)) {
     for (const [depName, val] of Object.entries(dependencies)) {
       let prBodyNotes = [];
       try {
@@ -122,21 +124,21 @@ async function detectVulnerabilityAlerts(input) {
         logger.warn({ err }, 'Error generating vulnerability PR notes');
       }
       const matchRule = {
-        managers: [manager],
+        datasources: [datasource],
         packageNames: [depName],
         matchCurrentVersion: `< ${val.firstPatchedVersion}`,
         prBodyNotes,
         force: {
           ...config.vulnerabilityAlerts,
           vulnerabilityAlert: true,
-          branchTopic: `${manager}-${depName}-vulnerability`,
+          branchTopic: `${datasource}-${depName}-vulnerability`,
         },
       };
       alertPackageRules.push(matchRule);
       const allowedRule = JSON.parse(JSON.stringify(matchRule));
       delete allowedRule.matchCurrentVersion;
       delete allowedRule.force;
-      if (manager === 'npm') {
+      if (datasource === 'npm') {
         allowedRule.allowedVersions = `^${val.firstPatchedVersion}`;
       } else {
         allowedRule.allowedVersions = `>= ${val.firstPatchedVersion}`;
diff --git a/test/workers/repository/init/__snapshots__/vulnerability.spec.js.snap b/test/workers/repository/init/__snapshots__/vulnerability.spec.js.snap
index 88cf06aab3..40b80a4b97 100644
--- a/test/workers/repository/init/__snapshots__/vulnerability.spec.js.snap
+++ b/test/workers/repository/init/__snapshots__/vulnerability.spec.js.snap
@@ -3,6 +3,9 @@
 exports[`workers/repository/init/vulnerability detectVulnerabilityAlerts() returns alerts 1`] = `
 Array [
   Object {
+    "datasources": Array [
+      "npm",
+    ],
     "force": Object {
       "branchTopic": "npm-electron-vulnerability",
       "commitMessageSuffix": "[SECURITY]",
@@ -12,9 +15,6 @@ Array [
       "schedule": Array [],
       "vulnerabilityAlert": true,
     },
-    "managers": Array [
-      "npm",
-    ],
     "matchCurrentVersion": "< 1.8.3",
     "packageNames": Array [
       "electron",
@@ -28,7 +28,7 @@ Electron version 1.7 up to 1.7.12; 1.8 up to 1.8.3 and 2.0.0 up to 2.0.0-beta.3
   },
   Object {
     "allowedVersions": "^1.8.3",
-    "managers": Array [
+    "datasources": Array [
       "npm",
     ],
     "packageNames": Array [
@@ -42,8 +42,11 @@ Electron version 1.7 up to 1.7.12; 1.8 up to 1.8.3 and 2.0.0 up to 2.0.0-beta.3
     ],
   },
   Object {
+    "datasources": Array [
+      "pypi",
+    ],
     "force": Object {
-      "branchTopic": "pip_requirements-ansible-vulnerability",
+      "branchTopic": "pypi-ansible-vulnerability",
       "commitMessageSuffix": "[SECURITY]",
       "groupName": null,
       "masterIssueApproval": false,
@@ -51,10 +54,7 @@ Electron version 1.7 up to 1.7.12; 1.8 up to 1.8.3 and 2.0.0 up to 2.0.0-beta.3
       "schedule": Array [],
       "vulnerabilityAlert": true,
     },
-    "managers": Array [
-      "pip_requirements",
-    ],
-    "matchCurrentVersion": "< 2.2.1.0",
+    "matchCurrentVersion": "< 2.2.0",
     "packageNames": Array [
       "ansible",
     ],
@@ -81,9 +81,9 @@ Ansible before versions 2.1.4, 2.2.1 is vulnerable to an improper input validati
     ],
   },
   Object {
-    "allowedVersions": ">= 2.2.1.0",
-    "managers": Array [
-      "pip_requirements",
+    "allowedVersions": ">= 2.2.0",
+    "datasources": Array [
+      "pypi",
     ],
     "packageNames": Array [
       "ansible",
-- 
GitLab