From 551336540c807d56bb964accd153a64b3d80a379 Mon Sep 17 00:00:00 2001 From: "glharper@microsoft.com" Date: Mon, 13 Mar 2023 08:37:45 -0700 Subject: [PATCH 1/7] remove ocsp code - test PR --- external/ocsp/ocsp.d.ts | 47 -- external/ocsp/ocsp.js | 11 - external/ocsp/ocsp/agent.js | 160 ------- external/ocsp/ocsp/api.js | 14 - external/ocsp/ocsp/cache.js | 117 ----- external/ocsp/ocsp/check.js | 56 --- external/ocsp/ocsp/request.js | 69 --- external/ocsp/ocsp/utils.js | 210 --------- external/ocsp/ocsp/verify.js | 118 ------ gulpfile.js | 6 - package.json | 2 - src/common.browser/CertChecks.ts | 401 ------------------ src/common.browser/WebsocketMessageAdapter.ts | 5 - tests/OCSPCacheTests.ts | 258 ----------- tests/SpeechRecognizerTests.ts | 1 - 15 files changed, 1475 deletions(-) delete mode 100644 external/ocsp/ocsp.d.ts delete mode 100644 external/ocsp/ocsp.js delete mode 100644 external/ocsp/ocsp/agent.js delete mode 100644 external/ocsp/ocsp/api.js delete mode 100644 external/ocsp/ocsp/cache.js delete mode 100644 external/ocsp/ocsp/check.js delete mode 100644 external/ocsp/ocsp/request.js delete mode 100644 external/ocsp/ocsp/utils.js delete mode 100644 external/ocsp/ocsp/verify.js delete mode 100644 src/common.browser/CertChecks.ts delete mode 100644 tests/OCSPCacheTests.ts diff --git a/external/ocsp/ocsp.d.ts b/external/ocsp/ocsp.d.ts deleted file mode 100644 index 5cce43f6..00000000 --- a/external/ocsp/ocsp.d.ts +++ /dev/null @@ -1,47 +0,0 @@ - -/** Declaration file generated by dts-gen */ - -import * as http from "http"; -import { DetailedPeerCertificate, Certificate, TlsOptions } from "tls"; -import { HttpsProxyAgentOptions } from "https-proxy-agent"; - -export class Agent extends http.Agent { - public constructor(options: any); - public fetchIssuer(peerCert: DetailedPeerCertificate, stapling: Certificate, cb: (error: string, result: DetailedPeerCertificate) => void): void; -} - -export function check(options: any, cb: (error: Error, res: any) => void): any; -export function verify(options: VerifyOptions, cb: (error: string, res: any) => void): void; - -export interface Response { - start: any; - end: any; - value: any; - certs: any; - certsTbs: any; -} - -export interface Request { - id: Buffer; - certID: any; - data: any; - - // Just to avoid re-parsing DER - cert: any; - issuer: any; -} - -export interface VerifyOptions { - request: Request; - response: Buffer; -} - -export class utils { - public static parseResponse(response: any): Response; - public static getAuthorityInfo(cert: DetailedPeerCertificate, ocspMethod: string, cb: (err: string, uri: string) => void): void; - public static getResponse(httpOptions: http.RequestOptions | string, data: any, cb: (err: string, raw: Buffer) => void): void; -} - -export class request { - public static generate(rawCert: Buffer, rawIssuer: Buffer): Request; -} \ No newline at end of file diff --git a/external/ocsp/ocsp.js b/external/ocsp/ocsp.js deleted file mode 100644 index f8f9b742..00000000 --- a/external/ocsp/ocsp.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict'; - -exports.Cache = require('./ocsp/cache'); -exports.Agent = require('./ocsp/agent'); - -exports.getOCSPURI = require('./ocsp/api').getOCSPURI; - -exports.request = require('./ocsp/request'); -exports.check = require('./ocsp/check'); -exports.verify = require('./ocsp/verify'); -exports.utils = require('./ocsp/utils'); diff --git a/external/ocsp/ocsp/agent.js b/external/ocsp/ocsp/agent.js deleted file mode 100644 index b9fb6400..00000000 --- a/external/ocsp/ocsp/agent.js +++ /dev/null @@ -1,160 +0,0 @@ -'use strict'; - -var ocsp = require('../ocsp'); - -var util = require('util'); -var http = require('http'); -var https = require('https'); -var rfc5280 = require('asn1.js-rfc5280'); -var SimpleCache = require('simple-lru-cache'); - -function Agent(options) { - if (!options) - options = {}; - - https.Agent.call(this, options); - - this.caCache = new SimpleCache({ maxSize: options.CACacheSize || 1024 }); -} -module.exports = Agent; -util.inherits(Agent, https.Agent); - -Agent.prototype.createConnection = function createConnection(port, - host, - options) { - - if (port !== null && typeof port === 'object') { - options = port; - port = null; - } else if (host !== null && typeof host === 'object') { - options = host; - host = null; - } else if (options === null || typeof options !== 'object') - options = {}; - - if (typeof port === 'number') - options.port = port; - - if (typeof host === 'string') - options.host = host; - - var ocspOptions = util._extend({ requestOCSP: true }, options); - var socket = https.Agent.prototype.createConnection.call( - this, port, host, ocspOptions); - - var self = this; - var stapling = null; - socket.on('OCSPResponse', function(data) { - stapling = data; - }); - - socket.on('secure', function() { - return self.handleOCSPResponse(socket, stapling, function(err) { - if (err) - return socket.destroy(err); - - // Time to allow all writes! - socket.uncork(); - }); - }); - - // Do not let any writes come through until we will verify OCSP - socket.cork(); - - return socket; -}; - -Agent.prototype.handleOCSPResponse = function handleOCSPResponse(socket, - stapling, - cb) { - var cert = socket.ssl.getPeerCertificate(true); - var issuer = cert.issuerCertificate; - - cert = cert.raw; - try { - cert = rfc5280.Certificate.decode(cert, 'der'); - - if (issuer) { - issuer = issuer.raw; - issuer = rfc5280.Certificate.decode(issuer, 'der'); - } - } catch (e) { - return cb(e); - } - - function onIssuer(err, x509) { - if (err) - return cb(err); - - issuer = x509; - - if (stapling) { - var req = ocsp.request.generate(cert, issuer); - ocsp.verify({ - request: req, - response: stapling - }, cb); - } else { - return ocsp.check({ cert: cert, issuer: issuer }, cb); - } - } - - if (issuer) - return onIssuer(null, issuer); - else - return this.fetchIssuer(cert, stapling, onIssuer); -}; - -Agent.prototype.fetchIssuer = function fetchIssuer(cert, stapling, cb) { - var issuers = ocsp.utils['id-ad-caIssuers'].join('.'); - var self = this; - - // TODO(indutny): use info from stapling response - ocsp.utils.getAuthorityInfo(cert, issuers, function(err, uri) { - if (err) - return cb(err); - - var ca = self.caCache.get(uri); - if (ca) - return cb(null, ca); - - var once = false; - function done(err, data) { - if (once) - return; - - once = true; - cb(err, data); - } - - function onResponse(res) { - if (res.statusCode < 200 || res.statusCode >= 400) - return done(new Error('Failed to fetch CA: ' + res.statusCode)); - - var chunks = []; - res.on('readable', function() { - var chunk = res.read(); - if (!chunk) - return; - chunks.push(chunk); - }); - - res.on('end', function() { - var cert = Buffer.concat(chunks); - - try { - cert = rfc5280.Certificate.decode(cert, 'der'); - } catch (e) { - return done(e); - } - - self.caCache.set(uri, cert); - done(null, cert); - }); - } - - http.get(uri) - .on('error', done) - .on('response', onResponse); - }); -}; diff --git a/external/ocsp/ocsp/api.js b/external/ocsp/ocsp/api.js deleted file mode 100644 index a112edf1..00000000 --- a/external/ocsp/ocsp/api.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -var ocsp = require('../ocsp'); -var rfc2560 = require('asn1.js-rfc2560'); -var rfc5280 = require('asn1.js-rfc5280'); - -exports.getOCSPURI = function getOCSPURI(rawCert, cb) { - var ocspMethod = rfc2560['id-pkix-ocsp'].join('.'); - - var cert = ocsp.utils.toDER(rawCert, 'CERTIFICATE'); - cert = rfc5280.Certificate.decode(cert, 'der'); - - ocsp.utils.getAuthorityInfo(cert, ocspMethod, cb); -}; diff --git a/external/ocsp/ocsp/cache.js b/external/ocsp/ocsp/cache.js deleted file mode 100644 index ed38bb7b..00000000 --- a/external/ocsp/ocsp/cache.js +++ /dev/null @@ -1,117 +0,0 @@ -'use strict'; - -var ocsp = require('../ocsp'); - -function Cache(options) { - this.options = options || {}; - this.cache = {}; - - // Override methods - if (this.options.probe) - this.probe = this.options.probe; - if (this.options.store) - this.store = this.options.store; - if (this.options.filter) - this.filter = this.options.filter; -} -module.exports = Cache; - -Cache.prototype.filter = function filter(url, callback) { - callback(null); -}; - -Cache.prototype.probe = function probe(id, callback) { - if (this.cache.hasOwnProperty(id)) - callback(null, this.cache[id]); - else - callback(null, false); -}; - -Cache.prototype.store = function store(id, response, maxTime, callback) { - if (this.cache.hasOwnProperty(id)) - clearTimeout(this.cache[id].timer); - var self = this; - this.cache[id] = { - response: response, - timer: setTimeout(function() { - delete self.cache[id]; - }, maxTime) - }; - - callback(null, null); -}; - -Cache.prototype.request = function request(id, data, callback) { - var self = this; - - function done(err, response) { - if (callback) - callback(err, response); - callback = null; - } - - function onResponse(err, ocsp) { - if (err) - return done(err); - - // Respond early - done(null, ocsp); - - // Try parsing and caching response - self.getMaxStoreTime(ocsp, function(err, maxTime) { - if (err) - return; - - self.store(id, ocsp, maxTime, function() { - // No-op - }); - }); - } - - // Check that url isn't blacklisted - this.filter(data.url, function(err) { - if (err) - return done(err, null); - - ocsp.utils.getResponse(data.url, data.ocsp, onResponse); - }); - -}; - -Cache.prototype.getMaxStoreTime = function getMaxStoreTime(response, callback) { - var basic; - try { - basic = ocsp.utils.parseResponse(response).value; - } catch (e) { - return callback(e); - } - - // Not enough responses - if (basic.tbsResponseData.responses.length === 0) - return callback(new Error('No OCSP responses')); - - var responses = basic.tbsResponseData.responses; - - // Every response should be positive - var good = responses.every(function(response) { - return response.certStatus.type === 'good'; - }); - - // No good - no cache - if (!good) - return callback(new Error('Some OCSP responses are not good')); - - // Find minimum nextUpdate time - var nextUpdate = 0; - for (var i = 0; i < responses.length; i++) { - var response = responses[i]; - var responseNext = response.nextUpdate; - if (!responseNext) - continue; - - if (nextUpdate === 0 || nextUpdate > responseNext) - nextUpdate = responseNext; - } - - return callback(null, Math.max(0, nextUpdate - new Date())); -}; diff --git a/external/ocsp/ocsp/check.js b/external/ocsp/ocsp/check.js deleted file mode 100644 index e7b1f664..00000000 --- a/external/ocsp/ocsp/check.js +++ /dev/null @@ -1,56 +0,0 @@ -'use strict'; - -var ocsp = require('../ocsp'); -var util = require('util'); -var url = require('url'); - -var rfc2560 = require('asn1.js-rfc2560'); - -module.exports = function check(options, cb) { - var sync = true; - var req; - - function done(err, data) { - if (sync) { - sync = false; - process.nextTick(function() { - cb(err, data); - }); - return; - } - - cb(err, data); - } - - try { - req = ocsp.request.generate(options.cert, options.issuer); - } catch (e) { - return done(e); - } - - var ocspMethod = rfc2560['id-pkix-ocsp'].join('.'); - ocsp.utils.getAuthorityInfo(req.cert, ocspMethod, function(err, uri) { - if (err) - return done(err); - - var httpOptions; - - if (options.httpOptions !== undefined) { - httpOptions = util._extend(options.httpOptions, url.parse(uri)); - } else { - httpOptions = uri; - } - - ocsp.utils.getResponse(httpOptions, req.data, function(err, raw) { - if (err) - return done(err); - - ocsp.verify({ - request: req, - response: raw - }, done); - }); - }); - - sync = false; -}; diff --git a/external/ocsp/ocsp/request.js b/external/ocsp/ocsp/request.js deleted file mode 100644 index 53473e7b..00000000 --- a/external/ocsp/ocsp/request.js +++ /dev/null @@ -1,69 +0,0 @@ -'use strict'; - -var ocsp = require('../ocsp'); -var crypto = require('crypto'); -var rfc2560 = require('asn1.js-rfc2560'); -var rfc5280 = require('asn1.js-rfc5280'); - -function sha1(data) { - return crypto.createHash('sha1').update(data).digest(); -} - -exports.generate = function generate(rawCert, rawIssuer) { - var cert; - if (rawCert.tbsCertificate) { - cert = rawCert; - } else { - cert = rfc5280.Certificate.decode( - ocsp.utils.toDER(rawCert, 'CERTIFICATE'), - 'der'); - } - var issuer; - if (rawIssuer.tbsCertificate) { - issuer = rawIssuer; - } else { - issuer = rfc5280.Certificate.decode( - ocsp.utils.toDER(rawIssuer, 'CERTIFICATE'), - 'der'); - } - - var tbsCert = cert.tbsCertificate; - var tbsIssuer = issuer.tbsCertificate; - - var certID = { - hashAlgorithm: { - // algorithm: [ 2, 16, 840, 1, 101, 3, 4, 2, 1 ] // sha256 - algorithm: [ 1, 3, 14, 3, 2, 26 ] // sha1 - }, - issuerNameHash: sha1(rfc5280.Name.encode(tbsCert.issuer, 'der')), - issuerKeyHash: sha1( - tbsIssuer.subjectPublicKeyInfo.subjectPublicKey.data), - serialNumber: tbsCert.serialNumber - }; - - var tbs = { - version: 'v1', - requestList: [ { - reqCert: certID - } ], - requestExtensions: [ { - extnID: rfc2560['id-pkix-ocsp-nonce'], - critical: false, - extnValue: rfc2560.Nonce.encode(crypto.randomBytes(16), 'der') - } ] - }; - - var req = { - tbsRequest: tbs - }; - - return { - id: sha1(rfc2560.CertID.encode(certID, 'der')), - certID: certID, - data: rfc2560.OCSPRequest.encode(req, 'der'), - - // Just to avoid re-parsing DER - cert: cert, - issuer: issuer - }; -}; diff --git a/external/ocsp/ocsp/utils.js b/external/ocsp/ocsp/utils.js deleted file mode 100644 index f280f006..00000000 --- a/external/ocsp/ocsp/utils.js +++ /dev/null @@ -1,210 +0,0 @@ -'use strict'; - -var http = require('http'); -var util = require('util'); -var url = require('url'); -var asn1 = require('asn1.js'); - -var rfc2560 = require('asn1.js-rfc2560'); - -exports['id-ad-caIssuers'] = [ 1, 3, 6, 1, 5, 5, 7, 48, 2 ]; -exports['id-kp-OCSPSigning'] = [ 1, 3, 6, 1, 5, 5, 7, 3, 9 ]; - -exports.getResponse = function getResponse(uri, req, cb) { - if (typeof uri !== 'object') { - uri = url.parse(uri); - } - - var options = util._extend({ - method: 'POST', - headers: { - 'Content-Type': 'application/ocsp-request', - 'Content-Length': req.length - } - }, uri); - - function done(err, response) { - if (cb) - cb(err, response); - cb = null; - } - - function onResponse(response) { - if (response.statusCode < 200 || response.statusCode >= 400) { - return done( - new Error('Failed to obtain OCSP response: ' + response.statusCode)); - } - - var chunks = []; - response.on('readable', function() { - var chunk = response.read(); - if (!chunk) - return; - chunks.push(chunk); - }); - response.on('end', function() { - var ocsp = Buffer.concat(chunks); - - done(null, ocsp); - }); - } - - http.request(options, onResponse) - .on('error', done) - .end(req); -}; - -exports.parseResponse = function parseResponse(raw) { - var body = { start: 0, end: raw.length }; - var response = rfc2560.OCSPResponse.decode(raw, 'der', { - track: function(key, start, end, type) { - if (type !== 'content' || key !== 'responseBytes/response') - return; - body.start = start; - body.end = end; - } - }); - - var status = response.responseStatus; - if (status !== 'successful') - throw new Error('Bad OCSP response status: ' + status); - - // Unknown response type - var responseType = response.responseBytes.responseType; - if (responseType !== 'id-pkix-ocsp-basic') - throw new Error('Unknown OCSP response type: ' + responseType); - - var bytes = response.responseBytes.response; - - var tbs = { start: body.start, end: body.end }; - var certsTbs = []; - var basic = rfc2560.BasicOCSPResponse.decode(bytes, 'der', { - track: function(key, start, end, type) { - if (type !== 'tagged') - return; - - if (key === 'tbsResponseData') { - tbs.start = body.start + start; - tbs.end = body.start + end; - } else if (key === 'certs/tbsCertificate') { - certsTbs.push({ start: body.start + start, end: body.start + end }); - } - } - }); - - var OCSPSigning = exports['id-kp-OCSPSigning'].join('.'); - var certs = (basic.certs || []).filter(function(cert) { - return cert.tbsCertificate.extensions.some(function(ext) { - if (ext.extnID !== 'extendedKeyUsage') - return false; - - return ext.extnValue.some(function(value) { - return value.join('.') === OCSPSigning; - }); - }); - }); - - return { - start: tbs.start, - end: tbs.end, - value: basic, - certs: certs, - certsTbs: certsTbs - }; -}; - -exports.digest = { - '1.3.14.3.2.26': 'sha1', - '2.16.840.1.101.3.4.2.1': 'sha256' -}; - -exports.digestRev = { - sha1: '1.3.14.3.2.26', - sha256: '2.16.840.1.101.3.4.2.1' -}; - -exports.sign = { - '1.2.840.113549.1.1.5': 'sha1WithRSAEncryption', - '1.2.840.113549.1.1.11': 'sha256WithRSAEncryption', - '1.2.840.113549.1.1.12': 'sha384WithRSAEncryption', - '1.2.840.113549.1.1.13': 'sha512WithRSAEncryption' -}; - -exports.signRev = { - sha1WithRSAEncryption: [ 1, 2, 840, 113549, 1, 1, 5 ], - sha256WithRSAEncryption: [ 1, 2, 840, 113549, 1, 1, 11 ], - sha384WithRSAEncryption: [ 1, 2, 840, 113549, 1, 1, 12 ], - sha512WithRSAEncryption: [ 1, 2, 840, 113549, 1, 1, 13 ] -}; - -exports.toPEM = function toPEM(buf, label) { - var p = buf.toString('base64'); - var out = [ '-----BEGIN ' + label + '-----' ]; - for (var i = 0; i < p.length; i += 64) - out.push(p.slice(i, i + 64)); - out.push('-----END ' + label + '-----'); - return out.join('\n'); -}; - -exports.toDER = function toDER(raw, what) { - var der = raw.toString().match(new RegExp( - '-----BEGIN ' + what + '-----([^-]*)-----END ' + what + '-----')); - if (der) - der = new Buffer(der[1].replace(/[\r\n]/g, ''), 'base64'); - else if (typeof raw === 'string') - der = new Buffer(raw); - else - der = raw; - return der; -}; - -exports.getAuthorityInfo = function getAuthorityInfo(cert, key, done) { - var exts = cert.tbsCertificate.extensions; - if (!exts) - exts = []; - - var infoAccess = exts.filter(function(ext) { - return ext.extnID === 'authorityInformationAccess'; - }); - - if (infoAccess.length === 0) - return done(new Error('AuthorityInfoAccess not found in extensions')); - - var res = null; - var found = infoAccess.some(function(info) { - var ext = info.extnValue; - - return ext.some(function(ad) { - if (ad.accessMethod.join('.') !== key) - return false; - - var loc = ad.accessLocation; - if (loc.type !== 'uniformResourceIdentifier') - return false; - - res = loc.value + ''; - - return true; - }); - }); - - if (!found) - return done(new Error(key + ' not found in AuthorityInfoAccess')); - - return done(null, res); -}; - -var RSAPrivateKey = asn1.define('RSAPrivateKey', function() { - this.seq().obj( - this.key('version').int(), - this.key('modulus').int(), - this.key('publicExponent').int(), - this.key('privateExponent').int(), - this.key('prime1').int(), - this.key('prime2').int(), - this.key('exponent1').int(), - this.key('exponent2').int(), - this.key('coefficient').int() - ); -}); -exports.RSAPrivateKey = RSAPrivateKey; diff --git a/external/ocsp/ocsp/verify.js b/external/ocsp/ocsp/verify.js deleted file mode 100644 index 37da8e21..00000000 --- a/external/ocsp/ocsp/verify.js +++ /dev/null @@ -1,118 +0,0 @@ -'use strict'; - -var ocsp = require('../ocsp'); -var rfc5280 = require('asn1.js-rfc5280'); -var crypto = require('crypto'); - -// TODO(indutny): verify issuer, etc... -function findResponder(issuer, certs, raws) { - var issuerKey = issuer.tbsCertificate.subjectPublicKeyInfo; - issuerKey = ocsp.utils.toPEM( - rfc5280.SubjectPublicKeyInfo.encode(issuerKey, 'der'), 'PUBLIC KEY'); - - for (var i = 0; i < certs.length; i++) { - var cert = certs[i]; - var signAlg = ocsp.utils.sign[cert.signatureAlgorithm.algorithm.join('.')]; - if (!signAlg) { - throw new Error('Unknown signature algorithm ' + - cert.signatureAlgorithm.algorithm); - } - - var verify = crypto.createVerify(signAlg); - - verify.update(raws[i]); - if (!verify.verify(issuerKey, cert.signature.data)) - throw new Error('Invalid signature'); - - var certKey = cert.tbsCertificate.subjectPublicKeyInfo; - certKey = ocsp.utils.toPEM( - rfc5280.SubjectPublicKeyInfo.encode(certKey, 'der'), 'PUBLIC KEY'); - return certKey; - } - - return issuerKey; -} - -module.exports = function verify(options, cb) { - var req = options.request; - var issuer; - var res; - - function done(err) { - process.nextTick(function() { - cb(err, res && res.certStatus); - }); - } - - try { - issuer = req.issuer || - rfc5280.Certificate.decode( - ocsp.utils.toDER(options.issuer, 'CERTIFICATE'), 'der'); - - res = ocsp.utils.parseResponse(options.response); - } catch (e) { - return done(e); - } - - var rawTBS = options.response.slice(res.start, res.end); - var certs = res.certs; - var raws = res.certsTbs.map(function(tbs) { - return options.response.slice(tbs.start, tbs.end); - }); - res = res.value; - - // Verify signature using CAs Public Key - var signAlg = ocsp.utils.sign[res.signatureAlgorithm.algorithm.join('.')]; - if (!signAlg) { - done(new Error('Unknown signature algorithm ' + - res.signatureAlgorithm.algorithm)); - return; - } - - var responderKey = findResponder(issuer, certs, raws); - - var verify = crypto.createVerify(signAlg); - var tbs = res.tbsResponseData; - - var signature = res.signature.data; - - verify.update(rawTBS); - if (!verify.verify(responderKey, signature)) - return done(new Error('Invalid signature')); - - if (tbs.responses.length < 1) - return done(new Error('Expected at least one response')); - - var res = tbs.responses[0]; - - // Verify CertID - // XXX(indutny): verify parameters - if (res.certId.hashAlgorithm.algorithm.join('.') !== - req.certID.hashAlgorithm.algorithm.join('.')) { - return done(new Error('Hash algorithm mismatch')); - } - - if (res.certId.issuerNameHash.toString('hex') !== - req.certID.issuerNameHash.toString('hex')) { - return done(new Error('Issuer name hash mismatch')); - } - - if (res.certId.issuerKeyHash.toString('hex') !== - req.certID.issuerKeyHash.toString('hex')) { - return done(new Error('Issuer key hash mismatch')); - } - - if (res.certId.serialNumber.cmp(req.certID.serialNumber) !== 0) - return done(new Error('Serial number mismatch')); - - if (res.certStatus.type !== 'good') { - return done(new Error('OCSP Status: ' + res.certStatus.type)); - } - - var now = +new Date(); - var nudge = options.nudge || 60000; - if (res.thisUpdate - nudge > now || res.nextUpdate + nudge < now) - return done(new Error('OCSP Response expired')); - - return done(null); -}; diff --git a/gulpfile.js b/gulpfile.js index 5b76792c..f36fa944 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -30,9 +30,6 @@ .pipe(tsProject()) .pipe(sourcemaps.write('.')) .pipe(gulp.dest('distrib/lib')); - }, function () { - return gulp.src('./external/**/*') - .pipe(gulp.dest('./distrib/lib/external/')); })); gulp.task('build2015', gulp.series(function build() { @@ -50,9 +47,6 @@ .pipe(tsProject2015()) .pipe(sourcemaps.write('.')) .pipe(gulp.dest('distrib/es2015')); - }, function () { - return gulp.src('./external/**/*') - .pipe(gulp.dest('./distrib/es2015/external/')); })); gulp.task('bundle', gulp.series('build', function bundle() { diff --git a/package.json b/package.json index 19ce6ef5..a3fdd6cf 100644 --- a/package.json +++ b/package.json @@ -34,8 +34,6 @@ "ws": false, "fs": false, "async-disk-cache": false, - "distrib/es2015/external/ocsp/ocsp": false, - "distrib/lib/external/ocsp/ocsp": false, "agent-base": false, "tls": false, "net": false diff --git a/src/common.browser/CertChecks.ts b/src/common.browser/CertChecks.ts deleted file mode 100644 index c5378076..00000000 --- a/src/common.browser/CertChecks.ts +++ /dev/null @@ -1,401 +0,0 @@ -/* eslint-disable import/order */ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -import * as http from "http"; -import * as tls from "tls"; -import * as ocsp from "../../external/ocsp/ocsp"; -import { - Events, - OCSPCacheEntryExpiredEvent, - OCSPCacheEntryNeedsRefreshEvent, - OCSPCacheFetchErrorEvent, - OCSPCacheHitEvent, - OCSPCacheMissEvent, - OCSPCacheUpdateCompleteEvent, - OCSPCacheUpdateNeededEvent, - OCSPDiskCacheHitEvent, - OCSPDiskCacheStoreEvent, - OCSPEvent, - OCSPMemoryCacheHitEvent, - OCSPMemoryCacheStoreEvent, - OCSPResponseRetrievedEvent, - OCSPStapleReceivedEvent, - OCSPVerificationFailedEvent, -} from "../common/Exports"; -import { IStringDictionary } from "../common/IDictionary"; -import { ProxyInfo } from "./ProxyInfo"; - -import Agent from "agent-base"; - -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore -import Cache from "async-disk-cache"; -import HttpsProxyAgent from "https-proxy-agent"; -import * as net from "net"; -import { OCSPCacheUpdateErrorEvent } from "../common/OCSPEvents"; - - -interface tbsUpdateResponse { - thisUpdate: number; - nextUpdate: number; -} - -interface tbsResponse { - tbsResponseData: { - responses: tbsUpdateResponse[]; - }; -} - -export class CertCheckAgent { - - // Test hook to enable forcing expiration / refresh to happen. - public static testTimeOffset: number = 0; - - // Test hook to disable stapling for cache testing. - public static forceDisableOCSPStapling: boolean = false; - - // An in memory cache for recived responses. - private static privMemCache: IStringDictionary = {}; - - // The on disk cache. - private static privDiskCache: Cache; - - private privProxyInfo: ProxyInfo; - - public constructor(proxyInfo?: ProxyInfo) { - if (!!proxyInfo) { - this.privProxyInfo = proxyInfo; - } - - // Initialize this here to allow tests to set the env variable before the cache is constructed. - if (!CertCheckAgent.privDiskCache) { - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call - CertCheckAgent.privDiskCache = new Cache("microsoft-cognitiveservices-speech-sdk-cache", { supportBuffer: true, location: (typeof process !== "undefined" && !!process.env.SPEECH_OCSP_CACHE_ROOT) ? process.env.SPEECH_OCSP_CACHE_ROOT : undefined }); - } - } - - // Test hook to force the disk cache to be recreated. - public static forceReinitDiskCache(): void { - CertCheckAgent.privDiskCache = undefined; - CertCheckAgent.privMemCache = {}; - } - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - public GetAgent(disableStapling?: boolean): http.Agent { - // eslint-disable-next-line @typescript-eslint/unbound-method - const agent: any = new Agent.Agent(this.CreateConnection); - - if (this.privProxyInfo !== undefined && - this.privProxyInfo.HostName !== undefined && - this.privProxyInfo.Port > 0) { - const proxyName: string = "privProxyInfo"; - // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access - agent[proxyName] = this.privProxyInfo; - } - - return agent as http.Agent; - } - - private static GetProxyAgent(proxyInfo: ProxyInfo): HttpsProxyAgent { - const httpProxyOptions: HttpsProxyAgent.HttpsProxyAgentOptions = { - host: proxyInfo.HostName, - port: proxyInfo.Port, - }; - - if (!!proxyInfo.UserName) { - httpProxyOptions.headers = { - "Proxy-Authentication": "Basic " + new Buffer(`${proxyInfo.UserName}:${(proxyInfo.Password === undefined) ? "" : proxyInfo.Password}`).toString("base64"), - }; - } else { - httpProxyOptions.headers = {}; - } - - httpProxyOptions.headers.requestOCSP = "true"; - - const httpProxyAgent: HttpsProxyAgent = new HttpsProxyAgent(httpProxyOptions); - return httpProxyAgent; - } - - private static async OCSPCheck(socketPromise: Promise, proxyInfo: ProxyInfo): Promise { - let ocspRequest: ocsp.Request; - let stapling: Buffer; - let resolved: boolean = false; - - const socket: net.Socket = await socketPromise; - socket.cork(); - - const tlsSocket: tls.TLSSocket = socket as tls.TLSSocket; - - return new Promise((resolve: (value: net.Socket) => void, reject: (error: string | Error) => void): void => { - socket.on("OCSPResponse", (data: Buffer): void => { - if (!!data) { - this.onEvent(new OCSPStapleReceivedEvent()); - stapling = data; - } - }); - - socket.on("error", (error: Error): void => { - if (!resolved) { - resolved = true; - socket.destroy(); - reject(error); - } - }); - - // eslint-disable-next-line @typescript-eslint/no-misused-promises, @typescript-eslint/explicit-function-return-type - tlsSocket.on("secure", async () => { - const peer: tls.DetailedPeerCertificate = tlsSocket.getPeerCertificate(true); - try { - const issuer: tls.DetailedPeerCertificate = await this.GetIssuer(peer); - - // We always need a request to verify the response. - ocspRequest = ocsp.request.generate(peer.raw, issuer.raw); - - // Do we have a result for this certificate in our memory cache? - const sig: string = ocspRequest.id.toString("hex"); - - // Stapled response trumps cached response. - if (!stapling) { - const cacheEntry: Buffer = await CertCheckAgent.GetResponseFromCache(sig, ocspRequest, proxyInfo); - stapling = cacheEntry; - } - - await this.VerifyOCSPResponse(stapling, ocspRequest, proxyInfo); - - socket.uncork(); - resolved = true; - resolve(socket); - } catch (e) { - socket.destroy(); - resolved = true; - reject(e as string); - } - }); - }); - } - - private static GetIssuer(peer: tls.DetailedPeerCertificate): Promise { - if (peer.issuerCertificate) { - return Promise.resolve(peer.issuerCertificate); - } - - return new Promise((resolve: (value: tls.DetailedPeerCertificate) => void, reject: (reason: string) => void): void => { - const ocspAgent: ocsp.Agent = new ocsp.Agent({}); - ocspAgent.fetchIssuer(peer, null, (error: string, value: tls.DetailedPeerCertificate): void => { - if (!!error) { - reject(error); - return; - } - - resolve(value); - }); - }); - } - - private static async GetResponseFromCache(signature: string, ocspRequest: ocsp.Request, proxyInfo: ProxyInfo): Promise { - let cachedResponse: Buffer = CertCheckAgent.privMemCache[signature]; - - if (!!cachedResponse) { - this.onEvent(new OCSPMemoryCacheHitEvent(signature)); - } - - // Do we have a result for this certificate on disk in %TMP%? - if (!cachedResponse) { - try { - // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call - const diskCacheResponse: { value: Buffer; isCached?: any } = await CertCheckAgent.privDiskCache.get(signature) as { value: Buffer; isCached?: any }; - if (!!diskCacheResponse.isCached) { - CertCheckAgent.onEvent(new OCSPDiskCacheHitEvent(signature)); - CertCheckAgent.StoreMemoryCacheEntry(signature, diskCacheResponse.value); - cachedResponse = diskCacheResponse.value; - } - } catch (error) { - cachedResponse = null; - } - } - - if (!cachedResponse) { - return cachedResponse; - } - - try { - const cachedOcspResponse: ocsp.Response = ocsp.utils.parseResponse(cachedResponse); - const responseValue: tbsResponse = cachedOcspResponse.value as tbsResponse; - const tbsData: { responses: tbsUpdateResponse[] } = responseValue.tbsResponseData; - if (tbsData.responses.length < 1) { - this.onEvent(new OCSPCacheFetchErrorEvent(signature, "Not enough data in cached response")); - return; - } - - const cachedStartTime: number = tbsData.responses[0].thisUpdate; - const cachedNextTime: number = tbsData.responses[0].nextUpdate; - - if (cachedNextTime < (Date.now() + this.testTimeOffset - 60000)) { - // Cached entry has expired. - this.onEvent(new OCSPCacheEntryExpiredEvent(signature, cachedNextTime)); - cachedResponse = null; - } else { - // If we're within one day of the next update, or 50% of the way through the validity period, - // background an update to the cache. - - const minUpdate: number = Math.min(24 * 60 * 60 * 1000, (cachedNextTime - cachedStartTime) / 2); - - if ((cachedNextTime - (Date.now() + this.testTimeOffset)) < minUpdate) { - this.onEvent(new OCSPCacheEntryNeedsRefreshEvent(signature, cachedStartTime, cachedNextTime)); - this.UpdateCache(ocspRequest, proxyInfo).catch((error: string): void => { - // Well, not much we can do here. - this.onEvent(new OCSPCacheUpdateErrorEvent(signature, error.toString())); - }); - } else { - this.onEvent(new OCSPCacheHitEvent(signature, cachedStartTime, cachedNextTime)); - } - } - } catch (error) { - this.onEvent(new OCSPCacheFetchErrorEvent(signature, error as string)); - cachedResponse = null; - } - if (!cachedResponse) { - this.onEvent(new OCSPCacheMissEvent(signature)); - } - return cachedResponse; - } - - private static async VerifyOCSPResponse(cacheValue: Buffer, ocspRequest: ocsp.Request, proxyInfo: ProxyInfo): Promise { - let ocspResponse: Buffer = cacheValue; - - // Do we have a valid response? - if (!ocspResponse) { - ocspResponse = await CertCheckAgent.GetOCSPResponse(ocspRequest, proxyInfo); - } - - return new Promise((resolve: () => void, reject: (error: string | Error) => void): void => { - ocsp.verify({ request: ocspRequest, response: ocspResponse }, (error: string): void => { - if (!!error) { - CertCheckAgent.onEvent(new OCSPVerificationFailedEvent(ocspRequest.id.toString("hex"), error)); - - // Bad Cached Value? One more try without the cache. - if (!!cacheValue) { - this.VerifyOCSPResponse(null, ocspRequest, proxyInfo).then((): void => { - resolve(); - }, (error: Error): void => { - reject(error); - }); - } else { - reject(error); - } - } else { - if (!cacheValue) { - CertCheckAgent.StoreCacheEntry(ocspRequest.id.toString("hex"), ocspResponse); - } - resolve(); - } - }); - }); - } - - private static async UpdateCache(req: ocsp.Request, proxyInfo: ProxyInfo): Promise { - const signature: string = req.id.toString("hex"); - this.onEvent(new OCSPCacheUpdateNeededEvent(signature)); - - const rawResponse: Buffer = await this.GetOCSPResponse(req, proxyInfo); - this.StoreCacheEntry(signature, rawResponse); - this.onEvent(new OCSPCacheUpdateCompleteEvent(req.id.toString("hex"))); - - } - - private static StoreCacheEntry(sig: string, rawResponse: Buffer): void { - this.StoreMemoryCacheEntry(sig, rawResponse); - this.StoreDiskCacheEntry(sig, rawResponse); - } - - private static StoreMemoryCacheEntry(sig: string, rawResponse: Buffer): void { - this.privMemCache[sig] = rawResponse; - this.onEvent(new OCSPMemoryCacheStoreEvent(sig)); - } - - private static StoreDiskCacheEntry(sig: string, rawResponse: Buffer): void { - // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call - this.privDiskCache.set(sig, rawResponse).then((): void => { - this.onEvent(new OCSPDiskCacheStoreEvent(sig)); - }); - } - - private static GetOCSPResponse(req: ocsp.Request, proxyInfo: ProxyInfo): Promise { - - const ocspMethod: string = "1.3.6.1.5.5.7.48.1"; - let options: http.RequestOptions = {}; - - if (!!proxyInfo) { - const agent: HttpsProxyAgent = CertCheckAgent.GetProxyAgent(proxyInfo); - options.agent = agent; - } - - return new Promise((resolve: (value: Buffer) => void, reject: (error: string | Error) => void): void => { - ocsp.utils.getAuthorityInfo(req.cert as tls.DetailedPeerCertificate, ocspMethod, (error: string, uri: string): void => { - if (error) { - reject(error); - return; - } - - const url = new URL(uri); - options = { ...options, host: url.host, protocol: url.protocol, port: url.port, path: url.pathname, hostname: url.host }; - - ocsp.utils.getResponse(options, req.data, (error: string, raw: Buffer): void => { - if (error) { - reject(error); - return; - } - - const certID: Buffer = req.certID as Buffer; - this.onEvent(new OCSPResponseRetrievedEvent(certID.toString("hex"))); - resolve(raw); - }); - }); - }); - } - - private static onEvent(event: OCSPEvent): void { - Events.instance.onEvent(event); - } - - private CreateConnection(request: Agent.ClientRequest, options: Agent.RequestOptions): Promise { - const enableOCSP: boolean = (typeof process !== "undefined" && process.env.NODE_TLS_REJECT_UNAUTHORIZED !== "0" && process.env.SPEECH_CONDUCT_OCSP_CHECK !== "0") && options.secureEndpoint; - let socketPromise: Promise; - - options = { - ...options, - ...{ - requestOCSP: !CertCheckAgent.forceDisableOCSPStapling, - servername: options.host - } - }; - - if (!!this.privProxyInfo) { - const httpProxyAgent: HttpsProxyAgent = CertCheckAgent.GetProxyAgent(this.privProxyInfo); - const baseAgent: Agent.Agent = httpProxyAgent as unknown as Agent.Agent; - - socketPromise = new Promise((resolve: (value: net.Socket) => void, reject: (error: string | Error) => void): void => { - baseAgent.callback(request, options, (error: Error, socket: net.Socket): void => { - if (!!error) { - reject(error); - } else { - resolve(socket); - } - }); - }); - } else { - if (!!options.secureEndpoint) { - socketPromise = Promise.resolve(tls.connect(options)); - } else { - socketPromise = Promise.resolve(net.connect(options)); - } - } - - if (!!enableOCSP) { - return CertCheckAgent.OCSPCheck(socketPromise, this.privProxyInfo); - } else { - return socketPromise; - } - } -} diff --git a/src/common.browser/WebsocketMessageAdapter.ts b/src/common.browser/WebsocketMessageAdapter.ts index 68f88151..0d3596b2 100644 --- a/src/common.browser/WebsocketMessageAdapter.ts +++ b/src/common.browser/WebsocketMessageAdapter.ts @@ -27,8 +27,6 @@ import { } from "../common/Exports"; import { ProxyInfo } from "./ProxyInfo"; -import { CertCheckAgent } from "./CertChecks"; - interface ISendItem { Message: ConnectionMessage; RawWebsocketMessage: RawWebsocketMessage; @@ -115,9 +113,6 @@ export class WebsocketMessageAdapter { const options: ws.ClientOptions = { headers: this.privHeaders, perMessageDeflate: this.privEnableCompression }; // The ocsp library will handle validation for us and fail the connection if needed. this.privCertificateValidatedDeferral.resolve(); - const checkAgent: CertCheckAgent = new CertCheckAgent(this.proxyInfo); - - options.agent = checkAgent.GetAgent(); // Workaround for https://github.com/microsoft/cognitive-services-speech-sdk-js/issues/465 // Which is root caused by https://github.com/TooTallNate/node-agent-base/issues/61 diff --git a/tests/OCSPCacheTests.ts b/tests/OCSPCacheTests.ts deleted file mode 100644 index 140de01d..00000000 --- a/tests/OCSPCacheTests.ts +++ /dev/null @@ -1,258 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT license. - -import { CertCheckAgent } from "../src/common.browser/CertChecks"; -import { - ConsoleLoggingListener -} from "../src/common.browser/Exports"; -import { - Events, - EventType, - IDetachable, - OCSPEvent, - PlatformEvent -} from "../src/common/Exports"; -import { Settings } from "./Settings"; -import { WaitForPromise } from "./Utilities"; - -import * as fs from "fs"; -import * as os from "os"; -import path from "path"; -import rimraf from "rimraf"; - -const origCacehDir: string = process.env.SPEECH_OSCP_CACHE_ROOT; -let cacheDir: string; -let events: OCSPEvent[]; -let currentListener: IDetachable; - -beforeAll(() => { - // override inputs, if necessary - Settings.LoadSettings(); - Events.instance.attachListener(new ConsoleLoggingListener(EventType.Debug)); -}); - -beforeEach(() => { - // tslint:disable-next-line:no-console - console.info("------------------Starting test case: " + expect.getState().currentTestName + "-------------------------"); - // tslint:disable-next-line:no-console - console.info("Start Time: " + new Date(Date.now()).toLocaleString()); - cacheDir = path.join(os.tmpdir(), Math.random().toString(36).substr(2, 15)); - process.env.SPEECH_OCSP_CACHE_ROOT = cacheDir; - fs.mkdirSync(cacheDir); - events = []; - currentListener = Events.instance.attach((event: PlatformEvent): void => { - if (event.name.startsWith("OCSP")) { - events.push(event as OCSPEvent); - } - }); - CertCheckAgent.forceReinitDiskCache(); - CertCheckAgent.testTimeOffset = 0; -}); - -jest.retryTimes(Settings.RetryCount); - -afterEach(() => { - // tslint:disable-next-line:no-console - console.info("End Time: " + new Date(Date.now()).toLocaleString()); - rimraf(cacheDir, (error: Error): void => { - // tslint:disable-next-line:no-console - console.info("Error " + Error.toString() + " cleaning up."); - }); - currentListener.detach().catch(); - currentListener = null; -}); - -afterAll(() => { - process.env.SPEECH_OSCP_CACHE_ROOT = origCacehDir; -}); - -/* -function findEvent(eventName: string): number { - let found: number = 0; - events.forEach((event: OCSPEvent, index: number, array: OCSPEvent[]): void => { - if (event.name === eventName) { - found++; - } - }); - - return found; -} - -function waitForEvents(eventName: string, eventCount: number, rejectMessage?: string, timeoutMS: number = 5000): Promise { - return WaitForPromise((): boolean => { - return findEvent(eventName) === eventCount; - }, rejectMessage === undefined ? eventName : rejectMessage, timeoutMS); -} - -const makeRequest = (disableOCSPStapling: boolean = true): Promise => { - return new Promise(async (resolve: (value: void) => void, reject: (reason: string) => void): Promise => { - const testUrl: string = "https://www.microsoft.com/"; - - const agent: CertCheckAgent = new CertCheckAgent(); - CertCheckAgent.forceDisableOCSPStapling = disableOCSPStapling; - - // TODO: if we re-enable this test, make it work without got (find another http request lib - // that replaces the user agent) - const { statusCode } = await got(testUrl, { - agent: { http: agent.GetAgent() }, - followRedirect: false, - }); - try { - if (statusCode !== 200) { - reject(`error: statusCode ${statusCode} received`); - } else { - resolve(); - } - } catch (error) { - reject(error); - } - }); -} - -// https://github.com/chromium/badssl.com/issues/477 -test.skip("Test OCSP Revoked", async (done: jest.DoneCallback): Promise => { - // tslint:disable-next-line:no-console - console.info("Name: Test OCSP Revoked"); - - const testUrl: string = "https://revoked.badssl.com/"; - - const agent: CertCheckAgent = new CertCheckAgent(); - - try { - // TODO: if we re-enable this test, make it work without got (find another http request lib - // that replaces the user agent) - await got(testUrl, { - agent: { http: agent.GetAgent() }, - followRedirect: false, - }); - } catch (error) { - try { - expect(error).not.toBeUndefined(); - expect(error).not.toBeNull(); - expect(error.toString()).toContain("revoked"); - done(); - } catch (ex) { - done(ex); - } - } -}); -*/ - -test.skip("Test OCSP Staple", async (done: jest.DoneCallback) => { - // eslint-disable-next-line no-console - console.info("Name: Test OCSP Staple"); - - // await makeRequest(false); - // await waitForEvents("OCSPStapleReceivedEvent", 1); - // await waitForEvents("OCSPResponseRetrievedEvent", 0); - done(); -}); - -/* -test.skip("Test OCSP Basic", async (done: jest.DoneCallback) => { - // tslint:disable-next-line:no-console - console.info("Name: Test OCSP Basic"); - - await makeRequest(); - await waitForEvents("OCSPResponseRetrievedEvent", 1); - await waitForEvents("OCSPMemoryCacheStoreEvent", 1); - await waitForEvents("OCSPDiskCacheStoreEvent", 1); - done(); -}); - -test.skip("Test OCSP 2nd request mem cache hit.", async (done: jest.DoneCallback) => { - // tslint:disable-next-line:no-console - console.info("Name: Test OCSP 2nd request mem cache hit."); - - await makeRequest(); - await waitForEvents("OCSPResponseRetrievedEvent", 1); - await waitForEvents("OCSPMemoryCacheStoreEvent", 1); - await waitForEvents("OCSPDiskCacheStoreEvent", 1); - - events = []; - - await makeRequest(); - await waitForEvents("OCSPResponseRetrievedEvent", 0); - await waitForEvents("OCSPMemoryCacheStoreEvent", 0); - await waitForEvents("OCSPDiskCacheStoreEvent", 0); - await waitForEvents("OCSPDiskCacheHitEvent", 0); - await waitForEvents("OCSPMemoryCacheHitEvent", 1); - - done(); -}); - -test.skip("Test OCSP expirey refreshes.", async (done: jest.DoneCallback) => { - // tslint:disable-next-line:no-console - console.info("Name: Test OCSP expirey refreshes."); - - await makeRequest(); - await waitForEvents("OCSPResponseRetrievedEvent", 1); - await waitForEvents("OCSPMemoryCacheStoreEvent", 1); - await waitForEvents("OCSPDiskCacheStoreEvent", 1); - - events = []; - CertCheckAgent.testTimeOffset = 1000 * 60 * 60 * 24 * 7.5; - - await makeRequest(); - await waitForEvents("OCSPResponseRetrievedEvent", 1); - await waitForEvents("OCSPMemoryCacheStoreEvent", 1); - await waitForEvents("OCSPDiskCacheStoreEvent", 1); - await waitForEvents("OCSPDiskCacheHitEvent", 0); - await waitForEvents("OCSPCacheEntryExpiredEvent", 1); - done(); -}); - -test.skip("Test OCSP expirey approaching refreshes.", async (done: jest.DoneCallback) => { - // tslint:disable-next-line:no-console - console.info("Name: Test OCSP expirey approaching refreshes."); - - await makeRequest(); - await waitForEvents("OCSPResponseRetrievedEvent", 1); - await waitForEvents("OCSPMemoryCacheStoreEvent", 1); - await waitForEvents("OCSPDiskCacheStoreEvent", 1); - - events = []; - CertCheckAgent.testTimeOffset = 1000 * 60 * 60 * 24 * 3.5; - - await makeRequest(); - await waitForEvents("OCSPResponseRetrievedEvent", 1); - await waitForEvents("OCSPMemoryCacheStoreEvent", 1); - await waitForEvents("OCSPDiskCacheStoreEvent", 1); - await waitForEvents("OCSPCacheUpdateNeededEvent", 1); - await waitForEvents("OCSPCacheUpdateCompleteEvent", 1); - done(); -}); - -test.skip("Test OCSP invalid cert refreshes.", async (done: jest.DoneCallback) => { - // tslint:disable-next-line:no-console - console.info("Name: invalid cert refreshes."); - - await makeRequest(); - await waitForEvents("OCSPResponseRetrievedEvent", 1); - await waitForEvents("OCSPMemoryCacheStoreEvent", 1); - await waitForEvents("OCSPDiskCacheStoreEvent", 1); - - events = []; - CertCheckAgent.forceReinitDiskCache(); - - const dir: string = path.join(cacheDir, "if-you-need-to-delete-this-open-an-issue-async-disk-cache", "microsoft-cognitiveservices-speech-sdk-cache"); - fs.readdir(dir, (error: NodeJS.ErrnoException, files: string[]): void => { - files.forEach((value: string, index: number, array: string[]): void => { - const file: string = path.join(dir, value); - const content: Buffer = fs.readFileSync(file); - content.set([2], 7); - fs.writeFileSync(file, content); - }); - }); - - await makeRequest(); - await waitForEvents("OCSPResponseRetrievedEvent", 1); - await waitForEvents("OCSPMemoryCacheStoreEvent", 2); - await waitForEvents("OCSPDiskCacheStoreEvent", 1); - await waitForEvents("OCSPCacheFetchErrorEvent", 1); - await waitForEvents("OCSPCacheMissEvent", 1); - - done(); - -}); -*/ diff --git a/tests/SpeechRecognizerTests.ts b/tests/SpeechRecognizerTests.ts index 7fb0dff6..3d134486 100644 --- a/tests/SpeechRecognizerTests.ts +++ b/tests/SpeechRecognizerTests.ts @@ -50,7 +50,6 @@ import { closeAsyncObjects, RepeatingPullStream, WaitForCondition } from "./Util import { AudioStreamFormatImpl } from "../src/sdk/Audio/AudioStreamFormat"; import { Console } from "console"; -import { utils } from "../external/ocsp/ocsp"; import { PullAudioInputStream } from "../microsoft.cognitiveservices.speech.sdk"; const FIRST_EVENT_ID: number = 1; From e3d71ecc062d8ec1669b8a9a538a9bea0600d7bf Mon Sep 17 00:00:00 2001 From: "glharper@microsoft.com" Date: Mon, 13 Mar 2023 09:29:37 -0700 Subject: [PATCH 2/7] get tests passing again --- src/common.browser/CertChecks.ts | 112 ++++++++++++++++++ src/common.browser/WebsocketMessageAdapter.ts | 4 + 2 files changed, 116 insertions(+) create mode 100644 src/common.browser/CertChecks.ts diff --git a/src/common.browser/CertChecks.ts b/src/common.browser/CertChecks.ts new file mode 100644 index 00000000..e3c0a229 --- /dev/null +++ b/src/common.browser/CertChecks.ts @@ -0,0 +1,112 @@ +/* eslint-disable import/order */ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as http from "http"; +import * as tls from "tls"; +import { ProxyInfo } from "./ProxyInfo"; + +import Agent from "agent-base"; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +import Cache from "async-disk-cache"; +import HttpsProxyAgent from "https-proxy-agent"; +import * as net from "net"; + +export class CertCheckAgent { + + // Test hook to enable forcing expiration / refresh to happen. + public static testTimeOffset: number = 0; + + // Test hook to disable stapling for cache testing. + public static forceDisableOCSPStapling: boolean = false; + + // The on disk cache. + private static privDiskCache: Cache; + + private privProxyInfo: ProxyInfo; + + public constructor(proxyInfo?: ProxyInfo) { + if (!!proxyInfo) { + this.privProxyInfo = proxyInfo; + } + + // Initialize this here to allow tests to set the env variable before the cache is constructed. + if (!CertCheckAgent.privDiskCache) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call + CertCheckAgent.privDiskCache = new Cache("microsoft-cognitiveservices-speech-sdk-cache", { supportBuffer: true, location: (typeof process !== "undefined" && !!process.env.SPEECH_OCSP_CACHE_ROOT) ? process.env.SPEECH_OCSP_CACHE_ROOT : undefined }); + } + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + public GetAgent(): http.Agent { + // eslint-disable-next-line @typescript-eslint/unbound-method + const agent: any = new Agent.Agent(this.CreateConnection); + + if (this.privProxyInfo !== undefined && + this.privProxyInfo.HostName !== undefined && + this.privProxyInfo.Port > 0) { + const proxyName: string = "privProxyInfo"; + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + agent[proxyName] = this.privProxyInfo; + } + + return agent as http.Agent; + } + + private static GetProxyAgent(proxyInfo: ProxyInfo): HttpsProxyAgent { + const httpProxyOptions: HttpsProxyAgent.HttpsProxyAgentOptions = { + host: proxyInfo.HostName, + port: proxyInfo.Port, + }; + + if (!!proxyInfo.UserName) { + httpProxyOptions.headers = { + "Proxy-Authentication": "Basic " + new Buffer(`${proxyInfo.UserName}:${(proxyInfo.Password === undefined) ? "" : proxyInfo.Password}`).toString("base64"), + }; + } else { + httpProxyOptions.headers = {}; + } + + httpProxyOptions.headers.requestOCSP = "true"; + + const httpProxyAgent: HttpsProxyAgent = new HttpsProxyAgent(httpProxyOptions); + return httpProxyAgent; + } + + private CreateConnection(request: Agent.ClientRequest, options: Agent.RequestOptions): Promise { + let socketPromise: Promise; + + options = { + ...options, + ...{ + requestOCSP: !CertCheckAgent.forceDisableOCSPStapling, + servername: options.host + } + }; + + if (!!this.privProxyInfo) { + const httpProxyAgent: HttpsProxyAgent = CertCheckAgent.GetProxyAgent(this.privProxyInfo); + const baseAgent: Agent.Agent = httpProxyAgent as unknown as Agent.Agent; + + socketPromise = new Promise((resolve: (value: net.Socket) => void, reject: (error: string | Error) => void): void => { + baseAgent.callback(request, options, (error: Error, socket: net.Socket): void => { + if (!!error) { + reject(error); + } else { + resolve(socket); + } + }); + }); + } else { + if (!!options.secureEndpoint) { + socketPromise = Promise.resolve(tls.connect(options)); + } else { + socketPromise = Promise.resolve(net.connect(options)); + } + } + + return socketPromise; + } +} diff --git a/src/common.browser/WebsocketMessageAdapter.ts b/src/common.browser/WebsocketMessageAdapter.ts index 0d3596b2..da8bb51f 100644 --- a/src/common.browser/WebsocketMessageAdapter.ts +++ b/src/common.browser/WebsocketMessageAdapter.ts @@ -27,6 +27,8 @@ import { } from "../common/Exports"; import { ProxyInfo } from "./ProxyInfo"; +import { CertCheckAgent } from "./CertChecks"; + interface ISendItem { Message: ConnectionMessage; RawWebsocketMessage: RawWebsocketMessage; @@ -113,7 +115,9 @@ export class WebsocketMessageAdapter { const options: ws.ClientOptions = { headers: this.privHeaders, perMessageDeflate: this.privEnableCompression }; // The ocsp library will handle validation for us and fail the connection if needed. this.privCertificateValidatedDeferral.resolve(); + const checkAgent: CertCheckAgent = new CertCheckAgent(this.proxyInfo); + options.agent = checkAgent.GetAgent(); // Workaround for https://github.com/microsoft/cognitive-services-speech-sdk-js/issues/465 // Which is root caused by https://github.com/TooTallNate/node-agent-base/issues/61 const uri = new URL(this.privUri); From da5fece505d4c8649ed49d665e4a0e9f5104483f Mon Sep 17 00:00:00 2001 From: Glenn Harper <64209257+glharper@users.noreply.github.com> Date: Tue, 14 Mar 2023 08:48:42 -0400 Subject: [PATCH 3/7] Update package.json --- package.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/package.json b/package.json index a3fdd6cf..298a49a5 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,6 @@ "simple-lru-cache": false, "ws": false, "fs": false, - "async-disk-cache": false, "agent-base": false, "tls": false, "net": false @@ -104,12 +103,8 @@ }, "dependencies": { "agent-base": "^6.0.1", - "asn1.js-rfc2560": "^5.0.1", - "asn1.js-rfc5280": "^3.0.0", - "async-disk-cache": "^2.1.0", "bent": "^7.3.12", "https-proxy-agent": "^4.0.0", - "simple-lru-cache": "0.0.2", "uuid": "^9.0.0", "ws": "^7.5.6" }, From 9a24155459c2ec731e2fda7010890ef2c89a24af Mon Sep 17 00:00:00 2001 From: Glenn Harper <64209257+glharper@users.noreply.github.com> Date: Tue, 14 Mar 2023 08:50:15 -0400 Subject: [PATCH 4/7] Update CertChecks.ts --- src/common.browser/CertChecks.ts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/common.browser/CertChecks.ts b/src/common.browser/CertChecks.ts index e3c0a229..4b4ee050 100644 --- a/src/common.browser/CertChecks.ts +++ b/src/common.browser/CertChecks.ts @@ -10,7 +10,6 @@ import Agent from "agent-base"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore -import Cache from "async-disk-cache"; import HttpsProxyAgent from "https-proxy-agent"; import * as net from "net"; @@ -22,21 +21,12 @@ export class CertCheckAgent { // Test hook to disable stapling for cache testing. public static forceDisableOCSPStapling: boolean = false; - // The on disk cache. - private static privDiskCache: Cache; - private privProxyInfo: ProxyInfo; public constructor(proxyInfo?: ProxyInfo) { if (!!proxyInfo) { this.privProxyInfo = proxyInfo; } - - // Initialize this here to allow tests to set the env variable before the cache is constructed. - if (!CertCheckAgent.privDiskCache) { - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call - CertCheckAgent.privDiskCache = new Cache("microsoft-cognitiveservices-speech-sdk-cache", { supportBuffer: true, location: (typeof process !== "undefined" && !!process.env.SPEECH_OCSP_CACHE_ROOT) ? process.env.SPEECH_OCSP_CACHE_ROOT : undefined }); - } } // eslint-disable-next-line @typescript-eslint/no-unused-vars From 7a9ebc4d386d42ebf6fe0f4c1ae54df5de2acb58 Mon Sep 17 00:00:00 2001 From: glenn Date: Tue, 14 Mar 2023 08:53:57 -0400 Subject: [PATCH 5/7] remove unneccessary dependencies --- package-lock.json | 389 +++++++++++----------------------------------- 1 file changed, 89 insertions(+), 300 deletions(-) diff --git a/package-lock.json b/package-lock.json index 500ce0ce..0e9afeac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,12 +10,8 @@ "license": "MIT", "dependencies": { "agent-base": "^6.0.1", - "asn1.js-rfc2560": "^5.0.1", - "asn1.js-rfc5280": "^3.0.0", - "async-disk-cache": "^2.1.0", "bent": "^7.3.12", "https-proxy-agent": "^4.0.0", - "simple-lru-cache": "0.0.2", "uuid": "^9.0.0", "ws": "^7.5.6" }, @@ -590,9 +586,8 @@ }, "node_modules/@eslint/eslintrc/node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "13.15.0", @@ -832,9 +827,8 @@ }, "node_modules/@jest/core/node_modules/fill-range": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -844,9 +838,8 @@ }, "node_modules/@jest/core/node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -876,9 +869,8 @@ }, "node_modules/@jest/core/node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -1400,9 +1392,9 @@ "license": "MIT" }, "node_modules/@types/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-kr90f+ERiQtKWMz5rP32ltJ/BtULDI5RVO0uavn1HQUOwjx0R1h0rnDYNL0CepF1zL5bSY6FISAfd9tOdDhU5Q==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==", "dev": true }, "node_modules/@types/ws": { @@ -2308,8 +2300,7 @@ }, "node_modules/asn1.js-rfc2560": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/asn1.js-rfc2560/-/asn1.js-rfc2560-5.0.1.tgz", - "integrity": "sha512-1PrVg6kuBziDN3PGFmRk3QrjpKvP9h/Hv5yMrFZvC1kpzP6dQRzf5BpKstANqHBkaOUmTpakJWhicTATOA/SbA==", + "license": "MIT", "dependencies": { "asn1.js-rfc5280": "^3.0.0" }, @@ -2347,8 +2338,7 @@ }, "node_modules/async-disk-cache": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/async-disk-cache/-/async-disk-cache-2.1.0.tgz", - "integrity": "sha512-iH+boep2xivfD9wMaZWkywYIURSmsL96d6MoqrC94BnGSvXE4Quf8hnJiHGFYhw/nLeIa1XyRaf4vvcvkwAefg==", + "license": "MIT", "dependencies": { "debug": "^4.1.1", "heimdalljs": "^0.2.3", @@ -2548,9 +2538,8 @@ }, "node_modules/base/node_modules/is-accessor-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, + "license": "MIT", "dependencies": { "kind-of": "^6.0.0" }, @@ -2560,9 +2549,8 @@ }, "node_modules/base/node_modules/is-data-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, + "license": "MIT", "dependencies": { "kind-of": "^6.0.0" }, @@ -2572,9 +2560,8 @@ }, "node_modules/base/node_modules/is-descriptor": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, + "license": "MIT", "dependencies": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -2586,8 +2573,7 @@ }, "node_modules/bent": { "version": "7.3.12", - "resolved": "https://registry.npmjs.org/bent/-/bent-7.3.12.tgz", - "integrity": "sha512-T3yrKnVGB63zRuoco/7Ybl7BwwGZR0lceoVG5XmQyMIH9s19SV5m+a8qam4if0zQuAmOQTyPTPmsQBdAorGK3w==", + "license": "Apache-2.0", "dependencies": { "bytesish": "^0.4.1", "caseless": "~0.12.0", @@ -2604,8 +2590,7 @@ }, "node_modules/binaryextensions": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.3.0.tgz", - "integrity": "sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==", + "license": "MIT", "engines": { "node": ">=0.8" }, @@ -2615,9 +2600,8 @@ }, "node_modules/bindings": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "file-uri-to-path": "1.0.0" @@ -2740,8 +2724,7 @@ }, "node_modules/bytesish": { "version": "0.4.4", - "resolved": "https://registry.npmjs.org/bytesish/-/bytesish-0.4.4.tgz", - "integrity": "sha512-i4uu6M4zuMUiyfZN4RU2+i9+peJh//pXhd9x1oSe1LBkZ3LEbCoygu8W0bXTukU1Jme2txKuotpCZRaC3FLxcQ==" + "license": "(Apache-2.0 AND MIT)" }, "node_modules/cache-base": { "version": "1.0.1", @@ -2764,8 +2747,6 @@ }, "node_modules/cache-base/node_modules/set-value": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-4.0.1.tgz", - "integrity": "sha512-ayATicCYPVnlNpFmjq2/VmVwhoCQA9+13j8qWp044fmFE3IFphosPtRM+0CJ5xoIx5Uy52fCcwg3XeH2pHbbPQ==", "dev": true, "funding": [ "https://github.com/sponsors/jonschlinkert", @@ -2825,8 +2806,7 @@ }, "node_modules/caseless": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + "license": "Apache-2.0" }, "node_modules/chalk": { "version": "4.1.2", @@ -2858,6 +2838,7 @@ }, "node_modules/chokidar": { "version": "2.1.8", + "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", "dev": true, "license": "MIT", "dependencies": { @@ -2879,9 +2860,8 @@ }, "node_modules/chokidar/node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -3183,6 +3163,7 @@ }, "node_modules/css/node_modules/source-map-resolve": { "version": "0.6.0", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", "dev": true, "license": "MIT", "dependencies": { @@ -3281,9 +3262,8 @@ }, "node_modules/decode-uri-component": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10" } @@ -3369,9 +3349,8 @@ }, "node_modules/define-property/node_modules/is-data-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, + "license": "MIT", "dependencies": { "kind-of": "^6.0.0" }, @@ -3425,8 +3404,6 @@ }, "node_modules/detect-indent/node_modules/minimist": { "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true, "license": "MIT" }, @@ -3582,8 +3559,7 @@ }, "node_modules/editions": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/editions/-/editions-2.3.1.tgz", - "integrity": "sha512-ptGvkwTvGdGfC0hfhKg0MT+TRLRKGtUiWGBInxOm5pz7ssADezahjCUaYuZ8Dr+C05FW0AECIIPt4WBxVINEhA==", + "license": "MIT", "dependencies": { "errlop": "^2.0.0", "semver": "^6.3.0" @@ -3638,8 +3614,7 @@ }, "node_modules/errlop": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/errlop/-/errlop-2.2.0.tgz", - "integrity": "sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw==", + "license": "MIT", "engines": { "node": ">=0.8" }, @@ -4484,9 +4459,8 @@ }, "node_modules/execa/node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4760,9 +4734,8 @@ }, "node_modules/fast-glob/node_modules/fill-range": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -4772,9 +4745,8 @@ }, "node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -4784,9 +4756,8 @@ }, "node_modules/fast-glob/node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -4805,9 +4776,8 @@ }, "node_modules/fast-glob/node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -4868,9 +4838,8 @@ }, "node_modules/file-uri-to-path": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/fill-range": { @@ -5034,11 +5003,9 @@ }, "node_modules/fsevents": { "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -5182,12 +5149,10 @@ }, "node_modules/glob-parent": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.1.tgz", - "integrity": "sha512-kEVjS71mQazDBHKcsq4E9u/vUzaLcw1A8EtUeydawvIWQCJM0qQ08G1H7/XTjFUulla6XQiDOG6MXSaG0HDKog==", "dev": true, "license": "ISC", "dependencies": { - "is-glob": "^4.0.3" + "is-glob": "^4.0.1" }, "engines": { "node": ">=10.13.0" @@ -5215,16 +5180,13 @@ }, "node_modules/glob-stream/node_modules/extend": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true, "license": "MIT" }, "node_modules/glob-stream/node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -5354,9 +5316,8 @@ }, "node_modules/gulp-eslint/node_modules/acorn": { "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -5483,9 +5444,8 @@ }, "node_modules/gulp-eslint/node_modules/espree": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^7.1.1", "acorn-jsx": "^5.2.0", @@ -5526,9 +5486,8 @@ }, "node_modules/gulp-eslint/node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -5861,16 +5820,14 @@ }, "node_modules/heimdalljs": { "version": "0.2.6", - "resolved": "https://registry.npmjs.org/heimdalljs/-/heimdalljs-0.2.6.tgz", - "integrity": "sha512-o9bd30+5vLBvBtzCPwwGqpry2+n0Hi6H1+qwt6y+0kwRHGGF8TFIhJPmnuM0xO97zaKrDZMwO/V56fAnn8m/tA==", + "license": "MIT", "dependencies": { "rsvp": "~3.2.1" } }, "node_modules/heimdalljs/node_modules/rsvp": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.2.1.tgz", - "integrity": "sha512-Rf4YVNYpKjZ6ASAmibcwTNciQ5Co5Ztq6iZPEykHpkoflnD/K5ryE/rHehFsTm4NJj8nKDhbi3eKBWGogmNnkg==" + "license": "MIT" }, "node_modules/homedir-polyfill": { "version": "1.0.3", @@ -5919,8 +5876,7 @@ }, "node_modules/https-proxy-agent": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", - "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "license": "MIT", "dependencies": { "agent-base": "5", "debug": "4" @@ -5931,8 +5887,7 @@ }, "node_modules/https-proxy-agent/node_modules/agent-base": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", - "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", + "license": "MIT", "engines": { "node": ">= 6.0.0" } @@ -6055,9 +6010,8 @@ }, "node_modules/inquirer/node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -6601,8 +6555,7 @@ }, "node_modules/istextorbinary": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.6.0.tgz", - "integrity": "sha512-+XRlFseT8B3L9KyjxxLjfXSLMuErKDsd8DBNrsaxoViABMEZlOSCstwmw0qpoFX3+U6yWU1yhLudAe6/lETGGA==", + "license": "MIT", "dependencies": { "binaryextensions": "^2.1.2", "editions": "^2.2.0", @@ -7053,9 +7006,8 @@ }, "node_modules/jest-haste-map/node_modules/braces": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, + "license": "MIT", "dependencies": { "fill-range": "^7.0.1" }, @@ -7065,9 +7017,8 @@ }, "node_modules/jest-haste-map/node_modules/fill-range": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -7077,10 +7028,8 @@ }, "node_modules/jest-haste-map/node_modules/fsevents": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, - "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -7091,9 +7040,8 @@ }, "node_modules/jest-haste-map/node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -7112,9 +7060,8 @@ }, "node_modules/jest-haste-map/node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -7708,9 +7655,8 @@ }, "node_modules/json5": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -7824,8 +7770,6 @@ }, "node_modules/liftoff/node_modules/extend": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true, "license": "MIT" }, @@ -7895,9 +7839,8 @@ }, "node_modules/lodash.sortby": { "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lru-cache": { "version": "6.0.0", @@ -8115,8 +8058,7 @@ }, "node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -8159,8 +8101,6 @@ }, "node_modules/mkdirp/node_modules/minimist": { "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "license": "MIT" }, "node_modules/ms": { @@ -8182,9 +8122,8 @@ }, "node_modules/nan": { "version": "2.16.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", - "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", "dev": true, + "license": "MIT", "optional": true }, "node_modules/nanomatch": { @@ -8484,9 +8423,8 @@ }, "node_modules/ocsp/node_modules/asn1.js-rfc2560": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/asn1.js-rfc2560/-/asn1.js-rfc2560-4.0.6.tgz", - "integrity": "sha512-ysf48ni+f/efNPilq4+ApbifUPcSW/xbDeQAh055I+grr2gXgNRQqHew7kkO70WSMQ2tEOURVwsK+dJqUNjIIg==", "dev": true, + "license": "MIT", "dependencies": { "asn1.js-rfc5280": "^2.0.0" }, @@ -8496,9 +8434,8 @@ }, "node_modules/ocsp/node_modules/asn1.js-rfc5280": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/asn1.js-rfc5280/-/asn1.js-rfc5280-2.0.1.tgz", - "integrity": "sha512-1e2ypnvTbYD/GdxWK77tdLBahvo1fZUHlQJqAVUuZWdYj0rdjGcf2CWYUtbsyRYpYUMwMWLZFUtLxog8ZXTrcg==", "dev": true, + "license": "MIT", "dependencies": { "asn1.js": "^4.5.0" } @@ -9222,6 +9159,7 @@ }, "node_modules/resolve-url": { "version": "0.2.1", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", "dev": true, "license": "MIT" }, @@ -9277,8 +9215,7 @@ }, "node_modules/rsvp": { "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "license": "MIT", "engines": { "node": "6.* || >= 7.*" } @@ -9634,9 +9571,8 @@ }, "node_modules/source-map": { "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "whatwg-url": "^7.0.0" }, @@ -9685,6 +9621,7 @@ }, "node_modules/source-map-resolve": { "version": "0.5.3", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", "dev": true, "license": "MIT", "dependencies": { @@ -9706,29 +9643,27 @@ }, "node_modules/source-map-url": { "version": "0.4.1", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", "dev": true, "license": "MIT" }, "node_modules/source-map/node_modules/tr46": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", "dev": true, + "license": "MIT", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/source-map/node_modules/webidl-conversions": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/source-map/node_modules/whatwg-url": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dev": true, + "license": "MIT", "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", @@ -10204,8 +10139,7 @@ }, "node_modules/textextensions": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.6.0.tgz", - "integrity": "sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ==", + "license": "MIT", "engines": { "node": ">=0.8" }, @@ -10454,9 +10388,8 @@ }, "node_modules/tsconfig-paths/node_modules/json5": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -10466,8 +10399,6 @@ }, "node_modules/tsconfig-paths/node_modules/minimist": { "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true, "license": "MIT" }, @@ -10515,9 +10446,8 @@ }, "node_modules/tslint/node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -10540,24 +10470,21 @@ }, "node_modules/tslint/node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "1.1.3" } }, "node_modules/tslint/node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tslint/node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -10572,9 +10499,8 @@ }, "node_modules/tslint/node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -10727,8 +10653,6 @@ }, "node_modules/union-value/node_modules/set-value": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-4.0.1.tgz", - "integrity": "sha512-ayATicCYPVnlNpFmjq2/VmVwhoCQA9+13j8qWp044fmFE3IFphosPtRM+0CJ5xoIx5Uy52fCcwg3XeH2pHbbPQ==", "dev": true, "funding": [ "https://github.com/sponsors/jonschlinkert", @@ -10853,6 +10777,7 @@ }, "node_modules/urix": { "version": "0.1.0", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", "dev": true, "license": "MIT" }, @@ -10866,8 +10791,7 @@ }, "node_modules/username-sync": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/username-sync/-/username-sync-1.0.3.tgz", - "integrity": "sha512-m/7/FSqjJNAzF2La448c/aEom0gJy7HY7Y509h6l0ePvEkFictAGptwWaj1msWJ38JbfEDOUoE8kqFee9EHKdA==" + "license": "MIT" }, "node_modules/util-deprecate": { "version": "1.0.2", @@ -11009,6 +10933,7 @@ }, "node_modules/w3c-hr-time": { "version": "1.0.2", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", "dev": true, "license": "MIT", "dependencies": { @@ -11680,8 +11605,6 @@ "dependencies": { "argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, "globals": { @@ -11847,8 +11770,6 @@ }, "fill-range": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -11856,8 +11777,6 @@ }, "is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "micromatch": { @@ -11877,8 +11796,6 @@ }, "to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" @@ -12279,9 +12196,9 @@ "dev": true }, "@types/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-kr90f+ERiQtKWMz5rP32ltJ/BtULDI5RVO0uavn1HQUOwjx0R1h0rnDYNL0CepF1zL5bSY6FISAfd9tOdDhU5Q==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==", "dev": true }, "@types/ws": { @@ -12844,8 +12761,6 @@ }, "asn1.js-rfc2560": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/asn1.js-rfc2560/-/asn1.js-rfc2560-5.0.1.tgz", - "integrity": "sha512-1PrVg6kuBziDN3PGFmRk3QrjpKvP9h/Hv5yMrFZvC1kpzP6dQRzf5BpKstANqHBkaOUmTpakJWhicTATOA/SbA==", "requires": { "asn1.js-rfc5280": "^3.0.0" } @@ -12870,8 +12785,6 @@ }, "async-disk-cache": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/async-disk-cache/-/async-disk-cache-2.1.0.tgz", - "integrity": "sha512-iH+boep2xivfD9wMaZWkywYIURSmsL96d6MoqrC94BnGSvXE4Quf8hnJiHGFYhw/nLeIa1XyRaf4vvcvkwAefg==", "requires": { "debug": "^4.1.1", "heimdalljs": "^0.2.3", @@ -13012,8 +12925,6 @@ }, "is-accessor-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { "kind-of": "^6.0.0" @@ -13021,8 +12932,6 @@ }, "is-data-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { "kind-of": "^6.0.0" @@ -13030,8 +12939,6 @@ }, "is-descriptor": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", @@ -13043,8 +12950,6 @@ }, "bent": { "version": "7.3.12", - "resolved": "https://registry.npmjs.org/bent/-/bent-7.3.12.tgz", - "integrity": "sha512-T3yrKnVGB63zRuoco/7Ybl7BwwGZR0lceoVG5XmQyMIH9s19SV5m+a8qam4if0zQuAmOQTyPTPmsQBdAorGK3w==", "requires": { "bytesish": "^0.4.1", "caseless": "~0.12.0", @@ -13056,14 +12961,10 @@ "dev": true }, "binaryextensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.3.0.tgz", - "integrity": "sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==" + "version": "2.3.0" }, "bindings": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "dev": true, "optional": true, "requires": { @@ -13146,9 +13047,7 @@ "dev": true }, "bytesish": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/bytesish/-/bytesish-0.4.4.tgz", - "integrity": "sha512-i4uu6M4zuMUiyfZN4RU2+i9+peJh//pXhd9x1oSe1LBkZ3LEbCoygu8W0bXTukU1Jme2txKuotpCZRaC3FLxcQ==" + "version": "0.4.4" }, "cache-base": { "version": "1.0.1", @@ -13167,8 +13066,6 @@ "dependencies": { "set-value": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-4.0.1.tgz", - "integrity": "sha512-ayATicCYPVnlNpFmjq2/VmVwhoCQA9+13j8qWp044fmFE3IFphosPtRM+0CJ5xoIx5Uy52fCcwg3XeH2pHbbPQ==", "dev": true, "requires": { "is-plain-object": "^2.0.4" @@ -13197,9 +13094,7 @@ "dev": true }, "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + "version": "0.12.0" }, "chalk": { "version": "4.1.2", @@ -13237,8 +13132,6 @@ "dependencies": { "glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "requires": { "is-glob": "^4.0.3" @@ -13527,8 +13420,6 @@ }, "decode-uri-component": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true }, "dedent": { @@ -13584,8 +13475,6 @@ }, "is-data-descriptor": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { "kind-of": "^6.0.0" @@ -13620,8 +13509,6 @@ "dependencies": { "minimist": { "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true } } @@ -13737,8 +13624,6 @@ }, "editions": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/editions/-/editions-2.3.1.tgz", - "integrity": "sha512-ptGvkwTvGdGfC0hfhKg0MT+TRLRKGtUiWGBInxOm5pz7ssADezahjCUaYuZ8Dr+C05FW0AECIIPt4WBxVINEhA==", "requires": { "errlop": "^2.0.0", "semver": "^6.3.0" @@ -13772,9 +13657,7 @@ } }, "errlop": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/errlop/-/errlop-2.2.0.tgz", - "integrity": "sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw==" + "version": "2.2.0" }, "errno": { "version": "0.1.8", @@ -14329,8 +14212,6 @@ }, "shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "which": { @@ -14529,8 +14410,6 @@ }, "fill-range": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -14538,8 +14417,6 @@ }, "glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -14547,8 +14424,6 @@ }, "is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "micromatch": { @@ -14561,8 +14436,6 @@ }, "to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" @@ -14608,8 +14481,6 @@ }, "file-uri-to-path": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", "dev": true, "optional": true }, @@ -14725,8 +14596,6 @@ }, "fsevents": { "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "dev": true, "optional": true, "requires": { @@ -14810,11 +14679,9 @@ }, "glob-parent": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.1.tgz", - "integrity": "sha512-kEVjS71mQazDBHKcsq4E9u/vUzaLcw1A8EtUeydawvIWQCJM0qQ08G1H7/XTjFUulla6XQiDOG6MXSaG0HDKog==", "dev": true, "requires": { - "is-glob": "^4.0.3" + "is-glob": "^4.0.1" } }, "glob-stream": { @@ -14835,14 +14702,10 @@ "dependencies": { "extend": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, "glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "requires": { "is-glob": "^4.0.3" @@ -14961,8 +14824,6 @@ "dependencies": { "acorn": { "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, "ansi-regex": { @@ -15052,8 +14913,6 @@ }, "espree": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", "dev": true, "requires": { "acorn": "^7.1.1", @@ -15083,8 +14942,6 @@ }, "glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -15281,16 +15138,12 @@ }, "heimdalljs": { "version": "0.2.6", - "resolved": "https://registry.npmjs.org/heimdalljs/-/heimdalljs-0.2.6.tgz", - "integrity": "sha512-o9bd30+5vLBvBtzCPwwGqpry2+n0Hi6H1+qwt6y+0kwRHGGF8TFIhJPmnuM0xO97zaKrDZMwO/V56fAnn8m/tA==", "requires": { "rsvp": "~3.2.1" }, "dependencies": { "rsvp": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.2.1.tgz", - "integrity": "sha512-Rf4YVNYpKjZ6ASAmibcwTNciQ5Co5Ztq6iZPEykHpkoflnD/K5ryE/rHehFsTm4NJj8nKDhbi3eKBWGogmNnkg==" + "version": "3.2.1" } } }, @@ -15327,17 +15180,13 @@ }, "https-proxy-agent": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", - "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", "requires": { "agent-base": "5", "debug": "4" }, "dependencies": { "agent-base": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", - "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==" + "version": "5.1.1" } } }, @@ -15417,8 +15266,6 @@ "dependencies": { "is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "string-width": { @@ -15755,8 +15602,6 @@ }, "istextorbinary": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.6.0.tgz", - "integrity": "sha512-+XRlFseT8B3L9KyjxxLjfXSLMuErKDsd8DBNrsaxoViABMEZlOSCstwmw0qpoFX3+U6yWU1yhLudAe6/lETGGA==", "requires": { "binaryextensions": "^2.1.2", "editions": "^2.2.0", @@ -16056,8 +15901,6 @@ }, "braces": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { "fill-range": "^7.0.1" @@ -16065,8 +15908,6 @@ }, "fill-range": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -16074,15 +15915,11 @@ }, "fsevents": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, "is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "micromatch": { @@ -16095,8 +15932,6 @@ }, "to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" @@ -16523,8 +16358,6 @@ }, "json5": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, "just-debounce": { @@ -16596,8 +16429,6 @@ "dependencies": { "extend": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true } } @@ -16650,8 +16481,6 @@ }, "lodash.sortby": { "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", "dev": true }, "lru-cache": { @@ -16808,8 +16637,6 @@ }, "minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { "brace-expansion": "^1.1.7" } @@ -16838,9 +16665,7 @@ }, "dependencies": { "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "version": "1.2.6" } } }, @@ -16857,8 +16682,6 @@ }, "nan": { "version": "2.16.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", - "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", "dev": true, "optional": true }, @@ -17069,8 +16892,6 @@ }, "asn1.js-rfc2560": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/asn1.js-rfc2560/-/asn1.js-rfc2560-4.0.6.tgz", - "integrity": "sha512-ysf48ni+f/efNPilq4+ApbifUPcSW/xbDeQAh055I+grr2gXgNRQqHew7kkO70WSMQ2tEOURVwsK+dJqUNjIIg==", "dev": true, "requires": { "asn1.js-rfc5280": "^2.0.0" @@ -17078,8 +16899,6 @@ }, "asn1.js-rfc5280": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/asn1.js-rfc5280/-/asn1.js-rfc5280-2.0.1.tgz", - "integrity": "sha512-1e2ypnvTbYD/GdxWK77tdLBahvo1fZUHlQJqAVUuZWdYj0rdjGcf2CWYUtbsyRYpYUMwMWLZFUtLxog8ZXTrcg==", "dev": true, "requires": { "asn1.js": "^4.5.0" @@ -17566,9 +17385,7 @@ } }, "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" + "version": "4.8.5" }, "run-async": { "version": "2.4.1", @@ -17807,8 +17624,6 @@ }, "source-map": { "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", "dev": true, "requires": { "whatwg-url": "^7.0.0" @@ -17816,8 +17631,6 @@ "dependencies": { "tr46": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", "dev": true, "requires": { "punycode": "^2.1.0" @@ -17825,14 +17638,10 @@ }, "webidl-conversions": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", "dev": true }, "whatwg-url": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dev": true, "requires": { "lodash.sortby": "^4.7.0", @@ -18189,9 +17998,7 @@ "dev": true }, "textextensions": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.6.0.tgz", - "integrity": "sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ==" + "version": "2.6.0" }, "throat": { "version": "6.0.1", @@ -18348,8 +18155,6 @@ "dependencies": { "json5": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "requires": { "minimist": "1.2.6" @@ -18357,8 +18162,6 @@ }, "minimist": { "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "strip-bom": { @@ -18392,8 +18195,6 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -18410,8 +18211,6 @@ }, "color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" @@ -18419,14 +18218,10 @@ }, "color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, "semver": { @@ -18435,8 +18230,6 @@ }, "supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -18537,8 +18330,6 @@ "dependencies": { "set-value": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-4.0.1.tgz", - "integrity": "sha512-ayATicCYPVnlNpFmjq2/VmVwhoCQA9+13j8qWp044fmFE3IFphosPtRM+0CJ5xoIx5Uy52fCcwg3XeH2pHbbPQ==", "dev": true, "requires": { "is-plain-object": "^2.0.4" @@ -18624,9 +18415,7 @@ "dev": true }, "username-sync": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/username-sync/-/username-sync-1.0.3.tgz", - "integrity": "sha512-m/7/FSqjJNAzF2La448c/aEom0gJy7HY7Y509h6l0ePvEkFictAGptwWaj1msWJ38JbfEDOUoE8kqFee9EHKdA==" + "version": "1.0.3" }, "util-deprecate": { "version": "1.0.2", From a9a8675ade0d254ae8748a48c805e5758bcd7055 Mon Sep 17 00:00:00 2001 From: glenn Date: Tue, 14 Mar 2023 08:58:15 -0400 Subject: [PATCH 6/7] try again --- package-lock.json | 72 ----------------------------------------------- 1 file changed, 72 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0e9afeac..a70aaa69 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2336,22 +2336,6 @@ "dev": true, "license": "MIT" }, - "node_modules/async-disk-cache": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "heimdalljs": "^0.2.3", - "istextorbinary": "^2.5.1", - "mkdirp": "^0.5.0", - "rimraf": "^3.0.0", - "rsvp": "^4.8.5", - "username-sync": "^1.0.2" - }, - "engines": { - "node": "8.* || >= 10.*" - } - }, "node_modules/async-done": { "version": "1.3.2", "dev": true, @@ -5818,17 +5802,6 @@ "node": ">=0.10.0" } }, - "node_modules/heimdalljs": { - "version": "0.2.6", - "license": "MIT", - "dependencies": { - "rsvp": "~3.2.1" - } - }, - "node_modules/heimdalljs/node_modules/rsvp": { - "version": "3.2.1", - "license": "MIT" - }, "node_modules/homedir-polyfill": { "version": "1.0.3", "dev": true, @@ -9213,13 +9186,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rsvp": { - "version": "4.8.5", - "license": "MIT", - "engines": { - "node": "6.* || >= 7.*" - } - }, "node_modules/run-async": { "version": "2.4.1", "dev": true, @@ -12759,18 +12725,6 @@ "safer-buffer": "^2.1.0" } }, - "asn1.js-rfc2560": { - "version": "5.0.1", - "requires": { - "asn1.js-rfc5280": "^3.0.0" - } - }, - "asn1.js-rfc5280": { - "version": "3.0.0", - "requires": { - "asn1.js": "^5.0.0" - } - }, "assign-symbols": { "version": "1.0.0", "dev": true @@ -12783,18 +12737,6 @@ "version": "1.5.2", "dev": true }, - "async-disk-cache": { - "version": "2.1.0", - "requires": { - "debug": "^4.1.1", - "heimdalljs": "^0.2.3", - "istextorbinary": "^2.5.1", - "mkdirp": "^0.5.0", - "rimraf": "^3.0.0", - "rsvp": "^4.8.5", - "username-sync": "^1.0.2" - } - }, "async-done": { "version": "1.3.2", "dev": true, @@ -15136,17 +15078,6 @@ } } }, - "heimdalljs": { - "version": "0.2.6", - "requires": { - "rsvp": "~3.2.1" - }, - "dependencies": { - "rsvp": { - "version": "3.2.1" - } - } - }, "homedir-polyfill": { "version": "1.0.3", "dev": true, @@ -17384,9 +17315,6 @@ "glob": "^7.1.3" } }, - "rsvp": { - "version": "4.8.5" - }, "run-async": { "version": "2.4.1", "dev": true From c9add90bc0d8ae765d8b27dfdd5a6cd22e2a95b1 Mon Sep 17 00:00:00 2001 From: glenn Date: Tue, 14 Mar 2023 09:00:43 -0400 Subject: [PATCH 7/7] update package-lock again --- package-lock.json | 173 ++++++++++++++-------------------------------- 1 file changed, 53 insertions(+), 120 deletions(-) diff --git a/package-lock.json b/package-lock.json index a70aaa69..a21ccce4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2290,6 +2290,7 @@ }, "node_modules/asn1.js": { "version": "5.4.1", + "dev": true, "license": "MIT", "dependencies": { "bn.js": "^4.0.0", @@ -2298,23 +2299,6 @@ "safer-buffer": "^2.1.0" } }, - "node_modules/asn1.js-rfc2560": { - "version": "5.0.1", - "license": "MIT", - "dependencies": { - "asn1.js-rfc5280": "^3.0.0" - }, - "peerDependencies": { - "asn1.js": "^5.0.0" - } - }, - "node_modules/asn1.js-rfc5280": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "asn1.js": "^5.0.0" - } - }, "node_modules/assign-symbols": { "version": "1.0.0", "dev": true, @@ -2490,6 +2474,7 @@ }, "node_modules/balanced-match": { "version": "1.0.2", + "dev": true, "license": "MIT" }, "node_modules/base": { @@ -2572,16 +2557,6 @@ "node": ">=0.10.0" } }, - "node_modules/binaryextensions": { - "version": "2.3.0", - "license": "MIT", - "engines": { - "node": ">=0.8" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, "node_modules/bindings": { "version": "1.5.0", "dev": true, @@ -2593,10 +2568,12 @@ }, "node_modules/bn.js": { "version": "4.12.0", + "dev": true, "license": "MIT" }, "node_modules/brace-expansion": { "version": "1.1.11", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -3058,6 +3035,7 @@ }, "node_modules/concat-map": { "version": "0.0.1", + "dev": true, "license": "MIT" }, "node_modules/concat-stream": { @@ -3541,20 +3519,6 @@ "object.defaults": "^1.1.0" } }, - "node_modules/editions": { - "version": "2.3.1", - "license": "MIT", - "dependencies": { - "errlop": "^2.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=0.8" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, "node_modules/electron-to-chromium": { "version": "1.4.202", "dev": true, @@ -3596,16 +3560,6 @@ "node": ">=10.13.0" } }, - "node_modules/errlop": { - "version": "2.2.0", - "license": "MIT", - "engines": { - "node": ">=0.8" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, "node_modules/errno": { "version": "0.1.8", "dev": true, @@ -4983,6 +4937,7 @@ }, "node_modules/fs.realpath": { "version": "1.0.0", + "dev": true, "license": "ISC" }, "node_modules/fsevents": { @@ -5115,6 +5070,7 @@ }, "node_modules/glob": { "version": "7.1.7", + "dev": true, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -5943,6 +5899,7 @@ }, "node_modules/inflight": { "version": "1.0.6", + "dev": true, "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -5951,6 +5908,7 @@ }, "node_modules/inherits": { "version": "2.0.4", + "dev": true, "license": "ISC" }, "node_modules/ini": { @@ -6526,21 +6484,6 @@ "node": ">=8" } }, - "node_modules/istextorbinary": { - "version": "2.6.0", - "license": "MIT", - "dependencies": { - "binaryextensions": "^2.1.2", - "editions": "^2.2.0", - "textextensions": "^2.5.0" - }, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, "node_modules/jest": { "version": "27.5.1", "dev": true, @@ -8027,10 +7970,12 @@ }, "node_modules/minimalistic-assert": { "version": "1.0.1", + "dev": true, "license": "ISC" }, "node_modules/minimatch": { "version": "3.1.2", + "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -8064,6 +8009,7 @@ }, "node_modules/mkdirp": { "version": "0.5.5", + "dev": true, "license": "MIT", "dependencies": { "minimist": "^1.2.5" @@ -8074,6 +8020,7 @@ }, "node_modules/mkdirp/node_modules/minimist": { "version": "1.2.6", + "dev": true, "license": "MIT" }, "node_modules/ms": { @@ -8415,6 +8362,7 @@ }, "node_modules/once": { "version": "1.4.0", + "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -8592,6 +8540,7 @@ }, "node_modules/path-is-absolute": { "version": "1.0.1", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -9175,6 +9124,7 @@ }, "node_modules/rimraf": { "version": "3.0.2", + "dev": true, "license": "ISC", "dependencies": { "glob": "^7.1.3" @@ -9242,6 +9192,7 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", + "dev": true, "license": "MIT" }, "node_modules/saxes": { @@ -9274,6 +9225,7 @@ }, "node_modules/semver": { "version": "6.3.0", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -9341,7 +9293,8 @@ "license": "ISC" }, "node_modules/simple-lru-cache": { - "version": "0.0.2" + "version": "0.0.2", + "dev": true }, "node_modules/sisteransi": { "version": "1.0.5", @@ -10103,16 +10056,6 @@ "dev": true, "license": "MIT" }, - "node_modules/textextensions": { - "version": "2.6.0", - "license": "MIT", - "engines": { - "node": ">=0.8" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, "node_modules/throat": { "version": "6.0.1", "dev": true, @@ -10755,10 +10698,6 @@ "node": ">=0.10.0" } }, - "node_modules/username-sync": { - "version": "1.0.3", - "license": "MIT" - }, "node_modules/util-deprecate": { "version": "1.0.2", "dev": true, @@ -11113,6 +11052,7 @@ }, "node_modules/wrappy": { "version": "1.0.2", + "dev": true, "license": "ISC" }, "node_modules/write": { @@ -12718,6 +12658,7 @@ }, "asn1.js": { "version": "5.4.1", + "dev": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -12843,7 +12784,8 @@ } }, "balanced-match": { - "version": "1.0.2" + "version": "1.0.2", + "dev": true }, "base": { "version": "0.11.2", @@ -12902,9 +12844,6 @@ "version": "1.13.1", "dev": true }, - "binaryextensions": { - "version": "2.3.0" - }, "bindings": { "version": "1.5.0", "dev": true, @@ -12914,10 +12853,12 @@ } }, "bn.js": { - "version": "4.12.0" + "version": "4.12.0", + "dev": true }, "brace-expansion": { "version": "1.1.11", + "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -13217,7 +13158,8 @@ "dev": true }, "concat-map": { - "version": "0.0.1" + "version": "0.0.1", + "dev": true }, "concat-stream": { "version": "1.6.2", @@ -13564,13 +13506,6 @@ "object.defaults": "^1.1.0" } }, - "editions": { - "version": "2.3.1", - "requires": { - "errlop": "^2.0.0", - "semver": "^6.3.0" - } - }, "electron-to-chromium": { "version": "1.4.202", "dev": true @@ -13598,9 +13533,6 @@ "tapable": "^2.2.0" } }, - "errlop": { - "version": "2.2.0" - }, "errno": { "version": "0.1.8", "dev": true, @@ -14534,7 +14466,8 @@ } }, "fs.realpath": { - "version": "1.0.0" + "version": "1.0.0", + "dev": true }, "fsevents": { "version": "1.2.13", @@ -14610,6 +14543,7 @@ }, "glob": { "version": "7.1.7", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -15164,13 +15098,15 @@ }, "inflight": { "version": "1.0.6", + "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { - "version": "2.0.4" + "version": "2.0.4", + "dev": true }, "ini": { "version": "1.3.8", @@ -15531,14 +15467,6 @@ "istanbul-lib-report": "^3.0.0" } }, - "istextorbinary": { - "version": "2.6.0", - "requires": { - "binaryextensions": "^2.1.2", - "editions": "^2.2.0", - "textextensions": "^2.5.0" - } - }, "jest": { "version": "27.5.1", "dev": true, @@ -16564,10 +16492,12 @@ "dev": true }, "minimalistic-assert": { - "version": "1.0.1" + "version": "1.0.1", + "dev": true }, "minimatch": { "version": "3.1.2", + "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -16591,12 +16521,14 @@ }, "mkdirp": { "version": "0.5.5", + "dev": true, "requires": { "minimist": "1.2.6" }, "dependencies": { "minimist": { - "version": "1.2.6" + "version": "1.2.6", + "dev": true } } }, @@ -16839,6 +16771,7 @@ }, "once": { "version": "1.4.0", + "dev": true, "requires": { "wrappy": "1" } @@ -16951,7 +16884,8 @@ } }, "path-is-absolute": { - "version": "1.0.1" + "version": "1.0.1", + "dev": true }, "path-key": { "version": "2.0.1", @@ -17311,6 +17245,7 @@ }, "rimraf": { "version": "3.0.2", + "dev": true, "requires": { "glob": "^7.1.3" } @@ -17345,7 +17280,8 @@ } }, "safer-buffer": { - "version": "2.1.2" + "version": "2.1.2", + "dev": true }, "saxes": { "version": "5.0.1", @@ -17364,7 +17300,8 @@ } }, "semver": { - "version": "6.3.0" + "version": "6.3.0", + "dev": true }, "semver-greatest-satisfied-range": { "version": "1.1.0", @@ -17409,7 +17346,8 @@ "dev": true }, "simple-lru-cache": { - "version": "0.0.2" + "version": "0.0.2", + "dev": true }, "sisteransi": { "version": "1.0.5", @@ -17925,9 +17863,6 @@ "version": "0.2.0", "dev": true }, - "textextensions": { - "version": "2.6.0" - }, "throat": { "version": "6.0.1", "dev": true @@ -18342,9 +18277,6 @@ "version": "3.1.1", "dev": true }, - "username-sync": { - "version": "1.0.3" - }, "util-deprecate": { "version": "1.0.2", "dev": true @@ -18595,7 +18527,8 @@ } }, "wrappy": { - "version": "1.0.2" + "version": "1.0.2", + "dev": true }, "write": { "version": "1.0.3",