2016-03-06 04:58:52 -08:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
const fs = require('fs');
|
|
|
|
const url = require('url');
|
|
|
|
|
|
|
|
function comparableCertificate(certificate) {
|
|
|
|
return {
|
|
|
|
data: certificate.data.toString(),
|
|
|
|
issuerName: certificate.issuerName
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
function areEqual(certificate0, certificate1) {
|
|
|
|
if (certificate0.data !== certificate1.data) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (certificate0.issuerName !== certificate1.issuerName) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
function getHost(targetURL) {
|
|
|
|
return url.parse(targetURL).host;
|
|
|
|
}
|
|
|
|
|
2016-09-25 07:14:01 -07:00
|
|
|
function CertificateStore(storeFile) {
|
2016-08-29 14:40:11 -07:00
|
|
|
this.storeFile = storeFile;
|
2016-10-25 08:40:53 -07:00
|
|
|
let storeStr;
|
2016-03-06 04:58:52 -08:00
|
|
|
try {
|
2016-09-25 07:14:01 -07:00
|
|
|
storeStr = fs.readFileSync(storeFile, 'utf-8');
|
|
|
|
} catch (e) {
|
2016-10-25 08:40:53 -07:00
|
|
|
storeStr = '{}';
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
this.data = JSON.parse(storeStr);
|
2016-09-25 07:14:01 -07:00
|
|
|
} catch (e) {
|
2016-10-25 08:40:53 -07:00
|
|
|
console.log('Error when parsing', storeFile, ':', e);
|
2016-03-06 04:58:52 -08:00
|
|
|
this.data = {};
|
|
|
|
}
|
2016-09-25 07:14:01 -07:00
|
|
|
}
|
2016-03-06 04:58:52 -08:00
|
|
|
|
2016-09-25 07:14:01 -07:00
|
|
|
CertificateStore.prototype.save = function save() {
|
2016-03-06 04:58:52 -08:00
|
|
|
fs.writeFileSync(this.storeFile, JSON.stringify(this.data, null, ' '));
|
|
|
|
};
|
|
|
|
|
2016-09-25 07:14:01 -07:00
|
|
|
CertificateStore.prototype.add = function add(targetURL, certificate) {
|
2016-03-06 04:58:52 -08:00
|
|
|
this.data[getHost(targetURL)] = comparableCertificate(certificate);
|
|
|
|
};
|
|
|
|
|
2016-09-25 07:14:01 -07:00
|
|
|
CertificateStore.prototype.isExisting = function isExisting(targetURL) {
|
2016-03-06 04:58:52 -08:00
|
|
|
return this.data.hasOwnProperty(getHost(targetURL));
|
|
|
|
};
|
|
|
|
|
2016-09-25 07:14:01 -07:00
|
|
|
CertificateStore.prototype.isTrusted = function isTrusted(targetURL, certificate) {
|
2016-03-06 04:58:52 -08:00
|
|
|
var host = getHost(targetURL);
|
|
|
|
if (!this.isExisting(targetURL)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return areEqual(this.data[host], comparableCertificate(certificate));
|
|
|
|
};
|
|
|
|
|
|
|
|
module.exports = {
|
2016-09-25 07:14:01 -07:00
|
|
|
load(storeFile) {
|
2016-03-06 04:58:52 -08:00
|
|
|
return new CertificateStore(storeFile);
|
|
|
|
}
|
|
|
|
};
|