Skip to content

Commit

Permalink
feat: Add support for --org flag to snyk test and snyk wizard
Browse files Browse the repository at this point in the history
chore: refactor lib/snyk-test/index.js for ease of future package manager additions.
  • Loading branch information
aviadatsnyk committed Apr 4, 2017
1 parent e5fb843 commit 94e4a36
Show file tree
Hide file tree
Showing 9 changed files with 68 additions and 185 deletions.
4 changes: 4 additions & 0 deletions cli/commands/protect/wizard.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@ function wizard(options) {
options = {};
}

if (config.org) {
options.org = config.org;
}

try {
if (detectPackageManager(cwd, options) === 'rubygems') {
throw new Error(
Expand Down
4 changes: 4 additions & 0 deletions cli/commands/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ function test(path, options) {
args.push({});
}

if (config.org) {
options.org = config.org;
}

return apiTokenExists('snyk test')
.then(function () {
// if we have more than path, options, we're going to assume that we've
Expand Down
4 changes: 2 additions & 2 deletions help/help.txt
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ Options:

--dev .............. Include devDependencies (defaults to production only).
--file=<File> ...... Sets package file. For more help run `snyk help file`.
--org=<org-name> ... Associate a snapshot (or wizard snapshot) with a specific
organisation. For more help run `snyk help orgs`.
--org=<org-name> ... Run snyk with a specific organisation. For more help
run `snyk help orgs`.
--ignore-policy .... Ignores and resets the state of your policy file.
--trust-policies ... Applies and uses ignore rules from your dependencies's
Snyk policies, otherwise ignore policies are only
Expand Down
4 changes: 2 additions & 2 deletions help/orgs.txt
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@

Organisations:

To monitor your project for a specific org, you can add an optional flag to
both the `monitor` and `wizard` commands:
To test or monitor your project for a specific org, you can add an optional
flag to the `test`, `monitor` and `wizard` commands:

$ snyk monitor --org=<my-org>
Captured a snapshot of this project's dependencies.
Expand Down
28 changes: 12 additions & 16 deletions lib/snyk-test/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ module.exports = test;

var Promise = require('es6-promise').Promise; // jshint ignore:line
var detect = require('../detect');
var runTest = require('./run-test');


function test(root, options, callback) {
if (typeof options === 'function') {
Expand All @@ -24,8 +26,8 @@ function test(root, options, callback) {
function executeTest(root, options) {
try {
var packageManager = detect.detectPackageManager(root, options);
var runner = loadTestRunner(packageManager);
return runner(root, options)
options.packageManager = packageManager;
return run(root, options)
.then(function (res) {
res.packageManager = packageManager;
return res;
Expand All @@ -35,19 +37,13 @@ function executeTest(root, options) {
}
}

function loadTestRunner(packageManager) {
switch (packageManager) {
case 'npm': {
return require('./npm');
}
case 'rubygems': {
return require('./rubygems');
}
case 'maven': {
return require('./maven');
}
default: {
throw new Error('Unsupported package manager: ' + packageManager);
}
function run(root, options) {
var packageManager = options.packageManager;
if (packageManager === 'npm') { // legacy special case (not really different)
return require('./npm')(root, options);
}
if (!new Set(['rubygems', 'maven']).has(packageManager)) {
throw new Error('Unsupported package manager: ' + packageManager);
}
return runTest(packageManager, root, options);
}
6 changes: 6 additions & 0 deletions lib/snyk-test/npm/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,9 @@ function test(root, options) {
hasDevDependencies = pkg.hasDevDependencies;
payload.method = 'POST';
payload.body = pkg;
if (options.org) {
payload.qs = {org: options.org};
}
if (options.policy) {
payload.body.policy = options.policy.toString();
}
Expand All @@ -77,6 +80,9 @@ function test(root, options) {
payload.method = 'GET';
payload.url += '/' +
encodeURIComponent(module.name + '@' + module.version);
if (options.org) {
payload.qs = {org: options.org};
}
return {
package: module,
payload: payload,
Expand Down
137 changes: 0 additions & 137 deletions lib/snyk-test/rubygems/index.js

This file was deleted.

48 changes: 27 additions & 21 deletions lib/snyk-test/maven/index.js → lib/snyk-test/run-test.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,21 @@
module.exports = test;
module.exports = runTest;

var debug = require('debug')('snyk');
var Promise = require('es6-promise').Promise; // jshint ignore:line
var request = require('../../request');
var fs = require('then-fs');
var snyk = require('../..');
var spinner = require('../../spinner');
var moduleToOjbect = require('snyk-module');
var isCI = require('../../is-ci');
var analytics = require('../../analytics');
var config = require('../../config');
var getModuleInfo = require('../../module-info');
var Promise = require('es6-promise').Promise; // jshint ignore:line

var analytics = require('../analytics');
var config = require('../config');
var getModuleInfo = require('../module-info');
var isCI = require('../is-ci');
var request = require('../request');
var snyk = require('../');
var spinner = require('../spinner');

function test(root, options) {
var promise = Promise.resolve().then(function () {

function runTest(packageManager, root, options) {
return Promise.resolve().then(function () {
var policyLocations = [root];
var hasDevDependencies = false;
var lbl = 'Querying vulnerabilities database...';
Expand Down Expand Up @@ -80,40 +82,41 @@ function test(root, options) {
});
}).then(spinner.clear(lbl));
});

return promise;
}

function assemblePayload(root, options, policyLocations) {
var local = fs.existsSync(root);
analytics.add('local', local);
analytics.add('packageManager', 'maven');
analytics.add('packageManager', options.packageManager);
return local ? assembleLocalPayload(root, options, policyLocations)
: assembleRemotePayload(root);
: assembleRemotePayload(root, options);
}

function assembleLocalPayload(root, options, policyLocations) {
return getModuleInfo('maven', root, options)
return getModuleInfo(options.packageManager, root, options)
.then(function (module) {
analytics.add('policies', policyLocations.length);
analytics.add('packageName', module.name);
analytics.add('packageVersion', module.version);
analytics.add('package', module.name + '@' + module.version);
var payload = {
method: 'POST',
url: vulnUrl(),
url: vulnUrl(options.packageManager),
json: true,
headers: {
'x-is-ci': isCI,
authorization: 'token ' + snyk.api,
},
body: module,
};
if (options.org) {
payload.qs = {org: options.org};
}
return payload;
});
}

function assembleRemotePayload(root) {
function assembleRemotePayload(root, options) {
var module = moduleToOjbect(root);
debug('testing remote: %s', module.name + '@' + module.version);
var encodedName = encodeURIComponent(module.name + '@' + module.version);
Expand All @@ -122,16 +125,19 @@ function assembleRemotePayload(root) {
analytics.add('package', module.name + '@' + module.version);
var payload = {
method: 'GET',
url: vulnUrl() + '/' + encodedName,
url: vulnUrl(options.packageManager) + '/' + encodedName,
json: true,
headers: {
'x-is-ci': isCI,
authorization: 'token ' + snyk.api,
},
};
if (options.org) {
payload.qs = {org: options.org};
}
return Promise.resolve(payload);
}

function vulnUrl() {
return config.API + '/vuln/maven';
function vulnUrl(packageManager) {
return config.API + '/vuln/' + packageManager;
}
Loading

0 comments on commit 94e4a36

Please sign in to comment.