npm-dependency-analyzer
Version:
Plugin to validate dependencies, concerning their license and vulnerabities
91 lines (73 loc) • 2.88 kB
JavaScript
import fetch from 'isomorphic-fetch'
import {flattenDeep} from 'lodash'
import bunyan from 'bunyan'
import {catchifyPromise} from './utility-functions'
import {Vulnerability} from '../report_model'
import RequestBody from '../oss-fetch-body'
const logger = bunyan.createLogger({name: 'Fetch-Vulnerabilities'})
/**
* Creates a request to fetch vulnerabilites
* @param {Object} body body of the request
* @param {Number} cacheTime time for the cache in the proxy
*/
const getRequest = (body, cacheTime) => {
return new Request('http://35.234.151.254/npm/dependency/vulnerabilities', {
headers: {
'Content-Type': 'application/json',
'Cache-Control': `max-age=${cacheTime || 0}`,
'Authorization': `Bearer ${process.env.CENTRAL_SERVER_TOKEN}`
},
method: 'POST',
body: JSON.stringify(body)
})
}
/**
* * Gets all vulnerabilities on the current project
* @param {Array} dependencies array of dependencies
* @param {Number} cacheTime time for the cache in the proxy
*/
export default async function getVulnerabilities (dependencies, cacheTime) {
logger.info('Fetching vulnerabilities')
const notFlatRequestBody = dependencies.map(dependency => {
const versions = [dependency.main_version, ...dependency.private_versions]
return versions.map(version => {
return new RequestBody('npm', dependency.title, version)
})
})
const requestBody = flattenDeep(notFlatRequestBody)
const [fetchError, response] = await catchifyPromise(fetch(getRequest(requestBody, cacheTime)))
if (fetchError) {
logger.warn(`Vulnerabilities Request failed: %O`, fetchError.message)
throw new Error(fetchError)
}
if (response.status === 401) {
logger.warn('Vulnerabilities Request failed: Status - %s; Reason - Invalid Token', response.status)
throw new Error('Token is invalid')
}
const [jsonError, body] = await catchifyPromise(response.json())
if (response.status !== 200) {
logger.warn(`Vulnerabilities Request failed: Status - %s; Reason - %O`, response.status, body)
throw new Error(body)
}
if (jsonError) {
logger.warn(`Vulnerabilities Request failed: Status - %s; Reason - %O`, response.status, jsonError)
throw new Error(jsonError.message)
}
dependencies.forEach(dependency => {
const dependencyVulnerabilities = body.filter(elem => elem.title === dependency.title)
dependencyVulnerabilities.forEach(elem => {
if (!elem.vulnerabilities) {
return
}
elem.vulnerabilities.forEach(vulnerability => {
if (!dependency.vulnerabilities.some(depElem => depElem.id === vulnerability.id)) {
dependency.vulnerabilities.push(new Vulnerability(vulnerability))
dependency.vulnerabilities_count += 1
}
})
})
})
logger.info('Finished fetching vulnerabilities')
return dependencies
}