diff --git a/src/fireedge/etc/fireedge-server.conf b/src/fireedge/etc/fireedge-server.conf index 4758fdb39fa..33c49f05284 100644 --- a/src/fireedge/etc/fireedge-server.conf +++ b/src/fireedge/etc/fireedge-server.conf @@ -28,3 +28,12 @@ session_remember_expiration: 3600 # minimum life expiration time (minutes) minimun_opennebula_expiration: 30 + +# :subscriber_endpoint to subscribe for OpenNebula events must match those in +# oned.conf +subscriber_endpoint: tcp://localhost:2101 + +# Log debug level: https://github.com/winstonjs/winston#using-logging-levels +# 0 = ERROR, 1 = WARNING, 2 = INFO, 5 = DEBUG +# +debug_level: 2 diff --git a/src/fireedge/etc/sunstone/sunstone-server.conf b/src/fireedge/etc/sunstone/sunstone-server.conf index a15e9c7c3b4..eb91d9f9332 100644 --- a/src/fireedge/etc/sunstone/sunstone-server.conf +++ b/src/fireedge/etc/sunstone/sunstone-server.conf @@ -13,7 +13,26 @@ vcenter_prepend_command: '' sunstone_prepend: '' # Directory to store temporal files when uploading images -tmpdir: /var/tmp +tmpdir: '/var/tmp' + +# Size upload file +max_upload_file_size: 20000 + + +################################################################################ +# Proxy +################################################################################ + +#Enable an http proxy for the support portal and to download MarketPlaceApps +# from the MarketPlace to the user's desktop. + +#proxy: "" + +################################################################################ +# Check Official support +################################################################################ + +#token_remote_support: "" ################################################################################ # UI Settings @@ -94,7 +113,3 @@ langs: vi: 'Vietnamese' zh_CN: 'Chinese (China)' zh_TW: 'Chinese (Taiwan)' - -################################################################################ -# Unused Settings for future features (added in 6.4 LTS) -################################################################################ \ No newline at end of file diff --git a/src/fireedge/package-lock.json b/src/fireedge/package-lock.json index e68ea946b3a..df5bc2f0135 100644 --- a/src/fireedge/package-lock.json +++ b/src/fireedge/package-lock.json @@ -55,6 +55,7 @@ "iconoir-react": "4.7.1", "immutable": "4.0.0-rc.12", "intersection-observer": "0.11.0", + "jsdom": "19.0.0", "jsonschema": "1.2.7", "jsonwebtoken": "8.5.1", "jwt-simple": "0.5.6", @@ -63,7 +64,7 @@ "marked": "4.0.10", "morgan": "1.10.0", "multer": "1.4.3", - "node-zendesk": "2.1.0", + "node-zendesk": "2.2.0", "notistack": "2.0.3", "opennebula-guacamole": "1.0.0", "opennebula-wmks": "2.1.4", @@ -2754,6 +2755,14 @@ "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.0.0.tgz", "integrity": "sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q==" }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "engines": { + "node": ">= 10" + } + }, "node_modules/@types/component-emitter": { "version": "1.2.11", "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", @@ -3283,6 +3292,11 @@ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -3299,7 +3313,6 @@ "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -3307,6 +3320,15 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -3316,6 +3338,25 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -3998,6 +4039,11 @@ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, "node_modules/browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -4879,6 +4925,27 @@ "node": ">=4" } }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + }, "node_modules/csstype": { "version": "3.0.11", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", @@ -4979,6 +5046,31 @@ "node": ">=0.10" } }, + "node_modules/data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -5003,6 +5095,11 @@ "node": ">=0.10.0" } }, + "node_modules/decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" + }, "node_modules/decompress-response": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", @@ -5025,8 +5122,7 @@ "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "node_modules/define-properties": { "version": "1.1.3", @@ -5167,6 +5263,17 @@ "npm": ">=1.2" } }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/dompurify": { "version": "2.2.6", "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.2.6.tgz", @@ -5482,6 +5589,83 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/eslint": { "version": "7.32.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", @@ -5544,7 +5728,6 @@ "resolved": "https://registry.npmjs.org/eslint-config-opennebula/-/eslint-config-opennebula-2.0.1.tgz", "integrity": "sha512-soNL+9o6BEa4CZWvwiIzw6I3LbL5MTzNhk216YOIfs+wCTry/CnaZjmTzUBdgQvSB0f2S8OC72mI5lCue+Zqpg==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@babel/core": "7.15.8", "@babel/eslint-parser": "7.15.4", @@ -5872,64 +6055,6 @@ "eslint": ">=7.7.0" } }, - "node_modules/eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", - "dev": true, - "peer": true, - "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "peer": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true, - "peer": true - }, "node_modules/eslint-plugin-jsdoc": { "version": "37.0.3", "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-37.0.3.tgz", @@ -6315,7 +6440,6 @@ "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, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -6524,8 +6648,7 @@ "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "node_modules/fast-xml-parser": { "version": "3.19.0", @@ -6788,19 +6911,6 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -7234,6 +7344,17 @@ "node": ">=0.10.0" } }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/html-entities": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", @@ -7278,6 +7399,19 @@ "node": ">=8.0.0" } }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/http-proxy-middleware": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.0.5.tgz", @@ -7318,6 +7452,18 @@ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -7729,6 +7875,11 @@ "node": ">=0.10.0" } }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -7913,6 +8064,124 @@ "node": ">=12.0.0" } }, + "node_modules/jsdom": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz", + "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.5.0", + "acorn-globals": "^6.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.1", + "decimal.js": "^10.3.1", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^3.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^10.0.0", + "ws": "^8.2.3", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsdom/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/jsdom/node_modules/tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsdom/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/jsdom/node_modules/ws": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz", + "integrity": "sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -8347,6 +8616,7 @@ "version": "7.8.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.8.0.tgz", "integrity": "sha512-AmXqneQZL3KZMIgBpaPTeI6pfwh+xQ2vutMsyqOu1TBdEXFZgpG/80wuJ531w2ZN7TI0/oc8CPxzh/DKQudZqg==", + "deprecated": "Please update to latest patch version to fix memory leak https://github.com/isaacs/node-lru-cache/issues/227", "engines": { "node": ">=12" } @@ -8687,12 +8957,12 @@ "dev": true }, "node_modules/nconf": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.11.0.tgz", - "integrity": "sha512-c4W7QqYF6p5BC7J/eVTOvtUlQgvS5CgbJ11xgjhSr8yyius7km7xgdIYHkFLR4TWY1HjsFkia/3l5OprGqCHvA==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.12.0.tgz", + "integrity": "sha512-T3fZPw3c7Dfrz8JBQEbEcZJ2s8f7cUMpKuyBtsGQe0b71pcXx6gNh4oti2xh5dxB+gO9ufNfISBlGvvWtfyMcA==", "dependencies": { - "async": "^1.4.0", - "ini": "^1.3.0", + "async": "^3.0.0", + "ini": "^2.0.0", "secure-keys": "^1.0.0", "yargs": "^16.1.1" }, @@ -8700,10 +8970,13 @@ "node": ">= 0.4.0" } }, - "node_modules/nconf/node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + "node_modules/nconf/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "engines": { + "node": ">=10" + } }, "node_modules/negotiator": { "version": "0.6.3", @@ -8812,12 +9085,12 @@ "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" }, "node_modules/node-zendesk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-zendesk/-/node-zendesk-2.1.0.tgz", - "integrity": "sha512-vMdk3hrN/mTu5MziyZupn8jeTcIIjJX5xMA1qavI58zyPhCLx13ASjqWik10oUNzJZxPX22wxc4zWbPLdGhAMg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-zendesk/-/node-zendesk-2.2.0.tgz", + "integrity": "sha512-A1BCHrE2JAfKmFFI1j6A6cLd9MH5prsz29DsiMigaMbHP0M8CuLqwl3PhIABwY1iQyApqRlMXy8z+d6ITUJclA==", "dependencies": { "async": "3.2.x", - "nconf": "0.11.0", + "nconf": "0.12.0", "querystring": "0.2.x", "request": "2.88.2" } @@ -8893,6 +9166,11 @@ "node": ">=0.10.0" } }, + "node_modules/nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + }, "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -9238,6 +9516,11 @@ "node": ">=0.10.0" } }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, "node_modules/parseqs": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", @@ -10720,6 +11003,17 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/scheduler": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", @@ -11432,6 +11726,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, "node_modules/table": { "version": "6.8.0", "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", @@ -11689,7 +11988,26 @@ "node": ">=0.8" } }, - "node_modules/tough-cookie/node_modules/punycode": { + "node_modules/tough-cookie/node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/tr46/node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", @@ -12007,6 +12325,25 @@ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", "dev": true }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", + "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/watchpack": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", @@ -12019,6 +12356,14 @@ "node": ">=10.13.0" } }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, "node_modules/webpack": { "version": "5.41.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.41.0.tgz", @@ -12232,6 +12577,48 @@ "node": ">=6" } }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz", + "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -12354,7 +12741,6 @@ "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, "engines": { "node": ">=0.10.0" } @@ -12438,6 +12824,14 @@ "ultron": "1.0.x" } }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "engines": { + "node": ">=12" + } + }, "node_modules/xmlbuilder": { "version": "8.2.2", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz", @@ -12446,6 +12840,11 @@ "node": ">=4.0" } }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, "node_modules/xmlhttprequest-ssl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", @@ -14254,6 +14653,11 @@ "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.0.0.tgz", "integrity": "sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q==" }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==" + }, "@types/component-emitter": { "version": "1.2.11", "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", @@ -14770,6 +15174,11 @@ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, + "abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" + }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -14782,8 +15191,16 @@ "acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } }, "acorn-jsx": { "version": "5.3.2", @@ -14792,6 +15209,19 @@ "dev": true, "requires": {} }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -15335,6 +15765,11 @@ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -16039,6 +16474,26 @@ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" }, + "cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "requires": { + "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==" + } + } + }, "csstype": { "version": "3.0.11", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", @@ -16133,6 +16588,27 @@ "assert-plus": "^1.0.0" } }, + "data-urls": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "requires": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + } + } + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -16146,6 +16622,11 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, + "decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" + }, "decompress-response": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", @@ -16162,8 +16643,7 @@ "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "define-properties": { "version": "1.1.3", @@ -16278,6 +16758,14 @@ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, + "domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "requires": { + "webidl-conversions": "^7.0.0" + } + }, "dompurify": { "version": "2.2.6", "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.2.6.tgz", @@ -16523,6 +17011,61 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, "eslint": { "version": "7.32.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", @@ -16900,57 +17443,6 @@ "dev": true, "requires": {} }, - "eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", - "dev": true, - "peer": true, - "requires": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "peer": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "peer": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true, - "peer": true - } - } - }, "eslint-plugin-jsdoc": { "version": "37.0.3", "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-37.0.3.tgz", @@ -17152,8 +17644,7 @@ "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 + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { "version": "1.4.0", @@ -17321,8 +17812,7 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "fast-xml-parser": { "version": "3.19.0", @@ -17525,12 +18015,6 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -17856,6 +18340,14 @@ "parse-passwd": "^1.0.0" } }, + "html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "requires": { + "whatwg-encoding": "^2.0.0" + } + }, "html-entities": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", @@ -17896,6 +18388,16 @@ "requires-port": "^1.0.0" } }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, "http-proxy-middleware": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.0.5.tgz", @@ -17929,6 +18431,15 @@ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, "human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -18203,6 +18714,11 @@ "isobject": "^3.0.1" } }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, "is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -18338,6 +18854,83 @@ "integrity": "sha512-2a6eRxSxp1BW040hFvaJxhsCMI9lT8QB8t14t+NY5tC5rckIR0U9cr2tjOeaFirmEOy6MHvmJnY7zTBHq431Lw==", "dev": true }, + "jsdom": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz", + "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==", + "requires": { + "abab": "^2.0.5", + "acorn": "^8.5.0", + "acorn-globals": "^6.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.1", + "decimal.js": "^10.3.1", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^3.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^10.0.0", + "ws": "^8.2.3", + "xml-name-validator": "^4.0.0" + }, + "dependencies": { + "acorn": { + "version": "8.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==" + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "ws": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz", + "integrity": "sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==", + "requires": {} + } + } + }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -18979,20 +19572,20 @@ "dev": true }, "nconf": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.11.0.tgz", - "integrity": "sha512-c4W7QqYF6p5BC7J/eVTOvtUlQgvS5CgbJ11xgjhSr8yyius7km7xgdIYHkFLR4TWY1HjsFkia/3l5OprGqCHvA==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.12.0.tgz", + "integrity": "sha512-T3fZPw3c7Dfrz8JBQEbEcZJ2s8f7cUMpKuyBtsGQe0b71pcXx6gNh4oti2xh5dxB+gO9ufNfISBlGvvWtfyMcA==", "requires": { - "async": "^1.4.0", - "ini": "^1.3.0", + "async": "^3.0.0", + "ini": "^2.0.0", "secure-keys": "^1.0.0", "yargs": "^16.1.1" }, "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" } } }, @@ -19100,12 +19693,12 @@ "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==" }, "node-zendesk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-zendesk/-/node-zendesk-2.1.0.tgz", - "integrity": "sha512-vMdk3hrN/mTu5MziyZupn8jeTcIIjJX5xMA1qavI58zyPhCLx13ASjqWik10oUNzJZxPX22wxc4zWbPLdGhAMg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-zendesk/-/node-zendesk-2.2.0.tgz", + "integrity": "sha512-A1BCHrE2JAfKmFFI1j6A6cLd9MH5prsz29DsiMigaMbHP0M8CuLqwl3PhIABwY1iQyApqRlMXy8z+d6ITUJclA==", "requires": { "async": "3.2.x", - "nconf": "0.11.0", + "nconf": "0.12.0", "querystring": "0.2.x", "request": "2.88.2" } @@ -19153,6 +19746,11 @@ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -19407,6 +20005,11 @@ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, "parseqs": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", @@ -20515,6 +21118,14 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "requires": { + "xmlchars": "^2.2.0" + } + }, "scheduler": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", @@ -21084,6 +21695,11 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, "table": { "version": "6.8.0", "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", @@ -21295,6 +21911,21 @@ } } }, + "tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "requires": { + "punycode": "^2.1.1" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } + } + }, "triple-beam": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", @@ -21549,6 +22180,22 @@ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", "dev": true }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", + "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", + "requires": { + "xml-name-validator": "^4.0.0" + } + }, "watchpack": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", @@ -21558,6 +22205,11 @@ "graceful-fs": "^4.1.2" } }, + "webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" + }, "webpack": { "version": "5.41.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.41.0.tgz", @@ -21704,6 +22356,38 @@ } } }, + "whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "requires": { + "iconv-lite": "0.6.3" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==" + }, + "whatwg-url": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz", + "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==", + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -21805,8 +22489,7 @@ "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 + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, "worker-loader": { "version": "3.0.8", @@ -21864,11 +22547,21 @@ "ultron": "1.0.x" } }, + "xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==" + }, "xmlbuilder": { "version": "8.2.2", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz", "integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=" }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, "xmlhttprequest-ssl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", diff --git a/src/fireedge/package.json b/src/fireedge/package.json index af572b26e55..f4b0c126ddb 100644 --- a/src/fireedge/package.json +++ b/src/fireedge/package.json @@ -89,6 +89,7 @@ "iconoir-react": "4.7.1", "immutable": "4.0.0-rc.12", "intersection-observer": "0.11.0", + "jsdom": "19.0.0", "jsonschema": "1.2.7", "jsonwebtoken": "8.5.1", "jwt-simple": "0.5.6", @@ -97,7 +98,7 @@ "marked": "4.0.10", "morgan": "1.10.0", "multer": "1.4.3", - "node-zendesk": "2.1.0", + "node-zendesk": "2.2.0", "notistack": "2.0.3", "opennebula-guacamole": "1.0.0", "opennebula-wmks": "2.1.4", diff --git a/src/fireedge/src/server/index.js b/src/fireedge/src/server/index.js index 79267f1a123..8cdda2b496f 100644 --- a/src/fireedge/src/server/index.js +++ b/src/fireedge/src/server/index.js @@ -51,6 +51,8 @@ import { validateServerIsSecure, } from './utils/server' +const appConfig = getFireedgeConfig() + // set paths genPathResources() @@ -58,7 +60,7 @@ genPathResources() genFireedgeKey() // set logger -initLogger() +initLogger(appConfig.debug_level) // destructure imports const unsecureServer = http.createServer @@ -70,7 +72,6 @@ const basename = defaultAppName ? `/${defaultAppName}` : '' let frontPath = 'client' // settings -const appConfig = getFireedgeConfig() const host = appConfig.host || defaultHost const port = appConfig.port || defaultPort diff --git a/src/fireedge/src/server/routes/api/index.js b/src/fireedge/src/server/routes/api/index.js index 25072b1ce06..471f4315157 100644 --- a/src/fireedge/src/server/routes/api/index.js +++ b/src/fireedge/src/server/routes/api/index.js @@ -22,8 +22,15 @@ const { defaultTmpPath, } = require('server/utils/constants/defaults') const { writeInLogger } = require('server/utils/logger') +const { getSunstoneConfig } = require('server/utils/yml') -const upload = multer({ dest: defaultTmpPath }) +const appConfig = getSunstoneConfig() +const optsMulter = { dest: appConfig.tmpdir || defaultTmpPath } +if (appConfig && appConfig.max_upload_file_size) { + optsMulter.limits = { fileSize: appConfig.max_upload_file_size } +} + +const upload = multer(optsMulter) const routes = [ '2fa', @@ -37,6 +44,7 @@ const routes = [ 'oneprovision', 'sunstone', 'system', + 'support', ] const serverRoutes = [] diff --git a/src/fireedge/src/server/routes/api/oneprovision/utils.js b/src/fireedge/src/server/routes/api/oneprovision/utils.js index 4cdbcc37651..d9ad7b8aa8b 100644 --- a/src/fireedge/src/server/routes/api/oneprovision/utils.js +++ b/src/fireedge/src/server/routes/api/oneprovision/utils.js @@ -268,7 +268,7 @@ const getEndpoint = () => { const getSpecificConfig = (key) => { if (!key) return '' - const provisionConfig = getProvisionConfig({ includeProtectedConfig: true }) + const provisionConfig = getProvisionConfig() if (Object.hasOwnProperty.call(provisionConfig, key)) { return provisionConfig[key] } diff --git a/src/fireedge/src/server/routes/api/sunstone/functions.js b/src/fireedge/src/server/routes/api/sunstone/functions.js index cbb42ce4887..eaad5f0f683 100644 --- a/src/fireedge/src/server/routes/api/sunstone/functions.js +++ b/src/fireedge/src/server/routes/api/sunstone/functions.js @@ -165,6 +165,7 @@ const getConfig = ( let error const config = getSunstoneConfig({ + includeProtectedConfig: false, onError: (err) => (error = err), }) diff --git a/src/fireedge/src/server/routes/api/support/functions.js b/src/fireedge/src/server/routes/api/support/functions.js new file mode 100644 index 00000000000..668ab6ff952 --- /dev/null +++ b/src/fireedge/src/server/routes/api/support/functions.js @@ -0,0 +1,178 @@ +/* ------------------------------------------------------------------------- * + * Copyright 2002-2022, OpenNebula Project, OpenNebula Systems * + * * + * Licensed under the Apache License, Version 2.0 (the "License"); you may * + * not use this file except in compliance with the License. You may obtain * + * a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, software * + * distributed under the License is distributed on an "AS IS" BASIS, * + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * + * See the License for the specific language governing permissions and * + * limitations under the License. * + * ------------------------------------------------------------------------- */ +const btoa = require('btoa') +const { JSDOM } = require('jsdom') +// eslint-disable-next-line node/no-deprecated-api +const { parse } = require('url') +const { defaults, httpCodes } = require('server/utils/constants') +const { httpResponse, executeRequest } = require('server/utils/server') +const { getSunstoneConfig } = require('server/utils/yml') + +const { + defaultEmptyFunction, + httpMethod, + defaultEnterpriseRepo, + defaultComunityRepo, +} = defaults +const { ok, badRequest } = httpCodes +const { GET } = httpMethod + +const appConfig = getSunstoneConfig() + +const headerUserAgent = { + 'User-Agent': 'OpenNebula Subscription Validation', +} + +/** + * Get element by xpath. + * + * @param {string} path - xpath + * @param {object} document - document + * @returns {Array} result + */ +const getElementByXpath = (path = '', document = {}) => { + const results = [] + const query = document?.evaluate(path, document, null, 7, null) + for (let i = 0, length = query?.snapshotLength; i < length; ++i) { + results.push(query?.snapshotItem?.(i)) + } + + return results +} + +/** + * Check if the instance has enterprise support. + * + * @param {object} res - http response + * @param {Function} next - express stepper + */ +const checkSupport = (res = {}, next = defaultEmptyFunction) => { + const responser = (data = '', code = badRequest) => { + res.locals.httpCode = httpResponse(code, data, '') + next() + } + + if (!(appConfig && appConfig.token_remote_support)) { + responser('empty/null token') + + return + } + + executeRequest( + { + params: { + url: defaultEnterpriseRepo, + method: GET, + headers: { + Authorization: `Basic ${btoa(appConfig.token_remote_support)}`, + ...headerUserAgent, + }, + }, + }, + { + success: (data) => { + data ? responser('', ok) : responser('') + }, + error: (error) => responser(error && error.message), + } + ) +} + +/** + * Return latest available version. + * + * @param {object} res - http response + * @param {Function} next - express stepper + */ +const versionSupport = (res = {}, next = defaultEmptyFunction) => { + const responser = (data = '', code = badRequest) => { + res.locals.httpCode = httpResponse(code, data, '') + next() + } + + let params = { + url: defaultComunityRepo, + headers: headerUserAgent, + } + + if (appConfig && appConfig.token_remote_support) { + params = { + url: defaultEnterpriseRepo, + headers: { + Authorization: `Basic ${btoa(appConfig.token_remote_support)}`, + ...headerUserAgent, + }, + } + } + + if (appConfig && appConfig.proxy) { + const parseUrl = parse(appConfig.proxy) + params.proxy = {} + parseUrl.protocol && (params.proxy.protocol = parseUrl.protocol) + parseUrl.host && (params.proxy.host = parseUrl.host) + parseUrl.port && (params.proxy.port = parseUrl.port) + } + + executeRequest( + { + params: { + method: GET, + ...params, + }, + }, + { + success: (data) => { + if (!data) { + responser('') + + return + } + const dataDom = new JSDOM(data) + const versions = getElementByXpath( + '//table/tbody/tr/td/a/text()', + dataDom?.window?.document + ) + + const parsedVersions = versions + .map((element) => element?.textContent?.replace('/', '')) + .filter((element) => { + if (!element?.match?.(/^(\d+\.)?(\d+\.)?(\*|\d+\.)?(\*|\d+)$/gm)) { + return false + } + const splitVersion = element.split('.') + + return splitVersion && splitVersion[1] && !(splitVersion[1] % 2) + }) + .reduce((a, b) => + a.localeCompare(b, undefined, { + numeric: true, + sensitivity: 'base', + }) > 0 + ? a + : b + ) + + responser(parsedVersions, ok) + }, + error: (error) => responser(error && error.message), + } + ) +} + +module.exports = { + checkSupport, + versionSupport, +} diff --git a/src/fireedge/src/server/routes/api/support/index.js b/src/fireedge/src/server/routes/api/support/index.js new file mode 100644 index 00000000000..9201f3a68f3 --- /dev/null +++ b/src/fireedge/src/server/routes/api/support/index.js @@ -0,0 +1,34 @@ +/* ------------------------------------------------------------------------- * + * Copyright 2002-2022, OpenNebula Project, OpenNebula Systems * + * * + * Licensed under the Apache License, Version 2.0 (the "License"); you may * + * not use this file except in compliance with the License. You may obtain * + * a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, software * + * distributed under the License is distributed on an "AS IS" BASIS, * + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * + * See the License for the specific language governing permissions and * + * limitations under the License. * + * ------------------------------------------------------------------------- */ + +const { Actions, Commands } = require('server/routes/api/support/routes') +const { + checkSupport, + versionSupport, +} = require('server/routes/api/support/functions') + +const { SUPPORT_CHECK, SUPPORT_VERSION } = Actions + +module.exports = [ + { + ...Commands[SUPPORT_CHECK], + action: checkSupport, + }, + { + ...Commands[SUPPORT_VERSION], + action: versionSupport, + }, +] diff --git a/src/fireedge/src/server/routes/api/support/routes.js b/src/fireedge/src/server/routes/api/support/routes.js new file mode 100644 index 00000000000..c27ba544cd0 --- /dev/null +++ b/src/fireedge/src/server/routes/api/support/routes.js @@ -0,0 +1,43 @@ +/* ------------------------------------------------------------------------- * + * Copyright 2002-2022, OpenNebula Project, OpenNebula Systems * + * * + * Licensed under the Apache License, Version 2.0 (the "License"); you may * + * not use this file except in compliance with the License. You may obtain * + * a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, software * + * distributed under the License is distributed on an "AS IS" BASIS, * + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * + * See the License for the specific language governing permissions and * + * limitations under the License. * + * ------------------------------------------------------------------------- */ + +const { httpMethod } = require('server/utils/constants/defaults') + +const basepath = '/support' +const { GET } = httpMethod + +const SUPPORT_CHECK = 'support.check' +const SUPPORT_VERSION = 'support.version' +const Actions = { + SUPPORT_CHECK, + SUPPORT_VERSION, +} + +module.exports = { + Actions, + Commands: { + [SUPPORT_VERSION]: { + path: `${basepath}/check/version`, + httpMethod: GET, + auth: true, + }, + [SUPPORT_CHECK]: { + path: `${basepath}/check`, + httpMethod: GET, + auth: true, + }, + }, +} diff --git a/src/fireedge/src/server/routes/api/vcenter/functions.js b/src/fireedge/src/server/routes/api/vcenter/functions.js index b61a0c9d2fc..545a41c8e14 100644 --- a/src/fireedge/src/server/routes/api/vcenter/functions.js +++ b/src/fireedge/src/server/routes/api/vcenter/functions.js @@ -14,10 +14,8 @@ * limitations under the License. * * ------------------------------------------------------------------------- */ const btoa = require('btoa') -const https = require('https') // eslint-disable-next-line node/no-deprecated-api const { parse } = require('url') -const { request: axios } = require('axios') const { defaults, httpCodes } = require('server/utils/constants') const { @@ -26,6 +24,7 @@ const { executeCommandAsync, publish, getSunstoneAuth, + executeRequest, } = require('server/utils/server') const { consoleParseToString, @@ -47,7 +46,6 @@ const { } = require('server/utils/constants/commands/cluster') const { - httpMethod, defaultEmptyFunction, defaultCommandVcenter, defaultRegexpStartJSON, @@ -55,7 +53,6 @@ const { defaultRegexpSplitLine, defaultRegexID, } = defaults -const { POST } = httpMethod const { ok, unauthorized, internalServerError, badRequest, accepted } = httpCodes const { LIST, IMPORT } = resourceFromData @@ -503,29 +500,6 @@ const importVobject = ( httpReturn(accepted) } -/** - * Axios request. - * - * @param {object} params - Axios params - * @param {Function} callback - Success Axios callback - * @param {Function} error - Error Axios callback - */ -const request = ( - params = {}, - callback = defaultEmptyFunction, - error = defaultEmptyFunction -) => { - const defaultsProperties = { - method: POST, - httpsAgent: new https.Agent({ rejectUnauthorized: false }), - validateStatus: (status) => status >= 200 && status < 400, - } - - axios({ ...defaultsProperties, ...params }) - .then(({ data } = {}) => callback(data)) - .catch(error) -} - /** * Get system config. * @@ -606,44 +580,56 @@ const getToken = ( responser(hostInfoError, unauthorized) } - request( + executeRequest( { - url: `https://${VCENTER_HOST}/api/session`, - headers: { - Authorization: `Basic ${btoa( - `${VCENTER_USER}:${VCENTER_PASSWORD}` - )}`, + params: { + url: `https://${VCENTER_HOST}/api/session`, + headers: { + Authorization: `Basic ${btoa( + `${VCENTER_USER}:${VCENTER_PASSWORD}` + )}`, + }, }, + agent: 'https', }, - (sessionId) => { - const vmIdFromDeployId = - VM.DEPLOY_ID.match(regexGetVcenterId).groups.id - - request( - { - url: `https://${VCENTER_HOST}/api/vcenter/vm/vm-${vmIdFromDeployId}/console/tickets`, - headers: { - 'Content-Type': 'application/json', - 'vmware-api-session-id': sessionId, + { + success: (sessionId) => { + const vmIdFromDeployId = + VM.DEPLOY_ID.match(regexGetVcenterId).groups.id + + executeRequest( + { + params: { + url: `https://${VCENTER_HOST}/api/vcenter/vm/vm-${vmIdFromDeployId}/console/tickets`, + headers: { + 'Content-Type': 'application/json', + 'vmware-api-session-id': sessionId, + }, + data: JSON.stringify({ type: 'WEBMKS' }), + }, + agent: 'https', }, - data: JSON.stringify({ type: 'WEBMKS' }), - }, - (ticketData) => { - const { ticket } = ticketData - const { protocol, hostname, port, path } = parse(ticket) - - const httpProtocol = protocol === 'wss:' ? 'https' : 'http' - const esxUrl = `${httpProtocol}://${hostname}:${port}` - const token = path.replace('/ticket/', '') - global.vcenterToken = { [token]: esxUrl } - - responser(token, ok) - }, - (error) => - responser(error && error.message, internalServerError) - ) - }, - (error) => responser(error && error.message, internalServerError) + { + success: (ticketData) => { + const { ticket } = ticketData + const { protocol, hostname, port, path } = parse(ticket) + + const httpProtocol = + protocol === 'wss:' ? 'https' : 'http' + const esxUrl = `${httpProtocol}://${hostname}:${port}` + const token = path.replace('/ticket/', '') + global.vcenterToken = { [token]: esxUrl } + + responser(token, ok) + }, + error: (error) => + responser(error && error.message, internalServerError), + } + ) + }, + error: (error) => + responser(error && error.message, internalServerError), + } ) }, }) diff --git a/src/fireedge/src/server/routes/entrypoints/Api/middlawares.js b/src/fireedge/src/server/routes/entrypoints/Api/middlawares.js index 1b1cacdf4ac..f065636dd1a 100644 --- a/src/fireedge/src/server/routes/entrypoints/Api/middlawares.js +++ b/src/fireedge/src/server/routes/entrypoints/Api/middlawares.js @@ -149,6 +149,9 @@ const getZone = (zone = '0') => { defaultOpennebulaZones[0].rpc ) { defaultOpennebulaZones[0].rpc = appConfig.one_xmlrpc + if (appConfig.subscriber_endpoint) { + defaultOpennebulaZones[0].zeromq = appConfig.subscriber_endpoint + } } return getDataZone(zone, defaultOpennebulaZones) diff --git a/src/fireedge/src/server/routes/entrypoints/Api/xmlrpc.js b/src/fireedge/src/server/routes/entrypoints/Api/xmlrpc.js index 670f32a3c70..a28430a5a16 100644 --- a/src/fireedge/src/server/routes/entrypoints/Api/xmlrpc.js +++ b/src/fireedge/src/server/routes/entrypoints/Api/xmlrpc.js @@ -65,7 +65,10 @@ const executeWorker = ({ worker.terminate() const err = result && result.data && result.data.err const value = result && result.data && result.data.value - writeInLogger([command, JSON.stringify(value)], 'worker: %s : %s') + writeInLogger([command, paramsCommand, JSON.stringify(value)], { + format: 'worker: %s, [%s]: %s', + level: 2, + }) if (!err) { fillResourceforHookConnection(user, command, paramsCommand) res.locals.httpCode = parseReturnWorker(value) diff --git a/src/fireedge/src/server/routes/entrypoints/App.js b/src/fireedge/src/server/routes/entrypoints/App.js index 3249d49a126..b6ca582bf2a 100644 --- a/src/fireedge/src/server/routes/entrypoints/App.js +++ b/src/fireedge/src/server/routes/entrypoints/App.js @@ -35,7 +35,8 @@ const APP_NAMES = Object.keys(defaultApps) const APP_CONFIG = { [defaultApps.provision.name]: getProvisionConfig() || {}, - [defaultApps.sunstone.name]: getSunstoneConfig() || {}, + [defaultApps.sunstone.name]: + getSunstoneConfig({ includeProtectedConfig: false }) || {}, } const ensuredScriptValue = (value) => diff --git a/src/fireedge/src/server/routes/websockets/guacamole.js b/src/fireedge/src/server/routes/websockets/guacamole.js index fa2ea1545f8..8f3418fd67f 100644 --- a/src/fireedge/src/server/routes/websockets/guacamole.js +++ b/src/fireedge/src/server/routes/websockets/guacamole.js @@ -98,7 +98,9 @@ const guacamole = (appServer) => { clientCallbacks ) guacamoleServer.on('error', (clientConnection, error) => { - writeInLogger(error, formatError) + writeInLogger(error, { + format: formatError, + }) messageTerminal(configError(error)) }) } diff --git a/src/fireedge/src/server/routes/websockets/vmrc.js b/src/fireedge/src/server/routes/websockets/vmrc.js index 6d962a9f25c..85af19ed6b9 100644 --- a/src/fireedge/src/server/routes/websockets/vmrc.js +++ b/src/fireedge/src/server/routes/websockets/vmrc.js @@ -53,11 +53,17 @@ const vmrcProxy = createProxyMiddleware(endpointVmrc, { const parseURL = parse(req.url) if (parseURL && parseURL.pathname) { const ticket = parseURL.pathname.split('/')[3] - writeInLogger(ticket, 'path to vmrc token: %s') + writeInLogger(ticket, { + format: 'path to vmrc token: %s', + level: 2, + }) if (global && global.vcenterToken && global.vcenterToken[ticket]) { return global.vcenterToken[ticket] } else { - writeInLogger(ticket, 'Non-existent token: %s') + writeInLogger(ticket, { + format: 'Non-existent token: %s', + level: 2, + }) } } } diff --git a/src/fireedge/src/server/utils/constants/defaults.js b/src/fireedge/src/server/utils/constants/defaults.js index 342a64c566b..6f45479e2b9 100644 --- a/src/fireedge/src/server/utils/constants/defaults.js +++ b/src/fireedge/src/server/utils/constants/defaults.js @@ -93,13 +93,14 @@ const defaults = { query: 'QUERY', postBody: 'POST_BODY', }, + defaultEnterpriseRepo: 'https://enterprise.opennebula.io/repo/', + defaultComunityRepo: 'https://downloads.opennebula.io/repo/', defaultDownloader: 'remotes/datastore/downloader.sh', defaultOpennebulaZones: [ { id: '0', name: 'OpenNebula', rpc: `${protocol}://${defaultIp}:2633/RPC2`, - zeromq: `tcp://${defaultIp}:2101`, }, ], defaultConfigParseXML: { @@ -125,6 +126,7 @@ const defaults = { defaultSunstonePath: internalSunstonePath, defaultProvisionPath: internalProvisionPath, defaultProvidersConfigPath: 'providers.d', + defaultLogsLevels: ['error', 'warm', 'info', 'http', 'verbose', 'debug'], defaultTypeLog: 'prod', defaultWebpackMode: 'development', defaultProductionWebpackMode: 'production', diff --git a/src/fireedge/src/server/utils/logger.js b/src/fireedge/src/server/utils/logger.js index 38dfb2ac5ee..78f5363beda 100644 --- a/src/fireedge/src/server/utils/logger.js +++ b/src/fireedge/src/server/utils/logger.js @@ -20,15 +20,20 @@ const { transports, format, createLogger } = require('winston') const { sprintf } = require('sprintf-js') const morgan = require('morgan') const { defaults } = require('server/utils/constants') -const { defaultWebpackMode } = defaults +const { defaultWebpackMode, defaultLogsLevels } = defaults let logger = null /** * Initialize logger. + * + * @param {number} logLevel - log level */ -const initLogger = () => { +const initLogger = (logLevel = 0) => { if (global && global.paths && global.paths.FIREEDGE_LOG) { + const levelString = parseInt(logLevel, 10) + const logString = defaultLogsLevels && defaultLogsLevels[levelString] + const trans = [] if (env && env.NODE_ENV && env.NODE_ENV === defaultWebpackMode) { @@ -41,7 +46,7 @@ const initLogger = () => { trans.push( new transports.File({ silent: false, - level: 'info', + level: logString, filename: global.paths.FIREEDGE_LOG, handleExceptions: true, format: format.simple(), @@ -86,7 +91,12 @@ const getLogger = () => logger const getLoggerMiddleware = () => { const log = getLogger() if (log && log.stream) { - return morgan('combined', { stream: log.stream }) + return morgan('combined', { + stream: log.stream, + skip: function (req, res) { + return res.statusCode < 400 + }, + }) } } @@ -94,13 +104,17 @@ const getLoggerMiddleware = () => { * Write in logger. * * @param {string} message - message for logger file - * @param {string } formatLog - message format + * @param {object} optLog - message format + * @param {string} optLog.format - Message format. By default is '%s' + * @param {number} optLog.level - Log debug level. By default is 0 */ -const writeInLogger = (message = '', formatLog = '%s') => { +const writeInLogger = (message = '', optLog = {}) => { + const { format: formatLogger = '%s', level = 0 } = optLog + const logString = defaultLogsLevels && defaultLogsLevels[level] const log = getLogger() if (log) { const parseMessage = Array.isArray(message) ? message : [message] - log.info(sprintf(formatLog, ...parseMessage)) + log[logString](sprintf(formatLogger, ...parseMessage)) } } diff --git a/src/fireedge/src/server/utils/server.js b/src/fireedge/src/server/utils/server.js index 3628f834aad..f02e4764182 100644 --- a/src/fireedge/src/server/utils/server.js +++ b/src/fireedge/src/server/utils/server.js @@ -14,6 +14,8 @@ * limitations under the License. * * ------------------------------------------------------------------------- */ +const https = require('https') +const http = require('http') const { env } = require('process') const { Map } = require('immutable') const { global } = require('window-or-global') @@ -41,6 +43,7 @@ const { defaults, httpCodes } = require('server/utils/constants') const { messageTerminal } = require('server/utils/general') const { validateAuth } = require('server/utils/jwt') const { writeInLogger } = require('server/utils/logger') +const { request: axios } = require('axios') const eventsEmitter = new events.EventEmitter() const { @@ -58,7 +61,6 @@ const { defaultKeyFilename, defaultSunstoneAuth, defaultWebpackMode, - defaultOpennebulaZones, defaultEtcPath, defaultTypeCrypto, defaultHash, @@ -71,6 +73,7 @@ const { defaultEmptyFunction, } = defaults const { internalServerError } = httpCodes +const { POST } = httpMethod let cert = '' let key = '' @@ -392,10 +395,14 @@ const genFireedgeKey = () => { global.paths.FIREEDGE_KEY_PATH, uuidv4.replace(/-/g, ''), () => { - writeInLogger(`file ${global.paths.FIREEDGE_KEY_PATH} created`) + const formatError = 'file %s created' + writeInLogger(global.paths.FIREEDGE_KEY_PATH, { + format: formatError, + level: 2, + }) messageTerminal({ color: 'green', - message: 'File %s created', + message: formatError, error: global.paths.FIREEDGE_KEY_PATH, }) }, @@ -482,8 +489,7 @@ const getSunstoneAuth = () => { */ const getDataZone = (zone = '0', configuredZones) => { let rtn - const zones = - (global && global.zones) || configuredZones || defaultOpennebulaZones + const zones = (global && global.zones) || configuredZones if (zones && Array.isArray(zones)) { rtn = zones[0] if (Number.isInteger(parseInt(zone, 10))) { @@ -527,6 +533,9 @@ const genPathResources = () => { if (!global.paths.FIREEDGE_LOG) { global.paths.FIREEDGE_LOG = `${LOG_LOCATION}/${defaultLogFilename}` } + if (!global.paths.FIREEDGE_LOG_LEVEL) { + global.paths.FIREEDGE_LOG = `${LOG_LOCATION}/${defaultLogFilename}` + } if (!global.paths.DOWNLOADER) { global.paths.DOWNLOADER = `${VAR_LOCATION}/${defaultDownloader}` } @@ -931,6 +940,37 @@ const subscriber = (eventName = '', callback = () => undefined) => { } } +/** + * Axios request. + * + * @param {object} data - data for request + * @param {object} data.params - params for request + * @param {string} data.method - request method + * @param {string} data.agent - request agent + * @param {object} callbacks - callbacks + * @param {Function} callbacks.success - success callback + * @param {Function} callbacks.error - error callback + */ +const executeRequest = (data = {}, callbacks = {}) => { + const { params = {}, method = POST, agent } = data + const { success = defaultEmptyFunction, error = defaultEmptyFunction } = + callbacks + const defaultsProperties = agent + ? { + method, + httpsAgent: + agent === 'https' + ? new https.Agent({ rejectUnauthorized: false }) + : new http.Agent({ rejectUnauthorized: false }), + validateStatus: (status) => status >= 200 && status < 400, + } + : {} + + axios({ ...defaultsProperties, ...params }) + .then(({ data: dataRequest } = {}) => success(dataRequest)) + .catch(error) +} + module.exports = { encrypt, decrypt, @@ -963,4 +1003,5 @@ module.exports = { validateHttpMethod, publish, subscriber, + executeRequest, } diff --git a/src/fireedge/src/server/utils/yml.js b/src/fireedge/src/server/utils/yml.js index 92852d4313c..a24f49eb0ec 100644 --- a/src/fireedge/src/server/utils/yml.js +++ b/src/fireedge/src/server/utils/yml.js @@ -94,7 +94,7 @@ const filterByProtectedKeys = (config = {}, keys = []) => /** * @typedef GetConfigurationOptions * @property {function(string)} [onError] - Function to be called when an error - * @property {boolean} [includeProtectedConfig] - Include protected config + * @property {boolean} [includeProtectedConfig] - Include protected config. By default is true. */ /** @@ -106,7 +106,7 @@ const filterByProtectedKeys = (config = {}, keys = []) => */ const getConfiguration = ( app = defaultAppName, - { onError = defaultEmptyFunction, includeProtectedConfig = false } = {} + { onError = defaultEmptyFunction, includeProtectedConfig = true } = {} ) => { const config = readYAMLFile(getConfigPathByApp(app), onError) @@ -123,8 +123,7 @@ const getConfiguration = ( * @param {GetConfigurationOptions} [options] - Options * @returns {object} FireEdge configuration */ -const getFireedgeConfig = (options) => - getConfiguration(defaultAppName, { includeProtectedConfig: true, ...options }) +const getFireedgeConfig = (options) => getConfiguration(defaultAppName, options) /** * Get Sunstone configuration.