scripts/misc/upgrade.js (224 lines of code) (raw):
// These are mongo shell routines to upgrade the database
// load these in mongo shell to run appropriate routines
// WARNING: Make backups of all data before running these.
// WARNING: These routines can make irreversable changes to data.
// WARNING: Use with caution. these scripts have not been well tested
console.log('WARNING: This is a mongo shell script');
console.log('WARNING: This is not a nodejs script');
print('These are mongo shell routines to upgrade the database')
print('load these in mongo shell to run appropriate routines')
print('WARNING: Make backups of all data before running these.');
print('WARNING: These routines can make irreversable changes to data.');
var smap = {
"internally found": "INTERNAL",
"seen in production": "USER",
"researcher reported": "EXTERNAL",
"third party source": "EXTERNAL"
}
var statemap = {
"drafting": "DRAFT",
"review-ready": "REVIEW",
"publish-ready": "READY",
"published": "PUBLIC",
"deferred": "RESERVED",
"rejected": "REJECTED",
"merged": "MERGED_TO"
}
var phases = {
DRAFT: "Current",
REVIEW: "Current",
READY: "Current",
PUBLIC: "Past",
RESERVED: "Future",
REPLACED_BY: "Other",
REJECTED: "Deleted",
SPLIT_FROM: "Other",
MERGED_TO: "Other"
};
function upgradeDocv002to003(doc) {
if (doc.cve) {
print('Found ' + doc.cve.CVE_data_meta.ID);
var source = {};
var DCCP = doc.cve.CNA_private;
if (DCCP) {
delete DCCP.merge_with;
if (DCCP.defect) {
source.defect = DCCP.defect;
}
delete DCCP.defect;
if (DCCP.advisoryID) {
source.advisory = DCCP.advisoryID;
}
delete DCCP.advisoryID
if (DCCP.metadata && DCCP.metadata.source) {
source.discovery = smap[DCCP.metadata.source];
}
doc.cve.source = source;
delete DCCP.metadata;
if (DCCP.bundle) {
delete DCCP.bundle;
}
if (doc.cve.CVE_data_meta.DATE_PUBLIC) {
DCCP.publish = {}
DCCP.publish.ym = doc.cve.CVE_data_meta.DATE_PUBLIC.substr(0, 7);
DCCP.publish.year = doc.cve.CVE_data_meta.DATE_PUBLIC.substr(0, 4);
DCCP.publish.month = doc.cve.CVE_data_meta.DATE_PUBLIC.substr(5, 2);
}
//if(DCCP.share_with_CVE) {
// delete DCCP.share_with_CVE;
//}
if (DCCP.merge_with) {
delete DCCP.merge_with;
}
if (DCCP.state) {
doc.cve.CVE_data_meta.STATE = statemap[DCCP.state];
delete DCCP.state;
}
}
// change this code to copy over advisory id from URL to source.advisory field.
/*
if (doc.cve.references && doc.cve.references.reference_data) {
var jsa = doc.cve.references.reference_data[0].url.match(/JSA\d+/);
if (jsa) {
if (!doc.cve.source.advisory) {
doc.cve.source.advisory = jsa[0];
}
}
}
*/
if (doc.cve.affects && doc.cve.affects.vendor && doc.cve.affects.vendor.vendor_data) {
for (var vi in doc.cve.affects.vendor.vendor_data) {
var v = doc.cve.affects.vendor.vendor_data[vi];
//print(v.vendor_name);
if (v.product && v.product.product_data) {
for (var pi in v.product.product_data) {
var p = v.product.product_data[pi];
//print(p.product_name);
if (p.version && p.version.version_data) {
for (var vri in p.version.version_data) {
var vr = p.version.version_data[vri];
//print(vr.version_value);
var k = vr.version_value.match(/(.*)\s+prior\s+to\s+(.*)/i);
if (k) {
vr.version_name = k[1];
vr.affected = "<";
vr.version_value = k[2];
}
}
}
}
}
}
}
if (doc.cve.credit)
var newCredit = [];
for (ci in doc.cve.credit) {
var c = doc.cve.credit[ci];
if (typeof c === 'string' || c instanceof String) {
newCredit.push({
lang: "eng",
value: c
});
} else {
newCredit.push(c);
}
}
if (doc.cve.solution instanceof String || typeof doc.cve.solution === 'string') {
var solution = [{
lang: "eng",
"value": doc.cve.solution
}];
doc.cve.solution = solution;
}
if (doc.cve.exploit instanceof String || typeof doc.cve.exploit === 'string') {
var exploit = [{
lang: "eng",
"value": doc.cve.exploit
}];
doc.cve.exploit = exploit;
}
doc.body = doc.cve;
delete doc.cve;
}
return doc;
}
function upgrade() {
var counter = 0,
total = 0;
var cves = db.collection('cves');
var cvesn = db.collection('cvesnew');
console.log("Connected successfully to server");
cves.find({}).forEach(function (doc) {
if (doc) {
total++;
if (doc.cve) {
var id = doc.cve.CVE_data_meta.ID;
var ndoc = upgradeDocv002to003(doc);
delete ndoc.id;
cvesn.save(ndoc).then((result) => {
console.log('Updated ' + id);
counter++;
});
}
} else {
console.log('Looked at ' + total + ' documents');
db.close()
}
});
}
function setupYM(){
db.getCollection('cves').find().forEach(function(doc){
s = {};
if(doc.body.CVE_data_meta.DATE_PUBLIC) {
s["body.CNA_private.publish.ym"] = doc.body.CVE_data_meta.DATE_PUBLIC.substr(0,7);
s["body.CNA_private.publish.year"] = doc.body.CVE_data_meta.DATE_PUBLIC.substr(0,4);
s["body.CNA_private.publish.month"] = doc.body.CVE_data_meta.DATE_PUBLIC.substr(5,2);
}
s["body.CNA_private.phase"] = phases[doc.body.CVE_data_meta.STATE];
db.getCollection('cves').update({_id:doc._id}, {$set: s});
});
}
function setupYMsa() {
db.getCollection('sas').find().forEach(function(doc){
s = {};
if(doc.body.DATE_PUBLIC) {
s["body.CNA_private.publish.ym"] = doc.body.DATE_PUBLIC.substr(0,7);
s["body.CNA_private.publish.year"] = doc.body.DATE_PUBLIC.substr(0,4);
s["body.CNA_private.publish.month"] = doc.body.DATE_PUBLIC.substr(5,2);
}
s["body.CNA_private.phase"] = phases[doc.body.STATE];
db.getCollection('sas').update({_id:doc._id}, {$set: s});
});
}
// upgrades mongo ids that uses to CVE ID to ObjectIDs.
// This is necessary for comments feature to work
function idUpgrade() {
db.getCollection('cves').find({"_id" : /CVE-/}).forEach(function(doc) {
doc._id;
var oldId = doc._id;
'removing ' + oldId;
db.getCollection('cves').remove({ _id: oldId });
delete doc._id;
res = db.getCollection('cves').insertOne(doc);
db.getCollection('cvehistories').update({docid: oldId},{$set:{'parent_id': res.insertedId}});
});
}
/*
function refnameadd(d) {
for (r of d.body.references.references_data) {
r.name = r.url;
r.refsource = 'CONFIRM';
r.name = r.url;
}
delete d._id;
return d;
}
*/
function calc(d) {
if (d.body.CVE_data_meta.DATE_PUBLIC > "") {
dt = d.body.CVE_data_meta.DATE_PUBLIC;
if (!d.body.CNA_private.publish) {
d.body.CNA_private.publish = {};
}
d.body.CNA_private.publish.year = dt.substr(0,4);
d.body.CNA_private.publish.ym = dt.substr(0,7);
d.body.CNA_private.publish.month = dt.substr(5,2);
}
return d;
}
function sacalc(d) {
if (d.body.DATE_PUBLIC > "") {
dt = d.body.DATE_PUBLIC;
if (!d.body.CNA_private.publish) {
d.body.CNA_private.publish = {};
}
d.body.CNA_private.publish.year = dt.substr(0,4);
d.body.CNA_private.publish.ym = dt.substr(0,7);
d.body.CNA_private.publish.month = dt.substr(5,2);
}
return d;
}
function severityLevel(score) {
var s = parseFloat(score);
if(isNaN(s) || s < 0) {
return '-';
}
if(s == 0.0) {
return 'NONE'
} else if(s <= 3.9) {
return 'LOW'
} else if(s <= 6.9) {
return 'MEDIUM'
} else if(s <= 8.9) {
return 'HIGH'
} else if(s <= 10.0) {
return 'CRITICAL'
} else {
return '-';
}
};