From 638a211354a644d21b076b49dc3c6782f2306b29 Mon Sep 17 00:00:00 2001 From: dpatanin Date: Wed, 19 Jun 2019 14:34:15 +0200 Subject: [PATCH 001/102] add wpscan test --- test/wpscan.test.js | 83 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 test/wpscan.test.js diff --git a/test/wpscan.test.js b/test/wpscan.test.js new file mode 100644 index 0000000000..caac8f8a44 --- /dev/null +++ b/test/wpscan.test.js @@ -0,0 +1,83 @@ +const { startSecurityTest, Time } = require('./sdk'); + +test( + 'finds a few informational severity findigns for www.iteraplan.de', + async () => { + const securityTest = await startSecurityTest({ + context: 'iteraplan wp', + metaData: {}, + name: 'wpscan', + target: { + name: 'iteraplan', + location: 'www.iteraplan.de', + attributes: {}, + }, + }); + + const { report } = securityTest; + + const findings = report.findings.map(( + { name, description, category, severity }) => ({ + name, + category, + severity, + })); + + expect(findings).toContainEqual({ + description: 'CMS Wordpress Information', + category: 'CMS Wordpress', + name: 'CMS Wordpress', + osi_layer: 'NETWORK', + severity: 'INFORMATIONAL', + }); + + expect(findings).toContainEqual({ + description: 'Username & Hash Extract', + category: '', + name: 'W3 Total Cache 0.9.2.4', + osi_layer: 'NETWORK', + severity: 'INFORMATIONAL', + }); + + expect(findings).toContainEqual({ + description: 'Remote Code Execution', + category: '', + name: 'W3 Total Cache', + osi_layer: 'NETWORK', + severity: 'INFORMATIONAL', + }); + + expect(findings).toContainEqual({ + description: 'Edge Mode Enabling CSRF', + category: '', + name: 'W3 Total Cache 0.9.4', + osi_layer: 'NETWORK', + severity: 'INFORMATIONAL', + }); + + expect(findings).toContainEqual({ + description: 'Cross', + category: '', + name: 'W3 Total Cache <= 0.9.4', + osi_layer: 'NETWORK', + severity: 'INFORMATIONAL', + }); + + expect(findings).toContainEqual({ + description: 'Debug Mode XSS', + category: '', + name: 'W3 Total Cache <= 0.9.4', + osi_layer: 'NETWORK', + severity: 'INFORMATIONAL', + }); + + expect(findings).toContainEqual({ + description: 'Authenticated Reflected Cross', + category: '', + name: 'W3 Total Cache <= 0.9.4.1', + osi_layer: 'NETWORK', + severity: 'INFORMATIONAL', + }); + }, + 7 * Time.Minute +); \ No newline at end of file From fe607612199d37e0bfd44d47077af9bdf5f13186 Mon Sep 17 00:00:00 2001 From: dpatanin Date: Mon, 24 Jun 2019 11:55:27 +0200 Subject: [PATCH 002/102] correct expected findings --- test/package-lock.json | 221 ++++++++++++++++++++++++++++++++++++++++- test/wpscan.test.js | 67 +++++++------ 2 files changed, 255 insertions(+), 33 deletions(-) diff --git a/test/package-lock.json b/test/package-lock.json index 29fc8ae1c7..89700db0c9 100644 --- a/test/package-lock.json +++ b/test/package-lock.json @@ -272,6 +272,24 @@ "normalize-path": "^2.1.1" } }, + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -335,6 +353,15 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, + "async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + } + }, "async-limiter": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", @@ -731,6 +758,19 @@ "delayed-stream": "~1.0.0" } }, + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true, + "optional": true + }, + "compare-versions": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.5.0.tgz", + "integrity": "sha512-hX+4kt2Rcwu+x1U0SsEFCn1quURjEjPEGH/cPBlpME/IidGimAdwfMU+B+xDr7et/KTR7VH2+ZqWGerv4NGs2w==", + "dev": true + }, "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", @@ -852,6 +892,15 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + } + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", @@ -1016,6 +1065,12 @@ } } }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, "estraverse": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", @@ -1240,6 +1295,16 @@ "bser": "^2.0.0" } }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -1935,6 +2000,26 @@ "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", "dev": true }, + "handlebars": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "dev": true, + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -2296,12 +2381,20 @@ }, "istanbul-api": { "version": "2.0.8", - "resolved": "", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.0.8.tgz", + "integrity": "sha512-ITCccemErW+BhZotmyQ/ktlYTAp9r7oWfz1oxxMpgKQVTUw0NAYRbKLbOSNaInipecIKul7U7O5BfCQBBRZa3w==", "dev": true, "requires": { + "async": "^2.6.1", + "compare-versions": "^3.2.1", + "fileset": "^2.0.3", "istanbul-lib-coverage": "^2.0.2", + "istanbul-lib-hook": "^2.0.2", "istanbul-lib-instrument": "^3.0.1", + "istanbul-lib-report": "^2.0.3", "istanbul-lib-source-maps": "^3.0.1", + "istanbul-reports": "^2.0.3", + "js-yaml": "^3.12.0", "make-dir": "^1.3.0", "once": "^1.4.0" } @@ -2312,6 +2405,15 @@ "integrity": "sha512-4CsY730KHy12ya/YNKubrMlb7EZZVsEPhXntyRY/Cbs7HN5HdznLbI4UbvIGHgocxHx3VkGe7l6IN1lipetuGg==", "dev": true }, + "istanbul-lib-hook": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", + "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, "istanbul-lib-instrument": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.0.1.tgz", @@ -2327,6 +2429,50 @@ "semver": "^5.5.0" } }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "istanbul-lib-source-maps": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.1.tgz", @@ -2348,6 +2494,15 @@ } } }, + "istanbul-reports": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", + "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "dev": true, + "requires": { + "handlebars": "^4.1.2" + } + }, "jest": { "version": "24.0.0", "resolved": "https://registry.npmjs.org/jest/-/jest-24.0.0.tgz", @@ -2753,6 +2908,16 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", @@ -3057,6 +3222,12 @@ "brace-expansion": "^1.1.7" } }, + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + }, "mixin-deep": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", @@ -3133,6 +3304,12 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -3285,6 +3462,16 @@ "wrappy": "1" } }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, "optionator": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", @@ -4061,6 +4248,12 @@ "extend-shallow": "^3.0.0" } }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -4331,6 +4524,26 @@ "prelude-ls": "~1.1.2" } }, + "uglify-js": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", + "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.20.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, "union-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", @@ -4553,6 +4766,12 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", diff --git a/test/wpscan.test.js b/test/wpscan.test.js index caac8f8a44..275f788bb2 100644 --- a/test/wpscan.test.js +++ b/test/wpscan.test.js @@ -6,7 +6,7 @@ test( const securityTest = await startSecurityTest({ context: 'iteraplan wp', metaData: {}, - name: 'wpscan', + name: 'wordpress', target: { name: 'iteraplan', location: 'www.iteraplan.de', @@ -16,66 +16,69 @@ test( const { report } = securityTest; - const findings = report.findings.map(( - { name, description, category, severity }) => ({ - name, - category, - severity, - })); + const findings = report.findings.map( + ({ description, category, name, osi_layer, severity }) => ({ + description, + category, + name, + osi_layer, + severity, + }) + ); expect(findings).toContainEqual({ description: 'CMS Wordpress Information', category: 'CMS Wordpress', name: 'CMS Wordpress', - osi_layer: 'NETWORK', + osi_layer: 'APPLICATION', severity: 'INFORMATIONAL', }); expect(findings).toContainEqual({ - description: 'Username & Hash Extract', - category: '', - name: 'W3 Total Cache 0.9.2.4', - osi_layer: 'NETWORK', + description: ' Username & Hash Extract', + category: 'Plugin', + name: 'W3 Total Cache 0.9.2.4 ', + osi_layer: 'APPLICATION', severity: 'INFORMATIONAL', }); expect(findings).toContainEqual({ - description: 'Remote Code Execution', - category: '', - name: 'W3 Total Cache', - osi_layer: 'NETWORK', + description: ' Remote Code Execution', + category: 'Plugin', + name: 'W3 Total Cache ', + osi_layer: 'APPLICATION', severity: 'INFORMATIONAL', }); expect(findings).toContainEqual({ - description: 'Edge Mode Enabling CSRF', - category: '', - name: 'W3 Total Cache 0.9.4', - osi_layer: 'NETWORK', + description: ' Edge Mode Enabling CSRF', + category: 'Plugin', + name: 'W3 Total Cache 0.9.4 ', + osi_layer: 'APPLICATION', severity: 'INFORMATIONAL', }); expect(findings).toContainEqual({ - description: 'Cross', - category: '', - name: 'W3 Total Cache <= 0.9.4', - osi_layer: 'NETWORK', + description: ' Cross', + category: 'Plugin', + name: 'W3 Total Cache <= 0.9.4 ', + osi_layer: 'APPLICATION', severity: 'INFORMATIONAL', }); expect(findings).toContainEqual({ - description: 'Debug Mode XSS', - category: '', - name: 'W3 Total Cache <= 0.9.4', - osi_layer: 'NETWORK', + description: ' Debug Mode XSS', + category: 'Plugin', + name: 'W3 Total Cache <= 0.9.4 ', + osi_layer: 'APPLICATION', severity: 'INFORMATIONAL', }); expect(findings).toContainEqual({ - description: 'Authenticated Reflected Cross', - category: '', - name: 'W3 Total Cache <= 0.9.4.1', - osi_layer: 'NETWORK', + description: ' Authenticated Reflected Cross', + category: 'Plugin', + name: 'W3 Total Cache <= 0.9.4.1 ', + osi_layer: 'APPLICATION', severity: 'INFORMATIONAL', }); }, From d0aed136b5c2f2a181119ba1d4cb09467b991f8c Mon Sep 17 00:00:00 2001 From: dpatanin Date: Mon, 24 Jun 2019 14:46:16 +0200 Subject: [PATCH 003/102] add wordpress scanner to compose file --- docker-compose.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index 05c09483cf..d6355adda0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -155,6 +155,20 @@ services: - ENGINE_BASIC_AUTH_USER=${ENGINE_SCANNERSERVICES_USER} - ENGINE_BASIC_AUTH_PASSWORD=${ENGINE_SCANNERSERVICES_PASSWORD} + scanner-cms-wordpress: + image: securecodebox/wpscan:${DEFAULT_TAG} + depends_on: + engine: + condition: service_healthy + networks: + - frontend + labels: + container_group: scanner + environment: + - ENGINE_ADDRESS=http://engine:8080 + - ENGINE_BASIC_AUTH_USER=${ENGINE_SCANNERSERVICES_USER} + - ENGINE_BASIC_AUTH_PASSWORD=${ENGINE_SCANNERSERVICES_PASSWORD} + persistence-elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.3.1 ports: From 6c3bb7fdf1e04007669efb0f209d50503c3ac27d Mon Sep 17 00:00:00 2001 From: dpatanin Date: Mon, 24 Jun 2019 16:40:39 +0200 Subject: [PATCH 004/102] add wpscan example with outdated wordpress image for testing --- docker-compose.demo.yml | 6 + .../usage-examples/wordpress-example.md | 106 ++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 docs/user-guide/usage-examples/wordpress-example.md diff --git a/docker-compose.demo.yml b/docker-compose.demo.yml index 4129d1b9b3..617281b733 100644 --- a/docker-compose.demo.yml +++ b/docker-compose.demo.yml @@ -18,3 +18,9 @@ services: - 8111:80 networks: - frontend + old-wordpress: + image: wordpress/4.7.5-php7.1-fpm + ports: + - 8000:80 + networks: + - frontend \ No newline at end of file diff --git a/docs/user-guide/usage-examples/wordpress-example.md b/docs/user-guide/usage-examples/wordpress-example.md new file mode 100644 index 0000000000..526a25ff60 --- /dev/null +++ b/docs/user-guide/usage-examples/wordpress-example.md @@ -0,0 +1,106 @@ +# Scanning Server Side Rendered Apps using wpscan + +Scanning for Vulnerabilities in old-wordpress using wpscan and the secureCodeBox. + +## Introduction + +Old-wordpress uses an outdated Wordpress image (`wordpress/4.7.5-php7.1-fpm`). + +In this example we'll be using wpscan controlled by the secureCodeBox to scan for vulnarabilties in the old-wordpress. + +## Testing the setup + +This is a straight forward configuration by simply configuring the target. + +### Start the scan via HTTP API + +`PUT http://localhost:8080/box/securityTests` + +### Start the scan via CLI + +`run_scanner.sh --payload payloadFile.json` + +### Test Payload + +```json +[ + { + "context": "old-wordpress example", + "name": "wpscan", + "target": { + "name": "old-wordpress", + "location": "http://old-wordpress:8000/" + } + } +] +``` + +This scan should finish in about two minutes and should return a couple of findings. + +## Full Scan + +The following example contains a fully configured Wordpress Scan for the old-wordpress. + +### Start the scan via HTTP API + +`PUT http://localhost:8080/box/securityTests` + +### Start the scan via CLI + +`run_scanner.sh --payload payloadFile.json arachni` + +### Full Payload + +```json +[ + { + "context": "old-wordpress example", + "name": "wpscan", + "target": { + "name": "old-wordpress", + "location": "http://old-wordpress:8000/", + "attributes": { + "WP_STEALTHY": "true", + "WP_ENUMERATE": "[Options]", + "WP_MAX_DURATION": "[Seconds]", + "WP_THROTTLE": "[Milliseconds]", + "WP_REQUEST_TIMEOUT": "[Seconds]", + "WP_DETECTION_MODE": "[Options]", + "WP_USER_AGENT": "[userAgent]", + "WP_HEADERS": "[headers]" + } + } + } +] +``` +Options for enumerate attribute: + +```txt +Enumeration Process +Available Choices: + vp | Vulnerable plugins + ap | All plugins + p | Plugins + vt | Vulnerable themes + at | All themes + t | Themes + tt | Timthumbs + cb | Config backups + dbe | Db exports + u | User IDs range. e.g: u1-5 + Range separator to use: '-' + Value if no argument supplied: 1-10 + m | Media IDs range. e.g m1-15 + Note: Permalink setting must be set to "Plain" for those to be detected + Range separator to use: '-' + Value if no argument supplied: 1-100 + +Separator to use between the values: ',' +Default: All Plugins, Config Backups +Value if no argument supplied: vp,vt,tt,cb,dbe,u,m +Incompatible choices (only one of each group/s can be used): + - vp, ap, p + - vt, at, t +``` + +This scan should finish in about two minutes and should return a couple of findings. \ No newline at end of file From 45eb2b707bdd051b17a6ffe20ed8b37df4e41810 Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach Date: Tue, 17 Sep 2019 16:55:54 +0200 Subject: [PATCH 005/102] Re-enable arachni integration test --- test/arachni.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/arachni.test.js b/test/arachni.test.js index 0774c762fa..ee65b9cbb3 100644 --- a/test/arachni.test.js +++ b/test/arachni.test.js @@ -1,6 +1,6 @@ const { startSecurityTest, Time } = require('./sdk'); -test.skip( +test( 'finds a few findings for a bare nginx container', async () => { const securityTest = await startSecurityTest({ From 5b1c37962a607fee32e6b4a471c6ed64cffc12a1 Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach Date: Wed, 18 Sep 2019 10:55:57 +0200 Subject: [PATCH 006/102] Retrigger build for amass fix From e3dd60ac23eef27421c4a86bd315d2e097a00340 Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach Date: Wed, 9 Oct 2019 16:32:12 +0200 Subject: [PATCH 007/102] Fix nginx version --- docker-compose.demo.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.demo.yml b/docker-compose.demo.yml index 4129d1b9b3..d4442b7bec 100644 --- a/docker-compose.demo.yml +++ b/docker-compose.demo.yml @@ -13,7 +13,7 @@ services: networks: - frontend nginx: - image: nginx + image: nginx:1.17-alpine ports: - 8111:80 networks: From bac3404f44a566515c547b63edd7b5e345ad558c Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach Date: Wed, 9 Oct 2019 16:32:55 +0200 Subject: [PATCH 008/102] Use docker compose to show logs instead of using docker directly Apperently there now is a kinda unpredictable hash behind the name and number of the container so that you cant use docker directly anymore. --- .travis.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index aa27e5fabf..79a7ec583a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,10 +14,10 @@ script: - npm test -- --verbose --forceExit after_failure: - docker ps -a - - docker logs securecodebox_engine_1 - - docker logs securecodebox_scanner-webapplication-zap_1 - - docker logs securecodebox_scanner-webapplication-arachni_1 - - docker logs securecodebox_scanner-infrastructure-amass_1 - - docker logs securecodebox_scanner-infrastructure-nmap_1 - - docker logs securecodebox_scanner-infrastructure-sslyze_1 - - docker logs securecodebox_scanner-webserver-nikto_1 + - docker-compose logs securecodebox_engine + - docker-compose logs securecodebox_scanner-webapplication-zap + - docker-compose logs securecodebox_scanner-webapplication-arachni + - docker-compose logs securecodebox_scanner-infrastructure-amass + - docker-compose logs securecodebox_scanner-infrastructure-nmap + - docker-compose logs securecodebox_scanner-infrastructure-sslyze + - docker-compose logs securecodebox_scanner-webserver-nikto From 1794ea10160c96f02d491cc805867ef3252be2ad Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach Date: Wed, 9 Oct 2019 16:47:56 +0200 Subject: [PATCH 009/102] Corrected docker-compose service name in log commands --- .travis.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 79a7ec583a..10107458c4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,10 +14,10 @@ script: - npm test -- --verbose --forceExit after_failure: - docker ps -a - - docker-compose logs securecodebox_engine - - docker-compose logs securecodebox_scanner-webapplication-zap - - docker-compose logs securecodebox_scanner-webapplication-arachni - - docker-compose logs securecodebox_scanner-infrastructure-amass - - docker-compose logs securecodebox_scanner-infrastructure-nmap - - docker-compose logs securecodebox_scanner-infrastructure-sslyze - - docker-compose logs securecodebox_scanner-webserver-nikto + - docker-compose logs engine + - docker-compose logs scanner-webapplication-zap + - docker-compose logs scanner-webapplication-arachni + - docker-compose logs scanner-infrastructure-amass + - docker-compose logs scanner-infrastructure-nmap + - docker-compose logs scanner-infrastructure-sslyze + - docker-compose logs scanner-webserver-nikto From 1e781c01a0401f6cc22af7212c1a806902b56e7c Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach Date: Mon, 14 Oct 2019 11:10:57 +0200 Subject: [PATCH 010/102] Remove "Interesting Response" from expected arachni findings --- test/arachni.test.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/test/arachni.test.js b/test/arachni.test.js index ee65b9cbb3..a44d24d514 100644 --- a/test/arachni.test.js +++ b/test/arachni.test.js @@ -28,13 +28,7 @@ test( severity: 'LOW', }); - expect(findings).toContainEqual({ - name: 'Interesting response', - category: 'Interesting responses', - severity: 'INFORMATIONAL', - }); - - expect(findings.length).toEqual(2); + expect(findings.length).toEqual(1); }, 5 * Time.Minute ); From 978f41e4bf04bb85e5119689021ba13938e738af Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach Date: Mon, 21 Oct 2019 11:47:49 +0200 Subject: [PATCH 011/102] Update expected ssh scanner findings for SCB SSH Findings 1.1.0 --- test/ssh.test.js | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/test/ssh.test.js b/test/ssh.test.js index 830888d18c..d8807c37db 100644 --- a/test/ssh.test.js +++ b/test/ssh.test.js @@ -28,34 +28,33 @@ test( expect(findings).toContainEqual({ category: 'SSH Service', - description: 'SSH Compliance Information', - name: 'SSH Compliance', + description: undefined, + name: 'SSH Service Information', osi_layer: 'NETWORK', severity: 'INFORMATIONAL', }); expect(findings).toContainEqual({ - category: 'SSH Service', - description: ' diffie-hellman-group14-sha1', - name: 'Remove these key exchange algorithms', + category: 'SSH Policy Violation', + description: 'Deprecated / discouraged SSH key algorithms are used', + name: 'Insecure SSH Key Algorithms', osi_layer: 'NETWORK', severity: 'MEDIUM', }); expect(findings).toContainEqual({ - category: 'SSH Service', - description: - ' umac-64-etm@openssh.com, hmac-sha1-etm@openssh.com, umac-64@openssh.com, hmac-sha1', - name: 'Remove these MAC algorithms', + category: 'SSH Policy Violation', + description: 'Deprecated / discouraged SSH MAC algorithms are used', + name: 'Insecure SSH MAC Algorithms', osi_layer: 'NETWORK', severity: 'MEDIUM', }); expect( findings - .filter(({ name }) => name !== 'SSH Compliance') - .filter(({ name }) => name !== 'Remove these key exchange algorithms') - .filter(({ name }) => name !== 'Remove these MAC algorithms') + .filter(({ name }) => name !== 'SSH Service Information') + .filter(({ name }) => name !== 'Insecure SSH Key Algorithms') + .filter(({ name }) => name !== 'Insecure SSH MAC Algorithms') ).toEqual([]); }, 2 * Time.Minute From c501444c0463d13dba4468e167fca13d1e3ad931 Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach Date: Mon, 21 Oct 2019 13:24:57 +0200 Subject: [PATCH 012/102] Configure mail notifications manually --- .travis.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.travis.yml b/.travis.yml index 10107458c4..1707eb3092 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,12 @@ language: node_js node_js: - '10' +notifications: + email: + recipients: + - jannik.hollenbach@iteratec.com + on_success: never + on_failure: always services: - docker env: From eeb6c22c6c3a37c0c003562dd1285feb49ead71a Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach Date: Mon, 21 Oct 2019 16:37:43 +0200 Subject: [PATCH 013/102] Add a concrete example of how metadata fields can be used --- docs/user-guide/metafields/README.md | 29 ++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/docs/user-guide/metafields/README.md b/docs/user-guide/metafields/README.md index 284eea47f7..533c4b27e8 100644 --- a/docs/user-guide/metafields/README.md +++ b/docs/user-guide/metafields/README.md @@ -7,6 +7,35 @@ These values can then be used by standerdized components e.g. by the DefectDojo > Note: None of these values are mandatory. + +## Example + +Here's a example of a SecurityTest (see the `PUT +/box/securityTests` endpoint) which Metadata Field set: + +```json +[ + { + "name": "nmap", + "context": "exampleCompoanyNetworkScan", + "tenant": "exampleCompoany", + "metaData": { + "location": "office-gotham-city", + "vlan": "vm-network" + }, + "target": { + "name": "gotham-city-offices", + "location": "192.168.42.0/24", + "attributes": { + "NMAP_PARAMETER": "" + } + } + } +] +``` + +In this example the meta data fields are used to identify the context of the scan more directly than using the string context field. When also using the elasticsearch persistence proivder these fields can be extremly helpfull to easily filter for the sub results you want to have. E.g. only show ports in the `office-gotham-city` or in particular `vlans`. How you end up using the metadata fields is up to you. + ## Standard Values ### Git and Build Values From 8637b223a77fdee3993d79361dafeed403c210ef Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach Date: Tue, 19 Nov 2019 12:50:17 +0100 Subject: [PATCH 014/102] Move SSH Scan Test Target to www.iteratec.de securecodebox.io doesn't have a ssh port open anymore since we moved over to github pages ;) --- test/ssh.test.js | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/test/ssh.test.js b/test/ssh.test.js index d8807c37db..bba41f7870 100644 --- a/test/ssh.test.js +++ b/test/ssh.test.js @@ -1,15 +1,15 @@ const { startSecurityTest, Time } = require('./sdk'); test( - 'finds a few low severity findigns for securecodebox.io', + 'finds a few low severity findings for securecodebox.io', async () => { const securityTest = await startSecurityTest({ - context: 'securecodebox.io tls', + context: 'www.iteratec.de ssh', metaData: {}, name: 'ssh', target: { - name: 'securecodebox.io tls', - location: 'securecodebox.io', + name: 'www.iteratec.de ssh', + location: 'www.iteratec.de', attributes: {}, }, }); @@ -36,16 +36,8 @@ test( expect(findings).toContainEqual({ category: 'SSH Policy Violation', - description: 'Deprecated / discouraged SSH key algorithms are used', - name: 'Insecure SSH Key Algorithms', - osi_layer: 'NETWORK', - severity: 'MEDIUM', - }); - - expect(findings).toContainEqual({ - category: 'SSH Policy Violation', - description: 'Deprecated / discouraged SSH MAC algorithms are used', - name: 'Insecure SSH MAC Algorithms', + description: 'Discouraged SSH authentication methods are used', + name: 'Discouraged SSH authentication methods', osi_layer: 'NETWORK', severity: 'MEDIUM', }); @@ -53,8 +45,7 @@ test( expect( findings .filter(({ name }) => name !== 'SSH Service Information') - .filter(({ name }) => name !== 'Insecure SSH Key Algorithms') - .filter(({ name }) => name !== 'Insecure SSH MAC Algorithms') + .filter(({ name }) => name !== 'Discouraged SSH authentication methods') ).toEqual([]); }, 2 * Time.Minute From be70a4ee06717cd57740547937524666b5bd5b0e Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach Date: Tue, 19 Nov 2019 13:44:38 +0100 Subject: [PATCH 015/102] Adjust sslyze findings to the new website --- test/sslyze.test.js | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/test/sslyze.test.js b/test/sslyze.test.js index e3a8abf093..dd3c83ad66 100644 --- a/test/sslyze.test.js +++ b/test/sslyze.test.js @@ -52,16 +52,6 @@ test( category: 'Resumption', severity: 'INFORMATIONAL', }); - expect(findings).toContainEqual({ - name: 'TLSv1 supported', - category: 'TLSv1', - severity: 'LOW', - }); - expect(findings).toContainEqual({ - name: 'TLSv1.1 supported', - category: 'TLSv1.1', - severity: 'INFORMATIONAL', - }); expect(findings).toContainEqual({ name: 'TLSv1.2 supported', category: 'TLSv1.2', From 322224e856298fb94be17d1028ce810ac942477f Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach Date: Tue, 19 Nov 2019 14:19:54 +0100 Subject: [PATCH 016/102] Configure eslint to match existing style --- test/.eslintrc | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 test/.eslintrc diff --git a/test/.eslintrc b/test/.eslintrc new file mode 100644 index 0000000000..9b17d289f2 --- /dev/null +++ b/test/.eslintrc @@ -0,0 +1,5 @@ +{ + "rules": { + "quotes": ["warn", "single"] + } +} From e164c95bb541a592f9f028ee538d8e600b8b7096 Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach Date: Tue, 19 Nov 2019 14:20:57 +0100 Subject: [PATCH 017/102] Remove unexpected undefined --- test/ssh.test.js | 1 - 1 file changed, 1 deletion(-) diff --git a/test/ssh.test.js b/test/ssh.test.js index bba41f7870..4d37191bba 100644 --- a/test/ssh.test.js +++ b/test/ssh.test.js @@ -28,7 +28,6 @@ test( expect(findings).toContainEqual({ category: 'SSH Service', - description: undefined, name: 'SSH Service Information', osi_layer: 'NETWORK', severity: 'INFORMATIONAL', From a8a391cd3be922167f1a4abf145ed62906398bd5 Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach Date: Fri, 22 Nov 2019 09:50:19 +0100 Subject: [PATCH 018/102] Autoformat yml --- docker-compose.yml | 126 ++++++++++++++++++++++----------------------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index cfae6a8630..f2a33ffdf7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,4 @@ -version: '2.1' +version: "2.1" services: engine: image: securecodebox/engine:${DEFAULT_TAG} @@ -40,25 +40,25 @@ services: restart: on-failure:3 camundadb: - image: mysql:5.7 - networks: - - frontend - volumes: - - camundadb-datastore:/var/lib/mysql - labels: - container_group: infrastructure - command: --max_allowed_packet=65011712 # 512M - environment: - - MYSQL_ROOT_PASSWORD=${CAMUNDADB_ROOT_PW} - - MYSQL_DATABASE=${CAMUNDADB_DATABASE} - - MYSQL_USER=${CAMUNDADB_USER} - - MYSQL_PASSWORD=${CAMUNDADB_PW} + image: mysql:5.7 + networks: + - frontend + volumes: + - camundadb-datastore:/var/lib/mysql + labels: + container_group: infrastructure + command: --max_allowed_packet=65011712 # 512M + environment: + - MYSQL_ROOT_PASSWORD=${CAMUNDADB_ROOT_PW} + - MYSQL_DATABASE=${CAMUNDADB_DATABASE} + - MYSQL_USER=${CAMUNDADB_USER} + - MYSQL_PASSWORD=${CAMUNDADB_PW} scanner-infrastructure-nmap: image: securecodebox/nmap:${DEFAULT_TAG} depends_on: engine: - condition: service_healthy + condition: service_healthy networks: - frontend labels: @@ -72,7 +72,7 @@ services: image: securecodebox/nikto:${DEFAULT_TAG} depends_on: engine: - condition: service_healthy + condition: service_healthy networks: - frontend labels: @@ -83,74 +83,74 @@ services: - ENGINE_BASIC_AUTH_PASSWORD=${ENGINE_SCANNERSERVICES_PASSWORD} scanner-webapplication-zap: - image: securecodebox/zap:${DEFAULT_TAG} - depends_on: - engine: - condition: service_healthy - networks: - - frontend - labels: - container_group: scanner - environment: + image: securecodebox/zap:${DEFAULT_TAG} + depends_on: + engine: + condition: service_healthy + networks: + - frontend + labels: + container_group: scanner + environment: - ENGINE_ADDRESS=http://engine:8080 - ENGINE_BASIC_AUTH_USER=${ENGINE_SCANNERSERVICES_USER} - ENGINE_BASIC_AUTH_PASSWORD=${ENGINE_SCANNERSERVICES_PASSWORD} - SECURECODEBOX_ZAP_JOBSSCHEDULERCRON=* * * * * * scanner-infrastructure-sslyze: - image: securecodebox/sslyze:${DEFAULT_TAG} - depends_on: - engine: - condition: service_healthy - networks: - - frontend - labels: - container_group: scanner - environment: + image: securecodebox/sslyze:${DEFAULT_TAG} + depends_on: + engine: + condition: service_healthy + networks: + - frontend + labels: + container_group: scanner + environment: - ENGINE_ADDRESS=http://engine:8080 - ENGINE_BASIC_AUTH_USER=${ENGINE_SCANNERSERVICES_USER} - ENGINE_BASIC_AUTH_PASSWORD=${ENGINE_SCANNERSERVICES_PASSWORD} scanner-webapplication-arachni: - image: securecodebox/arachni:${DEFAULT_TAG} - depends_on: - engine: - condition: service_healthy - networks: - - frontend - labels: - container_group: scanner - environment: + image: securecodebox/arachni:${DEFAULT_TAG} + depends_on: + engine: + condition: service_healthy + networks: + - frontend + labels: + container_group: scanner + environment: - ENGINE_ADDRESS=http://engine:8080 - ENGINE_BASIC_AUTH_USER=${ENGINE_SCANNERSERVICES_USER} - ENGINE_BASIC_AUTH_PASSWORD=${ENGINE_SCANNERSERVICES_PASSWORD} - volumes: + volumes: - "./plugins/arachni-login-scripts:/securecodebox/static/" scanner-infrastructure-amass: - image: securecodebox/amass:${DEFAULT_TAG} - depends_on: - engine: - condition: service_healthy - networks: - - frontend - labels: - container_group: scanner - environment: + image: securecodebox/amass:${DEFAULT_TAG} + depends_on: + engine: + condition: service_healthy + networks: + - frontend + labels: + container_group: scanner + environment: - ENGINE_ADDRESS=http://engine:8080 - ENGINE_BASIC_AUTH_USER=${ENGINE_SCANNERSERVICES_USER} - ENGINE_BASIC_AUTH_PASSWORD=${ENGINE_SCANNERSERVICES_PASSWORD} - + scanner-infrastructure-ssh: - image: securecodebox/ssh:${DEFAULT_TAG} - depends_on: - engine: - condition: service_healthy - networks: - - frontend - labels: - container_group: scanner - environment: + image: securecodebox/ssh:${DEFAULT_TAG} + depends_on: + engine: + condition: service_healthy + networks: + - frontend + labels: + container_group: scanner + environment: - ENGINE_ADDRESS=http://engine:8080 - ENGINE_BASIC_AUTH_USER=${ENGINE_SCANNERSERVICES_USER} - ENGINE_BASIC_AUTH_PASSWORD=${ENGINE_SCANNERSERVICES_PASSWORD} From d7a8114d7eefbc13c166f5a22560204ca1d2db2a Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach Date: Fri, 22 Nov 2019 09:51:48 +0100 Subject: [PATCH 019/102] Adjust wpscan naming and add them to the travis integration stack --- .travis.yml | 5 +++-- docker-compose.yml | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 1707eb3092..5325921827 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: node_js node_js: - - '10' + - "12" notifications: email: recipients: @@ -14,7 +14,7 @@ env: - DEFAULT_TAG=unstable script: - cp test/.env.test .env - - docker-compose -f docker-compose.yml -f docker-compose.demo.yml up -d engine camundadb bodgeit juice-shop nginx scanner-infrastructure-nmap scanner-webapplication-arachni scanner-webapplication-zap scanner-infrastructure-amass scanner-infrastructure-sslyze scanner-webserver-nikto scanner-infrastructure-ssh + - docker-compose -f docker-compose.yml -f docker-compose.demo.yml up -d engine camundadb bodgeit juice-shop nginx scanner-infrastructure-nmap scanner-webapplication-arachni scanner-webapplication-zap scanner-infrastructure-amass scanner-infrastructure-sslyze scanner-webserver-nikto scanner-infrastructure-ssh scanner-cms-wpscan - cd test - npm ci - npm test -- --verbose --forceExit @@ -27,3 +27,4 @@ after_failure: - docker-compose logs scanner-infrastructure-nmap - docker-compose logs scanner-infrastructure-sslyze - docker-compose logs scanner-webserver-nikto + - docker-compose logs scanner-cms-wpscan diff --git a/docker-compose.yml b/docker-compose.yml index f2a33ffdf7..23acfbfcbd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -155,7 +155,7 @@ services: - ENGINE_BASIC_AUTH_USER=${ENGINE_SCANNERSERVICES_USER} - ENGINE_BASIC_AUTH_PASSWORD=${ENGINE_SCANNERSERVICES_PASSWORD} - scanner-cms-wordpress: + scanner-cms-wpscan: image: securecodebox/wpscan:${DEFAULT_TAG} depends_on: engine: From 39cdc770ba6b3e2febc24cf3718298b20b4ea688 Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach Date: Fri, 22 Nov 2019 10:05:36 +0100 Subject: [PATCH 020/102] Correct config for old wordpress example instance --- .travis.yml | 2 +- docker-compose.demo.yml | 28 +++++++++++++++++++++++++--- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5325921827..c6b9b9be7f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ env: - DEFAULT_TAG=unstable script: - cp test/.env.test .env - - docker-compose -f docker-compose.yml -f docker-compose.demo.yml up -d engine camundadb bodgeit juice-shop nginx scanner-infrastructure-nmap scanner-webapplication-arachni scanner-webapplication-zap scanner-infrastructure-amass scanner-infrastructure-sslyze scanner-webserver-nikto scanner-infrastructure-ssh scanner-cms-wpscan + - docker-compose -f docker-compose.yml -f docker-compose.demo.yml up -d engine camundadb bodgeit juice-shop nginx scanner-infrastructure-nmap scanner-webapplication-arachni scanner-webapplication-zap scanner-infrastructure-amass scanner-infrastructure-sslyze scanner-webserver-nikto scanner-infrastructure-ssh scanner-cms-wpscan old-wordpress - cd test - npm ci - npm test -- --verbose --forceExit diff --git a/docker-compose.demo.yml b/docker-compose.demo.yml index 4439698b61..2c2f09aace 100644 --- a/docker-compose.demo.yml +++ b/docker-compose.demo.yml @@ -1,4 +1,4 @@ -version: '2.1' +version: "2.1" services: juice-shop: image: bkimminich/juice-shop @@ -19,8 +19,30 @@ services: networks: - frontend old-wordpress: - image: wordpress/4.7.5-php7.1-fpm + image: wordpress:4.7.5-php7.1-fpm-alpine ports: - 8000:80 networks: - - frontend \ No newline at end of file + - frontend + environment: + WORDPRESS_DB_HOST: wordpress-db + WORDPRESS_DB_USER: exampleuser + WORDPRESS_DB_PASSWORD: examplepass + WORDPRESS_DB_NAME: exampledb + volumes: + - wordpress:/var/www/html + + wordpress-db: + image: mysql:5.7 + restart: always + environment: + MYSQL_DATABASE: exampledb + MYSQL_USER: exampleuser + MYSQL_PASSWORD: examplepass + MYSQL_RANDOM_ROOT_PASSWORD: "1" + volumes: + - db:/var/lib/mysql + +volumes: + wordpress: + db: From 0ae314bb77e6ab18e42d288671af57c286e51f43 Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach Date: Thu, 28 Nov 2019 13:16:00 +0100 Subject: [PATCH 021/102] Added single image demo outdated wp instance --- demo/old-wordpress/Dockerfile | 4 ++++ demo/old-wordpress/wp.db | Bin 0 -> 621568 bytes demo/readme.md | 2 ++ docker-compose.demo.yml | 25 ++----------------------- 4 files changed, 8 insertions(+), 23 deletions(-) create mode 100644 demo/old-wordpress/Dockerfile create mode 100644 demo/old-wordpress/wp.db create mode 100644 demo/readme.md diff --git a/demo/old-wordpress/Dockerfile b/demo/old-wordpress/Dockerfile new file mode 100644 index 0000000000..5edf71dbe4 --- /dev/null +++ b/demo/old-wordpress/Dockerfile @@ -0,0 +1,4 @@ +FROM dorwardv/wordpress-sqlite-nginx-docker@sha256:72cc94ef4f80e0d6d83c5f23eab5f056c74b207bd8a9722570260cde56d28b6e +COPY ./wp.db /usr/share/nginx/html/wp-content/database/.ht.sqlite +RUN chmod +rxw /usr/share/nginx/html/wp-content/database/.ht.sqlite +RUN chown -R www-data.www-data /usr/share/nginx/html/wp-content/database/ \ No newline at end of file diff --git a/demo/old-wordpress/wp.db b/demo/old-wordpress/wp.db new file mode 100644 index 0000000000000000000000000000000000000000..a1db5aa02b29038ba9a990e3e64624f7397fe3bf GIT binary patch literal 621568 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

h5>}PBe1D_43l8~s0W*0CFDUFkbpqmSPb%UAF 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

-3&D|OWJ?l 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�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 JqIj&=|35I&W)J`X literal 0 HcmV?d00001 diff --git a/demo/readme.md b/demo/readme.md new file mode 100644 index 0000000000..2c78833f21 --- /dev/null +++ b/demo/readme.md @@ -0,0 +1,2 @@ +This folder contains the data for a example config of a vulnerable wordpress instances. +This instance can be used for demo. diff --git a/docker-compose.demo.yml b/docker-compose.demo.yml index 2c2f09aace..d3d33632ec 100644 --- a/docker-compose.demo.yml +++ b/docker-compose.demo.yml @@ -19,30 +19,9 @@ services: networks: - frontend old-wordpress: - image: wordpress:4.7.5-php7.1-fpm-alpine + image: securecodebox/old-wordpress:4.0 + restart: always ports: - 8000:80 networks: - frontend - environment: - WORDPRESS_DB_HOST: wordpress-db - WORDPRESS_DB_USER: exampleuser - WORDPRESS_DB_PASSWORD: examplepass - WORDPRESS_DB_NAME: exampledb - volumes: - - wordpress:/var/www/html - - wordpress-db: - image: mysql:5.7 - restart: always - environment: - MYSQL_DATABASE: exampledb - MYSQL_USER: exampleuser - MYSQL_PASSWORD: examplepass - MYSQL_RANDOM_ROOT_PASSWORD: "1" - volumes: - - db:/var/lib/mysql - -volumes: - wordpress: - db: From 31dc04c37e5ca85cd6c1446f14ac8a2915ba7720 Mon Sep 17 00:00:00 2001 From: J12934 <13718901+J12934@users.noreply.github.com> Date: Thu, 16 Jan 2020 16:34:01 +0100 Subject: [PATCH 022/102] Correct expected findings --- test/wpscan.test.js | 118 +++++++++++++------------------------------- 1 file changed, 35 insertions(+), 83 deletions(-) diff --git a/test/wpscan.test.js b/test/wpscan.test.js index 275f788bb2..ab3c629a8f 100644 --- a/test/wpscan.test.js +++ b/test/wpscan.test.js @@ -1,86 +1,38 @@ const { startSecurityTest, Time } = require('./sdk'); test( - 'finds a few informational severity findigns for www.iteraplan.de', - async () => { - const securityTest = await startSecurityTest({ - context: 'iteraplan wp', - metaData: {}, - name: 'wordpress', - target: { - name: 'iteraplan', - location: 'www.iteraplan.de', - attributes: {}, - }, - }); - - const { report } = securityTest; - - const findings = report.findings.map( - ({ description, category, name, osi_layer, severity }) => ({ - description, - category, - name, - osi_layer, - severity, - }) - ); - - expect(findings).toContainEqual({ - description: 'CMS Wordpress Information', - category: 'CMS Wordpress', - name: 'CMS Wordpress', - osi_layer: 'APPLICATION', - severity: 'INFORMATIONAL', - }); - - expect(findings).toContainEqual({ - description: ' Username & Hash Extract', - category: 'Plugin', - name: 'W3 Total Cache 0.9.2.4 ', - osi_layer: 'APPLICATION', - severity: 'INFORMATIONAL', - }); - - expect(findings).toContainEqual({ - description: ' Remote Code Execution', - category: 'Plugin', - name: 'W3 Total Cache ', - osi_layer: 'APPLICATION', - severity: 'INFORMATIONAL', - }); - - expect(findings).toContainEqual({ - description: ' Edge Mode Enabling CSRF', - category: 'Plugin', - name: 'W3 Total Cache 0.9.4 ', - osi_layer: 'APPLICATION', - severity: 'INFORMATIONAL', - }); - - expect(findings).toContainEqual({ - description: ' Cross', - category: 'Plugin', - name: 'W3 Total Cache <= 0.9.4 ', - osi_layer: 'APPLICATION', - severity: 'INFORMATIONAL', - }); - - expect(findings).toContainEqual({ - description: ' Debug Mode XSS', - category: 'Plugin', - name: 'W3 Total Cache <= 0.9.4 ', - osi_layer: 'APPLICATION', - severity: 'INFORMATIONAL', - }); - - expect(findings).toContainEqual({ - description: ' Authenticated Reflected Cross', - category: 'Plugin', - name: 'W3 Total Cache <= 0.9.4.1 ', - osi_layer: 'APPLICATION', - severity: 'INFORMATIONAL', - }); - }, - 7 * Time.Minute -); \ No newline at end of file + 'finds a few findings findings for an older wordpress installation', + async () => { + const securityTest = await startSecurityTest({ + context: 'old wordpress', + metaData: {}, + name: 'wordpress', + target: { + name: 'old-wordpress', + location: 'old-wordpress', + attributes: {}, + }, + }); + + const { report } = securityTest; + + const [finding, ...otherFindings] = report.findings; + + console.log(report.findings); + + expect(finding).toMatchObject({ + name: 'CMS Wordpress', + category: 'CMS Wordpress', + description: 'CMS Wordpress Information', + location: 'http://old-wordpress/', + severity: 'INFORMATIONAL', + osi_layer: 'APPLICATION', + attributes: { + version: '4.0.29', + }, + }); + + expect(otherFindings).toEqual([]); + }, + 7 * Time.Minute +); From d2145fec2798f2459ee76b12bdeabce43daed14f Mon Sep 17 00:00:00 2001 From: J12934 <13718901+J12934@users.noreply.github.com> Date: Mon, 20 Jan 2020 10:24:40 +0100 Subject: [PATCH 023/102] Fix test name --- test/ssh.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/ssh.test.js b/test/ssh.test.js index 4d37191bba..f3b0943a79 100644 --- a/test/ssh.test.js +++ b/test/ssh.test.js @@ -1,7 +1,7 @@ const { startSecurityTest, Time } = require('./sdk'); test( - 'finds a few low severity findings for securecodebox.io', + 'finds a few low severity findings for iteratec.de', async () => { const securityTest = await startSecurityTest({ context: 'www.iteratec.de ssh', From 94f5802d527aaa749ce87c62be096902887b51c1 Mon Sep 17 00:00:00 2001 From: J12934 <13718901+J12934@users.noreply.github.com> Date: Mon, 20 Jan 2020 10:24:54 +0100 Subject: [PATCH 024/102] Add proper www subdomain for sslyze test --- test/sslyze.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/sslyze.test.js b/test/sslyze.test.js index dd3c83ad66..bf25b5f5a0 100644 --- a/test/sslyze.test.js +++ b/test/sslyze.test.js @@ -8,8 +8,8 @@ test( metaData: {}, name: 'sslyze', target: { - name: 'securecodebox.io', - location: 'securecodebox.io', + name: 'www.securecodebox.io', + location: 'www.securecodebox.io', attributes: {}, }, }); From cad24fad2d808ae91dfcbd24155b7e8ad15bf867 Mon Sep 17 00:00:00 2001 From: J12934 <13718901+J12934@users.noreply.github.com> Date: Mon, 20 Jan 2020 10:37:26 +0100 Subject: [PATCH 025/102] Echo out ssh scanner logs --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 1707eb3092..7649e8e3b2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,4 +26,5 @@ after_failure: - docker-compose logs scanner-infrastructure-amass - docker-compose logs scanner-infrastructure-nmap - docker-compose logs scanner-infrastructure-sslyze + - docker-compose logs scanner-infrastructure-ssh - docker-compose logs scanner-webserver-nikto From 893f84ba706b48814b048f0ee69c04c8fcff9e6d Mon Sep 17 00:00:00 2001 From: J12934 <13718901+J12934@users.noreply.github.com> Date: Mon, 20 Jan 2020 11:09:06 +0100 Subject: [PATCH 026/102] Add docker file for dempo server with self signed key --- demo/unsafe-https/Dockerfile | 8 ++++++++ demo/unsafe-https/index.html | 8 ++++++++ demo/unsafe-https/nginx.conf | 19 +++++++++++++++++++ demo/unsafe-https/site.crt | 22 ++++++++++++++++++++++ demo/unsafe-https/site.key | 28 ++++++++++++++++++++++++++++ 5 files changed, 85 insertions(+) create mode 100644 demo/unsafe-https/Dockerfile create mode 100644 demo/unsafe-https/index.html create mode 100644 demo/unsafe-https/nginx.conf create mode 100644 demo/unsafe-https/site.crt create mode 100644 demo/unsafe-https/site.key diff --git a/demo/unsafe-https/Dockerfile b/demo/unsafe-https/Dockerfile new file mode 100644 index 0000000000..14c4817b44 --- /dev/null +++ b/demo/unsafe-https/Dockerfile @@ -0,0 +1,8 @@ +FROM nginx:1.17-alpine +COPY index.html /usr/share/nginx/html/index.html +COPY nginx.conf /etc/nginx/nginx.conf +COPY site.crt /etc/nginx/my-site.com.crt +COPY site.key /etc/nginx/my-site.com.key + +EXPOSE 80 +EXPOSE 443 \ No newline at end of file diff --git a/demo/unsafe-https/index.html b/demo/unsafe-https/index.html new file mode 100644 index 0000000000..ba4082c0ad --- /dev/null +++ b/demo/unsafe-https/index.html @@ -0,0 +1,8 @@ + + + secureCodeBox Demo + + +

secureCodeBox Demo

+ + \ No newline at end of file diff --git a/demo/unsafe-https/nginx.conf b/demo/unsafe-https/nginx.conf new file mode 100644 index 0000000000..1b58da5d5c --- /dev/null +++ b/demo/unsafe-https/nginx.conf @@ -0,0 +1,19 @@ +events { + worker_connections 4096; ## Default: 1024 +} + +http { + server { + listen 80; + server_name my-site.com; + root /usr/share/nginx/html; + } + + server { # This new server will watch for traffic on 443 + listen 443 ssl; + server_name my-site.com; + ssl_certificate /etc/nginx/my-site.com.crt; + ssl_certificate_key /etc/nginx/my-site.com.key; + root /usr/share/nginx/html; + } +} \ No newline at end of file diff --git a/demo/unsafe-https/site.crt b/demo/unsafe-https/site.crt new file mode 100644 index 0000000000..c1a0c6cb19 --- /dev/null +++ b/demo/unsafe-https/site.crt @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDuDCCAqACCQCfYz6nAAaeOzANBgkqhkiG9w0BAQsFADCBnTELMAkGA1UEBhMC +REUxEDAOBgNVBAgMB0hhbWJ1cmcxEDAOBgNVBAcMB0hhbWJ1cmcxFjAUBgNVBAoM +DWl0ZXJhdGVjIEdtYkgxFjAUBgNVBAsMDXNlY3VyZUNvZGVCb3gxFTATBgNVBAMM +DHVuc2FmZS1odHRwczEjMCEGCSqGSIb3DQEJARYUc2VjdXJpdHlAaXRlcmF0ZWMu +ZGUwHhcNMjAwMTIwMDk1NjUzWhcNMjEwMTE5MDk1NjUzWjCBnTELMAkGA1UEBhMC +REUxEDAOBgNVBAgMB0hhbWJ1cmcxEDAOBgNVBAcMB0hhbWJ1cmcxFjAUBgNVBAoM +DWl0ZXJhdGVjIEdtYkgxFjAUBgNVBAsMDXNlY3VyZUNvZGVCb3gxFTATBgNVBAMM +DHVuc2FmZS1odHRwczEjMCEGCSqGSIb3DQEJARYUc2VjdXJpdHlAaXRlcmF0ZWMu +ZGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkWokgcWwZeP0vaks/ +oVCqqmZnGfXojU4tKWirHi3TByRShyQQFAe5xwrrkmhPnczSatauPek3u0rSP/pE +EnJJNuJX0gBHNy9UT/FaoKeFnk5bUCqxA/TQzi9cUxJ7fuWyuCS3Q9f4eHRRzEzB +xC0MNGvm/kFnoB/62X+F3j1t4RslNi792YLq3oTjLCl+BWU2gAGY/1fDDibGpQqT +Mk3nD8QJtVaa8K8DHgW7oZYBLM6mP3XmbeFP9cgJDNpwFYPj8lgz1+WPOGNaRyuD +rtq+NV8EwWI4H3Z2qYNB1S2D2ZPR4F/5u0D/nUKNSuZXvQIpCy1K9HkGar2AJtBy +OiILAgMBAAEwDQYJKoZIhvcNAQELBQADggEBANyzyCSnre1qIvKN4rr/u/FKfTls +js7Th9V3MfqU/M5RpoPFhinqfQRcp2+Awe/GD9UquQGyceKkm71iViLRADaXlzqW +fgrfa0jb4Qh+JIwaonTpMmgWvV+MrUNrFzbTbwiNsf+KjrxpoRghAmn5zlg8gSuM +dkOT67FxZuvAFaUPFsFq0ZzDvL6ztFNTkOs4qkjWzorhvIAbNcFWoWawM6XAuV0A +Zr8XzV40EVcQaEWa4ND0o8Dd5ca7S1yIyuOKljfg2SHJ/jlBwe1bJaFEYpl9TtHe +v5TJW8R/uSHeQ3+PjhInbhq529VP3MFYulYByhXqhxsHMKhWz1Z2os3kuGU= +-----END CERTIFICATE----- diff --git a/demo/unsafe-https/site.key b/demo/unsafe-https/site.key new file mode 100644 index 0000000000..1879869a48 --- /dev/null +++ b/demo/unsafe-https/site.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDkWokgcWwZeP0v +aks/oVCqqmZnGfXojU4tKWirHi3TByRShyQQFAe5xwrrkmhPnczSatauPek3u0rS +P/pEEnJJNuJX0gBHNy9UT/FaoKeFnk5bUCqxA/TQzi9cUxJ7fuWyuCS3Q9f4eHRR +zEzBxC0MNGvm/kFnoB/62X+F3j1t4RslNi792YLq3oTjLCl+BWU2gAGY/1fDDibG +pQqTMk3nD8QJtVaa8K8DHgW7oZYBLM6mP3XmbeFP9cgJDNpwFYPj8lgz1+WPOGNa +RyuDrtq+NV8EwWI4H3Z2qYNB1S2D2ZPR4F/5u0D/nUKNSuZXvQIpCy1K9HkGar2A +JtByOiILAgMBAAECggEBAKgWoJO6CbliXvQ1CPjolIlb7w77hBDPWvlRXtN+3npU +6n65LWmMZPdyNW6cEZ5xaKCGtkoCFpbIjdXf9CeBcJDGDqxYT44caAFm6yEr2sQ3 +eDQs+Y/deqrs6t3J5HP1P71jYNtp3CLw/6ZqfSGwdvxh5f9druVJb+DlksIGii9D +PRKIKWnSnp0doZNEvKHiEijqNKswKiKMaAvahY9q14rnmyyCpZSDwjZUMafXMqW3 +Rg7FOgpfKY+bM52tJqJ7Xl59Zy+sVrmDO7LxgI1XCcRoT6qM39STVvqiIKQ2AaHw +An2F0xelAeN2bFMp8wlTI0XHGbPhgXg34FFFmiLCe2ECgYEA88VrweuALsIjArjG +MP/6YMmD3ExIloBE51yEZwUYMeMgpzpFY1gYEBYiX6hh0vw/L0FaN9hNHF9NvPYW +E0gC3cMXAHeFKCF6GDRr+ipdFfq8URONK4LM7f7UckE83TPh72t8aqWOq02z1rCF +tKooZJBJQ1cCyaS5dHzSMHSiVHECgYEA788eV03AePkXzzFX1uiIsKjiia8ovwc+ +AJkP6PYrWeB1QS6GBTEKWerEmONMcTOACQ+JLtZ1sqpA+xoB1zuBhF+NHlfoQPoc +XTX+J+oZQy1Z/RwwyfNbUA2F12V7eQJ5xULvTwfU441eR/RHCCFp/TaMxoPSwCLk +Lcc+TCzBbDsCgYEAqfO60+EXZgINnKkr7B+a9P2pg95fQSY+Y7sZyCVCIA3ExzIW +DFPvus9juaNQSGN6vbxnZMXVxPEg5pv++gRbkzafg8DQQhFM6TErEqeUbG15+2CR +LIOt0kO2481d3K5+V4htnoC8PewXdJdvMGztamc53Mv98o14iqE3fXbjcdECgYEA +4VRwYgBA9mq4IItwyhK9PaGzG0RmuPiJHe60sGV+3ni2NIUOkRo/a7XY/P+2+Dc3 ++0uJz2TcOwEXBdquGBtl24gdBYH8TfG1bTAqnD6vdhvLDrXKcjgkeNf8ByToHBBj +cyMt0ci+FQLksB+sDsu216LGLFH5WWhvl0Q8GT+Ej7kCgYBqpt5Lm7I9GyeamJw3 +xGQBJp3WtAhk7loWvXQKlW9C8TQv4Qw5JMFL5qhC3/K7rFNbSYvqocB8QlHg7Zq/ +dWWr/JUdpTI5tMYhyr36edBpPGHt9IyJWdhJQWdKmejatMB6FF51wToAFCAWg25F +ER/vBLsWL/DJeqwZpx1bRrbwEQ== +-----END PRIVATE KEY----- From 90688696ac2b4587f3a006f528f757920dae83e5 Mon Sep 17 00:00:00 2001 From: J12934 <13718901+J12934@users.noreply.github.com> Date: Mon, 20 Jan 2020 11:12:35 +0100 Subject: [PATCH 027/102] Run sslyze tests against local server with self signed cert This should hopefuly make the tests less flaky as not external internet connection ist required --- .travis.yml | 2 +- docker-compose.demo.yml | 4 ++++ test/sslyze.test.js | 35 +++++++++++++++++++---------------- 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7649e8e3b2..2c7b7bcd45 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ env: - DEFAULT_TAG=unstable script: - cp test/.env.test .env - - docker-compose -f docker-compose.yml -f docker-compose.demo.yml up -d engine camundadb bodgeit juice-shop nginx scanner-infrastructure-nmap scanner-webapplication-arachni scanner-webapplication-zap scanner-infrastructure-amass scanner-infrastructure-sslyze scanner-webserver-nikto scanner-infrastructure-ssh + - docker-compose -f docker-compose.yml -f docker-compose.demo.yml up -d engine camundadb bodgeit juice-shop nginx unsafe-https scanner-infrastructure-nmap scanner-webapplication-arachni scanner-webapplication-zap scanner-infrastructure-amass scanner-infrastructure-sslyze scanner-webserver-nikto scanner-infrastructure-ssh - cd test - npm ci - npm test -- --verbose --forceExit diff --git a/docker-compose.demo.yml b/docker-compose.demo.yml index d4442b7bec..6410ed874e 100644 --- a/docker-compose.demo.yml +++ b/docker-compose.demo.yml @@ -18,3 +18,7 @@ services: - 8111:80 networks: - frontend + unsafe-https: + image: securecodebox/unsafe-https + networks: + - frontend diff --git a/test/sslyze.test.js b/test/sslyze.test.js index bf25b5f5a0..0ba3f77b02 100644 --- a/test/sslyze.test.js +++ b/test/sslyze.test.js @@ -1,15 +1,15 @@ const { startSecurityTest, Time } = require('./sdk'); test( - 'finds tls information for securecodebox.io', + 'finds tls information for host with self signed cert', async () => { const securityTest = await startSecurityTest({ context: 'securecodebox.io tls', metaData: {}, name: 'sslyze', target: { - name: 'www.securecodebox.io', - location: 'www.securecodebox.io', + name: 'unsafe-https server', + location: 'unsafe-https', attributes: {}, }, }); @@ -22,18 +22,23 @@ test( severity, })); + expect(findings).toContainEqual({ + name: 'Certificate is not trusted', + category: 'Certificate info', + severity: 'MEDIUM', + }); expect(findings).toContainEqual({ name: 'Must-Staple unsupported', category: 'Certificate info', severity: 'INFORMATIONAL', }); expect(findings).toContainEqual({ - name: 'Certificate includes SCTS count', + name: 'No extended validation certificate', category: 'Certificate info', severity: 'INFORMATIONAL', }); expect(findings).toContainEqual({ - name: 'No extended validation certificate', + name: 'No OCSP response', category: 'Certificate info', severity: 'INFORMATIONAL', }); @@ -43,13 +48,18 @@ test( severity: 'INFORMATIONAL', }); expect(findings).toContainEqual({ - name: 'Session resumption succeeded', + name: 'Session resumption failed', category: 'Resumption', - severity: 'INFORMATIONAL', + severity: 'LOW', }); expect(findings).toContainEqual({ - name: 'Session resumption succeeded', - category: 'Resumption', + name: 'TLSv1 supported', + category: 'TLSv1', + severity: 'LOW', + }); + expect(findings).toContainEqual({ + name: 'TLSv1.1 supported', + category: 'TLSv1.1', severity: 'INFORMATIONAL', }); expect(findings).toContainEqual({ @@ -57,13 +67,6 @@ test( category: 'TLSv1.2', severity: 'INFORMATIONAL', }); - - // Should only detect findings of 'informational' severity level and 1 TLSv1 finding - expect( - findings - .filter(({ severity }) => severity !== 'INFORMATIONAL') - .filter(({ name }) => name !== 'TLSv1 supported') - ).toEqual([]); }, 5 * Time.Minute ); From 412be21264ba17b3ba51066774929849018739af Mon Sep 17 00:00:00 2001 From: Yannik Fuhrmeister Date: Mon, 20 Jan 2020 11:43:41 +0100 Subject: [PATCH 028/102] change SSH integration Tests to match new testservice --- test/ssh.test.js | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/test/ssh.test.js b/test/ssh.test.js index 4d37191bba..9d7366f2a3 100644 --- a/test/ssh.test.js +++ b/test/ssh.test.js @@ -8,8 +8,8 @@ test( metaData: {}, name: 'ssh', target: { - name: 'www.iteratec.de ssh', - location: 'www.iteratec.de', + name: 'sshservice ssh', + location: 'sshservice', attributes: {}, }, }); @@ -25,7 +25,7 @@ test( severity, }) ); - + console.log(findings); expect(findings).toContainEqual({ category: 'SSH Service', name: 'SSH Service Information', @@ -34,17 +34,42 @@ test( }); expect(findings).toContainEqual({ + description: 'Deprecated / discouraged SSH key algorithms are used', category: 'SSH Policy Violation', + name: 'Insecure SSH Key Algorithms', + osi_layer: 'NETWORK', + severity: 'MEDIUM' + }); + + expect(findings).toContainEqual({ + description: 'Deprecated / discouraged SSH MAC algorithms are used', + category: 'SSH Policy Violation', + name: 'Insecure SSH MAC Algorithms', + osi_layer: 'NETWORK', + severity: 'MEDIUM' + }); + + expect(findings).toContainEqual({ description: 'Discouraged SSH authentication methods are used', + category: 'SSH Policy Violation', name: 'Discouraged SSH authentication methods', osi_layer: 'NETWORK', - severity: 'MEDIUM', + severity: 'MEDIUM' }); - expect( - findings + console.log(findings .filter(({ name }) => name !== 'SSH Service Information') + .filter(({ name }) => name !== 'Insecure SSH Key Algorithms') + .filter(({ name }) => name !== 'Insecure SSH MAC Algorithms') .filter(({ name }) => name !== 'Discouraged SSH authentication methods') + ); + expect( + findings + .filter(({ name }) => name !== 'SSH Service Information') + .filter(({ name }) => name !== 'Insecure SSH Key Algorithms') + .filter(({ name }) => name !== 'Insecure SSH MAC Algorithms') + .filter(({ name }) => name !== 'Discouraged SSH authentication methods') + ).toEqual([]); }, 2 * Time.Minute From 4d14a17df4928fe8b0284ae47105c9aa8ef037c0 Mon Sep 17 00:00:00 2001 From: Yannik Fuhrmeister Date: Mon, 20 Jan 2020 11:47:39 +0100 Subject: [PATCH 029/102] Adding new Image to Test Mozzilla ssh_scan --- docker-compose.demo.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docker-compose.demo.yml b/docker-compose.demo.yml index d4442b7bec..68878a0f06 100644 --- a/docker-compose.demo.yml +++ b/docker-compose.demo.yml @@ -18,3 +18,7 @@ services: - 8111:80 networks: - frontend + sshservice: + image: securecodebox/dummy-ssh + networks: + - frontend From 727007a62ced1cf7f638daf6dcd816fd35bc017c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Dec 2019 23:04:34 +0000 Subject: [PATCH 030/102] Bump handlebars from 4.1.2 to 4.5.3 in /test Bumps [handlebars](https://github.com/wycats/handlebars.js) from 4.1.2 to 4.5.3. - [Release notes](https://github.com/wycats/handlebars.js/releases) - [Changelog](https://github.com/wycats/handlebars.js/blob/master/release-notes.md) - [Commits](https://github.com/wycats/handlebars.js/compare/v4.1.2...v4.5.3) Signed-off-by: dependabot[bot] --- test/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/package-lock.json b/test/package-lock.json index 163209412b..04d1a3d618 100644 --- a/test/package-lock.json +++ b/test/package-lock.json @@ -2191,9 +2191,9 @@ "dev": true }, "handlebars": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", - "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz", + "integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==", "dev": true, "requires": { "neo-async": "^2.6.0", From 82005b02882ade011f93e9ba2be3358a393f80c8 Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach Date: Wed, 24 Apr 2019 15:27:19 +0200 Subject: [PATCH 031/102] Adds inital draft of multi tenancy docs --- docs/user-guide/README.md | 6 +++ docs/user-guide/multi-tenancy/README.md | 70 +++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 docs/user-guide/multi-tenancy/README.md diff --git a/docs/user-guide/README.md b/docs/user-guide/README.md index b12f261578..8c2cf906a8 100644 --- a/docs/user-guide/README.md +++ b/docs/user-guide/README.md @@ -107,3 +107,9 @@ The following links contain completes examples and explanations how to set up an ## Starting Scan-Processes using the CLI We have introduced a [simple secureCodeBox CLI](../../cli/README.md) which is based on the REST-API. This CLI can be used to configure and start Scan-Process or to integrate with you CI/CD Pipeline (e.g. Jenkins). + +## Multi Tenancy / Multi Environment Support + +When using the secureCodeBox in multiple independent teams all managing their own infrastructure you can run into numerous problems, from isolated services only availible in specific networks to aggresive firewalls blocking any automated scans. The secureCodeBox is designed to handle these situations. + +See the [Multi Tenancy Docs and Example](./multi-tenancy/README.md) diff --git a/docs/user-guide/multi-tenancy/README.md b/docs/user-guide/multi-tenancy/README.md new file mode 100644 index 0000000000..a4dde79093 --- /dev/null +++ b/docs/user-guide/multi-tenancy/README.md @@ -0,0 +1,70 @@ +# Multi Tenancy / Multi Environment Support + +The basic principle of multi-tenancy support in the secureCodeBox is to get the scanners running inside protected networks. This way the scanners are able to access the service directly without the interference of any firewall. The network connectivity between the scanner and the engine works, aslong as the scanner is able to send out http requests to the engine. The engine activly sends out requests to the scanner, it only responds to their incomming http requests. + +So in a multi-tenant / multi-environment secureCodeBox setup there would be two different types of scanner working on jobs. + +1. Specialized scanner, located in isolated networks, handling scans for these networks. +2. Default scanner handling Jobs without specific network access. + +To seperate which scanner should be able to work on which scan the secureCodeBox relies on the camunda user managment. Every scanner has to authenticate itself agaisnt the engine to communicate with it. The authentification and authorization system of camunda is structured into three main concepts: + +1. `Users`: The basic building block +2. `Authorizations`: A authorization represent a specific right. The are structure of a type of object, e.g. a "user", and a list of action allowed to be performed on the object, e.g. "create", "update". +3. `Groups`: A group is a collection of users asigning them a specifc role. The secureCodeBox creates three different roles by default. + 1. `camunda-admin` for administartion users, with the ability to do everything. + 2. `scanner` for the technical users of the scanners, with the ability to fetch scan jobs and submit results + 3. `continuousIntegration` to start security tests from ci systems like "jenkins" or "travis". +4. `Tenants`: A tenant groups together users from a business centric view. E.g. all users of a team would be part a of a tenant. + +## Example + +As an example, let imagine the following example: + +A company consisting of many different delopment teams has a shared secureCodeBox instance. "Team Blue" now wants to test their internal Payment Microservice which is running in a protected network. To get started the team sets up a camunda Tenant called: + +- "Team Blue" (id: "team_blue") + +And to users: + +- TeamBlueJenkins: (id: `team_blue_dispatcher`) (group: `continuousIntegration`) (tenant: `team_blue`) + +- TeamBlueZap: (id: `team_blue_internal_zap`) (group: `scanner`) (tenant: `team_blue`) + +The Scanner needs to be deployed in the network. The setup will depend on their network, e.g. when the network is a protected vpc in aws the scanner could be deployed via fargate in the same vpc. + +More generaly they want to get the scanner container running and provide it with three pieces of information: + +1. Address of the engine +2. Username of the technical user +3. Password of the technical user + +The most basic setup would be to just start a single container in the network, which could look like this: + +```bash +docker run -e ENGINE_BASIC_AUTH_USER="team_blue_internal_zap" -e ENGINE_BASIC_AUTH_PASSWORD="password" -e ENGINE_ADDRESS="https://engine.scb.my-organisation.com" securecodebox/zap:latest +``` + +Then the ci user can create security tests which can only be worked on by users of the tenant: + +```bash +PUT https://engine.scb.my-organisation.com/box/securityTests +[ + { + "name": "zap", + "context": "Payment Service Scan", + "tenant": "team_blue", + "target": { + "name": "Payment Service", + "location": "https://payment.service.testing.my-organisation.com", + "attributes": { + "ZAP_BASE_URL": "https://payment.service.testing.my-organisation.com" + } + } + } +] +``` + +The important piece of this definition is the tenant attribute of the securityTest. This indicates the engine the engine which tenant to start the securityTest with. If the tenant doesnt get specified the process will get started without a tenant and will be worked on by one of the default scanner. + +> Note: To start a securityTest as a tenant the starting user has to be a member of the tenant. From db0d6247fc67f0eb03e6d6d800edaf84820d5e7c Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach Date: Wed, 24 Apr 2019 16:09:09 +0200 Subject: [PATCH 032/102] Added scb_multi_tenancy.drawio --- docs/user-guide/multi-tenancy/scb_multi_tenancy.drawio | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/user-guide/multi-tenancy/scb_multi_tenancy.drawio diff --git a/docs/user-guide/multi-tenancy/scb_multi_tenancy.drawio b/docs/user-guide/multi-tenancy/scb_multi_tenancy.drawio new file mode 100644 index 0000000000..8a3d64143b --- /dev/null +++ b/docs/user-guide/multi-tenancy/scb_multi_tenancy.drawio @@ -0,0 +1 @@ +3Vlbl9o2EP41Pqd9yB5fwX4Elt00bRNO6Tnp9k3YwqixLVeWF8iv7whL+CLDZjdrSJcHmBnPyNI3F42E4czS3T1D+eZ3GuHEsM1oZzi3hm1bI8eHHyHZV5LA9ipBzEgklWrBknzFUmhKaUkiXLQUOaUJJ3lbGNIswyFvyRBjdNtWW9Ok/dYcxVgTLEOU6NLPJOKbSuqbZi1/j0m8kW921YMUKV0pKDYootuGyJkbzoxRyisq3c1wIrBTsFR2dyeeHufFcMa/xQDPQ/Rh+v7XT+5H0/p38e4+4H++s8fVMI8oKeWC5Wz5XiGw4WkClGU4U/2dchqPmHG8a4jkHO4xTTFne1CRTz1lIuPBrbhtja3tBpVs08DV8UfSp9Kf8XHkes1AyGU/B4KRBsF8xzHLkDD9iPmWsi8aKODNXJBlmtwxlAI53W4Ix8schUK+hWwAWQM7tULLCsQDtTZ4/dvE1fI1XAsclgzPoEZM6c6wRwlMYrpiQMWCKso8p7DeCKwgAyGfma6Eb+IboFEq4M1Whfj59HmyXIDR35OFbjBwPI/MNu72eKwhb41MHXnfGyqg3Z6crlCJyKOCZUEPI60pAGVmeAvfH+iqMEQVuVP6QDZMekZZlquUcDD6AxdlwotThh0X4AhqrGTB4xsaU0i3eS2dMlpmERbLNIGrdX6jNJfO+wdzvpcbBio5bacb3hH+lzC/8ST3IAcT9O2uyewVkwH+DSPBPqjxBFObHThldzKMClqyEJ9LEhksHLEY8zOK0qcCuLNRyXCCOHlsb159IXYwnTCG9g2FnJJMOPE48kIIGsE+bge75Xf2nOfpA1HNoA7241K+o/Doe9pbLDxe0Ck8/rULj+VdvJkwn9jzXLcHAGdsDoWAc2kE3DYC1vUh6Nt9BoXAaUOg+rnrQaAHwS/ZsaGc5HlCQqjRNBumvRybrfbSfaMg62H2RJGfZzHJ8OX7Q2vUQi7QM9SyepDzhgJOL9KtkGxvcFdop1+Elu3bA8E11hZ8ieZVNaJH5qHdlb56IyqD9Mk+VEbP6/Wh37fZmFowi/5NcxkEH28jzHBBvqLVQUEgJztf0PamhncLEpSQOANBiEXxBoEIYkiTZCIfpCSKDu5O0AonUxR+iQ+On9EEDlXivc768Ol1zLlg09LleL0lZ2w0r5D60si8Uc2YKtgV97zjQd3Py1HU1qYs6HpdQLh03fgKTbx/lbSTZ0ZFN5Lu5Jlx+JT7MY5+XqfTtB2v6fcn9cW11+BHv0ArB990zVHvbqfuM87sf/+X2qKu415eWzpnjJfWEvnyzn2lCvPhS4t+33uV64GfSH0oyNQxwCxg/J8v3nXZQSdZA1vvuy57l6B76RavEeRk0wnmkkNq9GCLdz8Mtp7fuacJhrunAbb+Q6nKl/pfOWf+Hw== \ No newline at end of file From 5d8dbc0192a3431771e84e78ab91b8067318a0c3 Mon Sep 17 00:00:00 2001 From: Robert Seedorff Date: Wed, 24 Apr 2019 16:18:36 +0200 Subject: [PATCH 033/102] Update scb_multi_tenancy.drawio --- docs/user-guide/multi-tenancy/scb_multi_tenancy.drawio | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user-guide/multi-tenancy/scb_multi_tenancy.drawio b/docs/user-guide/multi-tenancy/scb_multi_tenancy.drawio index 8a3d64143b..d448377da1 100644 --- a/docs/user-guide/multi-tenancy/scb_multi_tenancy.drawio +++ b/docs/user-guide/multi-tenancy/scb_multi_tenancy.drawio @@ -1 +1 @@ -3Vlbl9o2EP41Pqd9yB5fwX4Elt00bRNO6Tnp9k3YwqixLVeWF8iv7whL+CLDZjdrSJcHmBnPyNI3F42E4czS3T1D+eZ3GuHEsM1oZzi3hm1bI8eHHyHZV5LA9ipBzEgklWrBknzFUmhKaUkiXLQUOaUJJ3lbGNIswyFvyRBjdNtWW9Ok/dYcxVgTLEOU6NLPJOKbSuqbZi1/j0m8kW921YMUKV0pKDYootuGyJkbzoxRyisq3c1wIrBTsFR2dyeeHufFcMa/xQDPQ/Rh+v7XT+5H0/p38e4+4H++s8fVMI8oKeWC5Wz5XiGw4WkClGU4U/2dchqPmHG8a4jkHO4xTTFne1CRTz1lIuPBrbhtja3tBpVs08DV8UfSp9Kf8XHkes1AyGU/B4KRBsF8xzHLkDD9iPmWsi8aKODNXJBlmtwxlAI53W4Ix8schUK+hWwAWQM7tULLCsQDtTZ4/dvE1fI1XAsclgzPoEZM6c6wRwlMYrpiQMWCKso8p7DeCKwgAyGfma6Eb+IboFEq4M1Whfj59HmyXIDR35OFbjBwPI/MNu72eKwhb41MHXnfGyqg3Z6crlCJyKOCZUEPI60pAGVmeAvfH+iqMEQVuVP6QDZMekZZlquUcDD6AxdlwotThh0X4AhqrGTB4xsaU0i3eS2dMlpmERbLNIGrdX6jNJfO+wdzvpcbBio5bacb3hH+lzC/8ST3IAcT9O2uyewVkwH+DSPBPqjxBFObHThldzKMClqyEJ9LEhksHLEY8zOK0qcCuLNRyXCCOHlsb159IXYwnTCG9g2FnJJMOPE48kIIGsE+bge75Xf2nOfpA1HNoA7241K+o/Doe9pbLDxe0Ck8/rULj+VdvJkwn9jzXLcHAGdsDoWAc2kE3DYC1vUh6Nt9BoXAaUOg+rnrQaAHwS/ZsaGc5HlCQqjRNBumvRybrfbSfaMg62H2RJGfZzHJ8OX7Q2vUQi7QM9SyepDzhgJOL9KtkGxvcFdop1+Elu3bA8E11hZ8ieZVNaJH5qHdlb56IyqD9Mk+VEbP6/Wh37fZmFowi/5NcxkEH28jzHBBvqLVQUEgJztf0PamhncLEpSQOANBiEXxBoEIYkiTZCIfpCSKDu5O0AonUxR+iQ+On9EEDlXivc768Ol1zLlg09LleL0lZ2w0r5D60si8Uc2YKtgV97zjQd3Py1HU1qYs6HpdQLh03fgKTbx/lbSTZ0ZFN5Lu5Jlx+JT7MY5+XqfTtB2v6fcn9cW11+BHv0ArB990zVHvbqfuM87sf/+X2qKu415eWzpnjJfWEvnyzn2lCvPhS4t+33uV64GfSH0oyNQxwCxg/J8v3nXZQSdZA1vvuy57l6B76RavEeRk0wnmkkNq9GCLdz8Mtp7fuacJhrunAbb+Q6nKl/pfOWf+Hw== \ No newline at end of file +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 \ No newline at end of file From 1387c158b3e646edcec51ca591a3c6c509eea54b Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach Date: Wed, 24 Apr 2019 17:58:58 +0200 Subject: [PATCH 034/102] Update scb_multi_tenancy.drawio --- docs/user-guide/multi-tenancy/scb_multi_tenancy.drawio | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user-guide/multi-tenancy/scb_multi_tenancy.drawio b/docs/user-guide/multi-tenancy/scb_multi_tenancy.drawio index d448377da1..532040b4a9 100644 --- a/docs/user-guide/multi-tenancy/scb_multi_tenancy.drawio +++ b/docs/user-guide/multi-tenancy/scb_multi_tenancy.drawio @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file From 37939a27754994610ca43098d6cf8919843c9108 Mon Sep 17 00:00:00 2001 From: Robert Seedorff Date: Mon, 29 Apr 2019 21:12:13 +0200 Subject: [PATCH 035/102] Added scb_multi_tenancy.png --- .../multi-tenancy/scb_multi_tenancy.png | Bin 0 -> 46858 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/user-guide/multi-tenancy/scb_multi_tenancy.png diff --git a/docs/user-guide/multi-tenancy/scb_multi_tenancy.png b/docs/user-guide/multi-tenancy/scb_multi_tenancy.png new file mode 100644 index 0000000000000000000000000000000000000000..44f3ca8541ae26f7d4ba6bd15bba5f7962deb5eb GIT binary patch literal 46858 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 Rsav3b`sXj} Date: Mon, 29 Apr 2019 21:13:53 +0200 Subject: [PATCH 036/102] removed some typos and added image --- docs/user-guide/multi-tenancy/README.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/user-guide/multi-tenancy/README.md b/docs/user-guide/multi-tenancy/README.md index a4dde79093..a5e63057cd 100644 --- a/docs/user-guide/multi-tenancy/README.md +++ b/docs/user-guide/multi-tenancy/README.md @@ -1,13 +1,18 @@ # Multi Tenancy / Multi Environment Support -The basic principle of multi-tenancy support in the secureCodeBox is to get the scanners running inside protected networks. This way the scanners are able to access the service directly without the interference of any firewall. The network connectivity between the scanner and the engine works, aslong as the scanner is able to send out http requests to the engine. The engine activly sends out requests to the scanner, it only responds to their incomming http requests. +The basic principle of multi-tenancy support in the secureCodeBox is to get the *scanners running inside protected networks*. +This way the scanners are able to access the service directly without the interference of any firewall. The network connectivity between the scanner and the engine works, aslong as the scanner is able to send out http requests to the engine. + +> The engine never activly sends out requests to the scanner, the communication is always initiated asynchronize and by pulling from the scannner side. The Engine only responds to incomming http requests from the scanner. So in a multi-tenant / multi-environment secureCodeBox setup there would be two different types of scanner working on jobs. -1. Specialized scanner, located in isolated networks, handling scans for these networks. +1. Specialized scanner, located in isolated networks, handling scans especially for these networks. 2. Default scanner handling Jobs without specific network access. -To seperate which scanner should be able to work on which scan the secureCodeBox relies on the camunda user managment. Every scanner has to authenticate itself agaisnt the engine to communicate with it. The authentification and authorization system of camunda is structured into three main concepts: +![Diagram](scb_multi_tenancy.png) + +To seperate which scanner should be able to work on which scan the secureCodeBox relies on the camunda user managment. Every scanner has to authenticate itself against the engine to communicate with it. The authentification and authorization system of camunda is structured into three main concepts: 1. `Users`: The basic building block 2. `Authorizations`: A authorization represent a specific right. The are structure of a type of object, e.g. a "user", and a list of action allowed to be performed on the object, e.g. "create", "update". @@ -65,6 +70,6 @@ PUT https://engine.scb.my-organisation.com/box/securityTests ] ``` -The important piece of this definition is the tenant attribute of the securityTest. This indicates the engine the engine which tenant to start the securityTest with. If the tenant doesnt get specified the process will get started without a tenant and will be worked on by one of the default scanner. +The important piece of this definition is the *tenant* attribute of the securityTest. This definition indicates the engine which tenant to start the securityTest with. If the tenant doesn't get specified the process will get started without a tenant and will be worked on by one of the default scanner. > Note: To start a securityTest as a tenant the starting user has to be a member of the tenant. From ea89c5f9aa0788524139e07b217ef9761551b2f7 Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach Date: Tue, 30 Apr 2019 10:43:47 +0200 Subject: [PATCH 037/102] Applied automatic spellchecking --- docs/user-guide/multi-tenancy/README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/user-guide/multi-tenancy/README.md b/docs/user-guide/multi-tenancy/README.md index a5e63057cd..61ed3d60be 100644 --- a/docs/user-guide/multi-tenancy/README.md +++ b/docs/user-guide/multi-tenancy/README.md @@ -1,23 +1,23 @@ # Multi Tenancy / Multi Environment Support The basic principle of multi-tenancy support in the secureCodeBox is to get the *scanners running inside protected networks*. -This way the scanners are able to access the service directly without the interference of any firewall. The network connectivity between the scanner and the engine works, aslong as the scanner is able to send out http requests to the engine. +This way the scanners are able to access the service directly without the interference of any firewall. The network connectivity between the scanner and the engine works, as-long as the scanner is able to send out http requests to the engine. -> The engine never activly sends out requests to the scanner, the communication is always initiated asynchronize and by pulling from the scannner side. The Engine only responds to incomming http requests from the scanner. +> The engine never actively sends out requests to the scanner, the communication is always initiated asynchronously and by pulling from the scanner side. The Engine only responds to incoming http requests from the scanner. So in a multi-tenant / multi-environment secureCodeBox setup there would be two different types of scanner working on jobs. -1. Specialized scanner, located in isolated networks, handling scans especially for these networks. +1. Specialised scanner, located in isolated networks, handling scans especially for these networks. 2. Default scanner handling Jobs without specific network access. ![Diagram](scb_multi_tenancy.png) -To seperate which scanner should be able to work on which scan the secureCodeBox relies on the camunda user managment. Every scanner has to authenticate itself against the engine to communicate with it. The authentification and authorization system of camunda is structured into three main concepts: +To separate which scanner should be able to work on which scan the secureCodeBox relies on the camunda user management. Every scanner has to authenticate itself against the engine to communicate with it. The authentication and authorization system of camunda is structured into three main concepts: 1. `Users`: The basic building block -2. `Authorizations`: A authorization represent a specific right. The are structure of a type of object, e.g. a "user", and a list of action allowed to be performed on the object, e.g. "create", "update". -3. `Groups`: A group is a collection of users asigning them a specifc role. The secureCodeBox creates three different roles by default. - 1. `camunda-admin` for administartion users, with the ability to do everything. +2. `Authorization `: A authorization represent a specific right. The are structure of a type of object, e.g. a "user", and a list of action allowed to be performed on the object, e.g. "create", "update". +3. `Groups`: A group is a collection of users assigning them a specific role. The secureCodeBox creates three different roles by default. + 1. `camunda-admin` for administration users, with the ability to do everything. 2. `scanner` for the technical users of the scanners, with the ability to fetch scan jobs and submit results 3. `continuousIntegration` to start security tests from ci systems like "jenkins" or "travis". 4. `Tenants`: A tenant groups together users from a business centric view. E.g. all users of a team would be part a of a tenant. @@ -26,11 +26,11 @@ To seperate which scanner should be able to work on which scan the secureCodeBox As an example, let imagine the following example: -A company consisting of many different delopment teams has a shared secureCodeBox instance. "Team Blue" now wants to test their internal Payment Microservice which is running in a protected network. To get started the team sets up a camunda Tenant called: +A company consisting of many different deployment teams has a shared secureCodeBox instance. "Team Blue" now wants to test their internal payment microservice which is running in a protected network. To get started the team sets up a camunda Tenant called: - "Team Blue" (id: "team_blue") -And to users: +And two users: - TeamBlueJenkins: (id: `team_blue_dispatcher`) (group: `continuousIntegration`) (tenant: `team_blue`) @@ -38,7 +38,7 @@ And to users: The Scanner needs to be deployed in the network. The setup will depend on their network, e.g. when the network is a protected vpc in aws the scanner could be deployed via fargate in the same vpc. -More generaly they want to get the scanner container running and provide it with three pieces of information: +More generally they want to get the scanner container running and provide it with three pieces of information: 1. Address of the engine 2. Username of the technical user From cab991e27ce7e2706db90c1c2987197cf02dd36d Mon Sep 17 00:00:00 2001 From: Yannik Fuhrmeister Date: Mon, 20 Jan 2020 12:46:21 +0100 Subject: [PATCH 038/102] Adding network to ssh-service --- docker-compose.demo.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docker-compose.demo.yml b/docker-compose.demo.yml index dab570a34d..defc0d834b 100644 --- a/docker-compose.demo.yml +++ b/docker-compose.demo.yml @@ -18,8 +18,10 @@ services: - 8111:80 networks: - frontend - sshservice: + ssh-service: image: securecodebox/dummy-ssh + networks: + - frontend unsafe-https: image: securecodebox/unsafe-https networks: From 1e2ec63d184a92754b7e8d231888a75979b1a203 Mon Sep 17 00:00:00 2001 From: Yannik Fuhrmeister Date: Mon, 20 Jan 2020 12:47:14 +0100 Subject: [PATCH 039/102] change name of ssh-service --- test/ssh.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/ssh.test.js b/test/ssh.test.js index cad1330132..f0826c3e98 100644 --- a/test/ssh.test.js +++ b/test/ssh.test.js @@ -8,8 +8,8 @@ test( metaData: {}, name: 'ssh', target: { - name: 'sshservice ssh', - location: 'sshservice', + name: 'ssh-service ssh', + location: 'ssh-service', attributes: {}, }, }); From ad34c1cbe586d6c47b3fc44827d554feecf2538d Mon Sep 17 00:00:00 2001 From: Yannik Fuhrmeister Date: Mon, 20 Jan 2020 12:48:44 +0100 Subject: [PATCH 040/102] change context of ssh test --- test/ssh.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/ssh.test.js b/test/ssh.test.js index f0826c3e98..0302ed6169 100644 --- a/test/ssh.test.js +++ b/test/ssh.test.js @@ -4,7 +4,7 @@ test( 'finds a few low severity findings for iteratec.de', async () => { const securityTest = await startSecurityTest({ - context: 'www.iteratec.de ssh', + context: 'ssh-service ssh', metaData: {}, name: 'ssh', target: { From 8162032d7793d9bc3da52aa060f99b8ba22ce5ba Mon Sep 17 00:00:00 2001 From: Yannik Fuhrmeister Date: Mon, 20 Jan 2020 13:17:23 +0100 Subject: [PATCH 041/102] Change name for ssh-test --- test/ssh.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/ssh.test.js b/test/ssh.test.js index 0302ed6169..200cbd3e4a 100644 --- a/test/ssh.test.js +++ b/test/ssh.test.js @@ -1,7 +1,7 @@ const { startSecurityTest, Time } = require('./sdk'); test( - 'finds a few low severity findings for iteratec.de', + 'finds a few medium severity findings for ssh-service', async () => { const securityTest = await startSecurityTest({ context: 'ssh-service ssh', From 6f999b6c5885232890b949a448d3bc053a3a9e3d Mon Sep 17 00:00:00 2001 From: Yannik Fuhrmeister Date: Mon, 20 Jan 2020 13:30:22 +0100 Subject: [PATCH 042/102] Adding Dockerfile for ssh-service --- demo/Dockerfile | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 demo/Dockerfile diff --git a/demo/Dockerfile b/demo/Dockerfile new file mode 100644 index 0000000000..3a5b186ab6 --- /dev/null +++ b/demo/Dockerfile @@ -0,0 +1,15 @@ +FROM ubuntu:16.04 + +RUN apt-get update && apt-get install -y openssh-server +RUN mkdir /var/run/sshd +RUN echo 'root:THEPASSWORDYOUCREATED' | chpasswd +RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config + +# SSH login fix. Otherwise user is kicked off after login +RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd + +ENV NOTVISIBLE "in users profile" +RUN echo "export VISIBLE=now" >> /etc/profile + +EXPOSE 22 +CMD ["/usr/sbin/sshd", "-D"] From c45a68e57bdf2c0c9df7ecb84614ec3dabd8f1dc Mon Sep 17 00:00:00 2001 From: Yannik Fuhrmeister Date: Mon, 20 Jan 2020 13:32:02 +0100 Subject: [PATCH 043/102] Start ssh-service container --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 2c7b7bcd45..af1fc633ec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ env: - DEFAULT_TAG=unstable script: - cp test/.env.test .env - - docker-compose -f docker-compose.yml -f docker-compose.demo.yml up -d engine camundadb bodgeit juice-shop nginx unsafe-https scanner-infrastructure-nmap scanner-webapplication-arachni scanner-webapplication-zap scanner-infrastructure-amass scanner-infrastructure-sslyze scanner-webserver-nikto scanner-infrastructure-ssh + - docker-compose -f docker-compose.yml -f docker-compose.demo.yml up -d engine camundadb bodgeit juice-shop nginx unsafe-https scanner-infrastructure-nmap scanner-webapplication-arachni scanner-webapplication-zap scanner-infrastructure-amass scanner-infrastructure-sslyze scanner-webserver-nikto scanner-infrastructure-ssh ssh-service - cd test - npm ci - npm test -- --verbose --forceExit From 900f9bbdff5a716fd6134591c94378cdb72e2525 Mon Sep 17 00:00:00 2001 From: Yannik Fuhrmeister Date: Mon, 20 Jan 2020 13:33:15 +0100 Subject: [PATCH 044/102] move Dockerfile into ssh-service --- demo/{ => ssh-service}/Dockerfile | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename demo/{ => ssh-service}/Dockerfile (100%) diff --git a/demo/Dockerfile b/demo/ssh-service/Dockerfile similarity index 100% rename from demo/Dockerfile rename to demo/ssh-service/Dockerfile From c2cd8a603b2214bd81e7e1a06f5cce6a2346112a Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach <13718901+J12934@users.noreply.github.com> Date: Mon, 20 Jan 2020 13:57:09 +0100 Subject: [PATCH 045/102] Add license note --- demo/ssh-service/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/demo/ssh-service/Dockerfile b/demo/ssh-service/Dockerfile index 3a5b186ab6..d901627848 100644 --- a/demo/ssh-service/Dockerfile +++ b/demo/ssh-service/Dockerfile @@ -1,3 +1,5 @@ +# From https://docs.docker.com/engine/examples/running_ssh_service/ +# This file is authored by Docker Inc. and is not covered by the Apache2 Licence by the secureCodeBox project. FROM ubuntu:16.04 RUN apt-get update && apt-get install -y openssh-server From bfae78f3af7f535ac146a795665cb10856729548 Mon Sep 17 00:00:00 2001 From: J12934 <13718901+J12934@users.noreply.github.com> Date: Mon, 20 Jan 2020 15:09:14 +0100 Subject: [PATCH 046/102] Add docker-compose network to wpscan image --- docker-compose.demo.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docker-compose.demo.yml b/docker-compose.demo.yml index a4cb662090..b7880469da 100644 --- a/docker-compose.demo.yml +++ b/docker-compose.demo.yml @@ -1,4 +1,4 @@ -version: '2.1' +version: "2.1" services: juice-shop: image: bkimminich/juice-shop @@ -23,6 +23,8 @@ services: restart: always ports: - 8000:80 + networks: + - frontend ssh-service: image: securecodebox/dummy-ssh networks: From 2d191cfd5fcffacb0d8bc545e2178c58c4d08233 Mon Sep 17 00:00:00 2001 From: Jorge Estigarribia Date: Wed, 15 Jan 2020 11:09:40 +0100 Subject: [PATCH 047/102] Added ncrack test --- docker-compose.yml | 14 ++++++++++++++ test/ncrack.test.js | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 test/ncrack.test.js diff --git a/docker-compose.yml b/docker-compose.yml index 4b8341b508..28c932f2ae 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -155,6 +155,20 @@ services: - ENGINE_BASIC_AUTH_USER=${ENGINE_SCANNERSERVICES_USER} - ENGINE_BASIC_AUTH_PASSWORD=${ENGINE_SCANNERSERVICES_PASSWORD} + scanner-infrastructure-ncrack: + image: securecodebox/ncrack:${DEFAULT_TAG} + depends_on: + engine: + condition: service_healthy + networks: + - scanner + labels: + container_group: scanner + environment: + - ENGINE_ADDRESS=http://engine:8080 + - ENGINE_BASIC_AUTH_USER=${ENGINE_SCANNERSERVICES_USER} + - ENGINE_BASIC_AUTH_PASSWORD=${ENGINE_SCANNERSERVICES_PASSWORD} + persistence-elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.8.1 ports: diff --git a/test/ncrack.test.js b/test/ncrack.test.js new file mode 100644 index 0000000000..b65f5814fe --- /dev/null +++ b/test/ncrack.test.js @@ -0,0 +1,34 @@ +const { startSecurityTest, Time } = require('./sdk'); + +test( + 'bruteforce scan juiceshop', + async () => { + const securityTest = await startSecurityTest({ + context: 'BruteforceScanJuiceShop', + metaData: {}, + name: 'ncrack', + target: { + name: 'JuiceShop Container', + location: 'juice-shop', + attributes: { + NCRACK_PARAMETER: '--user admin --pass 1234', + }, + }, + }); + + const { report } = securityTest; + + const [finding1, ...otherFindings] = report.findings.map( + ({ description, category, name, osi_layer, severity }) => ({ + description, + category, + name, + osi_layer, + severity, + }) + ); + + expect(finding1).toEqual([]); + }, + 1 * Time.Minute +); \ No newline at end of file From 90306d5b910b473550f6f148e9dddc7753d5b373 Mon Sep 17 00:00:00 2001 From: Jorge Estigarribia Date: Wed, 15 Jan 2020 11:14:16 +0100 Subject: [PATCH 048/102] Changed ncrack network --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 28c932f2ae..eb0dfc01ac 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -161,7 +161,7 @@ services: engine: condition: service_healthy networks: - - scanner + - frontend labels: container_group: scanner environment: From 8c7f806881ae7e81854f96e061a280788a3f862d Mon Sep 17 00:00:00 2001 From: Jorge Estigarribia Date: Wed, 15 Jan 2020 11:28:17 +0100 Subject: [PATCH 049/102] Added scanner-infractructure-ncrack to travis.yaml --- .travis.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index af1fc633ec..9c3b526b6c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ env: - DEFAULT_TAG=unstable script: - cp test/.env.test .env - - docker-compose -f docker-compose.yml -f docker-compose.demo.yml up -d engine camundadb bodgeit juice-shop nginx unsafe-https scanner-infrastructure-nmap scanner-webapplication-arachni scanner-webapplication-zap scanner-infrastructure-amass scanner-infrastructure-sslyze scanner-webserver-nikto scanner-infrastructure-ssh ssh-service + - docker-compose -f docker-compose.yml -f docker-compose.demo.yml up -d engine camundadb bodgeit juice-shop nginx unsafe-https scanner-infrastructure-nmap scanner-webapplication-arachni scanner-webapplication-zap scanner-infrastructure-amass scanner-infrastructure-sslyze scanner-webserver-nikto scanner-infrastructure-ssh ssh-service scanner-infrastructure-ncrack - cd test - npm ci - npm test -- --verbose --forceExit @@ -27,4 +27,6 @@ after_failure: - docker-compose logs scanner-infrastructure-nmap - docker-compose logs scanner-infrastructure-sslyze - docker-compose logs scanner-infrastructure-ssh + - docker-compose logs scanner-infrastructure-ncrack - docker-compose logs scanner-webserver-nikto + \ No newline at end of file From 5027749b108a5f5ff5a9821130b4187b90f8a590 Mon Sep 17 00:00:00 2001 From: Jorge Estigarribia Date: Wed, 15 Jan 2020 13:51:04 +0100 Subject: [PATCH 050/102] Fixed ncrack test --- test/ncrack.test.js | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/test/ncrack.test.js b/test/ncrack.test.js index b65f5814fe..19b38a34c7 100644 --- a/test/ncrack.test.js +++ b/test/ncrack.test.js @@ -1,17 +1,17 @@ const { startSecurityTest, Time } = require('./sdk'); test( - 'bruteforce scan juiceshop', + 'bruteforce scan find credentials for camundadb', async () => { const securityTest = await startSecurityTest({ - context: 'BruteforceScanJuiceShop', + context: 'BruteforceScanCamundadb', metaData: {}, name: 'ncrack', target: { - name: 'JuiceShop Container', - location: 'juice-shop', + name: 'Camundadb Container', + location: 'mysql://camundadb', attributes: { - NCRACK_PARAMETER: '--user admin --pass 1234', + NCRACK_PARAMETER: '--user root --pass root', }, }, }); @@ -19,16 +19,28 @@ test( const { report } = securityTest; const [finding1, ...otherFindings] = report.findings.map( - ({ description, category, name, osi_layer, severity }) => ({ - description, + ({ category, osi_layer, severity, attributes }) => ({ category, - name, osi_layer, severity, + attributes, }) ); - expect(finding1).toEqual([]); + expect(finding1).toMatchObject({ + category: 'Discovered Credentials', + osi_layer: 'APPLICATION', + severity: 'HIGH', + attributes: { + "password": "root", + "port": "3306", + "protocol": "tcp", + "service": "mysql", + "username": "root", + }, + }); + + expect(otherFindings).toEqual([]); }, 1 * Time.Minute ); \ No newline at end of file From ceb11c60eb8d0604dd7d38e849fcd34836d1e4e6 Mon Sep 17 00:00:00 2001 From: Jorge Estigarribia Date: Fri, 17 Jan 2020 16:02:20 +0100 Subject: [PATCH 051/102] Added simple ncrack user guide --- docs/user-guide/scanprocesses/Ncrack.md | 72 +++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 docs/user-guide/scanprocesses/Ncrack.md diff --git a/docs/user-guide/scanprocesses/Ncrack.md b/docs/user-guide/scanprocesses/Ncrack.md new file mode 100644 index 0000000000..c8ac0da81c --- /dev/null +++ b/docs/user-guide/scanprocesses/Ncrack.md @@ -0,0 +1,72 @@ +--- +title: 'Nrack' +path: 'scanner/Nrack' +category: 'scanner' +usecase: 'Network Scanner' +release: 'https://img.shields.io/github/release/secureCodeBox/scanner-infrastructure-nrack.svg' +--- + +![Nrack logo](https://nmap.org/ncrack/images/ncrack_logo.png) + +> "Ncrack is a high-speed network authentication cracking tool. It was built to help companies secure their networks by proactively testing all their hosts and networking devices for poor passwords. Security professionals also rely on Ncrack when auditing their clients. Ncrack was designed using a modular approach, a command-line syntax similar to Nmap and a dynamic engine that can adapt its behaviour based on network feedback. It allows for rapid, yet reliable large-scale auditing of multiple hosts. Ncrack's features include a very flexible interface granting the user full control of network operations, allowing for very sophisticated bruteforcing attacks, timing templates for ease of use, runtime interaction similar to Nmap's and many more. Protocols supported include SSH, RDP, FTP, Telnet, HTTP(S), Wordpress, POP3(S), IMAP, CVS, SMB, VNC, SIP, Redis, PostgreSQL, MQTT, MySQL, MSSQL, MongoDB, Cassandra, WinRM, OWA, and DICOM " https://nmap.org/ncrack/ + + + + +## Configuration + +To configure this service specify the following environment variables: + +| Environment Variable | Value Example | +| -------------------------- | ------------- | +| ENGINE_ADDRESS | http://engine | +| ENGINE_BASIC_AUTH_USER | username | +| ENGINE_BASIC_AUTH_PASSWORD | 123456 | + + +For information how to start a scanner see [Starting Scan Processes](https://github.com/secureCodeBox/engine/wiki/Starting-Scan-Processes) + +## Example + +Example configuration: + +```json +[ + { + "name": "Ncrack", + "context": "SSH Credential Scans", + "target": { + "name": "Local SSH", + "location": "ssh://192.168.0.1", + "attributes": { + "NCRACK_PARAMTER": "--user root --pass 123456" + } + } + } +] +``` + +Example Output: + +```json +{ + "findings": [ + { + "name": "Credentials for Service ssh://192.168.0.1:22 discovered via bruteforce.", + "description": "", + "location": "ssh://192.168.0.1:22", + "category": "Discovered Credentials", + "severity": "HIGH", + "osi_layer": "APPLICATION", + "attributes": { + "username": "root", + "password": "123456", + "ip_address": "192.168.0.1", + "port": "22", + "protocol": "tcp", + "service": "ssh" + } + } + ] +} +``` From 75bf98cbdc5786643b3ab91c1d13a4a25595ca83 Mon Sep 17 00:00:00 2001 From: Jorge Estigarribia Date: Mon, 20 Jan 2020 16:23:04 +0100 Subject: [PATCH 052/102] Deleted provisory user guide --- docs/user-guide/scanprocesses/Ncrack.md | 72 ------------------------- 1 file changed, 72 deletions(-) delete mode 100644 docs/user-guide/scanprocesses/Ncrack.md diff --git a/docs/user-guide/scanprocesses/Ncrack.md b/docs/user-guide/scanprocesses/Ncrack.md deleted file mode 100644 index c8ac0da81c..0000000000 --- a/docs/user-guide/scanprocesses/Ncrack.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: 'Nrack' -path: 'scanner/Nrack' -category: 'scanner' -usecase: 'Network Scanner' -release: 'https://img.shields.io/github/release/secureCodeBox/scanner-infrastructure-nrack.svg' ---- - -![Nrack logo](https://nmap.org/ncrack/images/ncrack_logo.png) - -> "Ncrack is a high-speed network authentication cracking tool. It was built to help companies secure their networks by proactively testing all their hosts and networking devices for poor passwords. Security professionals also rely on Ncrack when auditing their clients. Ncrack was designed using a modular approach, a command-line syntax similar to Nmap and a dynamic engine that can adapt its behaviour based on network feedback. It allows for rapid, yet reliable large-scale auditing of multiple hosts. Ncrack's features include a very flexible interface granting the user full control of network operations, allowing for very sophisticated bruteforcing attacks, timing templates for ease of use, runtime interaction similar to Nmap's and many more. Protocols supported include SSH, RDP, FTP, Telnet, HTTP(S), Wordpress, POP3(S), IMAP, CVS, SMB, VNC, SIP, Redis, PostgreSQL, MQTT, MySQL, MSSQL, MongoDB, Cassandra, WinRM, OWA, and DICOM " https://nmap.org/ncrack/ - - - - -## Configuration - -To configure this service specify the following environment variables: - -| Environment Variable | Value Example | -| -------------------------- | ------------- | -| ENGINE_ADDRESS | http://engine | -| ENGINE_BASIC_AUTH_USER | username | -| ENGINE_BASIC_AUTH_PASSWORD | 123456 | - - -For information how to start a scanner see [Starting Scan Processes](https://github.com/secureCodeBox/engine/wiki/Starting-Scan-Processes) - -## Example - -Example configuration: - -```json -[ - { - "name": "Ncrack", - "context": "SSH Credential Scans", - "target": { - "name": "Local SSH", - "location": "ssh://192.168.0.1", - "attributes": { - "NCRACK_PARAMTER": "--user root --pass 123456" - } - } - } -] -``` - -Example Output: - -```json -{ - "findings": [ - { - "name": "Credentials for Service ssh://192.168.0.1:22 discovered via bruteforce.", - "description": "", - "location": "ssh://192.168.0.1:22", - "category": "Discovered Credentials", - "severity": "HIGH", - "osi_layer": "APPLICATION", - "attributes": { - "username": "root", - "password": "123456", - "ip_address": "192.168.0.1", - "port": "22", - "protocol": "tcp", - "service": "ssh" - } - } - ] -} -``` From 0301d33ac0e05b81e024c80d5cae4477ecc9daa9 Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach <13718901+J12934@users.noreply.github.com> Date: Mon, 20 Jan 2020 17:06:16 +0100 Subject: [PATCH 053/102] Delete obsolete nmap docs page The docs are now located in the individual repositories: https://github.com/secureCodeBox/scanner-infrastructure-nmap Or as a rendered version directly on the website https://www.securecodebox.io/scanner/Nmap --- docs/user-guide/scanprocesses/Nmap.md | 78 --------------------------- 1 file changed, 78 deletions(-) delete mode 100644 docs/user-guide/scanprocesses/Nmap.md diff --git a/docs/user-guide/scanprocesses/Nmap.md b/docs/user-guide/scanprocesses/Nmap.md deleted file mode 100644 index 3277c38d6a..0000000000 --- a/docs/user-guide/scanprocesses/Nmap.md +++ /dev/null @@ -1,78 +0,0 @@ -# Nmap Network Scanner - -The Nmap Network Scanner is a microservice that comes with -the default scanprocess collection -of the SecureCodeBox and utilizes the -[Nmap Security Scanner](https://nmap.org/). -The main purpose of the scanner is to identify open ports, -active hosts, active services or operating systems running -on a target system and using that information to find security vulnerabilities. -In addition there are lots of other powerful features -like the [Nmap Scripting Engine](https://nmap.org/book/nse.html) -for example, which can be used to write your own scripts -and run them against a specified target. For a detailed -description of Nmap please refer to the [Nmap Website](https://nmap.org/). - -## Configuration - -When the scanner is started the following variables need -to be configured: - -* `NMAP_CONTEXT`: The business context under which the scan should be executed -* `NMAP_TARGET`: The scanner target (e.g. localhost, 132.145.77.11, example.com, etc.) -* `NMAP_TARGET_NAME`: Specifies a name for the target (Used in the Results). -* `NMAP_CONFIGURATION_TYPE`: _default_ or _advanced_. When set to _advanced_, additional -options can be specified. -* `PROCESS_MARK_FALSE_POSITIVE`: Specifies if an additional task should be executed, which checks -for false-positive results - -For information how to start a scanner see [Starting Scan Processes](https://github.com/secureCodeBox/engine/wiki/Starting-Scan-Processes) - -### Advanced Configuration - -If the `NMAP_CONFIGURATION_TYPE` is set to _advanced_, you have the -option to change the `NMAP_TARGET` again. -Furthermore additional options for the Nmap parameters -can be defined. The most important options are: - -* `-p` xx: Scan ports of the target. Replace xx with a single port number or -a range of ports. -* `-PS`, `-PA`, `-PU` xx: Replace xx with the ports to scan. TCP SYN/ACK or -UDP discovery. -* `-sV`: Determine service and version info. -* `-O`: Determine OS info. -* `-A`: Determine service/version and OS info. -* `-script` xx: Replace xx with the script name. Start the scan with the given script. -* `--script` xx: Replace xx with a coma-separated list of scripts. Start the scan with the given scripts. - -A list of options is available in the input form of the scanner configuration. -For a detailed explanation refer to the [Nmap Reference Guide](https://nmap.org/book/man.html). - -## Results - -Like all SecureCodeBox scanners the Nmap scanner returns a report which contains a list of findings. Each of the findings contains the following entries: -* `id` -* `name` -* `description` -* `category` -* `osiLayer` -* `severity` -* `reference` -* `hint` -* `location` -* `attributes` - -For a detailed description of these fields, refer to [Add reference here, when existing](). - -The `attributes` field contains the following: - -* `port`: When an open port is found, this specifies the port number -* `ip_address`: The IP Address of the scanned host -* `mac_address`: The MAC Address of the scanned host -* `protocol`: The protocol, which was used by the scanner -* `start`: The start time of the scan -* `end`: The end time of the scan -* `state`: The state of the port (open, filtered, closed, unfiltered) -* `service`: The service running on the port - -Note: The `PROCESS_RAW_FINDINGS` field of the Camunda process contains the unparsed and unfiltered XML-output of the Nmap scan. From 8d0967f0f0c7d376595d42e31ee19af32ee18431 Mon Sep 17 00:00:00 2001 From: Sven Strittmatter Date: Tue, 21 Jan 2020 14:53:28 +0100 Subject: [PATCH 054/102] Use the new URI Signed-off-by: Sven Strittmatter --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5358e5baed..c1aa984925 100644 --- a/README.md +++ b/README.md @@ -191,7 +191,7 @@ Sponsored by [iteratec GmbH](https://www.iteratec.de/) - [consul]: https://www.consul.io/ [microservices]: https://martinfowler.com/articles/microservices.html [beta-testers]: https://www.securecodebox.io/ -[owasp]: https://www.owasp.org/index.php/OWASP_secureCodeBox +[owasp]: https://owasp.org/www-project-securecodebox/ [objspec]: https://www.sigs-datacom.de/fachzeitschriften/objektspektrum.html [secdevops-objspec]: http://www.sigs.de/public/ots/2017/OTS_DevOps_2017/Seedorff_Pfaender_OTS_%20DevOps_2017.pdf [jenkins]: https://jenkins.io/ From 5b0ae2e622792b119a7fa9479b55790b7ebff13c Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach <13718901+J12934@users.noreply.github.com> Date: Wed, 22 Jan 2020 10:10:56 +0100 Subject: [PATCH 055/102] Correct grammar misstakes --- docs/user-guide/multi-tenancy/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/user-guide/multi-tenancy/README.md b/docs/user-guide/multi-tenancy/README.md index 61ed3d60be..9da9217b6a 100644 --- a/docs/user-guide/multi-tenancy/README.md +++ b/docs/user-guide/multi-tenancy/README.md @@ -15,7 +15,7 @@ So in a multi-tenant / multi-environment secureCodeBox setup there would be two To separate which scanner should be able to work on which scan the secureCodeBox relies on the camunda user management. Every scanner has to authenticate itself against the engine to communicate with it. The authentication and authorization system of camunda is structured into three main concepts: 1. `Users`: The basic building block -2. `Authorization `: A authorization represent a specific right. The are structure of a type of object, e.g. a "user", and a list of action allowed to be performed on the object, e.g. "create", "update". +2. `Authorization `: An authorization represent a specific right. The are structure of a type of object, e.g. a "user", and a list of action allowed to be performed on the object, e.g. "create", "update". 3. `Groups`: A group is a collection of users assigning them a specific role. The secureCodeBox creates three different roles by default. 1. `camunda-admin` for administration users, with the ability to do everything. 2. `scanner` for the technical users of the scanners, with the ability to fetch scan jobs and submit results @@ -70,6 +70,6 @@ PUT https://engine.scb.my-organisation.com/box/securityTests ] ``` -The important piece of this definition is the *tenant* attribute of the securityTest. This definition indicates the engine which tenant to start the securityTest with. If the tenant doesn't get specified the process will get started without a tenant and will be worked on by one of the default scanner. +The most important piece of this definition is the *tenant* attribute of the securityTest. This definition indicates the engine which tenant to start the securityTest with. If the tenant doesn't get specified the process will get started without a tenant and will be worked on by one of the default scanner. > Note: To start a securityTest as a tenant the starting user has to be a member of the tenant. From c86c72283ab887363ea0d2352e00368968896045 Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach <13718901+J12934@users.noreply.github.com> Date: Wed, 22 Jan 2020 10:23:55 +0100 Subject: [PATCH 056/102] =?UTF-8?q?Add=20"=F0=9F=95=B7=20Security=20Scanne?= =?UTF-8?q?r"=20release=20category?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/release-drafter.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml index eeb02b0400..a630cf1c4b 100644 --- a/.github/release-drafter.yml +++ b/.github/release-drafter.yml @@ -13,6 +13,8 @@ categories: label: 'docs' - title: '📌 Dependencies' label: 'dependencies' + - title: '🕷 Security Scanner' + label: 'security scanner' change-template: '- $TITLE @$AUTHOR (#$NUMBER)' exclude-labels: - 'skip-changelog' From 544e5839ec120ddfe257e751cec1a1c45eeb81c1 Mon Sep 17 00:00:00 2001 From: J12934 <13718901+J12934@users.noreply.github.com> Date: Thu, 23 Jan 2020 11:17:07 +0100 Subject: [PATCH 057/102] Autoformat --- test/ssh.test.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/test/ssh.test.js b/test/ssh.test.js index 200cbd3e4a..bcd9738ea2 100644 --- a/test/ssh.test.js +++ b/test/ssh.test.js @@ -38,7 +38,7 @@ test( category: 'SSH Policy Violation', name: 'Insecure SSH Key Algorithms', osi_layer: 'NETWORK', - severity: 'MEDIUM' + severity: 'MEDIUM', }); expect(findings).toContainEqual({ @@ -46,7 +46,7 @@ test( category: 'SSH Policy Violation', name: 'Insecure SSH MAC Algorithms', osi_layer: 'NETWORK', - severity: 'MEDIUM' + severity: 'MEDIUM', }); expect(findings).toContainEqual({ @@ -54,10 +54,11 @@ test( category: 'SSH Policy Violation', name: 'Discouraged SSH authentication methods', osi_layer: 'NETWORK', - severity: 'MEDIUM' + severity: 'MEDIUM', }); - console.log(findings + console.log( + findings .filter(({ name }) => name !== 'SSH Service Information') .filter(({ name }) => name !== 'Insecure SSH Key Algorithms') .filter(({ name }) => name !== 'Insecure SSH MAC Algorithms') @@ -65,11 +66,10 @@ test( ); expect( findings - .filter(({ name }) => name !== 'SSH Service Information') - .filter(({ name }) => name !== 'Insecure SSH Key Algorithms') - .filter(({ name }) => name !== 'Insecure SSH MAC Algorithms') - .filter(({ name }) => name !== 'Discouraged SSH authentication methods') - + .filter(({ name }) => name !== 'SSH Service Information') + .filter(({ name }) => name !== 'Insecure SSH Key Algorithms') + .filter(({ name }) => name !== 'Insecure SSH MAC Algorithms') + .filter(({ name }) => name !== 'Discouraged SSH authentication methods') ).toEqual([]); }, 2 * Time.Minute From a01d2715b9cf4d7e75309d84aa63249dde310d52 Mon Sep 17 00:00:00 2001 From: J12934 <13718901+J12934@users.noreply.github.com> Date: Thu, 23 Jan 2020 11:18:00 +0100 Subject: [PATCH 058/102] Removed debug console logs --- test/ssh.test.js | 9 +-------- test/wpscan.test.js | 2 -- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/test/ssh.test.js b/test/ssh.test.js index bcd9738ea2..d5c946e16b 100644 --- a/test/ssh.test.js +++ b/test/ssh.test.js @@ -25,7 +25,7 @@ test( severity, }) ); - console.log(findings); + expect(findings).toContainEqual({ category: 'SSH Service', name: 'SSH Service Information', @@ -57,13 +57,6 @@ test( severity: 'MEDIUM', }); - console.log( - findings - .filter(({ name }) => name !== 'SSH Service Information') - .filter(({ name }) => name !== 'Insecure SSH Key Algorithms') - .filter(({ name }) => name !== 'Insecure SSH MAC Algorithms') - .filter(({ name }) => name !== 'Discouraged SSH authentication methods') - ); expect( findings .filter(({ name }) => name !== 'SSH Service Information') diff --git a/test/wpscan.test.js b/test/wpscan.test.js index ab3c629a8f..9eeeda9d6e 100644 --- a/test/wpscan.test.js +++ b/test/wpscan.test.js @@ -18,8 +18,6 @@ test( const [finding, ...otherFindings] = report.findings; - console.log(report.findings); - expect(finding).toMatchObject({ name: 'CMS Wordpress', category: 'CMS Wordpress', From 596041ad2797d902755b5f12e000ea4bfd44f7e5 Mon Sep 17 00:00:00 2001 From: J12934 <13718901+J12934@users.noreply.github.com> Date: Thu, 23 Jan 2020 11:19:37 +0100 Subject: [PATCH 059/102] Autoformat --- docs/user-guide/multi-tenancy/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/user-guide/multi-tenancy/README.md b/docs/user-guide/multi-tenancy/README.md index 9da9217b6a..f7d1016db5 100644 --- a/docs/user-guide/multi-tenancy/README.md +++ b/docs/user-guide/multi-tenancy/README.md @@ -1,6 +1,6 @@ # Multi Tenancy / Multi Environment Support -The basic principle of multi-tenancy support in the secureCodeBox is to get the *scanners running inside protected networks*. +The basic principle of multi-tenancy support in the secureCodeBox is to get the _scanners running inside protected networks_. This way the scanners are able to access the service directly without the interference of any firewall. The network connectivity between the scanner and the engine works, as-long as the scanner is able to send out http requests to the engine. > The engine never actively sends out requests to the scanner, the communication is always initiated asynchronously and by pulling from the scanner side. The Engine only responds to incoming http requests from the scanner. @@ -15,7 +15,7 @@ So in a multi-tenant / multi-environment secureCodeBox setup there would be two To separate which scanner should be able to work on which scan the secureCodeBox relies on the camunda user management. Every scanner has to authenticate itself against the engine to communicate with it. The authentication and authorization system of camunda is structured into three main concepts: 1. `Users`: The basic building block -2. `Authorization `: An authorization represent a specific right. The are structure of a type of object, e.g. a "user", and a list of action allowed to be performed on the object, e.g. "create", "update". +2. `Authorization`: An authorization represent a specific right. The are structure of a type of object, e.g. a "user", and a list of action allowed to be performed on the object, e.g. "create", "update". 3. `Groups`: A group is a collection of users assigning them a specific role. The secureCodeBox creates three different roles by default. 1. `camunda-admin` for administration users, with the ability to do everything. 2. `scanner` for the technical users of the scanners, with the ability to fetch scan jobs and submit results @@ -70,6 +70,6 @@ PUT https://engine.scb.my-organisation.com/box/securityTests ] ``` -The most important piece of this definition is the *tenant* attribute of the securityTest. This definition indicates the engine which tenant to start the securityTest with. If the tenant doesn't get specified the process will get started without a tenant and will be worked on by one of the default scanner. +The most important piece of this definition is the _tenant_ attribute of the securityTest. This definition indicates the engine which tenant to start the securityTest with. If the tenant doesn't get specified the process will get started without a tenant and will be worked on by one of the default scanner. > Note: To start a securityTest as a tenant the starting user has to be a member of the tenant. From 9d6c73015ea3f82b1b7f112f8171a05598e49def Mon Sep 17 00:00:00 2001 From: J12934 <13718901+J12934@users.noreply.github.com> Date: Thu, 23 Jan 2020 11:19:51 +0100 Subject: [PATCH 060/102] Correct missing 's' --- docs/user-guide/multi-tenancy/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user-guide/multi-tenancy/README.md b/docs/user-guide/multi-tenancy/README.md index f7d1016db5..f048828557 100644 --- a/docs/user-guide/multi-tenancy/README.md +++ b/docs/user-guide/multi-tenancy/README.md @@ -15,7 +15,7 @@ So in a multi-tenant / multi-environment secureCodeBox setup there would be two To separate which scanner should be able to work on which scan the secureCodeBox relies on the camunda user management. Every scanner has to authenticate itself against the engine to communicate with it. The authentication and authorization system of camunda is structured into three main concepts: 1. `Users`: The basic building block -2. `Authorization`: An authorization represent a specific right. The are structure of a type of object, e.g. a "user", and a list of action allowed to be performed on the object, e.g. "create", "update". +2. `Authorization`: An authorization represents a specific right. The are structure of a type of object, e.g. a "user", and a list of action allowed to be performed on the object, e.g. "create", "update". 3. `Groups`: A group is a collection of users assigning them a specific role. The secureCodeBox creates three different roles by default. 1. `camunda-admin` for administration users, with the ability to do everything. 2. `scanner` for the technical users of the scanners, with the ability to fetch scan jobs and submit results From e26452f2357f77a25be0d8de53204d379ac2be9e Mon Sep 17 00:00:00 2001 From: Jorge Estigarribia Date: Tue, 28 Jan 2020 15:28:14 +0100 Subject: [PATCH 061/102] Changed archetype related part --- docs/developer-guide/README.md | 53 +++++++++++++++++++++++++++------- 1 file changed, 42 insertions(+), 11 deletions(-) diff --git a/docs/developer-guide/README.md b/docs/developer-guide/README.md index 20804693ee..560a4e78dc 100644 --- a/docs/developer-guide/README.md +++ b/docs/developer-guide/README.md @@ -26,28 +26,60 @@ We either have a [static API documentation](./api-doc.md) or a living API docume To integrate a new scanner into the secureCodeBox Engine you need to write a plugin. This plugins contains a BPMN Model of your Scan Process. This Model defines the following aspects: -* Name and ID of the process. +* Name and ID of the process: e.g. `ncrack-process` (see [coding guidelines](#coding-guidelines) below). * A topic name for the task queue (e.g. `nikto_webserverscan`). Every scanner has at minimum one queue in which the pending scan jobs are inserted by the secureCodeBox engine to be completed by the scan services. These queues are defined as External Service Tasks in Camunda. * The transformation of scanner results. If the scanner results are returned in an incompatible format of the secureCodeBox Finding Format, the data can be transformed inside the engine before persisting it. This transformation can also be done within the scan service. * You can implement the four eye principle by the process. -To quickly create a new process model you can simply run our maven archetype: +To run the next steps you first have to make sure you have **Java 8** installed and then run the following command into the main folder (engine) to compile the stack: + +``` +mvn install +``` + +To quickly create a new process model you can simply run our maven archetype into the scan-procesess folder (engine/scb-scanprocesess): ``` mvn archetype:generate \ -DarchetypeGroupId=io.securecodebox.scanprocesses \ -DarchetypeArtifactId=archetype-process \ -DarchetypeVersion=0.0.1-SNAPSHOT -``` - -This process only contains the bare minimum of logic in the process model. Now go into your process folder (engine/scb-scanprocesses) and run: -``` -mvn install ``` +During this process you will be asked to provide a attributes to generate the archetype, e.g. + +> groupId: io.securecodebox.scanprocesses +> artifactId: ncrack-process +> version: 1.0-SNAPSHOT +> package: io.securecodebox.scanprocesses +> processName: ncrack-process +> processTopic: ncrack_brute_force_scan + + + +After this step you should extend two files with the new scanner: + +1. The first one is the Dockerfile (engine/Dockerfile) e.g. + + > COPY --from=builder ./scb-scanprocesses/ncrack-process/target/scrack-process-0.0.1-SNAPSHOT.jar /scb-engine/lib/ + +2. The second one is the Pom.xml (engine/scb-engine/pom.xml) e.g. + + > + > + > ​ io.securecodebox.scanprocesses + > + > ​ ncrack-process + > + > ​ 0.0.1-SNAPSHOT + > + > ​ runtime + > + > + Copy the process jar file from the traget folder of your process to the engines plugins folder. Restart the engine and you can interact with the following curl commands with your process: -To get and lock an job you execute the following curl. Please replace `` with the host of your secureCodeBox and `` with the previously configured `processTopic`. +To get and lock a job you execute the following curl. Please replace `` with the host of your secureCodeBox and `` with the previously configured `processTopic`. ``` curl -X POST 'http://:8080/box/jobs/lock//29bf7fd3-8512-4d73-a22f-608e493cd726' -H 'accept: application/json' ``` @@ -77,7 +109,6 @@ curl -X POST 'http://:8080/box/jobs//result' -H 'Conte - To edit these models, Camunda provides a free modelling tool for the BPMN models which you can [download here](https://camunda.com/products/modeler/). Feel free to get inspiration from the [prepackaged processes here](https://github.com/secureCodeBox/engine/tree/master/scb-scanprocesses). @@ -114,7 +145,7 @@ The Forms are HTML Documents with embedded AngularJS code for custom logic. There are some parts, both logic and definitions, which are shared across processes. These pieces are extracted into their own module. You can include this module in your own code and reuse it. > **Hint**: If you write your scanner in a JVM language you can use the report and finding definitions inside the scanner not just inside the engine plugin. - + # Guidelines ## Coding Guidelines @@ -146,7 +177,7 @@ We're using snake_case (lower case) for json attributes. If an enum type is used }, "location": "tcp://127.0.0.1:3306" } -``` +``` ### Topic Names for External Tasks Topics for external tasks for specific technologies are named as follows: ``` From c0dc70372c976dbf82c12d46973455e840608f2c Mon Sep 17 00:00:00 2001 From: Jorge Estigarribia Date: Tue, 28 Jan 2020 16:20:45 +0100 Subject: [PATCH 062/102] Changed camunda related part --- docs/developer-guide/README.md | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/docs/developer-guide/README.md b/docs/developer-guide/README.md index 560a4e78dc..6cfca747ca 100644 --- a/docs/developer-guide/README.md +++ b/docs/developer-guide/README.md @@ -55,8 +55,6 @@ During this process you will be asked to provide a attributes to generate the ar > processName: ncrack-process > processTopic: ncrack_brute_force_scan - - After this step you should extend two files with the new scanner: 1. The first one is the Dockerfile (engine/Dockerfile) e.g. @@ -117,9 +115,18 @@ Feel free to get inspiration from the [prepackaged processes here](https://githu If you copied a process model you need to change a few things according to your new scan process: * Update the **name** and **id** of the process. You can edit this in side-panel on the right hand side of the Camunda Editor once you opened the model. + +* Update the **Start-Event** of the process to reference on the process-specific form e.g. `ressource/bmpn/forms/ncrack/configure-target.html` + * Update the **topic-name** of the External Service Task. -* Update the references to configuration **forms** to your own configuration forms. See [Creating configuration forms](#configforms) - + +* Update the references to configuration **forms** to your own configuration forms. See [Creating configuration forms](#creating-configuration-forms) + +* Several targets in the configure form is now deprecated. Form should only support a single target. + +* `camForm.variableManager.destroyVariable('PROCESS_TARGETS');` does not work in the form because the variable does not normally exist. + + ### Integrate your process model with the engine From 392a20d4aa2d4dcdb426a144bafb467fc9d4a793 Mon Sep 17 00:00:00 2001 From: Sven Strittmatter Date: Wed, 29 Jan 2020 08:44:26 +0100 Subject: [PATCH 063/102] Use new invite link for Slack Signed-off-by: Sven Strittmatter --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c1aa984925..2963370f66 100644 --- a/README.md +++ b/README.md @@ -220,5 +220,5 @@ Sponsored by [iteratec GmbH](https://www.iteratec.de/) - [scb-github]: https://github.com/secureCodeBox/ [scb-engine]: https://github.com/secureCodeBox/engine [scb-twitter]: https://twitter.com/secureCodeBox -[scb-slack]: https://join.slack.com/t/securecodebox/shared_invite/enQtNDU3MTUyOTM0NTMwLTJiNzg3MmU2ZDY2NDFiMGI0Y2FkM2I5Mzc2ZmEzYTcyN2FlN2Y2NDFiZDE5NjAxMjg1M2IxNDViNzE3OTIxMGU +[scb-slack]: https://join.slack.com/t/securecodebox/shared_invite/enQtNDU3MTUyOTM0NTMwLTBjOWRjNjVkNGEyMjQ0ZGMyNDdlYTQxYWQ4MzNiNGY3MDMxNThkZjJmMzY2NDRhMTk3ZWM3OWFkYmY1YzUxNTU [scb-license]: https://github.com/secureCodeBox/secureCodeBox/blob/master/LICENSE From 19f44275347f660a2c080fff3630bef60ab3972f Mon Sep 17 00:00:00 2001 From: Sven Strittmatter Date: Wed, 29 Jan 2020 09:19:48 +0100 Subject: [PATCH 064/102] Use new invite link for Slack Signed-off-by: Sven Strittmatter --- docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index 072cb1c394..abb1ab0681 100644 --- a/docs/index.md +++ b/docs/index.md @@ -21,5 +21,5 @@ Code of secureCodeBox is licensed under the [Apache License 2.0][scb-license]. [scb-github]: https://github.com/secureCodeBox/secureCodeBox [scb-twitter]: https://twitter.com/secureCodeBox -[scb-slack]: https://join.slack.com/t/securecodebox/shared_invite/enQtMzc2MTIxNDg2NzIwLTI1MWUzNzVmZTY5MWNkMmQwNTA1YjZmYjQyM2FhY2ZiYjBlNmVkYWVjZWUxZTY1OTk1MTlmNmI0ZGJjZGIxYzU +[scb-slack]: https://join.slack.com/t/securecodebox/shared_invite/enQtNDU3MTUyOTM0NTMwLTBjOWRjNjVkNGEyMjQ0ZGMyNDdlYTQxYWQ4MzNiNGY3MDMxNThkZjJmMzY2NDRhMTk3ZWM3OWFkYmY1YzUxNTU [scb-license]: https://github.com/secureCodeBox/secureCodeBox/blob/master/LICENSE From 9fbc79ab0176a789af1f4f76b6603693a79a0e3f Mon Sep 17 00:00:00 2001 From: Yannik Fuhrmeister Date: Wed, 26 Feb 2020 11:21:36 +0100 Subject: [PATCH 065/102] Fix gitignore Syntax I inserted a new line to make sure changes on *.template.json and other files specified are included in git --- cli/.gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cli/.gitignore b/cli/.gitignore index 61c29efbf8..0b1b0ecea8 100644 --- a/cli/.gitignore +++ b/cli/.gitignore @@ -1,5 +1,6 @@ * + !*.template.json !README.html !run_scanner.sh -!.gitignore \ No newline at end of file +!.gitignore From 5ebd446605a303139920634d1c8fba83d7718983 Mon Sep 17 00:00:00 2001 From: Yannik Fuhrmeister Date: Wed, 26 Feb 2020 11:24:21 +0100 Subject: [PATCH 066/102] Fix process name It seems that the process name for combining nmap and nikto has changed so i changed the process name in the template from nmap-nikto to combined-nmap-nikto --- cli/nmap-nikto.template.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/nmap-nikto.template.json b/cli/nmap-nikto.template.json index de961317d2..cca02067e2 100644 --- a/cli/nmap-nikto.template.json +++ b/cli/nmap-nikto.template.json @@ -1,7 +1,7 @@ [ { "context": "%CONTEXT%", - "name": "nmap-nikto", + "name": "combined-nmap-nikto", "target": { "location": "%HOST%", "name": "%TARGET_NAME%" From ec45af4756d0b3729493bf1ab309ba92c17452e7 Mon Sep 17 00:00:00 2001 From: Yannik Fuhrmeister Date: Wed, 11 Mar 2020 08:18:36 +0100 Subject: [PATCH 067/102] Adding Basic integration Test for combined nmap nikto scans --- test/combined-nmap-nikto.test.js | 49 ++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 test/combined-nmap-nikto.test.js diff --git a/test/combined-nmap-nikto.test.js b/test/combined-nmap-nikto.test.js new file mode 100644 index 0000000000..c4ad62e1af --- /dev/null +++ b/test/combined-nmap-nikto.test.js @@ -0,0 +1,49 @@ +const { startSecurityTest, Time } = require('./sdk'); + +test( + 'finds open 3000 port of juiceshop', + async () => { + const securityTest = await startSecurityTest({ + context: 'JuiceShopPortScan', + metaData: {}, + name: 'combined-nmap-nikto', + target: { + name: 'JuiceShop Container', + location: 'juice-shop', + attributes: { + NIKTO_PORTS: "3000", + COMBINED_NMAP_NIKTO_PORTS: "80, 443, 3000, 8080, 8443", + }, + }, + }); + + const { report } = securityTest; + + const [finding1, finding2, finding3, ...otherFindings] = report.findings.map( + ({ name, osi_layer, severity }) => ({ + name, + osi_layer, + severity, + }) + ); + + expect(finding1).toMatchObject({ + name: 'Retrieved x-powered-by header: Express', + osi_layer: 'APPLICATION', + severity: 'INFORMATIONAL', + }); + + expect(finding2).toMatchObject({ + name: 'Retrieved access-control-allow-origin header: *', + osi_layer: 'APPLICATION', + severity: 'INFORMATIONAL' + }); + + expect(finding3).toMatchObject({ + name: 'The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS', + osi_layer: 'APPLICATION', + severity: 'INFORMATIONAL' + }); + }, + 5 * Time.Minute +); \ No newline at end of file From d95a03b4cef43024d642ad1904a67dbe8e23b730 Mon Sep 17 00:00:00 2001 From: Yannik Fuhrmeister Date: Wed, 11 Mar 2020 08:23:25 +0100 Subject: [PATCH 068/102] Updating nikto test --- test/nikto.test.js | 43 +++++++++++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/test/nikto.test.js b/test/nikto.test.js index 9905ce046e..79d2db4bf2 100644 --- a/test/nikto.test.js +++ b/test/nikto.test.js @@ -1,30 +1,49 @@ const { startSecurityTest, Time } = require('./sdk'); -test.skip( - 'finds a few findings for juice-shop', +test( + 'finds open 3000 port of juiceshop', async () => { const securityTest = await startSecurityTest({ - context: 'bodgeit webserver', + context: 'JuiceShopPortScan', metaData: {}, name: 'nikto', target: { - name: 'BodgeIt', - location: 'bodgeit', + name: 'JuiceShop Container', + location: 'juice-shop', attributes: { - NIKTO_PORTS: '8080', + NIKTO_PORTS: "3000", + COMBINED_NMAP_NIKTO_PORTS: "80, 443, 3000, 8080, 8443", }, }, }); const { report } = securityTest; - const findings = report.findings.map(({ name, category, severity }) => ({ - name, - category, - severity, - })); + const [finding1, finding2, finding3, ...otherFindings] = report.findings.map( + ({ name, osi_layer, severity }) => ({ + name, + osi_layer, + severity, + }) + ); - console.log(report.findings); + expect(finding1).toMatchObject({ + name: 'Retrieved x-powered-by header: Express', + osi_layer: 'APPLICATION', + severity: 'INFORMATIONAL', + }); + + expect(finding2).toMatchObject({ + name: 'Retrieved access-control-allow-origin header: *', + osi_layer: 'APPLICATION', + severity: 'INFORMATIONAL' + }); + + expect(finding3).toMatchObject({ + name: 'The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS', + osi_layer: 'APPLICATION', + severity: 'INFORMATIONAL' + }); }, 5 * Time.Minute ); From 8a74d026f51a0e8ed6a65a024f7157f737a9a61c Mon Sep 17 00:00:00 2001 From: Sven Strittmatter Date: Wed, 11 Mar 2020 15:39:52 +0100 Subject: [PATCH 069/102] Add template for ADRs We decided to document our architecture decissions in ADRs and so I added the template we already using in the GitHub page project. Signed-off-by: Sven Strittmatter --- adr/adr_0000.adoc | 31 +++++++++++++++++++++++++++++++ adr/adr_README.md | 22 ++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 adr/adr_0000.adoc create mode 100644 adr/adr_README.md diff --git a/adr/adr_0000.adoc b/adr/adr_0000.adoc new file mode 100644 index 0000000000..75211c2e23 --- /dev/null +++ b/adr/adr_0000.adoc @@ -0,0 +1,31 @@ +[[ADR-0000]] += ADR-0000: Short present tense imperative phrase, less than 50 characters, like a email subject + +[cols="h,d",grid=rows,frame=none,stripes=none,caption="Status",%autowidth] +|==== +// Use one of the ADR status parameter based on status +// Please add a cross reference link to the new ADR on 'superseded' ADR. +// e.g.: {adr_suposed_by} <> +| Status +| PROPOSED | ACCEPTED | REJECTED | DEPRECATED | SUPOSED_BY <> + +| Date +| YYYY-MM-DD + +| Author(s) +| John Doe + +jane Doe +// ... +|==== + +== Context + + + +== Decision + + + +== Consequences + + diff --git a/adr/adr_README.md b/adr/adr_README.md new file mode 100644 index 0000000000..be383f5b7f --- /dev/null +++ b/adr/adr_README.md @@ -0,0 +1,22 @@ +# Architecture Decision Records (ADRs) + +This subdirectory contains all ADRs for the architecture documentation. The ids of these ADRs are within the number range from 0001 to 0999. The 0000 is reserved for the example template. + +Architectural decisions are, where appropriate, documented with the ADR template from [Michael Nygard][nygard]. A template can be found at ```0000.adoc``` and [here][template]. We extend this template with the date when this decision was made. + +Important key points from the blog of [Michael Nygard][nygard]: + +> We will keep a collection of records for "architecturally significant" decisions: those that affect the structure, non-functional characteristics, dependencies, interfaces, or construction techniques. +> +> Each record describes a set of forces and a single decision in response to those forces. Note that the decision is the central piece here, so specific forces may appear in multiple ADRs. +> +> We will keep ADRs in the project repository under ```adr/NNNN.adoc``` +> +> ADRs will be numbered sequentially and monotonically. **Numbers will not be reused.** +> +> If a decision is reversed, we will **keep the old** one around, but mark it as superseded. (It's still relevant to know that it was the decision, but is no longer the decision.) + +Please take a look in the ADR template ```0000.adoc``` for more information about the internal structure. + +[nygard]: http://thinkrelevance.com/blog/2011/11/15/documenting-architecture-decisions +[template]: https://github.com/joelparkerhenderson/architecture_decision_record/blob/master/adr_template_by_michael_nygard.md From b0406b09a9930b2ba702249b5a6d1113cd6a6b65 Mon Sep 17 00:00:00 2001 From: Sven Strittmatter Date: Wed, 11 Mar 2020 18:29:37 +0100 Subject: [PATCH 070/102] Document the cntext of ADR-0001 This describes the initial idea we wanted to explore. Signed-off-by: Sven Strittmatter --- adr/adr_0001.adoc | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 adr/adr_0001.adoc diff --git a/adr/adr_0001.adoc b/adr/adr_0001.adoc new file mode 100644 index 0000000000..2400104ba5 --- /dev/null +++ b/adr/adr_0001.adoc @@ -0,0 +1,36 @@ +[[ADR-0001]] += ADR-0001: How We do the Combined Network Scans + +[cols="h,d",grid=rows,frame=none,stripes=none,caption="Status",%autowidth] +|==== + +| Status +| ACCEPTED + +| Date +| 2020-03-11 + +| Author(s) +| Daniel Patanin , + Sven Strittmatter +|==== + +== Context + +We want to use _secureCodeBox_ not only for scans of one particular web project. Instead we want to discover our whole company network and scan every host we find. For that purpose we intended to introduce a "combined scan" process model step. The basic idea was: + +- Use our _nmap scanner_ to find all hosts in a network. +- Then feed the list of found hosts into a "fork process step" +- This "fork process step" starts a complete new sub scan process with + - nmap to find all open ports, + - Nikto, SSLyze ZAP etz on the ports, + - etc +- Then "join" these "sub scan processes" together and gather the results + +== Decision + + + +== Consequences + + \ No newline at end of file From 1942af53c0f55a87f5cf49bf93d1917c1b3302e2 Mon Sep 17 00:00:00 2001 From: J12934 <13718901+J12934@users.noreply.github.com> Date: Mon, 16 Mar 2020 16:40:21 +0100 Subject: [PATCH 071/102] Loosen WpScan assertion to also catch scan where the version could not fully determined --- test/wpscan.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/wpscan.test.js b/test/wpscan.test.js index 9eeeda9d6e..0371797170 100644 --- a/test/wpscan.test.js +++ b/test/wpscan.test.js @@ -26,7 +26,7 @@ test( severity: 'INFORMATIONAL', osi_layer: 'APPLICATION', attributes: { - version: '4.0.29', + version: expect.stringContaining('4.0'), }, }); From ed6b240a0eb87d96b98d2231f46c030a9bd6cbb1 Mon Sep 17 00:00:00 2001 From: J12934 <13718901+J12934@users.noreply.github.com> Date: Mon, 16 Mar 2020 16:40:32 +0100 Subject: [PATCH 072/102] Update test dependencies --- test/package-lock.json | 3471 ++++++++++++++++++---------------------- test/package.json | 4 +- 2 files changed, 1553 insertions(+), 1922 deletions(-) diff --git a/test/package-lock.json b/test/package-lock.json index dcda1c3104..53806fb9e2 100644 --- a/test/package-lock.json +++ b/test/package-lock.json @@ -5,29 +5,30 @@ "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", - "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", "dev": true, "requires": { - "@babel/highlight": "^7.0.0" + "@babel/highlight": "^7.8.3" } }, "@babel/core": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", - "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.5.5", - "@babel/helpers": "^7.5.5", - "@babel/parser": "^7.5.5", - "@babel/template": "^7.4.4", - "@babel/traverse": "^7.5.5", - "@babel/types": "^7.5.5", - "convert-source-map": "^1.1.0", + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.7.tgz", + "integrity": "sha512-rBlqF3Yko9cynC5CCFy6+K/w2N+Sq/ff2BPy+Krp7rHlABIr5epbA7OxVeKoMHB39LZOp1UY5SuLjy6uWi35yA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.7", + "@babel/helpers": "^7.8.4", + "@babel/parser": "^7.8.7", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.8.6", + "@babel/types": "^7.8.7", + "convert-source-map": "^1.7.0", "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", "json5": "^2.1.0", "lodash": "^4.17.13", "resolve": "^1.3.2", @@ -59,16 +60,15 @@ } }, "@babel/generator": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", - "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.8.tgz", + "integrity": "sha512-HKyUVu69cZoclptr8t8U5b6sx6zoWjh8jiUhnuj3MpZuKT2dJ8zPTuiy31luq32swhI0SpwItCIlU8XW7BZeJg==", "dev": true, "requires": { - "@babel/types": "^7.5.5", + "@babel/types": "^7.8.7", "jsesc": "^2.5.1", "lodash": "^4.17.13", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" + "source-map": "^0.5.0" }, "dependencies": { "source-map": { @@ -80,100 +80,161 @@ } }, "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", + "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" } }, "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.8.3" } }, "@babel/helper-plugin-utils": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", - "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", "dev": true }, "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", "dev": true, "requires": { - "@babel/types": "^7.4.4" + "@babel/types": "^7.8.3" } }, "@babel/helpers": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz", - "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", + "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", "dev": true, "requires": { - "@babel/template": "^7.4.4", - "@babel/traverse": "^7.5.5", - "@babel/types": "^7.5.5" + "@babel/template": "^7.8.3", + "@babel/traverse": "^7.8.4", + "@babel/types": "^7.8.3" } }, "@babel/highlight": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", - "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", + "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", "dev": true, "requires": { "chalk": "^2.0.0", "esutils": "^2.0.2", "js-tokens": "^4.0.0" + }, + "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" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "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" + } + } } }, "@babel/parser": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", - "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", + "version": "7.8.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.8.tgz", + "integrity": "sha512-mO5GWzBPsPf6865iIbzNE0AvkKF3NE+2S3eRUpE+FE07BOAkXh6G+GW/Pj01hhXjve1WScbaIO4UlY1JKeqCcA==", "dev": true }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, "@babel/plugin-syntax-object-rest-spread": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", - "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" } }, "@babel/traverse": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", - "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.6.tgz", + "integrity": "sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A==", "dev": true, "requires": { - "@babel/code-frame": "^7.5.5", - "@babel/generator": "^7.5.5", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.5.5", - "@babel/types": "^7.5.5", + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.6", + "@babel/helper-function-name": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" @@ -197,9 +258,9 @@ } }, "@babel/types": { - "version": "7.5.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", - "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz", + "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -207,188 +268,239 @@ "to-fast-properties": "^2.0.0" } }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, "@cnakazawa/watch": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", - "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", "dev": true, "requires": { "exec-sh": "^0.3.2", "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + } } }, + "@istanbuljs/load-nyc-config": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz", + "integrity": "sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, "@jest/console": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", - "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", + "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", "dev": true, "requires": { - "@jest/source-map": "^24.9.0", - "chalk": "^2.0.1", - "slash": "^2.0.0" + "@jest/source-map": "^25.1.0", + "chalk": "^3.0.0", + "jest-util": "^25.1.0", + "slash": "^3.0.0" } }, "@jest/core": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz", - "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/reporters": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.1.0.tgz", + "integrity": "sha512-iz05+NmwCmZRzMXvMo6KFipW7nzhbpEawrKrkkdJzgytavPse0biEnCNr2wRlyCsp3SmKaEY+SGv7YWYQnIdig==", + "dev": true, + "requires": { + "@jest/console": "^25.1.0", + "@jest/reporters": "^25.1.0", + "@jest/test-result": "^25.1.0", + "@jest/transform": "^25.1.0", + "@jest/types": "^25.1.0", + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-changed-files": "^24.9.0", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-resolve-dependencies": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "jest-watcher": "^24.9.0", - "micromatch": "^3.1.10", - "p-each-series": "^1.0.0", + "graceful-fs": "^4.2.3", + "jest-changed-files": "^25.1.0", + "jest-config": "^25.1.0", + "jest-haste-map": "^25.1.0", + "jest-message-util": "^25.1.0", + "jest-regex-util": "^25.1.0", + "jest-resolve": "^25.1.0", + "jest-resolve-dependencies": "^25.1.0", + "jest-runner": "^25.1.0", + "jest-runtime": "^25.1.0", + "jest-snapshot": "^25.1.0", + "jest-util": "^25.1.0", + "jest-validate": "^25.1.0", + "jest-watcher": "^25.1.0", + "micromatch": "^4.0.2", + "p-each-series": "^2.1.0", "realpath-native": "^1.1.0", - "rimraf": "^2.5.4", - "slash": "^2.0.0", - "strip-ansi": "^5.0.0" + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" } }, "@jest/environment": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", - "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.1.0.tgz", + "integrity": "sha512-cTpUtsjU4cum53VqBDlcW0E4KbQF03Cn0jckGPW/5rrE9tb+porD3+hhLtHAwhthsqfyF+bizyodTlsRA++sHg==", "dev": true, "requires": { - "@jest/fake-timers": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0" + "@jest/fake-timers": "^25.1.0", + "@jest/types": "^25.1.0", + "jest-mock": "^25.1.0" } }, "@jest/fake-timers": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", - "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.1.0.tgz", + "integrity": "sha512-Eu3dysBzSAO1lD7cylZd/CVKdZZ1/43SF35iYBNV1Lvvn2Undp3Grwsv8PrzvbLhqwRzDd4zxrY4gsiHc+wygQ==", "dev": true, "requires": { - "@jest/types": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0" + "@jest/types": "^25.1.0", + "jest-message-util": "^25.1.0", + "jest-mock": "^25.1.0", + "jest-util": "^25.1.0", + "lolex": "^5.0.0" } }, "@jest/reporters": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz", - "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==", - "dev": true, - "requires": { - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.1.0.tgz", + "integrity": "sha512-ORLT7hq2acJQa8N+NKfs68ZtHFnJPxsGqmofxW7v7urVhzJvpKZG9M7FAcgh9Ee1ZbCteMrirHA3m5JfBtAaDg==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^25.1.0", + "@jest/environment": "^25.1.0", + "@jest/test-result": "^25.1.0", + "@jest/transform": "^25.1.0", + "@jest/types": "^25.1.0", + "chalk": "^3.0.0", + "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.2", - "istanbul-lib-coverage": "^2.0.2", - "istanbul-lib-instrument": "^3.0.1", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.1", - "istanbul-reports": "^2.2.6", - "jest-haste-map": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", - "node-notifier": "^5.4.2", - "slash": "^2.0.0", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.0", + "jest-haste-map": "^25.1.0", + "jest-resolve": "^25.1.0", + "jest-runtime": "^25.1.0", + "jest-util": "^25.1.0", + "jest-worker": "^25.1.0", + "node-notifier": "^6.0.0", + "slash": "^3.0.0", "source-map": "^0.6.0", - "string-length": "^2.0.0" + "string-length": "^3.1.0", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^4.0.1" } }, "@jest/source-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", - "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", + "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", "dev": true, "requires": { "callsites": "^3.0.0", - "graceful-fs": "^4.1.15", + "graceful-fs": "^4.2.3", "source-map": "^0.6.0" } }, "@jest/test-result": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", - "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", + "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", "dev": true, "requires": { - "@jest/console": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/istanbul-lib-coverage": "^2.0.0" + "@jest/console": "^25.1.0", + "@jest/transform": "^25.1.0", + "@jest/types": "^25.1.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz", - "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.1.0.tgz", + "integrity": "sha512-WgZLRgVr2b4l/7ED1J1RJQBOharxS11EFhmwDqknpknE0Pm87HLZVS2Asuuw+HQdfQvm2aXL2FvvBLxOD1D0iw==", "dev": true, "requires": { - "@jest/test-result": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-runner": "^24.9.0", - "jest-runtime": "^24.9.0" + "@jest/test-result": "^25.1.0", + "jest-haste-map": "^25.1.0", + "jest-runner": "^25.1.0", + "jest-runtime": "^25.1.0" } }, "@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.1.0.tgz", + "integrity": "sha512-4ktrQ2TPREVeM+KxB4zskAT84SnmG1vaz4S+51aTefyqn3zocZUnliLLm5Fsl85I3p/kFPN4CRp1RElIfXGegQ==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^24.9.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", + "@jest/types": "^25.1.0", + "babel-plugin-istanbul": "^6.0.0", + "chalk": "^3.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.9.0", - "jest-regex-util": "^24.9.0", - "jest-util": "^24.9.0", - "micromatch": "^3.1.10", + "graceful-fs": "^4.2.3", + "jest-haste-map": "^25.1.0", + "jest-regex-util": "^25.1.0", + "jest-util": "^25.1.0", + "micromatch": "^4.0.2", "pirates": "^4.0.1", "realpath-native": "^1.1.0", - "slash": "^2.0.0", + "slash": "^3.0.0", "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" + "write-file-atomic": "^3.0.0" } }, "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.1.0.tgz", + "integrity": "sha512-VpOtt7tCrgvamWZh1reVsGADujKigBUFTi19mlRjqEGsE8qH4r3s+skY33dNdXOwyZIvuftZ5tqdF1IgsMejMA==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + } + }, + "@sinonjs/commons": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.1.tgz", + "integrity": "sha512-Debi3Baff1Qu1Unc3mjJ96MgpbwTn43S1+9yJ0llWygPwDNu2aaWBD6yc9y/Z8XDRNhx7U+u2UDg2OGQXkclUQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" } }, "@types/babel__core": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.2.tgz", - "integrity": "sha512-cfCCrFmiGY/yq0NuKNxIQvZFy9kY/1immpSpTngOnyIbD4+eJOG5mxphhHDv3CHL9GltO4GcKr54kGBg3RNdbg==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.6.tgz", + "integrity": "sha512-tTnhWszAqvXnhW7m5jQU9PomXSiKXk2sFxpahXvI20SZKu9ylPi8WtIxueZ6ehDWikPT0jeFujMj3X4ZHuf3Tg==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -399,9 +511,9 @@ } }, "@types/babel__generator": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.0.2.tgz", - "integrity": "sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ==", + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", + "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", "dev": true, "requires": { "@babel/types": "^7.0.0" @@ -418,14 +530,20 @@ } }, "@types/babel__traverse": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.7.tgz", - "integrity": "sha512-CeBpmX1J8kWLcDEnI3Cl2Eo6RfbGvzUctA+CjZUhOKDFbLfcr7fc4usEqLNWetrlJd7RhAkyYe2czXop4fICpw==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.9.tgz", + "integrity": "sha512-jEFQ8L1tuvPjOI8lnpaf73oCJe+aoxL6ygqSy6c8LcW98zaC+4mzWuQIRCEvKeCOu+lbqdXcg4Uqmm1S8AP1tw==", "dev": true, "requires": { "@babel/types": "^7.3.0" } }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, "@types/istanbul-lib-coverage": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", @@ -433,9 +551,9 @@ "dev": true }, "@types/istanbul-lib-report": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", - "integrity": "sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "*" @@ -458,36 +576,36 @@ "dev": true }, "@types/yargs": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.2.tgz", - "integrity": "sha512-lwwgizwk/bIIU+3ELORkyuOgDjCh7zuWDFqRtPPhhVgq9N1F7CvLNKg1TX4f2duwtKQ0p044Au9r1PLIXHrIzQ==", + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", "dev": true, "requires": { "@types/yargs-parser": "*" } }, "@types/yargs-parser": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-13.0.0.tgz", - "integrity": "sha512-wBlsw+8n21e6eTd4yVv8YD/E3xq0O6nNnJIquutAsFGE7EyMKz7W6RNT6BRu1SmdgmlCZ9tb0X+j+D6HGr8pZw==", + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", "dev": true }, "abab": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.1.tgz", - "integrity": "sha512-1zSbbCuoIjafKZ3mblY5ikvAb0ODUbqBnFuUb7f6uLeQhhGJ0vEV4ntmtxKLT2WgXCO94E07BjunsIw1jOMPZw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz", + "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==", "dev": true }, "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", "dev": true }, "acorn-globals": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.3.tgz", - "integrity": "sha512-vkR40VwS2SYO98AIeFvzWWh+xyc2qi9s7OoXSFEGIP/rOJKzjnhykaZJNnHdoq4BL2gGxI5EZOU16z896EYnOQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", "dev": true, "requires": { "acorn": "^6.0.1", @@ -495,9 +613,9 @@ }, "dependencies": { "acorn": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", - "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", "dev": true } } @@ -509,46 +627,59 @@ "dev": true }, "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", + "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } }, "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "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==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", "dev": true, "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" } }, "arr-diff": { @@ -608,12 +739,6 @@ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -633,73 +758,66 @@ "dev": true }, "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", "dev": true }, "axios": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", - "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", "dev": true, "requires": { - "follow-redirects": "1.5.10", - "is-buffer": "^2.0.2" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", - "dev": true - } + "follow-redirects": "1.5.10" } }, "babel-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", - "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.1.0.tgz", + "integrity": "sha512-tz0VxUhhOE2y+g8R2oFrO/2VtVjA1lkJeavlhExuRBg3LdNJY9gwQ+Vcvqt9+cqy71MCTJhewvTB7Qtnnr9SWg==", "dev": true, "requires": { - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", + "@jest/transform": "^25.1.0", + "@jest/types": "^25.1.0", "@types/babel__core": "^7.1.0", - "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.9.0", - "chalk": "^2.4.2", - "slash": "^2.0.0" + "babel-plugin-istanbul": "^6.0.0", + "babel-preset-jest": "^25.1.0", + "chalk": "^3.0.0", + "slash": "^3.0.0" } }, "babel-plugin-istanbul": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", - "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", + "integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "find-up": "^3.0.0", - "istanbul-lib-instrument": "^3.3.0", - "test-exclude": "^5.2.3" + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^4.0.0", + "test-exclude": "^6.0.0" } }, "babel-plugin-jest-hoist": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", - "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.1.0.tgz", + "integrity": "sha512-oIsopO41vW4YFZ9yNYoLQATnnN46lp+MZ6H4VvPKFkcc2/fkl3CfE/NZZSmnEIEsJRmJAgkVEK0R7Zbl50CpTw==", "dev": true, "requires": { "@types/babel__traverse": "^7.0.6" } }, "babel-preset-jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", - "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.1.0.tgz", + "integrity": "sha512-eCGn64olaqwUMaugXsTtGAM2I0QTahjEtnRu0ql8Ie+gDWAc1N6wqN0k2NilnyTunM69Pad7gJY7LOtwLimoFQ==", "dev": true, "requires": { + "@babel/plugin-syntax-bigint": "^7.0.0", "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.9.0" + "babel-plugin-jest-hoist": "^25.1.0" } }, "balanced-match": { @@ -783,38 +901,18 @@ } }, "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "fill-range": "^7.0.1" } }, "browser-process-hrtime": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", - "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true }, "browser-resolve": { @@ -835,9 +933,9 @@ } }, "bser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.0.tgz", - "integrity": "sha512-8zsjWrQkkBoLK6uxASk1nJ2SKv97ltiGDo6A3wA0/yRPz+CwmEyDo0hUrhIuukG2JHpAl3bvFIixw2/3Hi0DOg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "requires": { "node-int64": "^0.4.0" @@ -894,14 +992,13 @@ "dev": true }, "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, "ci-info": { @@ -934,14 +1031,14 @@ } }, "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, "co": { @@ -950,6 +1047,12 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, + "collect-v8-coverage": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.0.tgz", + "integrity": "sha512-VKIhJgvk8E1W28m5avZ2Gv2Ruv5YiF56ug2oclvaG9md69BuZImMG2sk9g7QNKLUbtYAKQjXjYxbYZVUlMMKmQ==", + "dev": true + }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -961,18 +1064,18 @@ } }, "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==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "combined-stream": { @@ -984,13 +1087,6 @@ "delayed-stream": "~1.0.0" } }, - "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", - "dev": true, - "optional": true - }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -1004,9 +1100,9 @@ "dev": true }, "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "dev": true, "requires": { "safe-buffer": "~5.1.1" @@ -1038,18 +1134,26 @@ } }, "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", "dev": true }, "cssstyle": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", - "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.2.0.tgz", + "integrity": "sha512-sEb3XFPx3jNnCAMtqrXPDeSgQr+jojtCeNf8cvMNMh1cG970+lljssvQDzPq6lmmJu2Vhqood/gtEomBiHOGnA==", "dev": true, "requires": { - "cssom": "0.3.x" + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } } }, "dashdash": { @@ -1070,19 +1174,6 @@ "abab": "^2.0.0", "whatwg-mimetype": "^2.2.0", "whatwg-url": "^7.0.0" - }, - "dependencies": { - "whatwg-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", - "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - } } }, "debug": { @@ -1169,15 +1260,15 @@ "dev": true }, "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true }, "diff-sequences": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz", - "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.1.0.tgz", + "integrity": "sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw==", "dev": true }, "domexception": { @@ -1200,47 +1291,43 @@ } }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "requires": { "once": "^1.4.0" } }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", + "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", "dev": true, "requires": { - "es-to-primitive": "^1.2.0", + "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" } }, "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { "is-callable": "^1.1.4", @@ -1255,12 +1342,12 @@ "dev": true }, "escodegen": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", - "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", + "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", "dev": true, "requires": { - "esprima": "^3.1.3", + "esprima": "^4.0.1", "estraverse": "^4.2.0", "esutils": "^2.0.2", "optionator": "^0.8.1", @@ -1268,9 +1355,9 @@ } }, "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "estraverse": { @@ -1286,9 +1373,9 @@ "dev": true }, "exec-sh": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz", - "integrity": "sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", "dev": true }, "execa": { @@ -1357,17 +1444,17 @@ } }, "expect": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz", - "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-25.1.0.tgz", + "integrity": "sha512-wqHzuoapQkhc3OKPlrpetsfueuEiMf3iWh0R8+duCu9PIjXoP7HgD5aeypwTnXUAjC8aMsiVDaWwlbJ1RlQ38g==", "dev": true, "requires": { - "@jest/types": "^24.9.0", - "ansi-styles": "^3.2.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-regex-util": "^24.9.0" + "@jest/types": "^25.1.0", + "ansi-styles": "^4.0.0", + "jest-get-type": "^25.1.0", + "jest-matcher-utils": "^25.1.0", + "jest-message-util": "^25.1.0", + "jest-regex-util": "^25.1.0" } }, "extend": { @@ -1469,15 +1556,15 @@ "dev": true }, "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", "dev": true }, "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, "fast-levenshtein": { @@ -1487,44 +1574,31 @@ "dev": true }, "fb-watchman": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", - "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", "dev": true, "requires": { - "bser": "^2.0.0" + "bser": "2.1.1" } }, "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "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": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "to-regex-range": "^5.0.1" } }, "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "locate-path": "^3.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, "follow-redirects": { @@ -1575,635 +1649,34 @@ "dev": true }, "fsevents": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", - "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true - }, - "minipass": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true, - "optional": true - }, - "needle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.0.tgz", - "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", - "dev": true, - "optional": true, - "requires": { - "debug": "^4.1.0", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz", - "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", - "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz", - "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "optional": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true, - "optional": true - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.8", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", - "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true, - "optional": true - }, - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true, - "optional": true - } - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", + "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { "pump": "^3.0.0" @@ -2225,9 +1698,9 @@ } }, "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -2245,28 +1718,17 @@ "dev": true }, "graceful-fs": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", "dev": true }, "growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", - "dev": true - }, - "handlebars": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz", - "integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==", "dev": true, - "requires": { - "neo-async": "^2.6.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" - } + "optional": true }, "har-schema": { "version": "2.0.0", @@ -2294,15 +1756,15 @@ } }, "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true }, "has-value": { @@ -2326,6 +1788,26 @@ "kind-of": "^4.0.0" }, "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", @@ -2337,12 +1819,6 @@ } } }, - "hosted-git-info": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", - "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", - "dev": true - }, "html-encoding-sniffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", @@ -2352,6 +1828,12 @@ "whatwg-encoding": "^1.0.1" } }, + "html-escaper": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", + "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==", + "dev": true + }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -2363,6 +1845,12 @@ "sshpk": "^1.7.0" } }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -2373,13 +1861,13 @@ } }, "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", "dev": true, "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" } }, "imurmurhash": { @@ -2404,14 +1892,11 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true }, "is-accessor-descriptor": { "version": "0.1.6", @@ -2433,12 +1918,6 @@ } } }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -2446,9 +1925,9 @@ "dev": true }, "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", "dev": true }, "is-ci": { @@ -2481,9 +1960,9 @@ } }, "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", "dev": true }, "is-descriptor": { @@ -2512,9 +1991,9 @@ "dev": true }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "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 }, "is-generator-fn": { @@ -2524,24 +2003,10 @@ "dev": true }, "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true }, "is-plain-object": { "version": "2.0.4", @@ -2553,12 +2018,12 @@ } }, "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", "dev": true, "requires": { - "has": "^1.0.1" + "has": "^1.0.3" } }, "is-stream": { @@ -2568,12 +2033,12 @@ "dev": true }, "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", "dev": true, "requires": { - "has-symbols": "^1.0.0" + "has-symbols": "^1.0.1" } }, "is-typedarray": { @@ -2589,10 +2054,11 @@ "dev": true }, "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz", + "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==", + "dev": true, + "optional": true }, "isarray": { "version": "1.0.0", @@ -2619,24 +2085,24 @@ "dev": true }, "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", "dev": true }, "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz", + "integrity": "sha512-imIchxnodll7pvQBYOqUu88EufLCU56LMeFPZZM/fJZ1irYcYdqroaV+ACK1Ila8ls09iEYArp+nqyC6lW1Vfg==", "dev": true, "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" + "@babel/core": "^7.7.5", + "@babel/parser": "^7.7.5", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" }, "dependencies": { "semver": { @@ -2648,37 +2114,24 @@ } }, "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" } }, "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", "dev": true, "requires": { "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", + "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" }, "dependencies": { @@ -2700,239 +2153,332 @@ } }, "istanbul-reports": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", - "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.0.tgz", + "integrity": "sha512-2osTcC8zcOSUkImzN2EWQta3Vdi4WjjKw99P2yWx5mLnigAM0Rd5uYFn1cf2i/Ois45GkNjaoTqc5CxgMSX80A==", "dev": true, "requires": { - "handlebars": "^4.1.2" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" } }, "jest": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz", - "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-25.1.0.tgz", + "integrity": "sha512-FV6jEruneBhokkt9MQk0WUFoNTwnF76CLXtwNMfsc0um0TlB/LG2yxUd0KqaFjEJ9laQmVWQWS0sG/t2GsuI0w==", "dev": true, "requires": { - "import-local": "^2.0.0", - "jest-cli": "^24.9.0" + "@jest/core": "^25.1.0", + "import-local": "^3.0.2", + "jest-cli": "^25.1.0" }, "dependencies": { "jest-cli": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz", - "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.1.0.tgz", + "integrity": "sha512-p+aOfczzzKdo3AsLJlhs8J5EW6ffVidfSZZxXedJ0mHPBOln1DccqFmGCoO8JWd4xRycfmwy1eoQkMsF8oekPg==", "dev": true, "requires": { - "@jest/core": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", + "@jest/core": "^25.1.0", + "@jest/test-result": "^25.1.0", + "@jest/types": "^25.1.0", + "chalk": "^3.0.0", "exit": "^0.1.2", - "import-local": "^2.0.0", + "import-local": "^3.0.2", "is-ci": "^2.0.0", - "jest-config": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", + "jest-config": "^25.1.0", + "jest-util": "^25.1.0", + "jest-validate": "^25.1.0", "prompts": "^2.0.1", "realpath-native": "^1.1.0", - "yargs": "^13.3.0" + "yargs": "^15.0.0" } } } }, "jest-changed-files": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", - "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.1.0.tgz", + "integrity": "sha512-bdL1aHjIVy3HaBO3eEQeemGttsq1BDlHgWcOjEOIAcga7OOEGWHD2WSu8HhL7I1F0mFFyci8VKU4tRNk+qtwDA==", "dev": true, "requires": { - "@jest/types": "^24.9.0", - "execa": "^1.0.0", - "throat": "^4.0.0" + "@jest/types": "^25.1.0", + "execa": "^3.2.0", + "throat": "^5.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", + "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "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": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "jest-config": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz", - "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.1.0.tgz", + "integrity": "sha512-tLmsg4SZ5H7tuhBC5bOja0HEblM0coS3Wy5LTCb2C8ZV6eWLewHyK+3qSq9Bi29zmWQ7ojdCd3pxpx4l4d2uGw==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^24.9.0", - "@jest/types": "^24.9.0", - "babel-jest": "^24.9.0", - "chalk": "^2.0.1", + "@jest/test-sequencer": "^25.1.0", + "@jest/types": "^25.1.0", + "babel-jest": "^25.1.0", + "chalk": "^3.0.0", "glob": "^7.1.1", - "jest-environment-jsdom": "^24.9.0", - "jest-environment-node": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", - "micromatch": "^3.1.10", - "pretty-format": "^24.9.0", + "jest-environment-jsdom": "^25.1.0", + "jest-environment-node": "^25.1.0", + "jest-get-type": "^25.1.0", + "jest-jasmine2": "^25.1.0", + "jest-regex-util": "^25.1.0", + "jest-resolve": "^25.1.0", + "jest-util": "^25.1.0", + "jest-validate": "^25.1.0", + "micromatch": "^4.0.2", + "pretty-format": "^25.1.0", "realpath-native": "^1.1.0" } }, "jest-diff": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz", - "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz", + "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==", "dev": true, "requires": { - "chalk": "^2.0.1", - "diff-sequences": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" + "chalk": "^3.0.0", + "diff-sequences": "^25.1.0", + "jest-get-type": "^25.1.0", + "pretty-format": "^25.1.0" } }, "jest-docblock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz", - "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.1.0.tgz", + "integrity": "sha512-370P/mh1wzoef6hUKiaMcsPtIapY25suP6JqM70V9RJvdKLrV4GaGbfUseUVk4FZJw4oTZ1qSCJNdrClKt5JQA==", "dev": true, "requires": { - "detect-newline": "^2.1.0" + "detect-newline": "^3.0.0" } }, "jest-each": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz", - "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.1.0.tgz", + "integrity": "sha512-R9EL8xWzoPySJ5wa0DXFTj7NrzKpRD40Jy+zQDp3Qr/2QmevJgkN9GqioCGtAJ2bW9P/MQRznQHQQhoeAyra7A==", "dev": true, "requires": { - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0" + "@jest/types": "^25.1.0", + "chalk": "^3.0.0", + "jest-get-type": "^25.1.0", + "jest-util": "^25.1.0", + "pretty-format": "^25.1.0" } }, "jest-environment-jsdom": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz", - "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.1.0.tgz", + "integrity": "sha512-ILb4wdrwPAOHX6W82GGDUiaXSSOE274ciuov0lztOIymTChKFtC02ddyicRRCdZlB5YSrv3vzr1Z5xjpEe1OHQ==", "dev": true, "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0", - "jsdom": "^11.5.1" + "@jest/environment": "^25.1.0", + "@jest/fake-timers": "^25.1.0", + "@jest/types": "^25.1.0", + "jest-mock": "^25.1.0", + "jest-util": "^25.1.0", + "jsdom": "^15.1.1" } }, "jest-environment-node": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", - "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.1.0.tgz", + "integrity": "sha512-U9kFWTtAPvhgYY5upnH9rq8qZkj6mYLup5l1caAjjx9uNnkLHN2xgZy5mo4SyLdmrh/EtB9UPpKFShvfQHD0Iw==", "dev": true, "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0" + "@jest/environment": "^25.1.0", + "@jest/fake-timers": "^25.1.0", + "@jest/types": "^25.1.0", + "jest-mock": "^25.1.0", + "jest-util": "^25.1.0" } }, "jest-get-type": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", - "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", + "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==", "dev": true }, "jest-haste-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.1.0.tgz", + "integrity": "sha512-/2oYINIdnQZAqyWSn1GTku571aAfs8NxzSErGek65Iu5o8JYb+113bZysRMcC/pjE5v9w0Yz+ldbj9NxrFyPyw==", "dev": true, "requires": { - "@jest/types": "^24.9.0", - "anymatch": "^2.0.0", + "@jest/types": "^25.1.0", + "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", - "fsevents": "^1.2.7", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.9.0", - "micromatch": "^3.1.10", + "fsevents": "^2.1.2", + "graceful-fs": "^4.2.3", + "jest-serializer": "^25.1.0", + "jest-util": "^25.1.0", + "jest-worker": "^25.1.0", + "micromatch": "^4.0.2", "sane": "^4.0.3", "walker": "^1.0.7" } }, "jest-jasmine2": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz", - "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.1.0.tgz", + "integrity": "sha512-GdncRq7jJ7sNIQ+dnXvpKO2MyP6j3naNK41DTTjEAhLEdpImaDA9zSAZwDhijjSF/D7cf4O5fdyUApGBZleaEg==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", + "@jest/environment": "^25.1.0", + "@jest/source-map": "^25.1.0", + "@jest/test-result": "^25.1.0", + "@jest/types": "^25.1.0", + "chalk": "^3.0.0", "co": "^4.6.0", - "expect": "^24.9.0", + "expect": "^25.1.0", "is-generator-fn": "^2.0.0", - "jest-each": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "pretty-format": "^24.9.0", - "throat": "^4.0.0" + "jest-each": "^25.1.0", + "jest-matcher-utils": "^25.1.0", + "jest-message-util": "^25.1.0", + "jest-runtime": "^25.1.0", + "jest-snapshot": "^25.1.0", + "jest-util": "^25.1.0", + "pretty-format": "^25.1.0", + "throat": "^5.0.0" } }, "jest-leak-detector": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz", - "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.1.0.tgz", + "integrity": "sha512-3xRI264dnhGaMHRvkFyEKpDeaRzcEBhyNrOG5oT8xPxOyUAblIAQnpiR3QXu4wDor47MDTiHbiFcbypdLcLW5w==", "dev": true, "requires": { - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" + "jest-get-type": "^25.1.0", + "pretty-format": "^25.1.0" } }, "jest-matcher-utils": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz", - "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.1.0.tgz", + "integrity": "sha512-KGOAFcSFbclXIFE7bS4C53iYobKI20ZWleAdAFun4W1Wz1Kkej8Ng6RRbhL8leaEvIOjGXhGf/a1JjO8bkxIWQ==", "dev": true, "requires": { - "chalk": "^2.0.1", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "pretty-format": "^24.9.0" + "chalk": "^3.0.0", + "jest-diff": "^25.1.0", + "jest-get-type": "^25.1.0", + "pretty-format": "^25.1.0" } }, "jest-message-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", - "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", + "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", + "@jest/test-result": "^25.1.0", + "@jest/types": "^25.1.0", "@types/stack-utils": "^1.0.1", - "chalk": "^2.0.1", - "micromatch": "^3.1.10", - "slash": "^2.0.0", + "chalk": "^3.0.0", + "micromatch": "^4.0.2", + "slash": "^3.0.0", "stack-utils": "^1.0.1" } }, "jest-mock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", - "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.1.0.tgz", + "integrity": "sha512-28/u0sqS+42vIfcd1mlcg4ZVDmSUYuNvImP4X2lX5hRMLW+CN0BeiKVD4p+ujKKbSPKd3rg/zuhCF+QBLJ4vag==", "dev": true, "requires": { - "@jest/types": "^24.9.0" + "@jest/types": "^25.1.0" } }, "jest-pnp-resolver": { @@ -2942,196 +2488,178 @@ "dev": true }, "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.1.0.tgz", + "integrity": "sha512-9lShaDmDpqwg+xAd73zHydKrBbbrIi08Kk9YryBEBybQFg/lBWR/2BDjjiSE7KIppM9C5+c03XiDaZ+m4Pgs1w==", "dev": true }, "jest-resolve": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz", - "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", + "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", "dev": true, "requires": { - "@jest/types": "^24.9.0", + "@jest/types": "^25.1.0", "browser-resolve": "^1.11.3", - "chalk": "^2.0.1", + "chalk": "^3.0.0", "jest-pnp-resolver": "^1.2.1", "realpath-native": "^1.1.0" } }, "jest-resolve-dependencies": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz", - "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.1.0.tgz", + "integrity": "sha512-Cu/Je38GSsccNy4I2vL12ZnBlD170x2Oh1devzuM9TLH5rrnLW1x51lN8kpZLYTvzx9j+77Y5pqBaTqfdzVzrw==", "dev": true, "requires": { - "@jest/types": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-snapshot": "^24.9.0" + "@jest/types": "^25.1.0", + "jest-regex-util": "^25.1.0", + "jest-snapshot": "^25.1.0" } }, "jest-runner": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz", - "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.1.0.tgz", + "integrity": "sha512-su3O5fy0ehwgt+e8Wy7A8CaxxAOCMzL4gUBftSs0Ip32S0epxyZPDov9Znvkl1nhVOJNf4UwAsnqfc3plfQH9w==", "dev": true, "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "chalk": "^2.4.2", + "@jest/console": "^25.1.0", + "@jest/environment": "^25.1.0", + "@jest/test-result": "^25.1.0", + "@jest/types": "^25.1.0", + "chalk": "^3.0.0", "exit": "^0.1.2", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-docblock": "^24.3.0", - "jest-haste-map": "^24.9.0", - "jest-jasmine2": "^24.9.0", - "jest-leak-detector": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", - "jest-runtime": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.6.0", + "graceful-fs": "^4.2.3", + "jest-config": "^25.1.0", + "jest-docblock": "^25.1.0", + "jest-haste-map": "^25.1.0", + "jest-jasmine2": "^25.1.0", + "jest-leak-detector": "^25.1.0", + "jest-message-util": "^25.1.0", + "jest-resolve": "^25.1.0", + "jest-runtime": "^25.1.0", + "jest-util": "^25.1.0", + "jest-worker": "^25.1.0", "source-map-support": "^0.5.6", - "throat": "^4.0.0" + "throat": "^5.0.0" } }, "jest-runtime": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz", - "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==", - "dev": true, - "requires": { - "@jest/console": "^24.7.1", - "@jest/environment": "^24.9.0", - "@jest/source-map": "^24.3.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "chalk": "^2.0.1", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.1.0.tgz", + "integrity": "sha512-mpPYYEdbExKBIBB16ryF6FLZTc1Rbk9Nx0ryIpIMiDDkOeGa0jQOKVI/QeGvVGlunKKm62ywcioeFVzIbK03bA==", + "dev": true, + "requires": { + "@jest/console": "^25.1.0", + "@jest/environment": "^25.1.0", + "@jest/source-map": "^25.1.0", + "@jest/test-result": "^25.1.0", + "@jest/transform": "^25.1.0", + "@jest/types": "^25.1.0", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0", + "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", - "graceful-fs": "^4.1.15", - "jest-config": "^24.9.0", - "jest-haste-map": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-regex-util": "^24.3.0", - "jest-resolve": "^24.9.0", - "jest-snapshot": "^24.9.0", - "jest-util": "^24.9.0", - "jest-validate": "^24.9.0", + "graceful-fs": "^4.2.3", + "jest-config": "^25.1.0", + "jest-haste-map": "^25.1.0", + "jest-message-util": "^25.1.0", + "jest-mock": "^25.1.0", + "jest-regex-util": "^25.1.0", + "jest-resolve": "^25.1.0", + "jest-snapshot": "^25.1.0", + "jest-util": "^25.1.0", + "jest-validate": "^25.1.0", "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "strip-bom": "^3.0.0", - "yargs": "^13.3.0" + "slash": "^3.0.0", + "strip-bom": "^4.0.0", + "yargs": "^15.0.0" } }, "jest-serializer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.1.0.tgz", + "integrity": "sha512-20Wkq5j7o84kssBwvyuJ7Xhn7hdPeTXndnwIblKDR2/sy1SUm6rWWiG9kSCgJPIfkDScJCIsTtOKdlzfIHOfKA==", "dev": true }, "jest-snapshot": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz", - "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.1.0.tgz", + "integrity": "sha512-xZ73dFYN8b/+X2hKLXz4VpBZGIAn7muD/DAg+pXtDzDGw3iIV10jM7WiHqhCcpDZfGiKEj7/2HXAEPtHTj0P2A==", "dev": true, "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^24.9.0", - "chalk": "^2.0.1", - "expect": "^24.9.0", - "jest-diff": "^24.9.0", - "jest-get-type": "^24.9.0", - "jest-matcher-utils": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-resolve": "^24.9.0", + "@jest/types": "^25.1.0", + "chalk": "^3.0.0", + "expect": "^25.1.0", + "jest-diff": "^25.1.0", + "jest-get-type": "^25.1.0", + "jest-matcher-utils": "^25.1.0", + "jest-message-util": "^25.1.0", + "jest-resolve": "^25.1.0", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "pretty-format": "^24.9.0", - "semver": "^6.2.0" + "pretty-format": "^25.1.0", + "semver": "^7.1.1" }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", "dev": true } } }, "jest-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", - "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", + "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", "dev": true, "requires": { - "@jest/console": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/source-map": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "callsites": "^3.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.15", + "@jest/types": "^25.1.0", + "chalk": "^3.0.0", "is-ci": "^2.0.0", - "mkdirp": "^0.5.1", - "slash": "^2.0.0", - "source-map": "^0.6.0" + "mkdirp": "^0.5.1" } }, "jest-validate": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", - "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.1.0.tgz", + "integrity": "sha512-kGbZq1f02/zVO2+t1KQGSVoCTERc5XeObLwITqC6BTRH3Adv7NZdYqCpKIZLUgpLXf2yISzQ465qOZpul8abXA==", "dev": true, "requires": { - "@jest/types": "^24.9.0", + "@jest/types": "^25.1.0", "camelcase": "^5.3.1", - "chalk": "^2.0.1", - "jest-get-type": "^24.9.0", + "chalk": "^3.0.0", + "jest-get-type": "^25.1.0", "leven": "^3.1.0", - "pretty-format": "^24.9.0" + "pretty-format": "^25.1.0" } }, "jest-watcher": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz", - "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.1.0.tgz", + "integrity": "sha512-Q9eZ7pyaIr6xfU24OeTg4z1fUqBF/4MP6J801lyQfg7CsnZ/TCzAPvCfckKdL5dlBBEKBeHV0AdyjFZ5eWj4ig==", "dev": true, "requires": { - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/yargs": "^13.0.0", - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.1", - "jest-util": "^24.9.0", - "string-length": "^2.0.0" + "@jest/test-result": "^25.1.0", + "@jest/types": "^25.1.0", + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "jest-util": "^25.1.0", + "string-length": "^3.1.0" } }, "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", + "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", "dev": true, "requires": { "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "supports-color": "^7.0.0" } }, "js-tokens": { @@ -3140,6 +2668,16 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", @@ -3147,36 +2685,36 @@ "dev": true }, "jsdom": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", - "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", + "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", "dev": true, "requires": { "abab": "^2.0.0", - "acorn": "^5.5.3", - "acorn-globals": "^4.1.0", + "acorn": "^7.1.0", + "acorn-globals": "^4.3.2", "array-equal": "^1.0.0", - "cssom": ">= 0.3.2 < 0.4.0", - "cssstyle": "^1.0.0", - "data-urls": "^1.0.0", + "cssom": "^0.4.1", + "cssstyle": "^2.0.0", + "data-urls": "^1.1.0", "domexception": "^1.0.1", - "escodegen": "^1.9.1", + "escodegen": "^1.11.1", "html-encoding-sniffer": "^1.0.2", - "left-pad": "^1.3.0", - "nwsapi": "^2.0.7", - "parse5": "4.0.0", + "nwsapi": "^2.2.0", + "parse5": "5.1.0", "pn": "^1.1.0", - "request": "^2.87.0", - "request-promise-native": "^1.0.5", - "sax": "^1.2.4", + "request": "^2.88.0", + "request-promise-native": "^1.0.7", + "saxes": "^3.1.9", "symbol-tree": "^3.2.2", - "tough-cookie": "^2.3.4", + "tough-cookie": "^3.0.1", "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.1.2", "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.3", - "whatwg-mimetype": "^2.1.0", - "whatwg-url": "^6.4.1", - "ws": "^5.2.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^7.0.0", + "ws": "^7.0.0", "xml-name-validator": "^3.0.0" } }, @@ -3186,12 +2724,6 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -3211,12 +2743,20 @@ "dev": true }, "json5": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", + "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", "dev": true, "requires": { "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + } } }, "jsprim": { @@ -3232,9 +2772,9 @@ } }, "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, "kleur": { @@ -3243,12 +2783,6 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, - "left-pad": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", - "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", - "dev": true - }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -3265,26 +2799,13 @@ "type-check": "~0.3.2" } }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" } }, "lodash": { @@ -3299,29 +2820,28 @@ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", "dev": true }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "lolex": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", + "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", "dev": true, "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" + "@sinonjs/commons": "^1.7.0" } }, "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", "dev": true, "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "semver": "^6.0.0" }, "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } @@ -3357,41 +2877,36 @@ "dev": true }, "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "braces": "^3.0.1", + "picomatch": "^2.0.5" } }, "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", "dev": true }, "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", "dev": true, "requires": { - "mime-db": "1.40.0" + "mime-db": "1.43.0" } }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -3402,9 +2917,9 @@ } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, "mixin-deep": { @@ -3435,14 +2950,6 @@ "dev": true, "requires": { "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } } }, "ms": { @@ -3451,13 +2958,6 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true, - "optional": true - }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -3483,12 +2983,6 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true - }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -3508,39 +3002,34 @@ "dev": true }, "node-notifier": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz", - "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-6.0.0.tgz", + "integrity": "sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==", "dev": true, + "optional": true, "requires": { "growly": "^1.3.0", - "is-wsl": "^1.1.0", - "semver": "^5.5.0", + "is-wsl": "^2.1.1", + "semver": "^6.3.0", "shellwords": "^0.1.1", - "which": "^1.3.0" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" + "which": "^1.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "optional": true + } } }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -3551,9 +3040,9 @@ } }, "nwsapi": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", - "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", "dev": true }, "oauth-sign": { @@ -3593,6 +3082,12 @@ } } }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -3608,14 +3103,26 @@ "isobject": "^3.0.0" } }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "requires": { "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" } }, "object.pick": { @@ -3636,54 +3143,34 @@ "wrappy": "1" } }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "onetime": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", "dev": true, "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - } + "mimic-fn": "^2.1.0" } }, "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, "requires": { "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", + "fast-levenshtein": "~2.0.6", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - }, - "dependencies": { - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - } + "word-wrap": "~1.2.3" } }, "p-each-series": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", - "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", - "dev": true, - "requires": { - "p-reduce": "^1.0.0" - } + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", + "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==", + "dev": true }, "p-finally": { "version": "1.0.0", @@ -3692,49 +3179,33 @@ "dev": true }, "p-limit": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", - "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", + "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", "dev": true, "requires": { "p-try": "^2.0.0" } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "p-limit": "^2.0.0" + "p-limit": "^2.2.0" } }, - "p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", - "dev": true - }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", "dev": true }, "pascalcase": { @@ -3744,9 +3215,9 @@ "dev": true }, "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, "path-is-absolute": { @@ -3767,25 +3238,16 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "picomatch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", + "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==", "dev": true }, "pirates": { @@ -3798,12 +3260,12 @@ } }, "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { - "find-up": "^3.0.0" + "find-up": "^4.0.0" } }, "pn": { @@ -3825,31 +3287,31 @@ "dev": true }, "pretty-format": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", - "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "version": "25.1.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", + "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", "dev": true, "requires": { - "@jest/types": "^24.9.0", - "ansi-regex": "^4.0.0", - "ansi-styles": "^3.2.0", - "react-is": "^16.8.4" + "@jest/types": "^25.1.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" } }, "prompts": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.2.1.tgz", - "integrity": "sha512-VObPvJiWPhpZI6C5m60XOzTfnYg/xc/an+r9VYymj9WJW3B/DIH+REzjpAACPf8brwPeP+7vz3bIim3S+AaMjw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.1.tgz", + "integrity": "sha512-qIP2lQyCwYbdzcqHIUi2HAxiWixhoM9OdLCWf8txXsapC/X9YdsCoeyRIXE/GP+Q0J37Q7+XN/MFqbUa7IzXNA==", "dev": true, "requires": { "kleur": "^3.0.3", - "sisteransi": "^1.0.3" + "sisteransi": "^1.0.4" } }, "psl": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz", - "integrity": "sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", + "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", "dev": true }, "pump": { @@ -3875,32 +3337,11 @@ "dev": true }, "react-is": { - "version": "16.9.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.9.0.tgz", - "integrity": "sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw==", + "version": "16.13.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.0.tgz", + "integrity": "sha512-GFMtL0vHkiBv9HluwNZTggSn/sCyEt9n02aM0dSAjGGyqyNlAyftYm4phPxdvCigG15JreC5biwxCgTAJZ7yAA==", "dev": true }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, "realpath-native": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", @@ -3939,9 +3380,9 @@ "dev": true }, "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "dev": true, "requires": { "aws-sign2": "~0.7.0", @@ -3951,7 +3392,7 @@ "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", - "har-validator": "~5.1.0", + "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", @@ -3961,47 +3402,53 @@ "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", + "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" }, "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" + "psl": "^1.1.28", + "punycode": "^2.1.1" } } } }, "request-promise-core": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", - "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", + "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", "dev": true, "requires": { - "lodash": "^4.17.11" + "lodash": "^4.17.15" } }, "request-promise-native": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", - "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", + "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", "dev": true, "requires": { - "request-promise-core": "1.1.2", + "request-promise-core": "1.1.3", "stealthy-require": "^1.1.1", "tough-cookie": "^2.3.3" + }, + "dependencies": { + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } } }, "require-directory": { @@ -4017,27 +3464,27 @@ "dev": true }, "resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", + "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", "dev": true, "requires": { "path-parse": "^1.0.6" } }, "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "requires": { - "resolve-from": "^3.0.0" + "resolve-from": "^5.0.0" } }, "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, "resolve-url": { @@ -4053,9 +3500,9 @@ "dev": true }, "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" @@ -4103,13 +3550,146 @@ "micromatch": "^3.1.4", "minimist": "^1.1.1", "walker": "~1.0.5" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } } }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + "saxes": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", + "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "dev": true, + "requires": { + "xmlchars": "^2.1.1" + } }, "semver": { "version": "5.7.1", @@ -4165,7 +3745,8 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", - "dev": true + "dev": true, + "optional": true }, "signal-exit": { "version": "3.0.2", @@ -4174,15 +3755,15 @@ "dev": true }, "sisteransi": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.3.tgz", - "integrity": "sha512-SbEG75TzH8G7eVXFSN5f9EExILKfly7SUvVY5DhhYLvfhKqhDFY0OzevWa/zwak0RLRfWS5AvfMWpd9gJvr5Yg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.4.tgz", + "integrity": "sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==", "dev": true }, "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, "snapdragon": { @@ -4314,12 +3895,12 @@ "dev": true }, "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "dev": true, "requires": { - "atob": "^2.1.1", + "atob": "^2.1.2", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", "source-map-url": "^0.4.0", @@ -4327,9 +3908,9 @@ } }, "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -4342,38 +3923,6 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true - }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -4383,6 +3932,12 @@ "extend-shallow": "^3.0.0" } }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -4434,56 +3989,76 @@ "dev": true }, "string-length": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", - "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", + "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==", "dev": true, "requires": { "astral-regex": "^1.0.0", - "strip-ansi": "^4.0.0" + "strip-ansi": "^5.2.0" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" } } } }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "string.prototype.trimleft": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", + "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + } + }, + "string.prototype.trimright": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", + "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.0" } }, "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true }, "strip-eof": { @@ -4492,13 +4067,29 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-hyperlinks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz", + "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" } }, "symbol-tree": { @@ -4507,22 +4098,31 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, + "terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + } + }, "test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" } }, "throat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "dev": true }, "tmpl": { @@ -4570,21 +4170,21 @@ } }, "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "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": "^3.0.0", - "repeat-string": "^1.6.1" + "is-number": "^7.0.0" } }, "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", "dev": true, "requires": { + "ip-regex": "^2.1.0", "psl": "^1.1.28", "punycode": "^2.1.1" } @@ -4598,12 +4198,6 @@ "punycode": "^2.1.0" } }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -4628,15 +4222,25 @@ "prelude-ls": "~1.1.2" } }, - "uglify-js": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", - "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, - "optional": true, "requires": { - "commander": "~2.20.0", - "source-map": "~0.6.1" + "is-typedarray": "^1.0.0" } }, "union-value": { @@ -4713,29 +4317,40 @@ "dev": true }, "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" } }, "uuid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", - "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "v8-to-istanbul": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.2.tgz", + "integrity": "sha512-G9R+Hpw0ITAmPSr47lSlc5A1uekSYzXxTMlFxso2xoffwo4jQnzbv1p9yXIinO8UMZKfAFewaCHwWvnH4Jb4Ug==", "dev": true, "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } } }, "verror": { @@ -4750,12 +4365,23 @@ } }, "w3c-hr-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", - "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", + "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", "dev": true, "requires": { - "browser-process-hrtime": "^0.1.2" + "domexception": "^1.0.1", + "webidl-conversions": "^4.0.2", + "xml-name-validator": "^3.0.0" } }, "walker": { @@ -4789,9 +4415,9 @@ "dev": true }, "whatwg-url": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", - "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "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", @@ -4814,21 +4440,21 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, "wrappy": { @@ -4838,24 +4464,22 @@ "dev": true }, "write-file-atomic": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", - "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, "requires": { - "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, "ws": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", - "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", + "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==", + "dev": true }, "xml-name-validator": { "version": "3.0.0", @@ -4863,6 +4487,12 @@ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", @@ -4870,27 +4500,28 @@ "dev": true }, "yargs": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", - "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", "dev": true, "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^3.0.0", + "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.1.1" + "yargs-parser": "^18.1.1" } }, "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.1.tgz", + "integrity": "sha512-KRHEsOM16IX7XuLnMOqImcPNbLVXMNHYAoFc3BKR8Ortl5gzDbtXvvEoGx9imk5E+X1VeNKNlcHr8B8vi+7ipA==", "dev": true, "requires": { "camelcase": "^5.0.0", diff --git a/test/package.json b/test/package.json index de9d1b8058..47e2a83f39 100644 --- a/test/package.json +++ b/test/package.json @@ -9,8 +9,8 @@ }, "license": "Apache2", "devDependencies": { - "axios": "^0.18.1", - "jest": "^24.9.0" + "axios": "^0.19.2", + "jest": "^25.1.0" }, "jest": { "testEnvironment": "node", From 93c2ccad7ef8834360527e92237f9ba623b45022 Mon Sep 17 00:00:00 2001 From: Robert Seedorff Date: Thu, 13 Feb 2020 16:26:34 +0100 Subject: [PATCH 073/102] Fixing GitHub issue #109 There seems to be a race condition sometimes. The engine needs to wait until the mysql db is ready. Added a new healthcheck. --- docker-compose.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index d63e6adf7c..930e09ba17 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,7 +3,8 @@ services: engine: image: securecodebox/engine:${DEFAULT_TAG} depends_on: - - camundadb + camundadb: + condition: service_healthy ports: - "8080:8080" networks: @@ -48,6 +49,11 @@ services: labels: container_group: infrastructure command: --max_allowed_packet=65011712 # 512M + healthcheck: + test: "/usr/bin/mysql --user=${CAMUNDADB_USER} --password=${CAMUNDADB_PW} --execute \"SHOW DATABASES;\"" + interval: 5s + timeout: 1s + retries: 5 environment: - MYSQL_ROOT_PASSWORD=${CAMUNDADB_ROOT_PW} - MYSQL_DATABASE=${CAMUNDADB_DATABASE} From 1f6ea6cb777d01376adfd5665e29ea395624f984 Mon Sep 17 00:00:00 2001 From: Robert Seedorff Date: Thu, 13 Feb 2020 16:29:32 +0100 Subject: [PATCH 074/102] Minor upgrade for kibana and elasticsearch --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 930e09ba17..081f6521fa 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -190,7 +190,7 @@ services: - ENGINE_BASIC_AUTH_PASSWORD=${ENGINE_SCANNERSERVICES_PASSWORD} persistence-elasticsearch: - image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.8.1 + image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.8.6 ports: - "9200:9200" - "9300:9300" @@ -205,7 +205,7 @@ services: - discovery.type=single-node persistence-kibana: - image: docker.elastic.co/kibana/kibana-oss:6.8.1 + image: docker.elastic.co/kibana/kibana-oss:6.8.6 depends_on: - persistence-elasticsearch ports: From dd0bc01e1a0fa9bf2b052fa16de7feb48424ef7c Mon Sep 17 00:00:00 2001 From: Robert Seedorff Date: Wed, 19 Feb 2020 13:30:00 +0100 Subject: [PATCH 075/102] Added a vagrant file to create a reproduceable local setup based on a virtual box machine --- .env | 10 ++--- .gitignore | 2 + README.md | 34 ++++++++++---- Vagrantfile | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 160 insertions(+), 13 deletions(-) create mode 100644 Vagrantfile diff --git a/.env b/.env index 874e478095..065a3a5a2d 100644 --- a/.env +++ b/.env @@ -2,15 +2,15 @@ CAMUNDADB_DATABASE=camundadb CAMUNDADB_ROOT_PW=root CAMUNDADB_USER=camunda CAMUNDADB_PW=secret - +# ENGINE_SCANNERSERVICES_USER=defaultScanner ENGINE_SCANNERSERVICES_PASSWORD=scan - +# DEFECT_DOJO_API_KEY=your-defect-dojo-api-key-here - +# # Default Image Tag. Latest will always be the most recent stable release. DEFAULT_TAG=latest - +# # Enabling the Persistence Providers inside then Engine Container # Even when they are disabled here they might still be started (depending on the way you start your compose stack) # This flag just changes if the engine writes results into the providers @@ -18,7 +18,7 @@ ENABLE_ELASTICSEARCH=true # DefectDojo integration is currently disabled by default # This is planned to change with release 1.2.0 ENABLE_DEFECT_DOJO=false - +# # Admin User Configuration # By default you will be asked to set the admin password on first login. # It can be set automatically by filling the following env vars. diff --git a/.gitignore b/.gitignore index 7a560d7bf2..673ec74837 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ **.iml .DS_Store .idea +.vagrant +**.log diff --git a/README.md b/README.md index 2963370f66..9065709c93 100644 --- a/README.md +++ b/README.md @@ -41,20 +41,22 @@ The purpose of *secureCodeBox* **is not** to replace the penetration testers or There is a german article about [Security DevOps – Angreifern (immer) einen Schritt voraus][secdevops-objspec] in the software engineering journal [OBJEKTSpektrum][objspec]. ## Quickstart - -### Prerequisites - * Minimal Docker version 18.03.0 is required - * Docker-Compose is required. - * Your docker host will need at least 4GB virtual memory to run the complete stack. If you want to scale out the scanner you will need more... - -For a quick start checkout this repository and start the complete secureCodeBox stack with docker-compose: +For a quick start checkout this repository and start the complete secureCodeBox stack with docker-compose or vagrant: ```bash git clone https://github.com/secureCodeBox/secureCodeBox cd secureCodeBox ``` -### Start with docker-compose +You can start the secureCodeBox project based on docker-compose or localy with Vagrant. + +### Start with docker and docker-compose + +#### Prerequisites + * Minimal Docker version 18.03.0 is required + * Docker-Compose is required. + * Your docker host will need at least 4GB virtual memory to run the complete stack. If you want to scale out the scanner you will need more... + The docker-compose.yml file can be used to launch a secureCodeBox instance. To start the secureCodeBox and some demo targets run the following: @@ -69,6 +71,22 @@ Running `docker-compose up` uses the default credentials specified in the [`.env * `ENGINE_SCANNERSERVICES_USER` Technical user for the scanner services to access the engines API * `ENGINE_SCANNERSERVICES_PASSWORD` Technical users password for the scanner services to access the engines API +### Start with Vagrant (docker and docker compose already included) +#### Prerequisites + * Vagrant Version 2.x is required + * VirtualBox is required + * Your vagrant maschine will need at least 8GB virtual memory to run the complete stack. If you want to scale out the scanner you will need more... + +```bash +vagrant plugin install vagrant-docker-compose +vagrant plugin install vagrant-disksize +``` +To start the complete setup localy you can easily start the vagrant maschine: + +```bash +vagrant up +``` + ### Run your first security scan There are several ways to start a security scan with the secureCodeBox. One way is to use the WebUI of the engine and start the scan manually. diff --git a/Vagrantfile b/Vagrantfile new file mode 100644 index 0000000000..97dd47ebcc --- /dev/null +++ b/Vagrantfile @@ -0,0 +1,127 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +# All Vagrant configuration is done below. The "2" in Vagrant.configure +# configures the configuration version (we support older styles for +# backwards compatibility). Please don't change it unless you know what +# you're doing. +Vagrant.configure("2") do |config| + # The most common configuration options are documented and commented below. + # For a complete reference, please see the online documentation at + # https://docs.vagrantup.com. + + # Check for plugins needed + if !Vagrant.has_plugin?("vagrant-disksize") + print " WARN: Missing plugin 'vagrant-disksize'.\n" + print " Use 'vagrant plugin install vagrant-disksize' to install.\n" + end + + if !Vagrant.has_plugin?("vagrant-docker-compose") + print " WARN: Missing plugin 'vagrant-docker-compose'.\n" + print " Use 'vagrant plugin install vagrant-docker-compose' to install.\n" + end + + # Every Vagrant development environment requires a box. You can search for + # boxes at https://vagrantcloud.com/search. + config.vm.box = "ubuntu/bionic64" + config.vm.hostname = "scb-test" + + # Defines a given disk size for this Box. + # You can search for this plugin at https://github.com/sprotheroe/vagrant-disksize + config.disksize.size = '40GB' + + # Disable automatic box update checking. If you disable this, then + # boxes will only be checked for updates when the user runs + # `vagrant box outdated`. This is not recommended. + # config.vm.box_check_update = false + + # Create a forwarded port mapping which allows access to a specific port + # within the machine from a port on the host machine. In the example below, + # accessing "localhost:8080" will access port 80 on the guest machine. + # NOTE: This will enable public access to the opened port + config.vm.network "forwarded_port", guest: 80, host: 80 + config.vm.network "forwarded_port", guest: 8080, host: 8080 + config.vm.network "forwarded_port", guest: 443, host: 443 + config.vm.network "forwarded_port", guest: 8443, host: 8443 + config.vm.network "forwarded_port", guest: 9200, host: 9200 + config.vm.network "forwarded_port", guest: 5601, host: 5601 + + + # Create a forwarded port mapping which allows access to a specific port + # within the machine from a port on the host machine and only allow access + # via 127.0.0.1 to disable public access + # config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1" + + # Create a private network, which allows host-only access to the machine + # using a specific IP. + # config.vm.network "private_network", ip: "192.168.33.10" + + # Create a public network, which generally matched to bridged network. + # Bridged networks make the machine appear as another physical device on + # your network. + # config.vm.network "public_network" + + #config.ssh.guest_port = 29683 + + # Share an additional folder to the guest VM. The first argument is + # the path on the host to the actual folder. The second argument is + # the path on the guest to mount the folder. And the optional third + # argument is a set of non-required options. + # config.vm.synced_folder "../data", "/vagrant_data" + + # Provider-specific configuration so you can fine-tune various + # backing providers for Vagrant. These expose provider-specific options. + # Example for VirtualBox: + # + config.vm.provider "virtualbox" do |vb| + vb.name = "scb-test" + + # Display the VirtualBox GUI when booting the machine + vb.gui = false + + # Customize the amount of memory on the VM: + vb.memory = "8192" + vb.cpus = 1 + end + + + # + # View the documentation for the provider you are using for more + # information on available options. + + # Enable provisioning with a shell script. Additional provisioners such as + # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the + # documentation for more information about their specific syntax and use. + # config.vm.provision "shell", inline: <<-SHELL + # apt-get update + # apt-get install -y apache2 + # SHELL + + compose_env = Hash.new + if File.file?(".env") + array = File.read(".env").split("\n") + array.each do |e| + unless e.start_with?("#") + var = e.split("=") + compose_env[var[0]] = var[1] + end + end + end + + # If errors occur, try running "vagrant provision" manually + # after "vagrant up" + config.vm.provision :docker + + # To use docker_compose as a provisioning tool, install + # vagrant-docker-compose plugin first. It should also solve the + # "The '' provisioner could not be found." error: + # $ vagrant plugin install vagrant-docker-compose + config.vm.provision :docker_compose, + project_name: "docker-vagrant", + yml: [ + "/vagrant/docker-compose.yml", + "/vagrant/docker-compose.demo.yml" + ], + env: compose_env, + run: "always" +end From 016464ade2782ae15ea5555c5d86583b95db9fe7 Mon Sep 17 00:00:00 2001 From: J12934 <13718901+J12934@users.noreply.github.com> Date: Mon, 16 Mar 2020 17:03:57 +0100 Subject: [PATCH 076/102] Update Vagrant syntax --- Vagrantfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Vagrantfile b/Vagrantfile index 97dd47ebcc..ca3263c996 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -11,12 +11,12 @@ Vagrant.configure("2") do |config| # https://docs.vagrantup.com. # Check for plugins needed - if !Vagrant.has_plugin?("vagrant-disksize") + unless Vagrant.has_plugin?("vagrant-disksize") print " WARN: Missing plugin 'vagrant-disksize'.\n" print " Use 'vagrant plugin install vagrant-disksize' to install.\n" end - if !Vagrant.has_plugin?("vagrant-docker-compose") + unless Vagrant.has_plugin?("vagrant-docker-compose") print " WARN: Missing plugin 'vagrant-docker-compose'.\n" print " Use 'vagrant plugin install vagrant-docker-compose' to install.\n" end From be998776ed5cb82c1960f9d2955d869f2ed2ffe8 Mon Sep 17 00:00:00 2001 From: J12934 <13718901+J12934@users.noreply.github.com> Date: Fri, 27 Mar 2020 14:09:13 +0100 Subject: [PATCH 077/102] Fix target uri format parsing --- cli/run_scanner.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/run_scanner.sh b/cli/run_scanner.sh index b246c02946..f58474df77 100755 --- a/cli/run_scanner.sh +++ b/cli/run_scanner.sh @@ -227,7 +227,7 @@ NUM_ERRORS=0 if [ ! -n "${PAYLOAD_OVERRIDE}" ]; then # Verify target format if [ "${TARGET_FORMAT}" = "uri" ]; then - if [[ ! "${TARGET}" =~ http?(s)://* ]]; then + if [[ ! "${TARGET}" =~ http(s)?://* ]]; then error "Invalid URI to scan: '${TARGET}'! Expected: http(s)://..." NUM_ERRORS=$((NUM_ERRORS + 1)) else From bf6d35073ed3946ba12ec68bbe15df2da516feca Mon Sep 17 00:00:00 2001 From: J12934 <13718901+J12934@users.noreply.github.com> Date: Fri, 27 Mar 2020 14:09:27 +0100 Subject: [PATCH 078/102] Use target instead of host for the zap template --- cli/zap.template.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/zap.template.json b/cli/zap.template.json index 4b87dbcb09..201e21ecae 100644 --- a/cli/zap.template.json +++ b/cli/zap.template.json @@ -3,7 +3,7 @@ "context": "%CONTEXT%", "name": "zap", "target": { - "location": "%HOST%", + "location": "%TARGET%", "name": "%TARGET_NAME%", "attributes": { "ZAP_BASE_URL": "%TARGET%", From 5bf05a632b488c46bb7c100291da1ef16ba01785 Mon Sep 17 00:00:00 2001 From: dpatanin Date: Mon, 30 Mar 2020 11:52:33 +0200 Subject: [PATCH 079/102] write adr for combined scanner --- adr/adr_0001.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/adr/adr_0001.adoc b/adr/adr_0001.adoc index 2400104ba5..38b27f72e2 100644 --- a/adr/adr_0001.adoc +++ b/adr/adr_0001.adoc @@ -29,8 +29,8 @@ We want to use _secureCodeBox_ not only for scans of one particular web project. == Decision - +The best solution to this problem would be to have each scan be able to take the results from any other completed scan and work on them, perhaps with a filter in between. But this is not possible with the camunda engine the way we use it for our current processes. Each of our scan processes has it's own bpmn. The results are passed as a variable from step to step inside the process models. In order for another scanner to have access to these variables, they need to be stored outside the processes. Furthermore, our scanner need to pass variables through, which indicate wether another scanner needs the results or they should be persisted. We do not have such a storage and variable logic implemented in our engine and camunda models, therefore we're not able to implement a combined scan such as described without reworking our engine and all process models. It is possible though to create processes for specific combined scanner which follow our current architecture. == Consequences - \ No newline at end of file +To have each combined scan process separately implemented means that we cannot use one scanner for multiple processes. So let's say we want a combined scan including a nmap scan followed by a ssh scan and another combined scan also starting with a nmap but followed by a sslyze. We can not use one and the same nmap scan for both, even if it's identically configured. This obviously is a technical flaw from a logical and performance point of view. But this way we don't need to rework our engine and existing process models, which also would add a lot of complexity. But at a curtain point in the future this should be worked on to improve performance and scaling of the combined scan processes. \ No newline at end of file From d85926a20a01ba2683364706f904d321ab9caee9 Mon Sep 17 00:00:00 2001 From: dpatanin Date: Tue, 31 Mar 2020 12:24:49 +0200 Subject: [PATCH 080/102] rework adr --- adr/adr_0001.adoc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/adr/adr_0001.adoc b/adr/adr_0001.adoc index 38b27f72e2..7ce584cc9b 100644 --- a/adr/adr_0001.adoc +++ b/adr/adr_0001.adoc @@ -27,10 +27,12 @@ We want to use _secureCodeBox_ not only for scans of one particular web project. - etc - Then "join" these "sub scan processes" together and gather the results +The best solution to this problem would be to have each scan be able to take the results from any other completed scan and work on them, perhaps with a filter in between. But this is not possible with the camunda engine the way we use it for our current processes. Each of our scan processes has it's own bpmn. The results are passed as a variable from step to step inside the process models. In order for another scanner to have access to these variables, they need to be stored outside the processes. Furthermore, our scanner need to pass variables through, which indicate wether another scanner needs the results or they should be persisted. + == Decision -The best solution to this problem would be to have each scan be able to take the results from any other completed scan and work on them, perhaps with a filter in between. But this is not possible with the camunda engine the way we use it for our current processes. Each of our scan processes has it's own bpmn. The results are passed as a variable from step to step inside the process models. In order for another scanner to have access to these variables, they need to be stored outside the processes. Furthermore, our scanner need to pass variables through, which indicate wether another scanner needs the results or they should be persisted. We do not have such a storage and variable logic implemented in our engine and camunda models, therefore we're not able to implement a combined scan such as described without reworking our engine and all process models. It is possible though to create processes for specific combined scanner which follow our current architecture. + We do not have such a storage and variable logic implemented in our engine and camunda models, therefore we're not able to implement a combined scan such as described without reworking our engine and all process models. It is possible though to create processes for specific combined scanner which follow our current architecture. One problem about this is, that we do not have the expertise in camunda required for such a rework and "upgrade". The question wether it is worth working into it or not is very difficult to answer, since workforce is limited and other tasks appear/are more important. Overall the idea of an architectural change/rework is not turned down, but a giant task for another time. == Consequences -To have each combined scan process separately implemented means that we cannot use one scanner for multiple processes. So let's say we want a combined scan including a nmap scan followed by a ssh scan and another combined scan also starting with a nmap but followed by a sslyze. We can not use one and the same nmap scan for both, even if it's identically configured. This obviously is a technical flaw from a logical and performance point of view. But this way we don't need to rework our engine and existing process models, which also would add a lot of complexity. But at a curtain point in the future this should be worked on to improve performance and scaling of the combined scan processes. \ No newline at end of file +To have each combined scan process separately implemented means that we cannot use one scanner for multiple processes. So let's say we want a combined scan including a nmap scan followed by a ssh scan and another combined scan also starting with a nmap but followed by a sslyze. We can not use one and the same nmap scan for both, even if it's identically configured. This obviously is a technical flaw from a logical and performance point of view. But this way we don't need to rework our engine and existing process models, which also would add a lot of complexity. But at a curtain point in the future this should be worked on to improve performance and scaling of the combined scan processes. So on the negative side we have performance flaws and the fact, that if we rework the architecture the combined processes become useless, since we then combine processes by other means. On the positive side we can focus more on other more important topics and don't have to invest time into learning camunda deeply, without knowing wether we want to use camunda for this kind of tasks in the end or not. \ No newline at end of file From aab62ffa8fda09e9706c5cafe560238b7df970ce Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach <13718901+J12934@users.noreply.github.com> Date: Sat, 4 Apr 2020 22:17:15 +0200 Subject: [PATCH 081/102] Regenerate package-lock to fix minimist vuln --- test/package-lock.json | 1171 ++++++++++++++++++---------------------- 1 file changed, 534 insertions(+), 637 deletions(-) diff --git a/test/package-lock.json b/test/package-lock.json index 53806fb9e2..af761f6e93 100644 --- a/test/package-lock.json +++ b/test/package-lock.json @@ -14,22 +14,23 @@ } }, "@babel/core": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.7.tgz", - "integrity": "sha512-rBlqF3Yko9cynC5CCFy6+K/w2N+Sq/ff2BPy+Krp7rHlABIr5epbA7OxVeKoMHB39LZOp1UY5SuLjy6uWi35yA==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", + "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.7", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.7", + "@babel/generator": "^7.9.0", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helpers": "^7.9.0", + "@babel/parser": "^7.9.0", "@babel/template": "^7.8.6", - "@babel/traverse": "^7.8.6", - "@babel/types": "^7.8.7", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", + "json5": "^2.1.2", "lodash": "^4.17.13", "resolve": "^1.3.2", "semver": "^5.4.1", @@ -51,6 +52,12 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -60,12 +67,12 @@ } }, "@babel/generator": { - "version": "7.8.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.8.tgz", - "integrity": "sha512-HKyUVu69cZoclptr8t8U5b6sx6zoWjh8jiUhnuj3MpZuKT2dJ8zPTuiy31luq32swhI0SpwItCIlU8XW7BZeJg==", + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz", + "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==", "dev": true, "requires": { - "@babel/types": "^7.8.7", + "@babel/types": "^7.9.0", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" @@ -99,12 +106,76 @@ "@babel/types": "^7.8.3" } }, + "@babel/helper-member-expression-to-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", + "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-imports": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", + "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-transforms": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", + "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/template": "^7.8.6", + "@babel/types": "^7.9.0", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", + "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, "@babel/helper-plugin-utils": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", "dev": true }, + "@babel/helper-replace-supers": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", + "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/helper-simple-access": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", + "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, "@babel/helper-split-export-declaration": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", @@ -114,25 +185,31 @@ "@babel/types": "^7.8.3" } }, + "@babel/helper-validator-identifier": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", + "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", + "dev": true + }, "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", + "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", "dev": true, "requires": { "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0" } }, "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", "dev": true, "requires": { + "@babel/helper-validator-identifier": "^7.9.0", "chalk": "^2.0.0", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" }, "dependencies": { @@ -189,9 +266,9 @@ } }, "@babel/parser": { - "version": "7.8.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.8.tgz", - "integrity": "sha512-mO5GWzBPsPf6865iIbzNE0AvkKF3NE+2S3eRUpE+FE07BOAkXh6G+GW/Pj01hhXjve1WScbaIO4UlY1JKeqCcA==", + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", "dev": true }, "@babel/plugin-syntax-bigint": { @@ -224,17 +301,17 @@ } }, "@babel/traverse": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.6.tgz", - "integrity": "sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", + "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.6", + "@babel/generator": "^7.9.0", "@babel/helper-function-name": "^7.8.3", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.6", - "@babel/types": "^7.8.6", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.0", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" @@ -258,12 +335,12 @@ } }, "@babel/types": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz", - "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", "dev": true, "requires": { - "esutils": "^2.0.2", + "@babel/helper-validator-identifier": "^7.9.0", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -282,14 +359,6 @@ "requires": { "exec-sh": "^0.3.2", "minimist": "^1.2.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } } }, "@istanbuljs/load-nyc-config": { @@ -311,89 +380,88 @@ "dev": true }, "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.2.6.tgz", + "integrity": "sha512-bGp+0PicZVCEhb+ifnW9wpKWONNdkhtJsRE7ap729hiAfTvCN6VhGx0s/l/V/skA2pnyqq+N/7xl9ZWfykDpsg==", "dev": true, "requires": { - "@jest/source-map": "^25.1.0", + "@jest/source-map": "^25.2.6", "chalk": "^3.0.0", - "jest-util": "^25.1.0", + "jest-util": "^25.2.6", "slash": "^3.0.0" } }, "@jest/core": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.1.0.tgz", - "integrity": "sha512-iz05+NmwCmZRzMXvMo6KFipW7nzhbpEawrKrkkdJzgytavPse0biEnCNr2wRlyCsp3SmKaEY+SGv7YWYQnIdig==", + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.2.7.tgz", + "integrity": "sha512-Nd6ELJyR+j0zlwhzkfzY70m04hAur0VnMwJXVe4VmmD/SaQ6DEyal++ERQ1sgyKIKKEqRuui6k/R0wHLez4P+g==", "dev": true, "requires": { - "@jest/console": "^25.1.0", - "@jest/reporters": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", + "@jest/console": "^25.2.6", + "@jest/reporters": "^25.2.6", + "@jest/test-result": "^25.2.6", + "@jest/transform": "^25.2.6", + "@jest/types": "^25.2.6", "ansi-escapes": "^4.2.1", "chalk": "^3.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.3", - "jest-changed-files": "^25.1.0", - "jest-config": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-resolve-dependencies": "^25.1.0", - "jest-runner": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-snapshot": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", - "jest-watcher": "^25.1.0", + "jest-changed-files": "^25.2.6", + "jest-config": "^25.2.7", + "jest-haste-map": "^25.2.6", + "jest-message-util": "^25.2.6", + "jest-regex-util": "^25.2.6", + "jest-resolve": "^25.2.6", + "jest-resolve-dependencies": "^25.2.7", + "jest-runner": "^25.2.7", + "jest-runtime": "^25.2.7", + "jest-snapshot": "^25.2.7", + "jest-util": "^25.2.6", + "jest-validate": "^25.2.6", + "jest-watcher": "^25.2.7", "micromatch": "^4.0.2", "p-each-series": "^2.1.0", - "realpath-native": "^1.1.0", + "realpath-native": "^2.0.0", "rimraf": "^3.0.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" } }, "@jest/environment": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.1.0.tgz", - "integrity": "sha512-cTpUtsjU4cum53VqBDlcW0E4KbQF03Cn0jckGPW/5rrE9tb+porD3+hhLtHAwhthsqfyF+bizyodTlsRA++sHg==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.2.6.tgz", + "integrity": "sha512-17WIw+wCb9drRNFw1hi8CHah38dXVdOk7ga9exThhGtXlZ9mK8xH4DjSB9uGDGXIWYSHmrxoyS6KJ7ywGr7bzg==", "dev": true, "requires": { - "@jest/fake-timers": "^25.1.0", - "@jest/types": "^25.1.0", - "jest-mock": "^25.1.0" + "@jest/fake-timers": "^25.2.6", + "@jest/types": "^25.2.6", + "jest-mock": "^25.2.6" } }, "@jest/fake-timers": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.1.0.tgz", - "integrity": "sha512-Eu3dysBzSAO1lD7cylZd/CVKdZZ1/43SF35iYBNV1Lvvn2Undp3Grwsv8PrzvbLhqwRzDd4zxrY4gsiHc+wygQ==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.2.6.tgz", + "integrity": "sha512-A6qtDIA2zg/hVgUJJYzQSHFBIp25vHdSxW/s4XmTJAYxER6eL0NQdQhe4+232uUSviKitubHGXXirt5M7blPiA==", "dev": true, "requires": { - "@jest/types": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0", + "@jest/types": "^25.2.6", + "jest-message-util": "^25.2.6", + "jest-mock": "^25.2.6", + "jest-util": "^25.2.6", "lolex": "^5.0.0" } }, "@jest/reporters": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.1.0.tgz", - "integrity": "sha512-ORLT7hq2acJQa8N+NKfs68ZtHFnJPxsGqmofxW7v7urVhzJvpKZG9M7FAcgh9Ee1ZbCteMrirHA3m5JfBtAaDg==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.2.6.tgz", + "integrity": "sha512-DRMyjaxcd6ZKctiXNcuVObnPwB1eUs7xrUVu0J2V0p5/aZJei5UM9GL3s/bmN4hRV8Mt3zXh+/9X2o0Q4ClZIA==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^25.1.0", - "@jest/environment": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", + "@jest/console": "^25.2.6", + "@jest/test-result": "^25.2.6", + "@jest/transform": "^25.2.6", + "@jest/types": "^25.2.6", "chalk": "^3.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", @@ -403,11 +471,10 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.0", - "jest-haste-map": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-util": "^25.1.0", - "jest-worker": "^25.1.0", + "jest-haste-map": "^25.2.6", + "jest-resolve": "^25.2.6", + "jest-util": "^25.2.6", + "jest-worker": "^25.2.6", "node-notifier": "^6.0.0", "slash": "^3.0.0", "source-map": "^0.6.0", @@ -417,9 +484,9 @@ } }, "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.2.6.tgz", + "integrity": "sha512-VuIRZF8M2zxYFGTEhkNSvQkUKafQro4y+mwUxy5ewRqs5N/ynSFUODYp3fy1zCnbCMy1pz3k+u57uCqx8QRSQQ==", "dev": true, "requires": { "callsites": "^3.0.0", @@ -428,58 +495,57 @@ } }, "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.2.6.tgz", + "integrity": "sha512-gmGgcF4qz/pkBzyfJuVHo2DA24kIgVQ5Pf/VpW4QbyMLSegi8z+9foSZABfIt5se6k0fFj/3p/vrQXdaOgit0w==", "dev": true, "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", + "@jest/console": "^25.2.6", + "@jest/types": "^25.2.6", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.1.0.tgz", - "integrity": "sha512-WgZLRgVr2b4l/7ED1J1RJQBOharxS11EFhmwDqknpknE0Pm87HLZVS2Asuuw+HQdfQvm2aXL2FvvBLxOD1D0iw==", + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.2.7.tgz", + "integrity": "sha512-s2uYGOXONDSTJQcZJ9A3Zkg3hwe53RlX1HjUNqjUy3HIqwgwCKJbnAKYsORPbhxXi3ARMKA7JNBi9arsTxXoYw==", "dev": true, "requires": { - "@jest/test-result": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-runner": "^25.1.0", - "jest-runtime": "^25.1.0" + "@jest/test-result": "^25.2.6", + "jest-haste-map": "^25.2.6", + "jest-runner": "^25.2.7", + "jest-runtime": "^25.2.7" } }, "@jest/transform": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.1.0.tgz", - "integrity": "sha512-4ktrQ2TPREVeM+KxB4zskAT84SnmG1vaz4S+51aTefyqn3zocZUnliLLm5Fsl85I3p/kFPN4CRp1RElIfXGegQ==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.2.6.tgz", + "integrity": "sha512-rZnjCjZf9avPOf9q/w9RUZ9Uc29JmB53uIXNJmNz04QbDMD5cR/VjfikiMKajBsXe2vnFl5sJ4RTt+9HPicauQ==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^25.1.0", + "@jest/types": "^25.2.6", "babel-plugin-istanbul": "^6.0.0", "chalk": "^3.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.3", - "jest-haste-map": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-util": "^25.1.0", + "jest-haste-map": "^25.2.6", + "jest-regex-util": "^25.2.6", + "jest-util": "^25.2.6", "micromatch": "^4.0.2", "pirates": "^4.0.1", - "realpath-native": "^1.1.0", + "realpath-native": "^2.0.0", "slash": "^3.0.0", "source-map": "^0.6.1", "write-file-atomic": "^3.0.0" } }, "@jest/types": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.1.0.tgz", - "integrity": "sha512-VpOtt7tCrgvamWZh1reVsGADujKigBUFTi19mlRjqEGsE8qH4r3s+skY33dNdXOwyZIvuftZ5tqdF1IgsMejMA==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.2.6.tgz", + "integrity": "sha512-myJTTV37bxK7+3NgKc4Y/DlQ5q92/NOwZsZ+Uch7OXdElxOg61QYc72fPYNAjlvbnJ2YvbXLamIsa9tj48BmyQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -498,9 +564,9 @@ } }, "@types/babel__core": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.6.tgz", - "integrity": "sha512-tTnhWszAqvXnhW7m5jQU9PomXSiKXk2sFxpahXvI20SZKu9ylPi8WtIxueZ6ehDWikPT0jeFujMj3X4ZHuf3Tg==", + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.7.tgz", + "integrity": "sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -569,6 +635,12 @@ "@types/istanbul-lib-report": "*" } }, + "@types/prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==", + "dev": true + }, "@types/stack-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", @@ -648,9 +720,9 @@ } }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "ansi-styles": { @@ -773,16 +845,16 @@ } }, "babel-jest": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.1.0.tgz", - "integrity": "sha512-tz0VxUhhOE2y+g8R2oFrO/2VtVjA1lkJeavlhExuRBg3LdNJY9gwQ+Vcvqt9+cqy71MCTJhewvTB7Qtnnr9SWg==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.2.6.tgz", + "integrity": "sha512-MDJOAlwtIeIQiGshyX0d2PxTbV73xZMpNji40ivVTPQOm59OdRR9nYCkffqI7ugtsK4JR98HgNKbDbuVf4k5QQ==", "dev": true, "requires": { - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", + "@jest/transform": "^25.2.6", + "@jest/types": "^25.2.6", "@types/babel__core": "^7.1.0", "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^25.1.0", + "babel-preset-jest": "^25.2.6", "chalk": "^3.0.0", "slash": "^3.0.0" } @@ -801,23 +873,23 @@ } }, "babel-plugin-jest-hoist": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.1.0.tgz", - "integrity": "sha512-oIsopO41vW4YFZ9yNYoLQATnnN46lp+MZ6H4VvPKFkcc2/fkl3CfE/NZZSmnEIEsJRmJAgkVEK0R7Zbl50CpTw==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.2.6.tgz", + "integrity": "sha512-qE2xjMathybYxjiGFJg0mLFrz0qNp83aNZycWDY/SuHiZNq+vQfRQtuINqyXyue1ELd8Rd+1OhFSLjms8msMbw==", "dev": true, "requires": { "@types/babel__traverse": "^7.0.6" } }, "babel-preset-jest": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.1.0.tgz", - "integrity": "sha512-eCGn64olaqwUMaugXsTtGAM2I0QTahjEtnRu0ql8Ie+gDWAc1N6wqN0k2NilnyTunM69Pad7gJY7LOtwLimoFQ==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.2.6.tgz", + "integrity": "sha512-Xh2eEAwaLY9+SyMt/xmGZDnXTW/7pSaBPG0EMo7EuhvosFKVWYB6CqwYD31DaEQuoTL090oDZ0FEqygffGRaSQ==", "dev": true, "requires": { "@babel/plugin-syntax-bigint": "^7.0.0", "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^25.1.0" + "babel-plugin-jest-hoist": "^25.2.6" } }, "balanced-match": { @@ -1048,9 +1120,9 @@ "dev": true }, "collect-v8-coverage": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.0.tgz", - "integrity": "sha512-VKIhJgvk8E1W28m5avZ2Gv2Ruv5YiF56ug2oclvaG9md69BuZImMG2sk9g7QNKLUbtYAKQjXjYxbYZVUlMMKmQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", + "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", "dev": true }, "collection-visit": { @@ -1131,6 +1203,23 @@ "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "cssom": { @@ -1203,14 +1292,11 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true }, "define-property": { "version": "2.0.2", @@ -1266,9 +1352,9 @@ "dev": true }, "diff-sequences": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.1.0.tgz", - "integrity": "sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz", + "integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==", "dev": true }, "domexception": { @@ -1305,36 +1391,6 @@ "once": "^1.4.0" } }, - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -1444,17 +1500,17 @@ } }, "expect": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-25.1.0.tgz", - "integrity": "sha512-wqHzuoapQkhc3OKPlrpetsfueuEiMf3iWh0R8+duCu9PIjXoP7HgD5aeypwTnXUAjC8aMsiVDaWwlbJ1RlQ38g==", + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/expect/-/expect-25.2.7.tgz", + "integrity": "sha512-yA+U2Ph0MkMsJ9N8q5hs9WgWI6oJYfecdXta6LkP/alY/jZZL1MHlJ2wbLh60Ucqf3G+51ytbqV3mlGfmxkpNw==", "dev": true, "requires": { - "@jest/types": "^25.1.0", + "@jest/types": "^25.2.6", "ansi-styles": "^4.0.0", - "jest-get-type": "^25.1.0", - "jest-matcher-utils": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-regex-util": "^25.1.0" + "jest-get-type": "^25.2.6", + "jest-matcher-utils": "^25.2.7", + "jest-message-util": "^25.2.6", + "jest-regex-util": "^25.2.6" } }, "extend": { @@ -1655,12 +1711,6 @@ "dev": true, "optional": true }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, "gensync": { "version": "1.0.0-beta.1", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", @@ -1746,27 +1796,12 @@ "har-schema": "^2.0.0" } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -1829,9 +1864,9 @@ } }, "html-escaper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", - "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, "http-signature": { @@ -1924,12 +1959,6 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, "is-ci": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", @@ -1959,12 +1988,6 @@ } } }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true - }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", @@ -2017,30 +2040,12 @@ "isobject": "^3.0.1" } }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -2103,14 +2108,6 @@ "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.0.0", "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } } }, "istanbul-lib-report": { @@ -2153,9 +2150,9 @@ } }, "istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-2osTcC8zcOSUkImzN2EWQta3Vdi4WjjKw99P2yWx5mLnigAM0Rd5uYFn1cf2i/Ois45GkNjaoTqc5CxgMSX80A==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -2163,54 +2160,54 @@ } }, "jest": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-25.1.0.tgz", - "integrity": "sha512-FV6jEruneBhokkt9MQk0WUFoNTwnF76CLXtwNMfsc0um0TlB/LG2yxUd0KqaFjEJ9laQmVWQWS0sG/t2GsuI0w==", + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest/-/jest-25.2.7.tgz", + "integrity": "sha512-XV1n/CE2McCikl4tfpCY950RytHYvxdo/wvtgmn/qwA8z1s16fuvgFL/KoPrrmkqJTaPMUlLVE58pwiaTX5TdA==", "dev": true, "requires": { - "@jest/core": "^25.1.0", + "@jest/core": "^25.2.7", "import-local": "^3.0.2", - "jest-cli": "^25.1.0" + "jest-cli": "^25.2.7" }, "dependencies": { "jest-cli": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.1.0.tgz", - "integrity": "sha512-p+aOfczzzKdo3AsLJlhs8J5EW6ffVidfSZZxXedJ0mHPBOln1DccqFmGCoO8JWd4xRycfmwy1eoQkMsF8oekPg==", + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.2.7.tgz", + "integrity": "sha512-OOAZwY4Jkd3r5WhVM5L3JeLNFaylvHUczMLxQDVLrrVyb1Cy+DNJ6MVsb5TLh6iBklB42m5TOP+IbOgKGGOtMw==", "dev": true, "requires": { - "@jest/core": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", + "@jest/core": "^25.2.7", + "@jest/test-result": "^25.2.6", + "@jest/types": "^25.2.6", "chalk": "^3.0.0", "exit": "^0.1.2", "import-local": "^3.0.2", "is-ci": "^2.0.0", - "jest-config": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", + "jest-config": "^25.2.7", + "jest-util": "^25.2.6", + "jest-validate": "^25.2.6", "prompts": "^2.0.1", - "realpath-native": "^1.1.0", - "yargs": "^15.0.0" + "realpath-native": "^2.0.0", + "yargs": "^15.3.1" } } } }, "jest-changed-files": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.1.0.tgz", - "integrity": "sha512-bdL1aHjIVy3HaBO3eEQeemGttsq1BDlHgWcOjEOIAcga7OOEGWHD2WSu8HhL7I1F0mFFyci8VKU4tRNk+qtwDA==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.2.6.tgz", + "integrity": "sha512-F7l2m5n55jFnJj4ItB9XbAlgO+6umgvz/mdK76BfTd2NGkvGf9x96hUXP/15a1K0k14QtVOoutwpRKl360msvg==", "dev": true, "requires": { - "@jest/types": "^25.1.0", + "@jest/types": "^25.2.6", "execa": "^3.2.0", "throat": "^5.0.0" }, "dependencies": { "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", + "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", "dev": true, "requires": { "path-key": "^3.1.0", @@ -2286,185 +2283,178 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, "jest-config": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.1.0.tgz", - "integrity": "sha512-tLmsg4SZ5H7tuhBC5bOja0HEblM0coS3Wy5LTCb2C8ZV6eWLewHyK+3qSq9Bi29zmWQ7ojdCd3pxpx4l4d2uGw==", + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.2.7.tgz", + "integrity": "sha512-rIdPPXR6XUxi+7xO4CbmXXkE6YWprvlKc4kg1SrkCL2YV5m/8MkHstq9gBZJ19Qoa3iz/GP+0sTG/PcIwkFojg==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^25.1.0", - "@jest/types": "^25.1.0", - "babel-jest": "^25.1.0", + "@jest/test-sequencer": "^25.2.7", + "@jest/types": "^25.2.6", + "babel-jest": "^25.2.6", "chalk": "^3.0.0", + "deepmerge": "^4.2.2", "glob": "^7.1.1", - "jest-environment-jsdom": "^25.1.0", - "jest-environment-node": "^25.1.0", - "jest-get-type": "^25.1.0", - "jest-jasmine2": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", + "jest-environment-jsdom": "^25.2.6", + "jest-environment-node": "^25.2.6", + "jest-get-type": "^25.2.6", + "jest-jasmine2": "^25.2.7", + "jest-regex-util": "^25.2.6", + "jest-resolve": "^25.2.6", + "jest-util": "^25.2.6", + "jest-validate": "^25.2.6", "micromatch": "^4.0.2", - "pretty-format": "^25.1.0", - "realpath-native": "^1.1.0" + "pretty-format": "^25.2.6", + "realpath-native": "^2.0.0" } }, "jest-diff": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz", - "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.2.6.tgz", + "integrity": "sha512-KuadXImtRghTFga+/adnNrv9s61HudRMR7gVSbP35UKZdn4IK2/0N0PpGZIqtmllK9aUyye54I3nu28OYSnqOg==", "dev": true, "requires": { "chalk": "^3.0.0", - "diff-sequences": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" + "diff-sequences": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.2.6" } }, "jest-docblock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.1.0.tgz", - "integrity": "sha512-370P/mh1wzoef6hUKiaMcsPtIapY25suP6JqM70V9RJvdKLrV4GaGbfUseUVk4FZJw4oTZ1qSCJNdrClKt5JQA==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.2.6.tgz", + "integrity": "sha512-VAYrljEq0upq0oERfIaaNf28gC6p9gORndhHstCYF8NWGNQJnzoaU//S475IxfWMk4UjjVmS9rJKLe5Jjjbixw==", "dev": true, "requires": { "detect-newline": "^3.0.0" } }, "jest-each": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.1.0.tgz", - "integrity": "sha512-R9EL8xWzoPySJ5wa0DXFTj7NrzKpRD40Jy+zQDp3Qr/2QmevJgkN9GqioCGtAJ2bW9P/MQRznQHQQhoeAyra7A==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.2.6.tgz", + "integrity": "sha512-OgQ01VINaRD6idWJOhCYwUc5EcgHBiFlJuw+ON2VgYr7HLtMFyCcuo+3mmBvuLUH4QudREZN7cDCZviknzsaJQ==", "dev": true, "requires": { - "@jest/types": "^25.1.0", + "@jest/types": "^25.2.6", "chalk": "^3.0.0", - "jest-get-type": "^25.1.0", - "jest-util": "^25.1.0", - "pretty-format": "^25.1.0" + "jest-get-type": "^25.2.6", + "jest-util": "^25.2.6", + "pretty-format": "^25.2.6" } }, "jest-environment-jsdom": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.1.0.tgz", - "integrity": "sha512-ILb4wdrwPAOHX6W82GGDUiaXSSOE274ciuov0lztOIymTChKFtC02ddyicRRCdZlB5YSrv3vzr1Z5xjpEe1OHQ==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.2.6.tgz", + "integrity": "sha512-/o7MZIhGmLGIEG5j7r5B5Az0umWLCHU+F5crwfbm0BzC4ybHTJZOQTFQWhohBg+kbTCNOuftMcqHlVkVduJCQQ==", "dev": true, "requires": { - "@jest/environment": "^25.1.0", - "@jest/fake-timers": "^25.1.0", - "@jest/types": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0", - "jsdom": "^15.1.1" + "@jest/environment": "^25.2.6", + "@jest/fake-timers": "^25.2.6", + "@jest/types": "^25.2.6", + "jest-mock": "^25.2.6", + "jest-util": "^25.2.6", + "jsdom": "^15.2.1" } }, "jest-environment-node": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.1.0.tgz", - "integrity": "sha512-U9kFWTtAPvhgYY5upnH9rq8qZkj6mYLup5l1caAjjx9uNnkLHN2xgZy5mo4SyLdmrh/EtB9UPpKFShvfQHD0Iw==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.2.6.tgz", + "integrity": "sha512-D1Ihj14fxZiMHGeTtU/LunhzSI+UeBvlr/rcXMTNyRMUMSz2PEhuqGbB78brBY6Dk3FhJDk7Ta+8reVaGjLWhA==", "dev": true, "requires": { - "@jest/environment": "^25.1.0", - "@jest/fake-timers": "^25.1.0", - "@jest/types": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0" + "@jest/environment": "^25.2.6", + "@jest/fake-timers": "^25.2.6", + "@jest/types": "^25.2.6", + "jest-mock": "^25.2.6", + "jest-util": "^25.2.6", + "semver": "^6.3.0" } }, "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz", + "integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==", "dev": true }, "jest-haste-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.1.0.tgz", - "integrity": "sha512-/2oYINIdnQZAqyWSn1GTku571aAfs8NxzSErGek65Iu5o8JYb+113bZysRMcC/pjE5v9w0Yz+ldbj9NxrFyPyw==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.2.6.tgz", + "integrity": "sha512-nom0+fnY8jwzelSDQnrqaKAcDZczYQvMEwcBjeL3PQ4MlcsqeB7dmrsAniUw/9eLkngT5DE6FhnenypilQFsgA==", "dev": true, "requires": { - "@jest/types": "^25.1.0", + "@jest/types": "^25.2.6", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.1.2", "graceful-fs": "^4.2.3", - "jest-serializer": "^25.1.0", - "jest-util": "^25.1.0", - "jest-worker": "^25.1.0", + "jest-serializer": "^25.2.6", + "jest-util": "^25.2.6", + "jest-worker": "^25.2.6", "micromatch": "^4.0.2", "sane": "^4.0.3", - "walker": "^1.0.7" + "walker": "^1.0.7", + "which": "^2.0.2" } }, "jest-jasmine2": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.1.0.tgz", - "integrity": "sha512-GdncRq7jJ7sNIQ+dnXvpKO2MyP6j3naNK41DTTjEAhLEdpImaDA9zSAZwDhijjSF/D7cf4O5fdyUApGBZleaEg==", + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.2.7.tgz", + "integrity": "sha512-HeQxEbonp8fUvik9jF0lkU9ab1u5TQdIb7YSU9Fj7SxWtqHNDGyCpF6ZZ3r/5yuertxi+R95Ba9eA91GMQ38eA==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^25.1.0", - "@jest/source-map": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", + "@jest/environment": "^25.2.6", + "@jest/source-map": "^25.2.6", + "@jest/test-result": "^25.2.6", + "@jest/types": "^25.2.6", "chalk": "^3.0.0", "co": "^4.6.0", - "expect": "^25.1.0", + "expect": "^25.2.7", "is-generator-fn": "^2.0.0", - "jest-each": "^25.1.0", - "jest-matcher-utils": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-snapshot": "^25.1.0", - "jest-util": "^25.1.0", - "pretty-format": "^25.1.0", + "jest-each": "^25.2.6", + "jest-matcher-utils": "^25.2.7", + "jest-message-util": "^25.2.6", + "jest-runtime": "^25.2.7", + "jest-snapshot": "^25.2.7", + "jest-util": "^25.2.6", + "pretty-format": "^25.2.6", "throat": "^5.0.0" } }, "jest-leak-detector": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.1.0.tgz", - "integrity": "sha512-3xRI264dnhGaMHRvkFyEKpDeaRzcEBhyNrOG5oT8xPxOyUAblIAQnpiR3QXu4wDor47MDTiHbiFcbypdLcLW5w==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.2.6.tgz", + "integrity": "sha512-n+aJUM+j/x1kIaPVxzerMqhAUuqTU1PL5kup46rXh+l9SP8H6LqECT/qD1GrnylE1L463/0StSPkH4fUpkuEjA==", "dev": true, "requires": { - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" + "jest-get-type": "^25.2.6", + "pretty-format": "^25.2.6" } }, "jest-matcher-utils": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.1.0.tgz", - "integrity": "sha512-KGOAFcSFbclXIFE7bS4C53iYobKI20ZWleAdAFun4W1Wz1Kkej8Ng6RRbhL8leaEvIOjGXhGf/a1JjO8bkxIWQ==", + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.2.7.tgz", + "integrity": "sha512-jNYmKQPRyPO3ny0KY1I4f0XW4XnpJ3Nx5ovT4ik0TYDOYzuXJW40axqOyS61l/voWbVT9y9nZ1THL1DlpaBVpA==", "dev": true, "requires": { "chalk": "^3.0.0", - "jest-diff": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" + "jest-diff": "^25.2.6", + "jest-get-type": "^25.2.6", + "pretty-format": "^25.2.6" } }, "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.2.6.tgz", + "integrity": "sha512-Hgg5HbOssSqOuj+xU1mi7m3Ti2nwSQJQf/kxEkrz2r2rp2ZLO1pMeKkz2WiDUWgSR+APstqz0uMFcE5yc0qdcg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", + "@jest/types": "^25.2.6", "@types/stack-utils": "^1.0.1", "chalk": "^3.0.0", "micromatch": "^4.0.2", @@ -2473,12 +2463,12 @@ } }, "jest-mock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.1.0.tgz", - "integrity": "sha512-28/u0sqS+42vIfcd1mlcg4ZVDmSUYuNvImP4X2lX5hRMLW+CN0BeiKVD4p+ujKKbSPKd3rg/zuhCF+QBLJ4vag==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.2.6.tgz", + "integrity": "sha512-vc4nibavi2RGPdj/MyZy/azuDjZhpYZLvpfgq1fxkhbyTpKVdG7CgmRVKJ7zgLpY5kuMjTzDYA6QnRwhsCU+tA==", "dev": true, "requires": { - "@jest/types": "^25.1.0" + "@jest/types": "^25.2.6" } }, "jest-pnp-resolver": { @@ -2488,174 +2478,168 @@ "dev": true }, "jest-regex-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.1.0.tgz", - "integrity": "sha512-9lShaDmDpqwg+xAd73zHydKrBbbrIi08Kk9YryBEBybQFg/lBWR/2BDjjiSE7KIppM9C5+c03XiDaZ+m4Pgs1w==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.6.tgz", + "integrity": "sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==", "dev": true }, "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.2.6.tgz", + "integrity": "sha512-7O61GVdcAXkLz/vNGKdF+00A80/fKEAA47AEXVNcZwj75vEjPfZbXDaWFmAQCyXj4oo9y9dC9D+CLA11t8ieGw==", "dev": true, "requires": { - "@jest/types": "^25.1.0", + "@jest/types": "^25.2.6", "browser-resolve": "^1.11.3", "chalk": "^3.0.0", "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" + "realpath-native": "^2.0.0", + "resolve": "^1.15.1" } }, "jest-resolve-dependencies": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.1.0.tgz", - "integrity": "sha512-Cu/Je38GSsccNy4I2vL12ZnBlD170x2Oh1devzuM9TLH5rrnLW1x51lN8kpZLYTvzx9j+77Y5pqBaTqfdzVzrw==", + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.2.7.tgz", + "integrity": "sha512-IrnMzCAh11Xd2gAOJL+ThEW6QO8DyqNdvNkQcaCticDrOAr9wtKT7yT6QBFFjqKFgjjvaVKDs59WdgUhgYnHnQ==", "dev": true, "requires": { - "@jest/types": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-snapshot": "^25.1.0" + "@jest/types": "^25.2.6", + "jest-regex-util": "^25.2.6", + "jest-snapshot": "^25.2.7" } }, "jest-runner": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.1.0.tgz", - "integrity": "sha512-su3O5fy0ehwgt+e8Wy7A8CaxxAOCMzL4gUBftSs0Ip32S0epxyZPDov9Znvkl1nhVOJNf4UwAsnqfc3plfQH9w==", + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.2.7.tgz", + "integrity": "sha512-RFEr71nMrtNwcpoHzie5+fe1w3JQCGMyT2xzNwKe3f88+bK+frM2o1v24gEcPxQ2QqB3COMCe2+1EkElP+qqqQ==", "dev": true, "requires": { - "@jest/console": "^25.1.0", - "@jest/environment": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", + "@jest/console": "^25.2.6", + "@jest/environment": "^25.2.6", + "@jest/test-result": "^25.2.6", + "@jest/types": "^25.2.6", "chalk": "^3.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.3", - "jest-config": "^25.1.0", - "jest-docblock": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-jasmine2": "^25.1.0", - "jest-leak-detector": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-util": "^25.1.0", - "jest-worker": "^25.1.0", + "jest-config": "^25.2.7", + "jest-docblock": "^25.2.6", + "jest-haste-map": "^25.2.6", + "jest-jasmine2": "^25.2.7", + "jest-leak-detector": "^25.2.6", + "jest-message-util": "^25.2.6", + "jest-resolve": "^25.2.6", + "jest-runtime": "^25.2.7", + "jest-util": "^25.2.6", + "jest-worker": "^25.2.6", "source-map-support": "^0.5.6", "throat": "^5.0.0" } }, "jest-runtime": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.1.0.tgz", - "integrity": "sha512-mpPYYEdbExKBIBB16ryF6FLZTc1Rbk9Nx0ryIpIMiDDkOeGa0jQOKVI/QeGvVGlunKKm62ywcioeFVzIbK03bA==", + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.2.7.tgz", + "integrity": "sha512-Gw3X8KxTTFylu2T/iDSNKRUQXQiPIYUY0b66GwVYa7W8wySkUljKhibQHSq0VhmCAN7vRBEQjlVQ+NFGNmQeBw==", "dev": true, "requires": { - "@jest/console": "^25.1.0", - "@jest/environment": "^25.1.0", - "@jest/source-map": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", + "@jest/console": "^25.2.6", + "@jest/environment": "^25.2.6", + "@jest/source-map": "^25.2.6", + "@jest/test-result": "^25.2.6", + "@jest/transform": "^25.2.6", + "@jest/types": "^25.2.6", "@types/yargs": "^15.0.0", "chalk": "^3.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.3", - "jest-config": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-snapshot": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", - "realpath-native": "^1.1.0", + "jest-config": "^25.2.7", + "jest-haste-map": "^25.2.6", + "jest-message-util": "^25.2.6", + "jest-mock": "^25.2.6", + "jest-regex-util": "^25.2.6", + "jest-resolve": "^25.2.6", + "jest-snapshot": "^25.2.7", + "jest-util": "^25.2.6", + "jest-validate": "^25.2.6", + "realpath-native": "^2.0.0", "slash": "^3.0.0", "strip-bom": "^4.0.0", - "yargs": "^15.0.0" + "yargs": "^15.3.1" } }, "jest-serializer": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.1.0.tgz", - "integrity": "sha512-20Wkq5j7o84kssBwvyuJ7Xhn7hdPeTXndnwIblKDR2/sy1SUm6rWWiG9kSCgJPIfkDScJCIsTtOKdlzfIHOfKA==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.6.tgz", + "integrity": "sha512-RMVCfZsezQS2Ww4kB5HJTMaMJ0asmC0BHlnobQC6yEtxiFKIxohFA4QSXSabKwSggaNkqxn6Z2VwdFCjhUWuiQ==", "dev": true }, "jest-snapshot": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.1.0.tgz", - "integrity": "sha512-xZ73dFYN8b/+X2hKLXz4VpBZGIAn7muD/DAg+pXtDzDGw3iIV10jM7WiHqhCcpDZfGiKEj7/2HXAEPtHTj0P2A==", + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.2.7.tgz", + "integrity": "sha512-Rm8k7xpGM4tzmYhB6IeRjsOMkXaU8/FOz5XlU6oYwhy53mq6txVNqIKqN1VSiexzpC80oWVxVDfUDt71M6XPOA==", "dev": true, "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^25.1.0", + "@jest/types": "^25.2.6", + "@types/prettier": "^1.19.0", "chalk": "^3.0.0", - "expect": "^25.1.0", - "jest-diff": "^25.1.0", - "jest-get-type": "^25.1.0", - "jest-matcher-utils": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "mkdirp": "^0.5.1", + "expect": "^25.2.7", + "jest-diff": "^25.2.6", + "jest-get-type": "^25.2.6", + "jest-matcher-utils": "^25.2.7", + "jest-message-util": "^25.2.6", + "jest-resolve": "^25.2.6", + "make-dir": "^3.0.0", "natural-compare": "^1.4.0", - "pretty-format": "^25.1.0", - "semver": "^7.1.1" - }, - "dependencies": { - "semver": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", - "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", - "dev": true - } + "pretty-format": "^25.2.6", + "semver": "^6.3.0" } }, "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.2.6.tgz", + "integrity": "sha512-gpXy0H5ymuQ0x2qgl1zzHg7LYHZYUmDEq6F7lhHA8M0eIwDB2WteOcCnQsohl9c/vBKZ3JF2r4EseipCZz3s4Q==", "dev": true, "requires": { - "@jest/types": "^25.1.0", + "@jest/types": "^25.2.6", "chalk": "^3.0.0", "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" + "make-dir": "^3.0.0" } }, "jest-validate": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.1.0.tgz", - "integrity": "sha512-kGbZq1f02/zVO2+t1KQGSVoCTERc5XeObLwITqC6BTRH3Adv7NZdYqCpKIZLUgpLXf2yISzQ465qOZpul8abXA==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.2.6.tgz", + "integrity": "sha512-a4GN7hYbqQ3Rt9iHsNLFqQz7HDV7KiRPCwPgo5nqtTIWNZw7gnT8KchG+Riwh+UTSn8REjFCodGp50KX/fRNgQ==", "dev": true, "requires": { - "@jest/types": "^25.1.0", + "@jest/types": "^25.2.6", "camelcase": "^5.3.1", "chalk": "^3.0.0", - "jest-get-type": "^25.1.0", + "jest-get-type": "^25.2.6", "leven": "^3.1.0", - "pretty-format": "^25.1.0" + "pretty-format": "^25.2.6" } }, "jest-watcher": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.1.0.tgz", - "integrity": "sha512-Q9eZ7pyaIr6xfU24OeTg4z1fUqBF/4MP6J801lyQfg7CsnZ/TCzAPvCfckKdL5dlBBEKBeHV0AdyjFZ5eWj4ig==", + "version": "25.2.7", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.2.7.tgz", + "integrity": "sha512-RdHuW+f49tahWtluTnUdZ2iPliebleROI2L/J5phYrUS6DPC9RB3SuUtqYyYhGZJsbvRSuLMIlY/cICJ+PIecw==", "dev": true, "requires": { - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", + "@jest/test-result": "^25.2.6", + "@jest/types": "^25.2.6", "ansi-escapes": "^4.2.1", "chalk": "^3.0.0", - "jest-util": "^25.1.0", + "jest-util": "^25.2.6", "string-length": "^3.1.0" } }, "jest-worker": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", - "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.2.6.tgz", + "integrity": "sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA==", "dev": true, "requires": { "merge-stream": "^2.0.0", @@ -2743,20 +2727,12 @@ "dev": true }, "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", + "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", "dev": true, "requires": { - "minimist": "^1.2.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - } + "minimist": "^1.2.5" } }, "jsprim": { @@ -2836,14 +2812,6 @@ "dev": true, "requires": { "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } } }, "makeerror": { @@ -2917,9 +2885,9 @@ } }, "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "mixin-deep": { @@ -2943,15 +2911,6 @@ } } }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -3015,12 +2974,15 @@ "which": "^1.3.1" }, "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, - "optional": true + "optional": true, + "requires": { + "isexe": "^2.0.0" + } } } }, @@ -3082,18 +3044,6 @@ } } }, - "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -3103,28 +3053,6 @@ "isobject": "^3.0.0" } }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -3245,9 +3173,9 @@ "dev": true }, "picomatch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", - "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true }, "pirates": { @@ -3287,21 +3215,29 @@ "dev": true }, "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", + "version": "25.2.6", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.6.tgz", + "integrity": "sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg==", "dev": true, "requires": { - "@jest/types": "^25.1.0", + "@jest/types": "^25.2.6", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + } } }, "prompts": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.1.tgz", - "integrity": "sha512-qIP2lQyCwYbdzcqHIUi2HAxiWixhoM9OdLCWf8txXsapC/X9YdsCoeyRIXE/GP+Q0J37Q7+XN/MFqbUa7IzXNA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", + "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", "dev": true, "requires": { "kleur": "^3.0.3", @@ -3309,9 +3245,9 @@ } }, "psl": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", - "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, "pump": { @@ -3337,19 +3273,16 @@ "dev": true }, "react-is": { - "version": "16.13.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.0.tgz", - "integrity": "sha512-GFMtL0vHkiBv9HluwNZTggSn/sCyEt9n02aM0dSAjGGyqyNlAyftYm4phPxdvCigG15JreC5biwxCgTAJZ7yAA==", + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, "realpath-native": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", - "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", - "dev": true, - "requires": { - "util.promisify": "^1.0.0" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", + "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", + "dev": true }, "regex-not": { "version": "1.0.2", @@ -3655,12 +3588,6 @@ "to-regex": "^3.0.2" } }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, "normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", @@ -3692,9 +3619,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "set-blocking": { @@ -3749,15 +3676,15 @@ "optional": true }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, "sisteransi": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.4.tgz", - "integrity": "sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, "slash": { @@ -3998,12 +3925,6 @@ "strip-ansi": "^5.2.0" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -4026,26 +3947,6 @@ "strip-ansi": "^6.0.0" } }, - "string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -4053,6 +3954,14 @@ "dev": true, "requires": { "ansi-regex": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + } } }, "strip-bom": { @@ -4316,18 +4225,6 @@ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - } - }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -4335,9 +4232,9 @@ "dev": true }, "v8-to-istanbul": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.2.tgz", - "integrity": "sha512-G9R+Hpw0ITAmPSr47lSlc5A1uekSYzXxTMlFxso2xoffwo4jQnzbv1p9yXIinO8UMZKfAFewaCHwWvnH4Jb4Ug==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.3.tgz", + "integrity": "sha512-sAjOC+Kki6aJVbUOXJbcR0MnbfjvBzwKZazEJymA2IX49uoOdEdk+4fBq5cXgYgiyKtAyrrJNtBZdOeDIF+Fng==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.1", @@ -4426,9 +4323,9 @@ } }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -4519,9 +4416,9 @@ } }, "yargs-parser": { - "version": "18.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.1.tgz", - "integrity": "sha512-KRHEsOM16IX7XuLnMOqImcPNbLVXMNHYAoFc3BKR8Ortl5gzDbtXvvEoGx9imk5E+X1VeNKNlcHr8B8vi+7ipA==", + "version": "18.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", + "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", "dev": true, "requires": { "camelcase": "^5.0.0", From 0a43abcee3e55cd20e35056d2dbb2c4eecb11dbc Mon Sep 17 00:00:00 2001 From: Sven Strittmatter Date: Thu, 9 Apr 2020 11:12:17 +0200 Subject: [PATCH 082/102] #117 Make the failing cURL not so silent With -s we do not get any output from cURL than the response. But this command often fails and we need more information to debug the problems. So we pass the -S which gives in combination with -s an error message if cURL fails. Signed-off-by: Sven Strittmatter --- cli/run_scanner.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/run_scanner.sh b/cli/run_scanner.sh index b246c02946..0969089c38 100755 --- a/cli/run_scanner.sh +++ b/cli/run_scanner.sh @@ -310,7 +310,7 @@ fi # Create job info "Successfully created JSON payload '${PAYLOAD_FILE}'." -command="curl -H 'Content-Type: application/json' ${CURL_AUTH_ARG} -X PUT -d @${PAYLOAD_FILE} -s ${SCB_URL}/securityTests" +command="curl -sS -H 'Content-Type: application/json' ${CURL_AUTH_ARG} -X PUT -d @${PAYLOAD_FILE} ${SCB_URL}/securityTests" info "Using command: \"${command}\"" response=`eval ${command}` From 0b4d356b39db0bca4007a75382a622cad2795480 Mon Sep 17 00:00:00 2001 From: Sven Strittmatter Date: Thu, 9 Apr 2020 11:15:28 +0200 Subject: [PATCH 083/102] #117 Evaluate the HTTP status code from scanner response For better debugging we also evaluate the HTTP status code. We do the trick by appending it at the end of the response body with cURL's built in option -w and then extract and remove this last line. Why exit code 4? It looks like the exit codes are incremented for each error condition. That implies that we should use 4 and increment all following error codes. But this would not be backward compatible if a caller evaluates the exit codes. Also we think that the evaluation of the HTTP status code is the same error condition category like the absent of a process ID in the response JSON. This patch closes #117. Signed-off-by: Sven Strittmatter --- cli/run_scanner.sh | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/cli/run_scanner.sh b/cli/run_scanner.sh index 0969089c38..a90814f89c 100755 --- a/cli/run_scanner.sh +++ b/cli/run_scanner.sh @@ -310,9 +310,27 @@ fi # Create job info "Successfully created JSON payload '${PAYLOAD_FILE}'." -command="curl -sS -H 'Content-Type: application/json' ${CURL_AUTH_ARG} -X PUT -d @${PAYLOAD_FILE} ${SCB_URL}/securityTests" +# With the -w we append the bare HTTP status code to the end of the response. +command="curl -sS -w '\n%{http_code}' -H 'Content-Type: application/json' ${CURL_AUTH_ARG} -X PUT -d @${PAYLOAD_FILE} ${SCB_URL}/securityTests" info "Using command: \"${command}\"" -response=`eval ${command}` +response=$(eval "${command}") +# Here we get the last line from $repsonse with the HTTP status code. +http_code="${response##*$'\n'}" +# And last but not least remove the previously added status code from the response body. +response=$(echo "${response}" |sed '$d') + +if [ "${http_code:0:1}" == "4" ]; then + if [ "${http_code}" == "404" ]; then + echo "The securityTest '${SCANNER}' does not exists (HTTP status ${http_code})!" + else + echo "The user is not authorized to create this securityTest (HTTP status ${http_code})!" + fi + + exit 4 +elif [ "${http_code:0:1}" == "5" ]; then + echo "Encountered unexpected error in engine (HTTP status ${http_code})! Check logs of the engine container for additional details." + exit 4 +fi ID_PROCESS=`echo ${response} | xargs | sed 's/\[//' | sed 's/\]//'` if [ ${#ID_PROCESS} -lt 10 ]; then From bf0da4867c1b9d6aaf4e78fabe9021ce1aeb46ec Mon Sep 17 00:00:00 2001 From: Sven Strittmatter Date: Thu, 9 Apr 2020 10:19:58 +0200 Subject: [PATCH 084/102] Rework the ADR001 - Fix names of products as they are nouns. - Use right Asciidoc quotes. - Refine the whole text about the why and what. The text is reworked in that way, that non-essential information and volatile information is removed: The bare problem about this topic was theglobale varaible space for Camundas sub process models. Signed-off-by: Sven Strittmatter --- adr/adr_0001.adoc | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/adr/adr_0001.adoc b/adr/adr_0001.adoc index 7ce584cc9b..7b8e0e5b0f 100644 --- a/adr/adr_0001.adoc +++ b/adr/adr_0001.adoc @@ -17,22 +17,25 @@ == Context -We want to use _secureCodeBox_ not only for scans of one particular web project. Instead we want to discover our whole company network and scan every host we find. For that purpose we intended to introduce a "combined scan" process model step. The basic idea was: +We want to use _secureCodeBox_ not only for scans of one particular web project. Instead we want to discover our whole company network and scan every host we find. For that purpose we intended to introduce a "`combined scan`" process model step. The basic idea was: -- Use our _nmap scanner_ to find all hosts in a network. -- Then feed the list of found hosts into a "fork process step" -- This "fork process step" starts a complete new sub scan process with - - nmap to find all open ports, - - Nikto, SSLyze ZAP etz on the ports, - - etc -- Then "join" these "sub scan processes" together and gather the results +- Use our _Nmap scanner_ to find all hosts in a network. +- Then feed the list of found hosts into a "`fork process step`" +- This "`fork process step`" starts a complete new sub scan process with + - _Nmap_ to find all open ports, + - _Nikto_, _SSLyze_, _ZAP_ etc on the ports, + - etc. +- Then "`join`" these "`sub scan processes`" together and gather the results. -The best solution to this problem would be to have each scan be able to take the results from any other completed scan and work on them, perhaps with a filter in between. But this is not possible with the camunda engine the way we use it for our current processes. Each of our scan processes has it's own bpmn. The results are passed as a variable from step to step inside the process models. In order for another scanner to have access to these variables, they need to be stored outside the processes. Furthermore, our scanner need to pass variables through, which indicate wether another scanner needs the results or they should be persisted. +The best solution to this problem would be to have each scan be able to take the results from any other completed scan and work on them, perhaps with a filter in between. The first idea was to use the sub process step feature built-in in _Camunda_. But this is not possible with the _Camunda_ engine the way we use it for our current processes. Each of our scan processes has it's own BPMN. The results are passed as a "`process global`" variable from step to step inside the process models. A "`sub process`" also would have only this global variable space. This would conflict with the necessity to have a separate variable space for each "`sub scan process`" to not mangle the results for each scanned IP address. == Decision - We do not have such a storage and variable logic implemented in our engine and camunda models, therefore we're not able to implement a combined scan such as described without reworking our engine and all process models. It is possible though to create processes for specific combined scanner which follow our current architecture. One problem about this is, that we do not have the expertise in camunda required for such a rework and "upgrade". The question wether it is worth working into it or not is very difficult to answer, since workforce is limited and other tasks appear/are more important. Overall the idea of an architectural change/rework is not turned down, but a giant task for another time. +We implement these scans as separate process models and combines them in a build pipeline. This means we first scan for IP addresses and store these found hosts in our data backend. Then the build pipeline retrieves the found IP addresses from the data backend and start to scan the hosts each one-by-one with a so called _combined scanner_. + +A _combined scanner_ is for example a combination of _Nmap_ and _Nikto_: The _Nmap_ scans for open HTTP ports via service detection and then _Nikto_ scans possibly found HTTP servers. == Consequences -To have each combined scan process separately implemented means that we cannot use one scanner for multiple processes. So let's say we want a combined scan including a nmap scan followed by a ssh scan and another combined scan also starting with a nmap but followed by a sslyze. We can not use one and the same nmap scan for both, even if it's identically configured. This obviously is a technical flaw from a logical and performance point of view. But this way we don't need to rework our engine and existing process models, which also would add a lot of complexity. But at a curtain point in the future this should be worked on to improve performance and scaling of the combined scan processes. So on the negative side we have performance flaws and the fact, that if we rework the architecture the combined processes become useless, since we then combine processes by other means. On the positive side we can focus more on other more important topics and don't have to invest time into learning camunda deeply, without knowing wether we want to use camunda for this kind of tasks in the end or not. \ No newline at end of file +* To have each combined scan process separately implemented means that we cannot use one scanner for multiple processes. So let's say we want a combined scan including a _Nmap_ scan followed by a _SSH_ scan and another combined scan also starting with a _Nmap_ but followed by a _SSLyze_. We can not use same _Nmap_ scan for both, even if it's identically configured. +* We don't need to invest lot of time into _Camunda_ to examine if it is possible in a clean way to introduce something like scoped variables to Camunda sub processes steps. \ No newline at end of file From 42bef37a174f17e7f594af11c43de12176c2c8a8 Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach <13718901+J12934@users.noreply.github.com> Date: Mon, 27 Apr 2020 11:13:03 +0200 Subject: [PATCH 085/102] Autoformat yaml --- docker-compose.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 081f6521fa..76bd84675c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,8 +3,8 @@ services: engine: image: securecodebox/engine:${DEFAULT_TAG} depends_on: - camundadb: - condition: service_healthy + camundadb: + condition: service_healthy ports: - "8080:8080" networks: @@ -50,7 +50,7 @@ services: container_group: infrastructure command: --max_allowed_packet=65011712 # 512M healthcheck: - test: "/usr/bin/mysql --user=${CAMUNDADB_USER} --password=${CAMUNDADB_PW} --execute \"SHOW DATABASES;\"" + test: '/usr/bin/mysql --user=${CAMUNDADB_USER} --password=${CAMUNDADB_PW} --execute "SHOW DATABASES;"' interval: 5s timeout: 1s retries: 5 @@ -179,7 +179,7 @@ services: image: securecodebox/ncrack:${DEFAULT_TAG} depends_on: engine: - condition: service_healthy + condition: service_healthy networks: - frontend labels: From 2b15e7803951b81e1ee53ff6469b0c753cf275e7 Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach <13718901+J12934@users.noreply.github.com> Date: Mon, 27 Apr 2020 12:16:16 +0200 Subject: [PATCH 086/102] Pin service versions --- .env | 14 +++++++++--- .travis.yml | 7 +++--- docker-compose.yml | 20 ++++++++--------- test/{.env.test => .env.stable.test} | 16 ++++++++++---- test/.env.unstable.test | 32 ++++++++++++++++++++++++++++ 5 files changed, 69 insertions(+), 20 deletions(-) rename test/{.env.test => .env.stable.test} (62%) create mode 100644 test/.env.unstable.test diff --git a/.env b/.env index 065a3a5a2d..52a303c376 100644 --- a/.env +++ b/.env @@ -8,9 +8,6 @@ ENGINE_SCANNERSERVICES_PASSWORD=scan # DEFECT_DOJO_API_KEY=your-defect-dojo-api-key-here # -# Default Image Tag. Latest will always be the most recent stable release. -DEFAULT_TAG=latest -# # Enabling the Persistence Providers inside then Engine Container # Even when they are disabled here they might still be started (depending on the way you start your compose stack) # This flag just changes if the engine writes results into the providers @@ -24,3 +21,14 @@ ENABLE_DEFECT_DOJO=false # It can be set automatically by filling the following env vars. CAMUNDA_BPM_ADMIN_USER_ID=false CAMUNDA_BPM_ADMIN_USER_PASSWORD= + +SECURECODEBOX_ENGINE_IMAGE_VERSION=v1.3.1 +SECURECODEBOX_NMAP_IMAGE_VERSION=v1.2.0 +SECURECODEBOX_NIKTO_IMAGE_VERSION=v1.0.1 +SECURECODEBOX_ZAP_IMAGE_VERSION=v1.1.0 +SECURECODEBOX_SSLYZE_IMAGE_VERSION=v1.0.7 +SECURECODEBOX_ARACHNI_IMAGE_VERSION=v1.0.3 +SECURECODEBOX_AMASS_IMAGE_VERSION=v1.1.0 +SECURECODEBOX_SSH_IMAGE_VERSION=v1.2.0 +SECURECODEBOX_WPSCAN_IMAGE_VERSION=v1.1.1 +SECURECODEBOX_NCRACK_IMAGE_VERSION=v0.1.0 diff --git a/.travis.yml b/.travis.yml index fa66b5179c..3679a62d9c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,10 +10,11 @@ notifications: services: - docker env: - - DEFAULT_TAG=latest - - DEFAULT_TAG=unstable + - version=latest + - version=unstable script: - - cp test/.env.test .env + - if [ $version -e "latest" ]; then cp test/.env.stable.test .env; fi + - if [ $version -e "unstable" ]; then cp test/.env.unstable.test .env; fi - docker-compose -f docker-compose.yml -f docker-compose.demo.yml up -d engine camundadb bodgeit juice-shop nginx unsafe-https old-wordpress ssh-service scanner-infrastructure-nmap scanner-webapplication-arachni scanner-webapplication-zap scanner-infrastructure-amass scanner-infrastructure-sslyze scanner-webserver-nikto scanner-infrastructure-ssh scanner-cms-wpscan scanner-infrastructure-ncrack - cd test - npm ci diff --git a/docker-compose.yml b/docker-compose.yml index 76bd84675c..f225b1a0f7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ version: "2.1" services: engine: - image: securecodebox/engine:${DEFAULT_TAG} + image: securecodebox/engine:${SECURECODEBOX_ENGINE_IMAGE_VERSION} depends_on: camundadb: condition: service_healthy @@ -61,7 +61,7 @@ services: - MYSQL_PASSWORD=${CAMUNDADB_PW} scanner-infrastructure-nmap: - image: securecodebox/nmap:${DEFAULT_TAG} + image: securecodebox/nmap:${SECURECODEBOX_NMAP_IMAGE_VERSION} depends_on: engine: condition: service_healthy @@ -75,7 +75,7 @@ services: - ENGINE_BASIC_AUTH_PASSWORD=${ENGINE_SCANNERSERVICES_PASSWORD} scanner-webserver-nikto: - image: securecodebox/nikto:${DEFAULT_TAG} + image: securecodebox/nikto:${SECURECODEBOX_NIKTO_IMAGE_VERSION} depends_on: engine: condition: service_healthy @@ -89,7 +89,7 @@ services: - ENGINE_BASIC_AUTH_PASSWORD=${ENGINE_SCANNERSERVICES_PASSWORD} scanner-webapplication-zap: - image: securecodebox/zap:${DEFAULT_TAG} + image: securecodebox/zap:${SECURECODEBOX_ZAP_IMAGE_VERSION} depends_on: engine: condition: service_healthy @@ -104,7 +104,7 @@ services: - SECURECODEBOX_ZAP_JOBSSCHEDULERCRON=* * * * * * scanner-infrastructure-sslyze: - image: securecodebox/sslyze:${DEFAULT_TAG} + image: securecodebox/sslyze:${SECURECODEBOX_SSLYZE_IMAGE_VERSION} depends_on: engine: condition: service_healthy @@ -118,7 +118,7 @@ services: - ENGINE_BASIC_AUTH_PASSWORD=${ENGINE_SCANNERSERVICES_PASSWORD} scanner-webapplication-arachni: - image: securecodebox/arachni:${DEFAULT_TAG} + image: securecodebox/arachni:${SECURECODEBOX_ARACHNI_IMAGE_VERSION} depends_on: engine: condition: service_healthy @@ -134,7 +134,7 @@ services: - "./plugins/arachni-login-scripts:/securecodebox/static/" scanner-infrastructure-amass: - image: securecodebox/amass:${DEFAULT_TAG} + image: securecodebox/amass:${SECURECODEBOX_AMASS_IMAGE_VERSION} depends_on: engine: condition: service_healthy @@ -148,7 +148,7 @@ services: - ENGINE_BASIC_AUTH_PASSWORD=${ENGINE_SCANNERSERVICES_PASSWORD} scanner-infrastructure-ssh: - image: securecodebox/ssh:${DEFAULT_TAG} + image: securecodebox/ssh:${SECURECODEBOX_SSH_IMAGE_VERSION} depends_on: engine: condition: service_healthy @@ -162,7 +162,7 @@ services: - ENGINE_BASIC_AUTH_PASSWORD=${ENGINE_SCANNERSERVICES_PASSWORD} scanner-cms-wpscan: - image: securecodebox/wpscan:${DEFAULT_TAG} + image: securecodebox/wpscan:${SECURECODEBOX_WPSCAN_IMAGE_VERSION} depends_on: engine: condition: service_healthy @@ -176,7 +176,7 @@ services: - ENGINE_BASIC_AUTH_PASSWORD=${ENGINE_SCANNERSERVICES_PASSWORD} scanner-infrastructure-ncrack: - image: securecodebox/ncrack:${DEFAULT_TAG} + image: securecodebox/ncrack:${SECURECODEBOX_NCRACK_IMAGE_VERSION} depends_on: engine: condition: service_healthy diff --git a/test/.env.test b/test/.env.stable.test similarity index 62% rename from test/.env.test rename to test/.env.stable.test index 6c80fa411d..dea2514fa8 100644 --- a/test/.env.test +++ b/test/.env.stable.test @@ -8,9 +8,6 @@ ENGINE_SCANNERSERVICES_PASSWORD=scan DEFECT_DOJO_API_KEY=your-defect-dojo-api-key-here -# Default Image Tag. Latest will always be the most recent stable release. -DEFAULT_TAG=develop - # Enabling the Persistence Providers inside then Engine Container # Even when they are disabled here they might still be started (depending on the way you start your compose stack) # This flag just changes if the engine writes results into the providers @@ -21,4 +18,15 @@ ENABLE_DEFECT_DOJO=false # By default you will be asked to set the admin password on first login. # It can be set automatically by filling the following env vars. CAMUNDA_BPM_ADMIN_USER_ID=kermit -CAMUNDA_BPM_ADMIN_USER_PASSWORD=a \ No newline at end of file +CAMUNDA_BPM_ADMIN_USER_PASSWORD=a + +SECURECODEBOX_ENGINE_IMAGE_VERSION=latest +SECURECODEBOX_NMAP_IMAGE_VERSION=latest +SECURECODEBOX_NIKTO_IMAGE_VERSION=latest +SECURECODEBOX_ZAP_IMAGE_VERSION=latest +SECURECODEBOX_SSLYZE_IMAGE_VERSION=latest +SECURECODEBOX_ARACHNI_IMAGE_VERSION=latest +SECURECODEBOX_AMASS_IMAGE_VERSION=latest +SECURECODEBOX_SSH_IMAGE_VERSION=latest +SECURECODEBOX_WPSCAN_IMAGE_VERSION=latest +SECURECODEBOX_NCRACK_IMAGE_VERSION=latest \ No newline at end of file diff --git a/test/.env.unstable.test b/test/.env.unstable.test new file mode 100644 index 0000000000..c8b89ddec8 --- /dev/null +++ b/test/.env.unstable.test @@ -0,0 +1,32 @@ +CAMUNDADB_DATABASE=camundadb +CAMUNDADB_ROOT_PW=root +CAMUNDADB_USER=camunda +CAMUNDADB_PW=secret + +ENGINE_SCANNERSERVICES_USER=defaultScanner +ENGINE_SCANNERSERVICES_PASSWORD=scan + +DEFECT_DOJO_API_KEY=your-defect-dojo-api-key-here + +# Enabling the Persistence Providers inside then Engine Container +# Even when they are disabled here they might still be started (depending on the way you start your compose stack) +# This flag just changes if the engine writes results into the providers +ENABLE_ELASTICSEARCH=false +ENABLE_DEFECT_DOJO=false + +# Admin User Configuration +# By default you will be asked to set the admin password on first login. +# It can be set automatically by filling the following env vars. +CAMUNDA_BPM_ADMIN_USER_ID=kermit +CAMUNDA_BPM_ADMIN_USER_PASSWORD=a + +SECURECODEBOX_ENGINE_IMAGE_VERSION=unstable +SECURECODEBOX_NMAP_IMAGE_VERSION=unstable +SECURECODEBOX_NIKTO_IMAGE_VERSION=unstable +SECURECODEBOX_ZAP_IMAGE_VERSION=unstable +SECURECODEBOX_SSLYZE_IMAGE_VERSION=unstable +SECURECODEBOX_ARACHNI_IMAGE_VERSION=unstable +SECURECODEBOX_AMASS_IMAGE_VERSION=unstable +SECURECODEBOX_SSH_IMAGE_VERSION=unstable +SECURECODEBOX_WPSCAN_IMAGE_VERSION=unstable +SECURECODEBOX_NCRACK_IMAGE_VERSION=unstable \ No newline at end of file From 439f067e91f706d3f976ac287e3ff74f388bcb11 Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach <13718901+J12934@users.noreply.github.com> Date: Mon, 27 Apr 2020 12:16:23 +0200 Subject: [PATCH 087/102] Autoformat --- test/nikto.test.js | 48 +++++++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/test/nikto.test.js b/test/nikto.test.js index 79d2db4bf2..f36cb22b52 100644 --- a/test/nikto.test.js +++ b/test/nikto.test.js @@ -1,15 +1,15 @@ -const { startSecurityTest, Time } = require('./sdk'); +const { startSecurityTest, Time } = require("./sdk"); test( - 'finds open 3000 port of juiceshop', + "finds open 3000 port of juiceshop", async () => { const securityTest = await startSecurityTest({ - context: 'JuiceShopPortScan', + context: "JuiceShopPortScan", metaData: {}, - name: 'nikto', + name: "nikto", target: { - name: 'JuiceShop Container', - location: 'juice-shop', + name: "JuiceShop Container", + location: "juice-shop", attributes: { NIKTO_PORTS: "3000", COMBINED_NMAP_NIKTO_PORTS: "80, 443, 3000, 8080, 8443", @@ -19,30 +19,34 @@ test( const { report } = securityTest; - const [finding1, finding2, finding3, ...otherFindings] = report.findings.map( - ({ name, osi_layer, severity }) => ({ - name, - osi_layer, - severity, - }) - ); + const [ + finding1, + finding2, + finding3, + ...otherFindings + ] = report.findings.map(({ name, osi_layer, severity }) => ({ + name, + osi_layer, + severity, + })); expect(finding1).toMatchObject({ - name: 'Retrieved x-powered-by header: Express', - osi_layer: 'APPLICATION', - severity: 'INFORMATIONAL', + name: "Retrieved x-powered-by header: Express", + osi_layer: "APPLICATION", + severity: "INFORMATIONAL", }); expect(finding2).toMatchObject({ - name: 'Retrieved access-control-allow-origin header: *', - osi_layer: 'APPLICATION', - severity: 'INFORMATIONAL' + name: "Retrieved access-control-allow-origin header: *", + osi_layer: "APPLICATION", + severity: "INFORMATIONAL", }); expect(finding3).toMatchObject({ - name: 'The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS', - osi_layer: 'APPLICATION', - severity: 'INFORMATIONAL' + name: + "The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS", + osi_layer: "APPLICATION", + severity: "INFORMATIONAL", }); }, 5 * Time.Minute From 519468ebd4fbc57fb529eff9662a64886a82b2fd Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach <13718901+J12934@users.noreply.github.com> Date: Mon, 27 Apr 2020 12:45:37 +0200 Subject: [PATCH 088/102] Fix nikto test --- test/nikto.test.js | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/test/nikto.test.js b/test/nikto.test.js index f36cb22b52..7b484a6951 100644 --- a/test/nikto.test.js +++ b/test/nikto.test.js @@ -12,37 +12,26 @@ test( location: "juice-shop", attributes: { NIKTO_PORTS: "3000", - COMBINED_NMAP_NIKTO_PORTS: "80, 443, 3000, 8080, 8443", + NIKTO_PARAMETER: "-Tuning 1,2,3,5,7,b", }, }, }); const { report } = securityTest; - const [ - finding1, - finding2, - finding3, - ...otherFindings - ] = report.findings.map(({ name, osi_layer, severity }) => ({ + const findings = report.findings.map(({ name, osi_layer, severity }) => ({ name, osi_layer, severity, })); - expect(finding1).toMatchObject({ - name: "Retrieved x-powered-by header: Express", - osi_layer: "APPLICATION", - severity: "INFORMATIONAL", - }); - - expect(finding2).toMatchObject({ + expect(findings).toContainEqual({ name: "Retrieved access-control-allow-origin header: *", osi_layer: "APPLICATION", severity: "INFORMATIONAL", }); - expect(finding3).toMatchObject({ + expect(findings).toContainEqual({ name: "The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS", osi_layer: "APPLICATION", From a280782025d607c243b8e1c8642a7ec5454e706a Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach <13718901+J12934@users.noreply.github.com> Date: Mon, 27 Apr 2020 14:33:27 +0200 Subject: [PATCH 089/102] Fix nmap-nikto test --- test/combined-nmap-nikto.test.js | 51 ++++++++++++++------------------ 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/test/combined-nmap-nikto.test.js b/test/combined-nmap-nikto.test.js index c4ad62e1af..f43fa1bdc6 100644 --- a/test/combined-nmap-nikto.test.js +++ b/test/combined-nmap-nikto.test.js @@ -1,15 +1,15 @@ -const { startSecurityTest, Time } = require('./sdk'); +const { startSecurityTest, Time } = require("./sdk"); test( - 'finds open 3000 port of juiceshop', + "finds open 3000 port of juiceshop", async () => { const securityTest = await startSecurityTest({ - context: 'JuiceShopPortScan', + context: "JuiceShopPortScan", metaData: {}, - name: 'combined-nmap-nikto', + name: "combined-nmap-nikto", target: { - name: 'JuiceShop Container', - location: 'juice-shop', + name: "JuiceShop Container", + location: "juice-shop", attributes: { NIKTO_PORTS: "3000", COMBINED_NMAP_NIKTO_PORTS: "80, 443, 3000, 8080, 8443", @@ -19,31 +19,24 @@ test( const { report } = securityTest; - const [finding1, finding2, finding3, ...otherFindings] = report.findings.map( - ({ name, osi_layer, severity }) => ({ - name, - osi_layer, - severity, - }) - ); + const findings = report.findings.map(({ name, osi_layer, severity }) => ({ + name, + osi_layer, + severity, + })); - expect(finding1).toMatchObject({ - name: 'Retrieved x-powered-by header: Express', - osi_layer: 'APPLICATION', - severity: 'INFORMATIONAL', + expect(findings).toContainEqual({ + name: "Retrieved access-control-allow-origin header: *", + osi_layer: "APPLICATION", + severity: "INFORMATIONAL", }); - expect(finding2).toMatchObject({ - name: 'Retrieved access-control-allow-origin header: *', - osi_layer: 'APPLICATION', - severity: 'INFORMATIONAL' - }); - - expect(finding3).toMatchObject({ - name: 'The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS', - osi_layer: 'APPLICATION', - severity: 'INFORMATIONAL' + expect(findings).toContainEqual({ + name: + "The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS", + osi_layer: "APPLICATION", + severity: "INFORMATIONAL", }); }, - 5 * Time.Minute -); \ No newline at end of file + 10 * Time.Minute +); From 98beb02330b495d1be628880a27420994f1f302b Mon Sep 17 00:00:00 2001 From: Sven Strittmatter Date: Wed, 22 Apr 2020 14:51:08 +0200 Subject: [PATCH 090/102] RFC: Syntax Definition for Combined Scans in SCBv2 This patch adds the initial parts of the RFC1 draft based on the outcome form our architecture workshop on 22.4.2020: - add motivation and header of the file. - add simple flow chart as problem description. - add theexamplerules from our workshop. Signed-off-by: Sven Strittmatter --- rfcs/rfc1.md | 238 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 238 insertions(+) create mode 100644 rfcs/rfc1.md diff --git a/rfcs/rfc1.md b/rfcs/rfc1.md new file mode 100644 index 0000000000..3f87314d99 --- /dev/null +++ b/rfcs/rfc1.md @@ -0,0 +1,238 @@ +# Syntax Definition for Combined Scans in SCBv2 + +secureCodeBox Core Development Team + +Request for Comments: 1 + +Authors: + +- Jannik Hollenbach (iteratec GmbH) +- Robert Seedorff (iteratec GmbH) +- Sven Strittmatter (iteratec GmbH) + +## Status of this Memo + +This document is a draft for the syntax and grammar definition used to declare combined scans in the next generation *secureCodeBox*. This is not a stable reference. It is necessary to discuss this topic in the community. Distribution of this memo is unlimited. + +## Motivation + +We are using *secureCodeBox* (further referenced as *SCB*) not only to scan a single web application for potential vulnerabilities. We also use *SCB* to scan whole networks to find potential vulnerable hosts. This approach relies on a concept of so called *combined scans*: We do one scan and feed the result into a subsequent scan. For example we scan for all hosts in a network with the *nmap scanner*, afterwords we scan all found IP addresses with the *nmap scanner* for open ports, and finally we scan these open ports with dedicated scanners like *SSLye*, *Nikto* etc. + +We are now moving to a new architectural approach of the *secureCodeBox* based on [Kubernetes][k8s] and its [custom resources][k8s-custom-resources]. This aproach gives us the posibility to orchestrate scans as simple YAML files in Kubernetes. The whole descrition of this new architecture is out of scope of this document. It is described in the master thesis "INSERT TITLE HERE". This new architecture is further referenced as *SCBv2*. + +This ground breaking architectural change requires also a new approach to define *combined scans*. They were implemented as plain Java code so far. This was quite inflexible: We needed to implement *combined scanners* for all possible combination of scanner (*nmap-nikto*, *nmap-sslyze*, *nmap-ssl* etc.). Also it is not very intuitive because you need a deep understanding of the underlying BPMN engine. + +## Requirements Notation + +The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [BCP 14][bcp-14] ([RFC2119](rfc-2119) [RFC8174][rfc-8174]) when, and only when, they appear in all capitals, as shown here. + +## Introduction + +Since the archietcure of *SCBv2* is based on Kubernetes the main artifact to describe the SCB orchestration is [YAML][yaml-spec]. So it seems natural to find an approach to define the *combined scans* also in YAML. + +## Problem Description + +In general we want to describe cascading scans like: + +```text ++--------+ +--------+ +--------+ +| scan 1 |-- result -->| scan 2 |-- result -->| scan 3 | ++--------+ +--------+ | +--------+ + | + | +--------+ + +---->| scan 4 | + +--------+ +``` + +A cocnrete example: + +```text ++----------------+ +-----------------+ +-----------+ +| <> | | <> | | <> | +| find all hosts |-- IP -->| find open ports |-- port 443 -->| check TLS | ++----------------+ +-----------------+ | +-----------+ + | + | +-------------+ + | | <> | + +------->| check HTTPd | + +-------------+ +``` + +### List of Interesting Services for Scans + +The [nmap service detection][nmap-detection] examines every foundopen port to detect what kind of service it is. For us interesting is this list: + +- ssh +- ldap +- ftp +- shell +- https +- http +- http-proxy +- http-alt +- postgresql +- mysql +- soap + +## Example Rules + +### SSLyze Scan Rule + +```yaml +apiVersion: "cascading.experimental.securecodebox.io/v1" +kind: CascadingRule +metadata: + name: "tls-scans" +spec: + on: + # AND logic + # define an explicit "port" as finding and a given port number + - category: "Open Port" + attributes: + port: 443 + service: "https" + # define an "port service" finding (any port) + - category: "Open Port" + attributes: + service: "https" + scanSpec: + name: "sslyze" + parameters: ["--regular", "${attributes.hostname}"] +``` + +### ZAP Scan Rule + +```yaml +apiVersion: "cascading.experimental.securecodebox.io/v1" +kind: CascadingRule +metadata: + name: "zap-scans" +spec: + on: + - category: "Open Port" + attributes: + service: "http" + scanSpec: + name: "zap" + parameters: ["--zap-api-baseline", "${attributes.hostname}"] +``` + +### SQLMap + +```yaml +apiVersion: "cascading.experimental.securecodebox.io/v1" +kind: CascadingRule +metadata: + name: "host-scan-database-check" +spec: + on: + # define an "port service" finding (any port) + - category: "Open Port" + attributes: + service: "postgresql" + scanSpec: + name: "sqlmap" + parameters: ["-t", "postgresql://${attributes.hostname}:${attributes.port}"] +``` + +### Nikto + +#### Alternative 1 + +HTTP and HTTPS in one file. + +```yaml +apiVersion: "cascading.experimental.securecodebox.io/v1" +kind: CascadingRule +metadata: + name: "host-scan-http" +spec: + on: + # define an "port service" finding (any port) + - category: "Open Port" + attributes: + service: "http" + - category: "Open Port" + attributes: + service: "https" + scanSpec: + name: "nikto" + parameters: ["-t", "${attributes.service:-http}://${attributes.hostname}"] +``` + +#### Alternative 2 + +HTTP and HTTPS in two files due to `https`/`http` in `scanSpec.parameters`. + +```yaml +apiVersion: "cascading.experimental.securecodebox.io/v1" +kind: CascadingRule +metadata: + name: "host-scans-http" +spec: + on: + - category: "Open Port" + attributes: + service: "http" + scanSpec: + name: "nitko" + parameters: ["-t", "http://${attributes.hostname}"] +--- +apiVersion: "cascading.experimental.securecodebox.io/v1" +kind: CascadingRule +metadata: + name: "host-scans-https" +spec: + on: + - category: "Open Port" + attributes: + service: + equals: "host-scan-https" + - category: "Open Port" + attributes: + service: + regex: "^host-.*-https" + - category: "Open Port" + attributes: # Alternative RegEx + service: "/^host-.*-https/" + - category: "Open Port" + attributes: + service: + contains: "scan" + scanSpec: + name: "nitko" + parameters: ["-t", "https://${attributes.hostname}"] +``` + +## a complete IP Range Scan Example + +```yaml +apiVersion: "execution.experimental.securecodebox.io/v1" +kind: Scan +metadata: + name: "portscan-hamburg-full" + label: + office: hamburg + vlan: complete +spec: + cascades: + enabled: true + allowedCascades: + - tls-scans # SSL Tests + - host-scans # Nikto alternative 1 + - host-scans-https # Nikto alternative 2.1 + - host-scans-http # Nikto alternative 2.2 + disallowedCascades: + - zap-scans # ZAP HTTP WebApp + scanSpec: + name: "nmap" + parameters: ["-sV", "192.168.188.0/24"] +``` + +[bcp-14]: https://tools.ietf.org/html/bcp14 +[k8s]: https://kubernetes.io/ +[k8s-custom-resources]: https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/ +[nmap-detection]: https://nmap.org/book/man-version-detection.html +[rfc-2119]: https://tools.ietf.org/html/rfc2119 +[rfc-8174]: https://tools.ietf.org/html/rfc8174 +[yaml-spec]: https://github.com/yaml/yaml-spec \ No newline at end of file From afa44f0deaa951ebdec08a4564b6e39cad20ad3c Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach <13718901+J12934@users.noreply.github.com> Date: Tue, 28 Apr 2020 15:39:24 +0200 Subject: [PATCH 091/102] Add correct thesis titel --- rfcs/rfc1.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rfcs/rfc1.md b/rfcs/rfc1.md index 3f87314d99..7c1bda89b1 100644 --- a/rfcs/rfc1.md +++ b/rfcs/rfc1.md @@ -18,7 +18,7 @@ This document is a draft for the syntax and grammar definition used to declare c We are using *secureCodeBox* (further referenced as *SCB*) not only to scan a single web application for potential vulnerabilities. We also use *SCB* to scan whole networks to find potential vulnerable hosts. This approach relies on a concept of so called *combined scans*: We do one scan and feed the result into a subsequent scan. For example we scan for all hosts in a network with the *nmap scanner*, afterwords we scan all found IP addresses with the *nmap scanner* for open ports, and finally we scan these open ports with dedicated scanners like *SSLye*, *Nikto* etc. -We are now moving to a new architectural approach of the *secureCodeBox* based on [Kubernetes][k8s] and its [custom resources][k8s-custom-resources]. This aproach gives us the posibility to orchestrate scans as simple YAML files in Kubernetes. The whole descrition of this new architecture is out of scope of this document. It is described in the master thesis "INSERT TITLE HERE". This new architecture is further referenced as *SCBv2*. +We are now moving to a new architectural approach of the *secureCodeBox* based on [Kubernetes][k8s] and its [custom resources][k8s-custom-resources]. This aproach gives us the posibility to orchestrate scans as simple YAML files in Kubernetes. The whole descrition of this new architecture is out of scope of this document. It is described in the master thesis "Automatic Assessment of Applications Security Aspects running in Cloud Environments". This new architecture is further referenced as *SCBv2*. This ground breaking architectural change requires also a new approach to define *combined scans*. They were implemented as plain Java code so far. This was quite inflexible: We needed to implement *combined scanners* for all possible combination of scanner (*nmap-nikto*, *nmap-sslyze*, *nmap-ssl* etc.). Also it is not very intuitive because you need a deep understanding of the underlying BPMN engine. @@ -235,4 +235,4 @@ spec: [nmap-detection]: https://nmap.org/book/man-version-detection.html [rfc-2119]: https://tools.ietf.org/html/rfc2119 [rfc-8174]: https://tools.ietf.org/html/rfc8174 -[yaml-spec]: https://github.com/yaml/yaml-spec \ No newline at end of file +[yaml-spec]: https://github.com/yaml/yaml-spec From 15834b3ee7a7c4e14d0ceef47282a28859337006 Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach <13718901+J12934@users.noreply.github.com> Date: Tue, 28 Apr 2020 15:50:43 +0200 Subject: [PATCH 092/102] Fix bash syntax in travis file --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3679a62d9c..b697618d90 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,8 +13,8 @@ env: - version=latest - version=unstable script: - - if [ $version -e "latest" ]; then cp test/.env.stable.test .env; fi - - if [ $version -e "unstable" ]; then cp test/.env.unstable.test .env; fi + - if [ "$version" == "latest" ]; then cp test/.env.stable.test .env; fi + - if [ "$version" == "unstable" ]; then cp test/.env.stable.test .env; fi - docker-compose -f docker-compose.yml -f docker-compose.demo.yml up -d engine camundadb bodgeit juice-shop nginx unsafe-https old-wordpress ssh-service scanner-infrastructure-nmap scanner-webapplication-arachni scanner-webapplication-zap scanner-infrastructure-amass scanner-infrastructure-sslyze scanner-webserver-nikto scanner-infrastructure-ssh scanner-cms-wpscan scanner-infrastructure-ncrack - cd test - npm ci From c6b5a20e7ed9c71f6eac94fab2a69212aaba41db Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach <13718901+J12934@users.noreply.github.com> Date: Mon, 4 May 2020 11:18:51 +0200 Subject: [PATCH 093/102] Removed DefectDojo enabled by default note DefectDojo integration still works, but needs to be set up separately to secureCodeBox. The focus in future will be to make the integration and setup as easy as possible, not to provide it by default. --- .env | 1 - 1 file changed, 1 deletion(-) diff --git a/.env b/.env index 52a303c376..4215cb2684 100644 --- a/.env +++ b/.env @@ -13,7 +13,6 @@ DEFECT_DOJO_API_KEY=your-defect-dojo-api-key-here # This flag just changes if the engine writes results into the providers ENABLE_ELASTICSEARCH=true # DefectDojo integration is currently disabled by default -# This is planned to change with release 1.2.0 ENABLE_DEFECT_DOJO=false # # Admin User Configuration From 8afbc7f572a7f52035811e07f7c2da4c88b086fd Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach <13718901+J12934@users.noreply.github.com> Date: Mon, 4 May 2020 12:13:04 +0200 Subject: [PATCH 094/102] Correct ZAP Rule Config to match current ScanTypes --- rfcs/rfc1.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/rfcs/rfc1.md b/rfcs/rfc1.md index 7c1bda89b1..e748404aef 100644 --- a/rfcs/rfc1.md +++ b/rfcs/rfc1.md @@ -112,9 +112,12 @@ spec: - category: "Open Port" attributes: service: "http" + - category: "Open Port" + attributes: + service: "https" scanSpec: - name: "zap" - parameters: ["--zap-api-baseline", "${attributes.hostname}"] + name: "zap-baseline" + parameters: ["-t", "${location}"] ``` ### SQLMap From 8008cb9203190b4fccbfe24ba0e922585b5a04ba Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach <13718901+J12934@users.noreply.github.com> Date: Mon, 4 May 2020 12:14:56 +0200 Subject: [PATCH 095/102] Change sqlmap to ncrack That's just not how sqlmap works --- rfcs/rfc1.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rfcs/rfc1.md b/rfcs/rfc1.md index e748404aef..6568936c4b 100644 --- a/rfcs/rfc1.md +++ b/rfcs/rfc1.md @@ -120,13 +120,13 @@ spec: parameters: ["-t", "${location}"] ``` -### SQLMap +### Ncrack (for Postgres) ```yaml apiVersion: "cascading.experimental.securecodebox.io/v1" kind: CascadingRule metadata: - name: "host-scan-database-check" + name: "postgres-credential-check" spec: on: # define an "port service" finding (any port) @@ -134,7 +134,7 @@ spec: attributes: service: "postgresql" scanSpec: - name: "sqlmap" + name: "ncrack" parameters: ["-t", "postgresql://${attributes.hostname}:${attributes.port}"] ``` From 16ec31cb5264c88a4668a0600a0e072bed217d86 Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach <13718901+J12934@users.noreply.github.com> Date: Mon, 4 May 2020 12:17:03 +0200 Subject: [PATCH 096/102] Correct nikto command line falg --- rfcs/rfc1.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rfcs/rfc1.md b/rfcs/rfc1.md index 6568936c4b..4bb88dcd26 100644 --- a/rfcs/rfc1.md +++ b/rfcs/rfc1.md @@ -135,7 +135,7 @@ spec: service: "postgresql" scanSpec: name: "ncrack" - parameters: ["-t", "postgresql://${attributes.hostname}:${attributes.port}"] + parameters: ["postgresql://${attributes.hostname}:${attributes.port}"] ``` ### Nikto @@ -160,7 +160,7 @@ spec: service: "https" scanSpec: name: "nikto" - parameters: ["-t", "${attributes.service:-http}://${attributes.hostname}"] + parameters: ["-h", "${attributes.service:-http}://${attributes.hostname}"] ``` #### Alternative 2 @@ -179,7 +179,7 @@ spec: service: "http" scanSpec: name: "nitko" - parameters: ["-t", "http://${attributes.hostname}"] + parameters: ["-h", "http://${attributes.hostname}"] --- apiVersion: "cascading.experimental.securecodebox.io/v1" kind: CascadingRule @@ -204,7 +204,7 @@ spec: contains: "scan" scanSpec: name: "nitko" - parameters: ["-t", "https://${attributes.hostname}"] + parameters: ["-h", "https://${attributes.hostname}"] ``` ## a complete IP Range Scan Example From b8a251530564739b9089f0285ff570c1f07c5a0e Mon Sep 17 00:00:00 2001 From: Dan Salmon Date: Fri, 8 May 2020 15:31:18 +0000 Subject: [PATCH 097/102] Fix Typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9065709c93..0fd4dda89d 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ For additional documentation aspects please have a look at our: The typical way to ensure application security is to hire a security specialist (aka penetration tester) at some point in your project to check the application for security bugs and vulnerabilities. Usually, this check is done at a later stage of the project and has two major drawbacks: 1. Nowadays, a lot of projects do continuous delivery, which means the developers deploy new versions multiple times each day. The penetration tester is only able to check a single snapshot, but some further commits could introduce new security issues. To ensure ongoing application security, the penetration tester should also continuously test the application. Unfortunately, such an approach is rarely financially feasible. -2. Due to a typically time boxed analysis, the penetration tester has to focus on trivial security issues (low-hangig fruits) and therefore will not address the serious, non-obvious ones. +2. Due to a typically time boxed analysis, the penetration tester has to focus on trivial security issues (low-hanging fruits) and therefore will not address the serious, non-obvious ones. With the _secureCodeBox_ we provide a toolchain for continuous scanning of applications to find the low-hanging fruit issues early in the development process and free the resources of the penetration tester to concentrate on the major security issues. From 2780bceb616ecbc96ef0def6c8f4e1d3a6d2a4e5 Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach <13718901+J12934@users.noreply.github.com> Date: Thu, 11 Jun 2020 12:30:32 +0200 Subject: [PATCH 098/102] Comment on rfc1 from @J12934 - Switched attribute `on` in `CascadingRule` to `matches`. On is a reserved keyword in yaml which gets implicitly converted to `"false"` when used without quationmarks as a key in yaml. - Introduced a new layer under the `matches` attribute, to mark how these rules should be applied. Currently only supporting `anyOf`. This enabled to introduces other operators to add new behavior later, without introducing breaking changes. - Switches selection mechanism for `CascadingRules` on `Scan` Objects to use kubernetes label selectors([documentation](https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#api),[api reference](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#labelselector-v1-meta)). The previous version matched on the names, which especially when using denylists can lead to problems when new `CascadingRules` were introduced but not included in the Blacklist. In the worst cases this can lead to invasive scanners being used against services where this is not permitted. The new label selector lets you block out classes of scanners (like all invasive scanner). --- rfcs/rfc1.md | 234 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 153 insertions(+), 81 deletions(-) diff --git a/rfcs/rfc1.md b/rfcs/rfc1.md index 4bb88dcd26..9b72b5162e 100644 --- a/rfcs/rfc1.md +++ b/rfcs/rfc1.md @@ -12,15 +12,15 @@ Authors: ## Status of this Memo -This document is a draft for the syntax and grammar definition used to declare combined scans in the next generation *secureCodeBox*. This is not a stable reference. It is necessary to discuss this topic in the community. Distribution of this memo is unlimited. +This document is a draft for the syntax and grammar definition used to declare combined scans in the next generation _secureCodeBox_. This is not a stable reference. It is necessary to discuss this topic in the community. Distribution of this memo is unlimited. ## Motivation -We are using *secureCodeBox* (further referenced as *SCB*) not only to scan a single web application for potential vulnerabilities. We also use *SCB* to scan whole networks to find potential vulnerable hosts. This approach relies on a concept of so called *combined scans*: We do one scan and feed the result into a subsequent scan. For example we scan for all hosts in a network with the *nmap scanner*, afterwords we scan all found IP addresses with the *nmap scanner* for open ports, and finally we scan these open ports with dedicated scanners like *SSLye*, *Nikto* etc. +We are using _secureCodeBox_ (further referenced as _SCB_) not only to scan a single web application for potential vulnerabilities. We also use _SCB_ to scan whole networks to find potential vulnerable hosts. This approach relies on a concept of so called _combined scans_: We do one scan and feed the result into a subsequent scan. For example we scan for all hosts in a network with the _nmap scanner_, afterwords we scan all found IP addresses with the _nmap scanner_ for open ports, and finally we scan these open ports with dedicated scanners like _SSLye_, _Nikto_ etc. -We are now moving to a new architectural approach of the *secureCodeBox* based on [Kubernetes][k8s] and its [custom resources][k8s-custom-resources]. This aproach gives us the posibility to orchestrate scans as simple YAML files in Kubernetes. The whole descrition of this new architecture is out of scope of this document. It is described in the master thesis "Automatic Assessment of Applications Security Aspects running in Cloud Environments". This new architecture is further referenced as *SCBv2*. +We are now moving to a new architectural approach of the _secureCodeBox_ based on [Kubernetes][k8s] and its [custom resources][k8s-custom-resources]. This aproach gives us the posibility to orchestrate scans as simple YAML files in Kubernetes. The whole descrition of this new architecture is out of scope of this document. It is described in the master thesis "Automatic Assessment of Applications Security Aspects running in Cloud Environments". This new architecture is further referenced as _SCBv2_. -This ground breaking architectural change requires also a new approach to define *combined scans*. They were implemented as plain Java code so far. This was quite inflexible: We needed to implement *combined scanners* for all possible combination of scanner (*nmap-nikto*, *nmap-sslyze*, *nmap-ssl* etc.). Also it is not very intuitive because you need a deep understanding of the underlying BPMN engine. +This ground breaking architectural change requires also a new approach to define _combined scans_. They were implemented as plain Java code so far. This was quite inflexible: We needed to implement _combined scanners_ for all possible combination of scanner (_nmap-nikto_, _nmap-sslyze_, _nmap-ssl_ etc.). Also it is not very intuitive because you need a deep understanding of the underlying BPMN engine. ## Requirements Notation @@ -28,7 +28,7 @@ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "S ## Introduction -Since the archietcure of *SCBv2* is based on Kubernetes the main artifact to describe the SCB orchestration is [YAML][yaml-spec]. So it seems natural to find an approach to define the *combined scans* also in YAML. +Since the archietcure of _SCBv2_ is based on Kubernetes the main artifact to describe the SCB orchestration is [YAML][yaml-spec]. So it seems natural to find an approach to define the _combined scans_ also in YAML. ## Problem Description @@ -58,9 +58,15 @@ A cocnrete example: +-------------+ ``` +## Changelog + +- Switched attribute `on` in `CascadingRule` to `matches`. On is a reserved keyword in yaml which gets implicitly converted to `"false"` when used without quationmarks as a key in yaml. +- Introduced a new layer under the `matches` attribute, to mark how these rules should be applied. Currently only supporting `anyOf`. This enabled to introduces other operators to add new behavior later, without introducing breaking changes. +- Switches selection mechanism for `CascadingRules` on `Scan` Objects to use kubernetes label selectors([documentation](https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#api),[api reference](https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#labelselector-v1-meta)). The previous version matched on the names, which especially when using denylists can lead to problems when new `CascadingRules` were introduced but not included in the Blacklist. In the worst cases this can lead to invasive scanners being used against services where this is not permitted. The new label selector lets you block out classes of scanners (like all invasive scanner). + ### List of Interesting Services for Scans -The [nmap service detection][nmap-detection] examines every foundopen port to detect what kind of service it is. For us interesting is this list: +The [nmap service detection][nmap-detection] examines every found open port to detect what kind of service it is. For us interesting is this list: - ssh - ldap @@ -83,21 +89,33 @@ apiVersion: "cascading.experimental.securecodebox.io/v1" kind: CascadingRule metadata: name: "tls-scans" + labels: + # Described how "invasive" the scan is. + # Possible values: "invasive" or "non-invasive" + # CascadingRules are considered "invasive" when the Scan they start actively sends out packages with attack payloads. + securecodebox.io/invasive: non-invasive + # Described the intensiveness level on a scanning and computational resource level. + # Possible values: "ligh", "medium", "intense" + # CascadingRules are considered more "intensive" when the Scan they start consumes lots of computational resources like RAM, CPU, or Network + securecodebox.io/intensive: light spec: - on: - # AND logic - # define an explicit "port" as finding and a given port number - - category: "Open Port" - attributes: - port: 443 - service: "https" - # define an "port service" finding (any port) - - category: "Open Port" - attributes: - service: "https" + matches: + # CascadingRule triggers if a finding matches at least one of the anyOf matchers + # With the first version of this implementation only anyOf would be supported. + # If this turns out to be lacking and other operators (like `allOf` can be introduced without breaking changes) + anyOf: + # define an explicit "port" as finding and a given port number + - category: "Open Port" + attributes: + port: 443 + service: "https" + # define an "port service" finding (any port) + - category: "Open Port" + attributes: + service: "https" scanSpec: name: "sslyze" - parameters: ["--regular", "${attributes.hostname}"] + parameters: ["--regular", "{{attributes.hostname}}"] ``` ### ZAP Scan Rule @@ -107,17 +125,21 @@ apiVersion: "cascading.experimental.securecodebox.io/v1" kind: CascadingRule metadata: name: "zap-scans" + labels: + securecodebox.io/invasive: non-invasive + securecodebox.io/intensive: medium spec: - on: - - category: "Open Port" - attributes: - service: "http" - - category: "Open Port" - attributes: - service: "https" + matches: + anyOf: + - category: "Open Port" + attributes: + service: "http" + - category: "Open Port" + attributes: + service: "https" scanSpec: name: "zap-baseline" - parameters: ["-t", "${location}"] + parameters: ["-t", "{{location}}"] ``` ### Ncrack (for Postgres) @@ -127,15 +149,19 @@ apiVersion: "cascading.experimental.securecodebox.io/v1" kind: CascadingRule metadata: name: "postgres-credential-check" + labels: + securecodebox.io/invasive: invasive + securecodebox.io/intensive: high spec: - on: - # define an "port service" finding (any port) - - category: "Open Port" - attributes: - service: "postgresql" + matches: + anyOf: + # define an "port service" finding (any port) + - category: "Open Port" + attributes: + service: "postgresql" scanSpec: name: "ncrack" - parameters: ["postgresql://${attributes.hostname}:${attributes.port}"] + parameters: ["postgresql://{{attributes.hostname}}:{{attributes.port}}"] ``` ### Nikto @@ -149,18 +175,22 @@ apiVersion: "cascading.experimental.securecodebox.io/v1" kind: CascadingRule metadata: name: "host-scan-http" + labels: + securecodebox.io/invasive: invasive + securecodebox.io/intensive: medium spec: - on: - # define an "port service" finding (any port) - - category: "Open Port" - attributes: - service: "http" - - category: "Open Port" - attributes: - service: "https" + matches: + anyOf: + # define an "port service" finding (any port) + - category: "Open Port" + attributes: + service: "http" + - category: "Open Port" + attributes: + service: "https" scanSpec: name: "nikto" - parameters: ["-h", "${attributes.service:-http}://${attributes.hostname}"] + parameters: ["-h", "{{attributes.service:}}://{{attributes.hostname}}"] ``` #### Alternative 2 @@ -172,70 +202,112 @@ apiVersion: "cascading.experimental.securecodebox.io/v1" kind: CascadingRule metadata: name: "host-scans-http" + labels: + securecodebox.io/invasive: invasive + securecodebox.io/intensive: medium spec: - on: - - category: "Open Port" - attributes: - service: "http" + matches: + anyOf: + - category: "Open Port" + attributes: + service: "http" scanSpec: name: "nitko" - parameters: ["-h", "http://${attributes.hostname}"] + parameters: ["-h", "http://{{attributes.hostname}}"] --- apiVersion: "cascading.experimental.securecodebox.io/v1" kind: CascadingRule metadata: name: "host-scans-https" + labels: + securecodebox.io/invasive: invasive + securecodebox.io/intensive: medium spec: - on: - - category: "Open Port" - attributes: - service: - equals: "host-scan-https" - - category: "Open Port" - attributes: - service: - regex: "^host-.*-https" - - category: "Open Port" - attributes: # Alternative RegEx - service: "/^host-.*-https/" - - category: "Open Port" - attributes: - service: - contains: "scan" + matches: + anyOf: + - category: "Open Port" + attributes: + service: + equals: "host-scan-https" + - category: "Open Port" + attributes: + service: + regex: "^host-.*-https" + - category: "Open Port" + attributes: # Alternative RegEx + service: "/^host-.*-https/" + - category: "Open Port" + attributes: + service: + contains: "scan" scanSpec: name: "nitko" parameters: ["-h", "https://${attributes.hostname}"] ``` -## a complete IP Range Scan Example +## Using Cascading Rules + +By default no cascading Rules will be used. + +```yaml +# Nmap Scan without cascading rules +apiVersion: "execution.experimental.securecodebox.io/v1" +kind: Scan +metadata: + name: "portscan-berlin-wifi" + label: + office: berlin + vlan: wifi +spec: + scanSpec: + name: "nmap" + parameters: ["-sV", "10.42.0.0/16"] +``` + +To enable cascading rules you need to specify a label selector to select the cascading rules you'd like + +```yaml +apiVersion: "execution.experimental.securecodebox.io/v1" +kind: Scan +metadata: + name: "portscan-berlin-wifi" + label: + office: berlin + vlan: wifi +spec: + cascades: + matchLabels: + # Uses all CascadingRules in the namespace which are labelled as "non-invasive" and a intensiveness level of "light" + securecodebox.io/invasive: non-invasive + securecodebox.io/intensive: light + scanSpec: + name: "nmap" + parameters: ["-sV", "10.42.0.0/16"] +``` + +To implicitly enable all cascading rules (not-recommended) a empty label selector can be used ```yaml apiVersion: "execution.experimental.securecodebox.io/v1" kind: Scan metadata: - name: "portscan-hamburg-full" + name: "portscan-berlin-wifi" label: - office: hamburg - vlan: complete + office: berlin + vlan: wifi spec: cascades: - enabled: true - allowedCascades: - - tls-scans # SSL Tests - - host-scans # Nikto alternative 1 - - host-scans-https # Nikto alternative 2.1 - - host-scans-http # Nikto alternative 2.2 - disallowedCascades: - - zap-scans # ZAP HTTP WebApp + # Uses all `CascadingRules` in the namespace + matchLabels: {} scanSpec: name: "nmap" - parameters: ["-sV", "192.168.188.0/24"] + parameters: ["-sV", "10.42.0.0/16"] ``` -[bcp-14]: https://tools.ietf.org/html/bcp14 -[k8s]: https://kubernetes.io/ +[bcp-14]: https://tools.ietf.org/html/bcp14 +[k8s]: https://kubernetes.io/ [k8s-custom-resources]: https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/ -[nmap-detection]: https://nmap.org/book/man-version-detection.html -[rfc-2119]: https://tools.ietf.org/html/rfc2119 -[rfc-8174]: https://tools.ietf.org/html/rfc8174 -[yaml-spec]: https://github.com/yaml/yaml-spec +[nmap-detection]: https://nmap.org/book/man-version-detection.html +[rfc-2119]: https://tools.ietf.org/html/rfc2119 +[rfc-8174]: https://tools.ietf.org/html/rfc8174 +[yaml-spec]: https://github.com/yaml/yaml-spec From c1a636afe56bac1d4a219966aaeb3784eaff1c88 Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach <13718901+J12934@users.noreply.github.com> Date: Mon, 15 Jun 2020 11:16:26 +0200 Subject: [PATCH 099/102] Fix scan spec on the wrong yaml level --- rfcs/rfc1.md | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/rfcs/rfc1.md b/rfcs/rfc1.md index 9b72b5162e..257f828e70 100644 --- a/rfcs/rfc1.md +++ b/rfcs/rfc1.md @@ -259,9 +259,8 @@ metadata: office: berlin vlan: wifi spec: - scanSpec: - name: "nmap" - parameters: ["-sV", "10.42.0.0/16"] + name: "nmap" + parameters: ["-sV", "10.42.0.0/16"] ``` To enable cascading rules you need to specify a label selector to select the cascading rules you'd like @@ -280,9 +279,8 @@ spec: # Uses all CascadingRules in the namespace which are labelled as "non-invasive" and a intensiveness level of "light" securecodebox.io/invasive: non-invasive securecodebox.io/intensive: light - scanSpec: - name: "nmap" - parameters: ["-sV", "10.42.0.0/16"] + name: "nmap" + parameters: ["-sV", "10.42.0.0/16"] ``` To implicitly enable all cascading rules (not-recommended) a empty label selector can be used @@ -299,9 +297,8 @@ spec: cascades: # Uses all `CascadingRules` in the namespace matchLabels: {} - scanSpec: - name: "nmap" - parameters: ["-sV", "10.42.0.0/16"] + name: "nmap" + parameters: ["-sV", "10.42.0.0/16"] ``` [bcp-14]: https://tools.ietf.org/html/bcp14 From 63088de87bb859b0b128bfa8c36aeb955266c232 Mon Sep 17 00:00:00 2001 From: Sam Reed Date: Tue, 30 Jun 2020 15:44:25 +0100 Subject: [PATCH 100/102] Copyedit README.md --- README.md | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 0fd4dda89d..5f4b26c4f3 100644 --- a/README.md +++ b/README.md @@ -27,44 +27,44 @@ For additional documentation aspects please have a look at our: The typical way to ensure application security is to hire a security specialist (aka penetration tester) at some point in your project to check the application for security bugs and vulnerabilities. Usually, this check is done at a later stage of the project and has two major drawbacks: 1. Nowadays, a lot of projects do continuous delivery, which means the developers deploy new versions multiple times each day. The penetration tester is only able to check a single snapshot, but some further commits could introduce new security issues. To ensure ongoing application security, the penetration tester should also continuously test the application. Unfortunately, such an approach is rarely financially feasible. -2. Due to a typically time boxed analysis, the penetration tester has to focus on trivial security issues (low-hanging fruits) and therefore will not address the serious, non-obvious ones. +2. Due to a typically time boxed analysis, the penetration tester has to focus on trivial security issues (low-hanging fruit) and therefore will probably not address the serious, non-obvious ones. With the _secureCodeBox_ we provide a toolchain for continuous scanning of applications to find the low-hanging fruit issues early in the development process and free the resources of the penetration tester to concentrate on the major security issues. -The purpose of *secureCodeBox* **is not** to replace the penetration testers or make them obsolete. We strongly recommend to run extensive tests by experienced penetration testers on all your applications. +The purpose of *secureCodeBox* **is not** to replace the penetration testers or make them obsolete. We strongly recommend running extensive tests by experienced penetration testers on all your applications. ![Overview of the architecture.](docs/resources/macbook_kibana.jpg "Overview of the architecture.") **Important note**: The _secureCodeBox_ is no simple one-button-click-solution! You must have a deep understanding of security and how to configure the scanners. Furthermore, an understanding of the scan results and how to interpret them is also necessary. -There is a german article about [Security DevOps – Angreifern (immer) einen Schritt voraus][secdevops-objspec] in the software engineering journal [OBJEKTSpektrum][objspec]. +There is a German article about [Security DevOps – Angreifern (immer) einen Schritt voraus][secdevops-objspec] in the software engineering journal [OBJEKTSpektrum][objspec]. ## Quickstart -For a quick start checkout this repository and start the complete secureCodeBox stack with docker-compose or vagrant: +For a quick start checkout this repository and start the complete _secureCodeBox_ stack with docker-compose or vagrant: ```bash git clone https://github.com/secureCodeBox/secureCodeBox cd secureCodeBox ``` -You can start the secureCodeBox project based on docker-compose or localy with Vagrant. +You can start the _secureCodeBox_ project based on docker-compose or locally with Vagrant. ### Start with docker and docker-compose #### Prerequisites - * Minimal Docker version 18.03.0 is required + * Minimum Docker version required is 18.03.0 * Docker-Compose is required. - * Your docker host will need at least 4GB virtual memory to run the complete stack. If you want to scale out the scanner you will need more... + * Your docker host will need at least 4GB virtual memory to run the complete stack. If you want to scale out the scanner you will need even more... -The docker-compose.yml file can be used to launch a secureCodeBox instance. -To start the secureCodeBox and some demo targets run the following: +The docker-compose.yml file can be used to launch a _secureCodeBox_ instance. +To start the _secureCodeBox_ and some demo targets run the following: ```bash docker-compose -f docker-compose.yml -f docker-compose.demo.yml up ``` -Running `docker-compose up` uses the default credentials specified in the [`.env`](https://github.com/secureCodeBox/starter/blob/master/.env) file. You can override these by changing the file or setting the environment variables on your system. Before running the SecureCodeBox outside a testing environment you should at least change the following variables: +Running `docker-compose up` uses the default credentials specified in the [`.env`](https://github.com/secureCodeBox/starter/blob/master/.env) file. You can override these by changing the file or setting the environment variables on your system. Before running the _secureCodeBox_ outside a testing environment you should at least change the following variables: * `CAMUNDADB_ROOT_PW` MySQL root password * `CAMUNDADB_USER` MySQL username used by the Camunda Engine * `CAMUNDADB_PW` MySQL password also used by the Camunda Engine @@ -75,20 +75,20 @@ Running `docker-compose up` uses the default credentials specified in the [`.env #### Prerequisites * Vagrant Version 2.x is required * VirtualBox is required - * Your vagrant maschine will need at least 8GB virtual memory to run the complete stack. If you want to scale out the scanner you will need more... + * Your vagrant machine will need at least 8GB virtual memory to run the complete stack. If you want to scale out the scanner you will need more... ```bash vagrant plugin install vagrant-docker-compose vagrant plugin install vagrant-disksize ``` -To start the complete setup localy you can easily start the vagrant maschine: +To start the complete setup locally you can easily start the vagrant machine: ```bash vagrant up ``` ### Run your first security scan -There are several ways to start a security scan with the secureCodeBox. One way is to use the WebUI of the engine and start the scan manually. +There are several ways to start a security scan with the _secureCodeBox_. One way is to use the WebUI of the engine and start the scan manually. Access the WebUI via: [http://your-docker-host:8080/](http://localhost:8080) @@ -97,11 +97,11 @@ Access the WebUI via: 2. Click on the user name -> my profile 3. Open the "Tasklist" 4. Click on "start process" in the upper menu -5. Select one of the implemented scan processes (e.g. NMAP) +5. Select one of the implemented scan processes (e.g. Nmap) 6. Configure the scanner and hit "complete" / "start" (depending on the process) 7. Wait for the result and have fun -> **Hint**: If you wan't to use ZAP you might should increase the spider depth from 1 to minimum 3 (advanced configuration). If you use Arachni increase DOM depth, path depth and page limit (scan scope). +> **Hint**: If you want to use ZAP you should increase the spider depth from 1 to minimum 3 (advanced configuration). If you use Arachni increase DOM depth, path depth and page limit (scan scope). ## How Does it Work? @@ -109,7 +109,7 @@ The core of the _secureCodeBox_ is a [process engine][scb-engine] (based on the ![An example scan process.](docs/resources/scan_process.png "An example scan process.") -The scan itself may be triggered via the WebUI, a REST-API call or via webhooks. The system allows continuous integration software such as Jenkins, Travis CI, Bamboo etc. to trigger a scan automatically. The scans will be executed by the specified scanners and the results will be aggregated for review in the control center or the CI environment. For a more detailed description of the components and how they interact see the [architecture](#architecture) section. +The scan itself may be triggered via the WebUI, a REST-API call or via webhooks. The system allows continuous integration software such as Jenkins, Travis CI, Bamboo etc. to trigger a scan automatically. The scan will be executed by the specified scanners and the results will be aggregated for review in the control center or the CI environment. For a more detailed description of the components and how they interact see the [architecture](#architecture) section. ## Architecture @@ -136,7 +136,7 @@ The scanners are individual tools like [Nmap][nmap], [Nikto][nikto], [Arachni][a Each scanner requires a small adapter, usually written in Java, Ruby, Python, or JavaScript. The adapter fulfills two needs. Firstly it translates the configuration data, defining what to do, from the engine format into a usable format for the particular scanning tool. Secondly, it transforms the results of the scan into a usable format by the data collection component. -The scanners also have to check whether the engine has a job to fulfill using the [external service task pattern][exteralServiceTask]. Requests from scanners were chosen over pushes from the engine due to an easier and more fail tolerant implementation. Otherwise the engine had to monitor the current progress of each scanner instance and whether it is still alive. Thanks to the current implementation a scanner might die and just sends a request after a restart. +The scanners also have to check whether the engine has a job to fulfill using the [external service task pattern][exteralServiceTask]. Requests from scanners were chosen over pushes from the engine due to an easier and more fail tolerant implementation. Otherwise the engine had to monitor the current progress of each scanner instance and whether it is still alive. Thanks to the current implementation a scanner might die and just sends a request after a restart. The following scanners are currently available out of the box: @@ -146,7 +146,7 @@ The following scanners are currently available out of the box: - [Arachni][arachni] web vulnerability scans - [Amass][amass] for subdomain scans - [WPScan][wpscan] black box [WordPress][wordpress] vulnerability scans -- [SSH Scan][sshscan] checking ssh servers for known vulnarabilities +- [SSH Scan][sshscan] checking ssh servers for known vulnerabilities In the works (coming soon) - [SQLMap][sqlmap] for SQL Injection scans @@ -174,7 +174,7 @@ On the host machine run `sysctl -w vm.max_map_count=262144` as root. To make the ### Scan-Container can't access outside of secure-code-box containers on CentOS -While it is possible to access for example the camunda engine from outside, it is not possible to perform scans outside of SecureCodeBox containers. _firewalld_ blocks traffic from containers to outside, please configure _firewalld_. +While it is possible to access for example the camunda engine from outside, it is not possible to perform scans outside of _secureCodeBox_ containers. _firewalld_ blocks traffic from containers to outside, please configure _firewalld_. ## Roadmap @@ -182,7 +182,7 @@ While it is possible to access for example the camunda engine from outside, it i At the moment, the _secureCodeBox_ is in a stable *beta state*. We are working hard on polishing, documenting and integrating new security scanners. ## License -Code of secureCodeBox is licensed under the [Apache License 2.0][scb-license]. +Code of _secureCodeBox_ is licensed under the [Apache License 2.0][scb-license]. ## Community You are welcome, please join us on... 👋 @@ -190,7 +190,7 @@ You are welcome, please join us on... 👋 - [Slack][scb-slack] - [Twitter][scb-twitter] -secureCodeBox is an official [OWASP][owasp] project. +_secureCodeBox_ is an official [OWASP][owasp] project. ## Contributing Contributions are welcome and extremely helpful 🙌 @@ -198,7 +198,7 @@ Contributions are welcome and extremely helpful 🙌 Author Information ------------------ -Sponsored by [iteratec GmbH](https://www.iteratec.de/) - +Sponsored by [iteratec GmbH](https://www.iteratec.de/) - [secureCodeBox.io](https://www.securecodebox.io/) [nginx]: https://nginx.org/en/ From 9b17aad4a047ad58e5695dcd41ab9b0154fc2ca1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Jul 2020 17:27:41 +0000 Subject: [PATCH 101/102] Bump lodash from 4.17.15 to 4.17.19 in /test Bumps [lodash](https://github.com/lodash/lodash) from 4.17.15 to 4.17.19. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.19) Signed-off-by: dependabot[bot] --- test/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/package-lock.json b/test/package-lock.json index af761f6e93..6d7f5dcea0 100644 --- a/test/package-lock.json +++ b/test/package-lock.json @@ -2785,9 +2785,9 @@ } }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", "dev": true }, "lodash.sortby": { From 159ca1c71f9dee9feb02158f0812a0df0921fa40 Mon Sep 17 00:00:00 2001 From: Jannik Hollenbach <13718901+J12934@users.noreply.github.com> Date: Mon, 31 Aug 2020 16:41:14 +0200 Subject: [PATCH 102/102] Add missing link to ZAP --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0fd4dda89d..724e39d988 100644 --- a/README.md +++ b/README.md @@ -141,6 +141,7 @@ The scanners also have to check whether the engine has a job to fulfill using th The following scanners are currently available out of the box: - [Nmap][nmap] for IP and port scans +- [OWASP ZAP](https://www.zaproxy.org/) for web applications and APIs - [Nikto][nikto] for web server scans - [SSLyze][sslyze] for SSL/TLS scans - [Arachni][arachni] web vulnerability scans