From 4b38793471791414328e923ff0699e11f20f8a6b Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Sat, 5 Jan 2019 08:56:18 +0100
Subject: [PATCH] refactor: trustLevel

---
 lib/datasource/npm/npmrc.js           |  6 +++---
 lib/datasource/npm/releases.js        |  5 ++---
 lib/manager/composer/artifacts.js     |  2 +-
 lib/manager/gomod/artifacts.js        |  2 +-
 lib/manager/npm/extract/index.js      |  5 +----
 lib/manager/npm/post-update/index.js  |  2 +-
 lib/workers/global/index.js           |  4 +++-
 lib/workers/repository/init/apis.js   |  5 +----
 lib/workers/repository/init/config.js | 10 ++--------
 test/datasource/npm/index.spec.js     | 26 ++++++++++++++------------
 10 files changed, 29 insertions(+), 38 deletions(-)

diff --git a/lib/datasource/npm/npmrc.js b/lib/datasource/npm/npmrc.js
index 12e1d8f981..a73bf75012 100644
--- a/lib/datasource/npm/npmrc.js
+++ b/lib/datasource/npm/npmrc.js
@@ -14,7 +14,7 @@ function getNpmrc() {
   return npmrc;
 }
 
-function setNpmrc(input, trustLevel = 'low') {
+function setNpmrc(input) {
   if (input) {
     if (input === npmrcRaw) {
       return;
@@ -27,7 +27,7 @@ function setNpmrc(input, trustLevel = 'low') {
     for (const [key, val] of Object.entries(npmrc)) {
       // istanbul ignore if
       if (
-        trustLevel === 'low' &&
+        global.trustLevel !== 'high' &&
         key.endsWith('registry') &&
         val &&
         val.includes('localhost')
@@ -46,7 +46,7 @@ function setNpmrc(input, trustLevel = 'low') {
         delete npmrc[key];
       }
     }
-    if (trustLevel !== 'high') {
+    if (global.trustLevel !== 'high') {
       return;
     }
     for (const key in npmrc) {
diff --git a/lib/datasource/npm/releases.js b/lib/datasource/npm/releases.js
index b7e14f324e..cb8ad80849 100644
--- a/lib/datasource/npm/releases.js
+++ b/lib/datasource/npm/releases.js
@@ -6,9 +6,8 @@ module.exports = {
 };
 
 async function getPkgReleases(purl, config) {
-  if (config) {
-    const trustLevel = config.global ? config.global.trustLevel : 'low';
-    setNpmrc(config.npmrc, trustLevel);
+  if (config && config.npmrc) {
+    setNpmrc(config.npmrc);
   }
   const res = await getDependency(purl.fullname, global.testNpmRetries);
   if (res) {
diff --git a/lib/manager/composer/artifacts.js b/lib/manager/composer/artifacts.js
index 9426f015d7..54d0bf88bb 100644
--- a/lib/manager/composer/artifacts.js
+++ b/lib/manager/composer/artifacts.js
@@ -99,7 +99,7 @@ async function getArtifacts(
       await fs.outputFile(localAuthFileName, JSON.stringify(authJson));
     }
     const env =
-      config.global && config.global.trustLevel === 'high'
+      global.trustLevel === 'high'
         ? process.env
         : {
             HOME: process.env.HOME,
diff --git a/lib/manager/gomod/artifacts.js b/lib/manager/gomod/artifacts.js
index 879d5e5de2..ad1f0cc4d5 100644
--- a/lib/manager/gomod/artifacts.js
+++ b/lib/manager/gomod/artifacts.js
@@ -42,7 +42,7 @@ async function getArtifacts(
       await fs.outputFile(localGoSumFileName, existingGoSumContent);
     }
     const env =
-      config.global && config.global.trustLevel === 'high'
+      global.trustLevel === 'high'
         ? process.env
         : {
             HOME: process.env.HOME,
diff --git a/lib/manager/npm/extract/index.js b/lib/manager/npm/extract/index.js
index 273729d521..27fc428af9 100644
--- a/lib/manager/npm/extract/index.js
+++ b/lib/manager/npm/extract/index.js
@@ -96,10 +96,7 @@ async function extractPackageFile(content, fileName, config) {
       npmrc = npmrc.replace(/(^|\n)package-lock.*?(\n|$)/g, '');
     }
     if (npmrc) {
-      if (
-        npmrc.includes('=${') &&
-        !(config.global && config.global.trustLevel === 'high')
-      ) {
+      if (npmrc.includes('=${') && !(global.trustLevel === 'high')) {
         logger.info('Discarding .npmrc file with variables');
         npmrc = undefined;
       }
diff --git a/lib/manager/npm/post-update/index.js b/lib/manager/npm/post-update/index.js
index 6d877f018f..fb76bb5327 100644
--- a/lib/manager/npm/post-update/index.js
+++ b/lib/manager/npm/post-update/index.js
@@ -345,7 +345,7 @@ async function getAdditionalFiles(config, packageFiles) {
   await fs.ensureDir(process.env.YARN_CACHE_FOLDER);
 
   const env =
-    config.global && config.global.trustLevel === 'high'
+    global.trustLevel === 'high'
       ? process.env
       : {
           HOME: process.env.HOME,
diff --git a/lib/workers/global/index.js b/lib/workers/global/index.js
index 093a89542f..a20798b1d1 100644
--- a/lib/workers/global/index.js
+++ b/lib/workers/global/index.js
@@ -39,12 +39,14 @@ async function start() {
         'Available now for GitLab: [Renovate Pro](https://renovatebot.com/pro) with real-time webhook handling and priority job queue.';
     }
     // Move global variables that we need to use later
-    const importGlobals = ['trustLevel', 'prBanner', 'prFooter'];
+    const importGlobals = ['prBanner', 'prFooter'];
     config.global = {};
     importGlobals.forEach(key => {
       config.global[key] = config[key];
       delete config[key];
     });
+    global.trustLevel = config.trustLevel || 'low';
+    delete config.trustLevel;
     detectRenovateVersion();
     // Iterate through repositories sequentially
     for (const repository of config.repositories) {
diff --git a/lib/workers/repository/init/apis.js b/lib/workers/repository/init/apis.js
index ebef7106c5..2e06f5d85f 100644
--- a/lib/workers/repository/init/apis.js
+++ b/lib/workers/repository/init/apis.js
@@ -20,10 +20,7 @@ async function initApis(input) {
   config = await assignPlatform(config);
   config = await getPlatformConfig(config);
   npmApi.resetMemCache();
-  npmApi.setNpmrc(
-    config.npmrc,
-    config.global ? config.global.trustLevel : 'low'
-  );
+  npmApi.setNpmrc(config.npmrc);
   delete config.gitPrivateKey;
   return config;
 }
diff --git a/lib/workers/repository/init/config.js b/lib/workers/repository/init/config.js
index f9628deae9..4c83bc4600 100644
--- a/lib/workers/repository/init/config.js
+++ b/lib/workers/repository/init/config.js
@@ -129,10 +129,7 @@ async function mergeRenovateConfig(config) {
   // istanbul ignore if
   if (decryptedConfig.npmrc) {
     logger.debug('Found npmrc in decrypted config - setting');
-    npmApi.setNpmrc(
-      decryptedConfig.npmrc,
-      config.global ? config.global.trustLevel : 'low'
-    );
+    npmApi.setNpmrc(decryptedConfig.npmrc);
   }
   // Decrypt after resolving in case the preset contains npm authentication instead
   const resolvedConfig = decryptConfig(
@@ -146,10 +143,7 @@ async function mergeRenovateConfig(config) {
     logger.debug(
       'Ignoring any .npmrc files in repository due to configured npmrc'
     );
-    npmApi.setNpmrc(
-      resolvedConfig.npmrc,
-      config.global ? config.global.trustLevel : 'low'
-    );
+    npmApi.setNpmrc(resolvedConfig.npmrc);
     resolvedConfig.ignoreNpmrcFile = true;
   }
   // istanbul ignore if
diff --git a/test/datasource/npm/index.spec.js b/test/datasource/npm/index.spec.js
index 6a510e17ba..aaad9c4951 100644
--- a/test/datasource/npm/index.spec.js
+++ b/test/datasource/npm/index.spec.js
@@ -18,6 +18,7 @@ describe('api/npm', () => {
     jest.resetAllMocks();
     global.repoCache = {};
     delete global.testNpmRetries;
+    global.trustLevel = 'low';
     npm.resetCache();
     npmResponse = {
       name: 'foobar',
@@ -354,17 +355,17 @@ describe('api/npm', () => {
     nock('https://registry.npmjs.org')
       .get('/foobar')
       .reply(200, npmResponse);
-    npm.setNpmrc('foo=bar');
-    const res = await npm.getPkgReleases({ fullname: 'foobar' });
+    const npmrc = 'foo=bar';
+    const res = await npm.getPkgReleases({ fullname: 'foobar' }, { npmrc });
     expect(res).toMatchSnapshot();
   });
   it('should cache package info from npm', async () => {
-    npm.setNpmrc('//registry.npmjs.org/:_authToken=abcdefghijklmnopqrstuvwxyz');
     nock('https://registry.npmjs.org')
       .get('/foobar')
       .reply(200, npmResponse);
-    const res1 = await npm.getPkgReleases({ fullname: 'foobar' });
-    const res2 = await npm.getPkgReleases({ fullname: 'foobar' });
+    const npmrc = '//registry.npmjs.org/:_authToken=abcdefghijklmnopqrstuvwxyz';
+    const res1 = await npm.getPkgReleases({ fullname: 'foobar' }, { npmrc });
+    const res2 = await npm.getPkgReleases({ fullname: 'foobar' }, { npmrc });
     expect(res1).not.toBe(null);
     expect(res1).toEqual(res2);
   });
@@ -378,11 +379,10 @@ describe('api/npm', () => {
     nock('https://npm.mycustomregistry.com')
       .get('/foobar')
       .reply(200, npmResponse);
-    npm.setNpmrc(
+    const npmrc =
       'registry=https://npm.mycustomregistry.com/\n//npm.mycustomregistry.com/:_auth = ' +
-        Buffer.from('abcdef').toString('base64')
-    );
-    const res = await npm.getPkgReleases({ fullname: 'foobar' });
+      Buffer.from('abcdef').toString('base64');
+    const res = await npm.getPkgReleases({ fullname: 'foobar' }, { npmrc });
     expect(res).toMatchSnapshot();
   });
   it('should replace any environment variable in npmrc', async () => {
@@ -390,16 +390,18 @@ describe('api/npm', () => {
       .get('/foobar')
       .reply(200, npmResponse);
     process.env.REGISTRY = 'https://registry.from-env.com';
+    global.trustLevel = 'high';
     // eslint-disable-next-line no-template-curly-in-string
-    npm.setNpmrc('registry=${REGISTRY}', 'high');
-    const res = await npm.getPkgReleases({ fullname: 'foobar' });
+    const npmrc = 'registry=${REGISTRY}';
+    const res = await npm.getPkgReleases({ fullname: 'foobar' }, { npmrc });
     expect(res).toMatchSnapshot();
   });
   it('should throw error if necessary env var is not present', () => {
     let e;
     try {
+      global.trustLevel = 'high';
       // eslint-disable-next-line no-template-curly-in-string
-      npm.setNpmrc('registry=${REGISTRY_MISSING}', 'high');
+      npm.setNpmrc('registry=${REGISTRY_MISSING}');
     } catch (err) {
       e = err;
     }
-- 
GitLab