diff --git a/src/fireedge/package-lock.json b/src/fireedge/package-lock.json index e609fcee0c..33534e1d0d 100644 --- a/src/fireedge/package-lock.json +++ b/src/fireedge/package-lock.json @@ -85,6 +85,7 @@ "socket.io-client": "4.1.2", "speakeasy": "2.0.0", "sprintf-js": "1.1.2", + "terser-webpack-plugin": "^5.1.4", "time-fix-plugin": "2.0.7", "tiny-worker": "2.3.0", "upcast": "4.0.0", @@ -96,7 +97,6 @@ "window-or-global": "1.0.1", "winston": "3.3.3", "worker-loader": "3.0.8", - "xml2js": "0.4.23", "xmlrpc": "1.3.2", "yaml": "1.10.0", "yup": "0.32.9", @@ -204,11 +204,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.8.tgz", - "integrity": "sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz", + "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==", "dependencies": { - "@babel/types": "^7.14.8", + "@babel/types": "^7.14.5", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -265,13 +265,13 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.8.tgz", - "integrity": "sha512-bpYvH8zJBWzeqi1o+co8qOrw+EXzQ/0c74gVmY205AWXy9nifHrOg77y+1zwxX5lXE7Icq4sPlSQ4O2kWBrteQ==", + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz", + "integrity": "sha512-Z6gsfGofTxH/+LQXqYEK45kxmcensbzmk/oi8DmaQytlQCgqNZt9XQF8iqlI/SeXWVjaMNxvYvzaYw+kh42mDg==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.14.5", "@babel/helper-function-name": "^7.14.5", - "@babel/helper-member-expression-to-functions": "^7.14.7", + "@babel/helper-member-expression-to-functions": "^7.14.5", "@babel/helper-optimise-call-expression": "^7.14.5", "@babel/helper-replace-supers": "^7.14.5", "@babel/helper-split-export-declaration": "^7.14.5" @@ -367,18 +367,18 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.8.tgz", - "integrity": "sha512-RyE+NFOjXn5A9YU1dkpeBaduagTlZ0+fccnIcAGbv1KGUlReBj7utF7oEth8IdIBQPcux0DDgW5MFBH2xu9KcA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz", + "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==", "dependencies": { "@babel/helper-module-imports": "^7.14.5", "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-simple-access": "^7.14.8", + "@babel/helper-simple-access": "^7.14.5", "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.8", + "@babel/helper-validator-identifier": "^7.14.5", "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.8", - "@babel/types": "^7.14.8" + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -431,11 +431,11 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", - "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz", + "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==", "dependencies": { - "@babel/types": "^7.14.8" + "@babel/types": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -464,9 +464,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", - "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", "engines": { "node": ">=6.9.0" } @@ -494,13 +494,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.8.tgz", - "integrity": "sha512-ZRDmI56pnV+p1dH6d+UN6GINGz7Krps3+270qqI9UJ4wxYThfAIcI5i7j5vXC4FJ3Wap+S9qcebxeYiqn87DZw==", + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.6.tgz", + "integrity": "sha512-yesp1ENQBiLI+iYHSJdoZKUtRpfTlL1grDIX9NRlAVppljLw/4tTyYupIB7uIYmC3stW/imAv8EqaKaS/ibmeA==", "dependencies": { "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.8", - "@babel/types": "^7.14.8" + "@babel/traverse": "^7.14.5", + "@babel/types": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -540,9 +540,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.8.tgz", - "integrity": "sha512-syoCQFOoo/fzkWDeM0dLEZi5xqurb5vuyzwIMNZRNun+N/9A4cUZeQaE7dTrB8jGaKuJRBtEOajtnmw0I5hvvA==", + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.7.tgz", + "integrity": "sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1543,9 +1543,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz", - "integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==", + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz", + "integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==", "dependencies": { "regenerator-runtime": "^0.13.4" }, @@ -1567,17 +1567,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.8.tgz", - "integrity": "sha512-kexHhzCljJcFNn1KYAQ6A5wxMRzq9ebYpEDV4+WdNyr3i7O44tanbDOR/xjiG2F3sllan+LgwK+7OMk0EmydHg==", + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.7.tgz", + "integrity": "sha512-9vDr5NzHu27wgwejuKL7kIOm4bwEtaPQ4Z6cpCmjSuaRqpH/7xc4qcGEscwMqlkwgcXl6MvqoAjZkQ24uSdIZQ==", "dependencies": { "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.8", + "@babel/generator": "^7.14.5", "@babel/helper-function-name": "^7.14.5", "@babel/helper-hoist-variables": "^7.14.5", "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.8", - "@babel/types": "^7.14.8", + "@babel/parser": "^7.14.7", + "@babel/types": "^7.14.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1586,11 +1586,11 @@ } }, "node_modules/@babel/types": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", - "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz", + "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==", "dependencies": { - "@babel/helper-validator-identifier": "^7.14.8", + "@babel/helper-validator-identifier": "^7.14.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2057,9 +2057,9 @@ "integrity": "sha512-7eQ2xYLLI/LsicL2nejW9Wyko3lcpN6O/z0ZLHrEQsg280zIdCv1t/0m6UtBjUHokCGBQ3gYTbHzDkZ1xOBwwg==" }, "node_modules/@types/node": { - "version": "16.4.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.4.1.tgz", - "integrity": "sha512-UW7cbLqf/Wu5XH2RKKY1cHwUNLicIDRLMraYKz+HHAerJ0ZffUEk+fMnd8qU2JaS6cAy0r8tsaf7yqHASf/Y0Q==" + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.3.2.tgz", + "integrity": "sha512-jJs9ErFLP403I+hMLGnqDRWT0RYKSvArxuBVh2veudHV7ifEC1WAmjJADacZ7mRbA2nWgHtn8xyECMAot0SkAw==" }, "node_modules/@types/prop-types": { "version": "15.7.4", @@ -2067,9 +2067,9 @@ "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==" }, "node_modules/@types/react": { - "version": "17.0.15", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.15.tgz", - "integrity": "sha512-uTKHDK9STXFHLaKv6IMnwp52fm0hwU+N89w/p9grdUqcFA6WuqDyPhaWopbNyE1k/VhgzmHl8pu1L4wITtmlLw==", + "version": "17.0.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.14.tgz", + "integrity": "sha512-0WwKHUbWuQWOce61UexYuWTGuGY/8JvtUe/dtQ6lR4sZ3UiylHotJeWpf3ArP9+DSGUoLY3wbU59VyMrJps5VQ==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -3200,9 +3200,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001247", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001247.tgz", - "integrity": "sha512-4rS7co+7+AoOSPRPOPUt5/GdaqZc0EsUpWk66ofE3HJTAajUK2Ss2VwoNzVN69ghg8lYYlh0an0Iy4LIHHo9UQ==", + "version": "1.0.30001245", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001245.tgz", + "integrity": "sha512-768fM9j1PKXpOCKws6eTo3RHmvTUsG9UrpT4WoREFeZgJBTi4/X9g565azS/rVUGtqb8nt7FjLeF5u4kukERnA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/browserslist" @@ -3761,9 +3761,9 @@ } }, "node_modules/copy-webpack-plugin/node_modules/glob-parent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.1.tgz", - "integrity": "sha512-kEVjS71mQazDBHKcsq4E9u/vUzaLcw1A8EtUeydawvIWQCJM0qQ08G1H7/XTjFUulla6XQiDOG6MXSaG0HDKog==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.0.tgz", + "integrity": "sha512-Hdd4287VEJcZXUwv1l8a+vXC1GjOQqXe+VS30w/ypihpcnu9M1n3xeYeJu5CBpeEQj2nAab2xxz28GuA3vp4Ww==", "dependencies": { "is-glob": "^4.0.1" }, @@ -3772,11 +3772,11 @@ } }, "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.0.tgz", + "integrity": "sha512-tTEaeYkyIhEZ9uWgAjDerWov3T9MgX8dhhy2r0IGeeX4W8ngtGl1++dUve/RUqzuaASSh7shwCDJjEzthxki8w==", "dependencies": { - "@types/json-schema": "^7.0.8", + "@types/json-schema": "^7.0.7", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, @@ -4273,9 +4273,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "node_modules/electron-to-chromium": { - "version": "1.3.786", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.786.tgz", - "integrity": "sha512-AmvbLBj3hepRk8v/DHrFF8gINxOFfDbrn6Ts3PcK46/FBdQb5OMmpamSpZQXSkfi77FfBzYtQtAk+00LCLYMVw==" + "version": "1.3.775", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.775.tgz", + "integrity": "sha512-EGuiJW4yBPOTj2NtWGZcX93ZE8IGj33HJAx4d3ouE2zOfW2trbWU+t1e0yzLr1qQIw81++txbM3BH52QwSRE6Q==" }, "node_modules/elliptic": { "version": "6.5.4", @@ -9399,9 +9399,9 @@ } }, "node_modules/rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz", + "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==", "dependencies": { "resolve": "^1.9.0" }, @@ -9454,9 +9454,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" }, "node_modules/regenerator-transform": { "version": "0.14.5", @@ -10803,11 +10803,11 @@ } }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.0.tgz", + "integrity": "sha512-tTEaeYkyIhEZ9uWgAjDerWov3T9MgX8dhhy2r0IGeeX4W8ngtGl1++dUve/RUqzuaASSh7shwCDJjEzthxki8w==", "dependencies": { - "@types/json-schema": "^7.0.8", + "@types/json-schema": "^7.0.7", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, @@ -11484,12 +11484,12 @@ } }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.0.tgz", + "integrity": "sha512-tTEaeYkyIhEZ9uWgAjDerWov3T9MgX8dhhy2r0IGeeX4W8ngtGl1++dUve/RUqzuaASSh7shwCDJjEzthxki8w==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.8", + "@types/json-schema": "^7.0.7", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, @@ -11552,9 +11552,9 @@ "integrity": "sha512-aHdl/y2N7PW2Sx7K+r3AxpJO+aDMcYzMQd60Qxefq3+EwhewSbTBqNumOsCE1JsCUNoyfGj5465N0sSf6hc/5w==" }, "node_modules/webpack-sources": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", - "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.0.tgz", + "integrity": "sha512-WyOdtwSvOML1kbgtXbTDnEW0jkJ7hZr/bDByIwszhWd/4XX1A3XMkrbFMsuH4+/MfLlZCUzlAdg4r7jaGKEIgQ==", "dependencies": { "source-list-map": "^2.0.1", "source-map": "^0.6.1" @@ -11595,11 +11595,11 @@ } }, "node_modules/webpack/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.0.tgz", + "integrity": "sha512-tTEaeYkyIhEZ9uWgAjDerWov3T9MgX8dhhy2r0IGeeX4W8ngtGl1++dUve/RUqzuaASSh7shwCDJjEzthxki8w==", "dependencies": { - "@types/json-schema": "^7.0.8", + "@types/json-schema": "^7.0.7", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, @@ -11792,11 +11792,11 @@ } }, "node_modules/worker-loader/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.0.tgz", + "integrity": "sha512-tTEaeYkyIhEZ9uWgAjDerWov3T9MgX8dhhy2r0IGeeX4W8ngtGl1++dUve/RUqzuaASSh7shwCDJjEzthxki8w==", "dependencies": { - "@types/json-schema": "^7.0.8", + "@types/json-schema": "^7.0.7", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, @@ -11865,26 +11865,6 @@ "ultron": "1.0.x" } }, - "node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "engines": { - "node": ">=4.0" - } - }, "node_modules/xmlrpc": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/xmlrpc/-/xmlrpc-1.3.2.tgz", @@ -21091,20 +21071,6 @@ "ultron": "1.0.x" } }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" - }, "xmlrpc": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/xmlrpc/-/xmlrpc-1.3.2.tgz", diff --git a/src/fireedge/package.json b/src/fireedge/package.json index 016a8c11e1..fc5b229606 100644 --- a/src/fireedge/package.json +++ b/src/fireedge/package.json @@ -127,6 +127,7 @@ "socket.io-client": "4.1.2", "speakeasy": "2.0.0", "sprintf-js": "1.1.2", + "terser-webpack-plugin": "5.1.4", "time-fix-plugin": "2.0.7", "tiny-worker": "2.3.0", "upcast": "4.0.0", @@ -138,7 +139,6 @@ "window-or-global": "1.0.1", "winston": "3.3.3", "worker-loader": "3.0.8", - "xml2js": "0.4.23", "xmlrpc": "1.3.2", "yaml": "1.10.0", "yup": "0.32.9", diff --git a/src/fireedge/src/client/containers/Login/index.js b/src/fireedge/src/client/containers/Login/index.js index d1fe59b6e3..9781093f5e 100644 --- a/src/fireedge/src/client/containers/Login/index.js +++ b/src/fireedge/src/client/containers/Login/index.js @@ -14,17 +14,14 @@ * limitations under the License. * * ------------------------------------------------------------------------- */ /* eslint-disable jsdoc/require-jsdoc */ -import React, { useMemo, useState } from 'react' - -import { Paper, Box, Container, LinearProgress, useMediaQuery } from '@material-ui/core' - -import { useFetch } from 'client/hooks' -import { useAuth, useAuthApi } from 'client/features/Auth' - +import { Box, Container, LinearProgress, Paper, useMediaQuery } from '@material-ui/core' import { OpenNebulaLogo } from 'client/components/Icons' import Form from 'client/containers/Login/Form' import * as FORMS from 'client/containers/Login/schema' import loginStyles from 'client/containers/Login/styles' +import { useAuth, useAuthApi } from 'client/features/Auth' +import { useFetch } from 'client/hooks' +import React, { useMemo, useState } from 'react' const STEPS = { USER_FORM: 0, diff --git a/src/fireedge/src/client/features/Auth/actions.js b/src/fireedge/src/client/features/Auth/actions.js index 555e049b21..34e692462a 100644 --- a/src/fireedge/src/client/features/Auth/actions.js +++ b/src/fireedge/src/client/features/Auth/actions.js @@ -14,22 +14,20 @@ * limitations under the License. * * ------------------------------------------------------------------------- */ /* eslint-disable jsdoc/require-jsdoc */ -import { createAsyncThunk, createAction } from '@reduxjs/toolkit' - +import { createAction, createAsyncThunk } from '@reduxjs/toolkit' +import { FILTER_POOL, JWT_NAME, ONEADMIN_ID, T } from 'client/constants' import { authService } from 'client/features/Auth/services' -import { userService } from 'client/features/One/user/services' -import { getGroups } from 'client/features/One/group/actions' import { dismissSnackbar } from 'client/features/General/actions' - +import { getGroups } from 'client/features/One/group/actions' +import { userService } from 'client/features/One/user/services' +import { removeStoreData, storage } from 'client/utils' import { httpCodes } from 'server/utils/constants' -import { T, JWT_NAME, ONEADMIN_ID, FILTER_POOL } from 'client/constants' -import { storage, removeStoreData } from 'client/utils' export const login = createAsyncThunk( 'auth/login', async ({ remember, ...user }, { rejectWithValue, dispatch }) => { try { - const response = await authService.login(user) + const response = await authService.login({ ...user, remember }) const { id, token } = response const isOneAdmin = id === ONEADMIN_ID diff --git a/src/fireedge/src/server/index.js b/src/fireedge/src/server/index.js index ff9ba39576..71a9761eb5 100644 --- a/src/fireedge/src/server/index.js +++ b/src/fireedge/src/server/index.js @@ -153,17 +153,12 @@ guacamole(appServer) * Handle sigterm and sigint. */ const handleBreak = () => { - if (appServer && appServer.close && typeof appServer.close === 'function') { - appServer.close(() => { - // this close sockets - sockets.forEach((socket) => { - if (socket && socket.close && typeof socket.close === 'function') { - socket.close() - } - }) - process.exit(0) - }) - } + sockets.forEach((socket) => { + if (socket && socket.close && typeof socket.close === 'function') { + socket.close() + } + }) + process.exit(0) } defaultEvents.forEach((nameEvent = '') => { if (nameEvent) { diff --git a/src/fireedge/src/server/routes/api/auth/auth-functions.js b/src/fireedge/src/server/routes/api/auth/auth-functions.js index 87861d5ffb..c3dea7711c 100644 --- a/src/fireedge/src/server/routes/api/auth/auth-functions.js +++ b/src/fireedge/src/server/routes/api/auth/auth-functions.js @@ -21,7 +21,7 @@ const { setPass, setType, setTfaToken, - setExtended, + setRemember, setNext, setRes, setNodeConnect, @@ -42,6 +42,8 @@ const { getDefaultParamsOfOpennebulaCommand } = require('server/utils/opennebula') +const { writeInLogger } = require('server/utils/logger') + /** * Login user. * @@ -68,7 +70,7 @@ const loginUser = (err = '', value = '', success = defaultEmptyFunction, error = * @param {Function} oneConnection - function of xmlrpc */ const auth = (res = {}, next = defaultEmptyFunction, params = {}, userData = {}, oneConnection = defaultEmptyFunction) => { - const { user, token, type, token2fa, extended } = params + const { user, token, type, token2fa, remember } = params setRes(res) setNext(next) setNodeConnect(oneConnection) @@ -86,7 +88,7 @@ const auth = (res = {}, next = defaultEmptyFunction, params = {}, userData = {}, setPass(token || '') setType(type || '') setTfaToken(token2fa || '') - setExtended(extended || '') + setRemember(remember || false) login(oneValue) } @@ -95,6 +97,7 @@ const auth = (res = {}, next = defaultEmptyFunction, params = {}, userData = {}, */ const error = () => { updaterResponse(new Map(unauthorized).toObject()) + writeInLogger(unauthorized) next() } diff --git a/src/fireedge/src/server/routes/api/auth/auth.js b/src/fireedge/src/server/routes/api/auth/auth.js index 085e40fd9f..5ec9b747d2 100644 --- a/src/fireedge/src/server/routes/api/auth/auth.js +++ b/src/fireedge/src/server/routes/api/auth/auth.js @@ -39,9 +39,9 @@ const routes = { from: fromData.postBody, name: 'token2fa' }, - extended: { + remember: { from: fromData.postBody, - name: 'extended' + name: 'remember' } } } diff --git a/src/fireedge/src/server/routes/api/auth/functions.js b/src/fireedge/src/server/routes/api/auth/functions.js index aad7dc3c5b..b63f0d14a0 100644 --- a/src/fireedge/src/server/routes/api/auth/functions.js +++ b/src/fireedge/src/server/routes/api/auth/functions.js @@ -22,10 +22,12 @@ const { Actions: ActionUsers } = require('server/utils/constants/commands/user') const { Actions: ActionZones } = require('server/utils/constants/commands/zone') const { httpMethod, - defaultOpennebulaExpiration, + defaultSessionExpiration, default2FAOpennebulaVar, defaultNamespace, - defaultEmptyFunction + defaultEmptyFunction, + defaultSessionLimitExpiration, + defaultRememberSessionExpiration } = require('server/utils/constants/defaults') const { getConfig } = require('server/utils/yml') const { @@ -53,15 +55,17 @@ let iv = '' let pass = '' let type = '' let tfatoken = '' -let extended = '' +let remember = false let next = defaultEmptyFunction let req = {} let res = {} let nodeConnect = defaultEmptyFunction let now = '' let nowUnix = '' -let nowWithMinutes = '' +let expireTime = '' let relativeTime = '' +let limitToken = defaultSessionExpiration +let limitExpirationReuseToken = defaultSessionLimitExpiration /** * Get key opennebula. @@ -165,14 +169,15 @@ const setTfaToken = newTfaToken => { } /** - * Set extended. + * Set remember. * - * @param {boolean} newExtended - new extended - * @returns {boolean} extended + * @param {boolean} remember - new remember + * @param newRemember + * @returns {boolean} remember */ -const setExtended = newExtended => { - extended = newExtended - return extended +const setRemember = newRemember => { + remember = newRemember + return remember } /** @@ -223,11 +228,12 @@ const setRes = (newRes = {}) => { * Set dates. */ const setDates = () => { - const limitToken = appConfig.opennebula_expiration || defaultOpennebulaExpiration + limitToken = remember ? (appConfig.session__remember_expiration || defaultRememberSessionExpiration) : (appConfig.session_expiration || defaultSessionExpiration) + limitExpirationReuseToken = parseInt(appConfig.session_reuse_token_time, 10) || defaultSessionLimitExpiration now = DateTime.local() nowUnix = now.toSeconds() - nowWithMinutes = now.plus({ minutes: limitToken }) - const diff = nowWithMinutes.diff(now, 'seconds') + expireTime = now.plus({ minutes: limitToken }) + const diff = expireTime.diff(now, 'seconds') relativeTime = diff.seconds } @@ -305,16 +311,12 @@ const validate2faAuthentication = informationUser => { * @param {object} informationUser - user data */ const genJWT = (token, informationUser) => { - if (token && token.token && informationUser && informationUser.ID && informationUser.NAME) { + if (token && token.token && token.time && informationUser && informationUser.ID && informationUser.NAME) { const { ID: id, TEMPLATE: userTemplate, NAME: user } = informationUser const dataJWT = { id, user, token: token.token } - const addTime = token.expiration_time || nowWithMinutes.toSeconds() - const jwt = createJWT(dataJWT, nowUnix, addTime) + const expire = token.time || expireTime.toSeconds() + const jwt = createJWT(dataJWT, nowUnix, expire) if (jwt) { - if (!global.users) { - global.users = {} - } - global.users[user] = { token: token.token } const rtn = { token: jwt, id } if (userTemplate && userTemplate.SUNSTONE && userTemplate.SUNSTONE.LANG) { rtn.language = userTemplate.SUNSTONE.LANG @@ -324,6 +326,38 @@ const genJWT = (token, informationUser) => { } } +/** + * Get created user tokens. + * + * @param {string} username - username + * @returns {object} - user token + */ +const getCreatedTokenOpennebula = (username = '') => { + if (global && global.users && username && global.users[username] && global.users[username].tokens) { + var acc = { token: '', time: 0 } + global.users[username].tokens.forEach((curr = {}, index = 0) => { + const currentTime = parseInt(curr.time, 10) + + // this delete expired tokens of global.users[username] + if (currentTime < nowUnix) { + delete global.users[username].tokens[index] + } + + // this select a valid token + if ( + DateTime.fromSeconds(currentTime).minus({ minutes: limitExpirationReuseToken }) >= now && + currentTime >= acc.time + ) { + acc = { token: curr.token, time: curr.time } + } + }) + + if (acc.token && acc.time) { + return acc + } + } +} + /** * Get zones. */ @@ -381,11 +415,15 @@ const createTokenServerAdmin = (serverAdmin = '', username = '') => { const key = getKey() const iv = getIV() if (serverAdmin && username && key && iv) { - rtn = encrypt( - `${serverAdmin}:${username}:${parseInt(nowWithMinutes.toSeconds())}`, - key, - iv - ) + const expire = parseInt(expireTime.toSeconds(), 10) + rtn = { + token: encrypt( + `${serverAdmin}:${username}:${expire}`, + key, + iv + ), + time: expire + } } return rtn } @@ -420,18 +458,38 @@ const wrapUserWithServerAdmin = (serverAdminData = {}, userData = {}) => { setKey(serverAdminPassword.substring(0, 32)) setIV(serverAdminPassword.substring(0, 16)) - const tokenWithServerAdmin = createTokenServerAdmin(serverAdminName, userName) + const JWTusername = `${serverAdminName}:${userName}` + + let tokenWithServerAdmin + let setGlobalNewToken = false + const validToken = getCreatedTokenOpennebula(JWTusername) + if (validToken) { + tokenWithServerAdmin = validToken + } else { + setGlobalNewToken = true + tokenWithServerAdmin = createTokenServerAdmin(serverAdminName, userName) + } + if (tokenWithServerAdmin) { genJWT( + tokenWithServerAdmin, { - token: tokenWithServerAdmin - }, - { - NAME: `${serverAdminName}:${userName}`, + NAME: JWTusername, ID: userData.ID, TEMPLATE: userData.TEMPLATE } ) + + // set global state + if (setGlobalNewToken) { + if (!global.users) { + global.users = {} + } + if (!global.users[JWTusername]) { + global.users[JWTusername] = { tokens: [] } + } + global.users[JWTusername].tokens.push({ token: tokenWithServerAdmin.token, time: parseInt(expireTime.toSeconds(), 10) }) + } next() } } else { @@ -455,20 +513,22 @@ const getServerAdminAndWrapUser = (userData = {}) => { setKey(serverAdminData.key) setIV(serverAdminData.iv) const tokenWithServerAdmin = createTokenServerAdmin(serverAdminData.username, serverAdminData.username) - const oneConnect = connectOpennebula(`${serverAdminData.username}:${serverAdminData.username}`, tokenWithServerAdmin) - oneConnect( - ActionUsers.USER_INFO, - getDefaultParamsOfOpennebulaCommand(ActionUsers.USER_INFO, GET), - (err, value) => { - responseOpennebula( - updaterResponse, - err, - value, - (serverAdminData = {}) => wrapUserWithServerAdmin(serverAdminData, userData), - next) - }, - false - ) + if (tokenWithServerAdmin.token) { + const oneConnect = connectOpennebula(`${serverAdminData.username}:${serverAdminData.username}`, tokenWithServerAdmin.token) + oneConnect( + ActionUsers.USER_INFO, + getDefaultParamsOfOpennebulaCommand(ActionUsers.USER_INFO, GET), + (err, value) => { + responseOpennebula( + updaterResponse, + err, + value, + (serverAdminData = {}) => wrapUserWithServerAdmin(serverAdminData, userData), + next) + }, + false + ) + } } } @@ -480,7 +540,7 @@ const getServerAdminAndWrapUser = (userData = {}) => { const login = userData => { let rtn = false if (userData) { - const findTextError = `[${namespace}${ActionUsers.USER_INFO}]` + const findTextError = `[${namespace}.${ActionUsers.USER_INFO}]` if (userData.indexOf && userData.indexOf(findTextError) >= 0) { updaterResponse(httpResponse(unauthorized)) } else { @@ -508,7 +568,7 @@ const functionRoutes = { setUser, setPass, setTfaToken, - setExtended, + setRemember, setNext, setReq, setRes, diff --git a/src/fireedge/src/server/routes/entrypoints/Api.js b/src/fireedge/src/server/routes/entrypoints/Api.js index 5ca89c2909..1059f1ad5e 100644 --- a/src/fireedge/src/server/routes/entrypoints/Api.js +++ b/src/fireedge/src/server/routes/entrypoints/Api.js @@ -198,7 +198,7 @@ router.all( if (!err) { fillResourceforHookConnection(user, command, paramsCommand) } - writeInLogger(`command: ${command} response for worker: ${JSON.stringify(value)}`) + writeInLogger(`worker: ${command} : ${JSON.stringify(value)}`) responseOpennebula(updaterResponse, err, value, response, next) } worker.postMessage( diff --git a/src/fireedge/src/server/routes/entrypoints/middlewares/api/index.js b/src/fireedge/src/server/routes/entrypoints/middlewares/api/index.js index 8ffc1b3028..1ee0eb9cfb 100644 --- a/src/fireedge/src/server/routes/entrypoints/middlewares/api/index.js +++ b/src/fireedge/src/server/routes/entrypoints/middlewares/api/index.js @@ -88,8 +88,10 @@ const userValidation = (user = '', token = '') => { global && global.users && global.users[user] && - global.users[user].token && - global.users[user].token === token) { + global.users[user].tokens && + Array.isArray(global.users[user].tokens) && + global.users[user].tokens.some(x => x && x.token === token) + ) { rtn = true } return rtn @@ -141,7 +143,7 @@ const validateResourceAndSession = (req, res, next) => { global.users = {} } if (!global.users[userOpennebula]) { - global.users[userOpennebula] = { token: passOpennebula } + global.users[userOpennebula] = { tokens: [{ token: passOpennebula, time: session.exp }] } } if (userValidation(userOpennebula, passOpennebula)) { next() diff --git a/src/fireedge/src/server/routes/websockets/hooks/index.js b/src/fireedge/src/server/routes/websockets/hooks/index.js index a36884b172..ca830a5576 100644 --- a/src/fireedge/src/server/routes/websockets/hooks/index.js +++ b/src/fireedge/src/server/routes/websockets/hooks/index.js @@ -16,14 +16,14 @@ const atob = require('atob') const { socket: socketZeroMQ } = require('zeromq') -const xml2js = require('xml2js') const { messageTerminal } = require('server/utils/general') const { middlewareValidateAuthWebsocket, middlewareValidateResourceForHookConnection, getResourceDataForRequest, getDataZone, - getQueryData + getQueryData, + xml2json } = require('server/utils/server') /** @@ -55,15 +55,8 @@ const main = (app = {}, type = '') => { mssgs.push(arg.toString()) }) if (mssgs[0] && mssgs[1]) { - xml2js.parseString( + xml2json( atob(mssgs[1]), - { - explicitArray: false, - trim: true, - normalize: true, - includeWhiteChars: true, - strict: false - }, (error, result) => { if (error) { const configErrorParser = { diff --git a/src/fireedge/src/server/utils/constants/defaults.js b/src/fireedge/src/server/utils/constants/defaults.js index 3a25755aea..8ae598297b 100644 --- a/src/fireedge/src/server/utils/constants/defaults.js +++ b/src/fireedge/src/server/utils/constants/defaults.js @@ -42,7 +42,9 @@ const defaults = { */ defaultEmptyFunction: () => undefined, defaultErrorTemplate: 'ERROR_FIREEDGE="%1$s"', - defaultOpennebulaExpiration: 180, + defaultSessionExpiration: 180, + defaultSessionLimitExpiration: 30, + defaultRememberSessionExpiration: 43200, defaultAppName: appName, defaultConfigErrorMessage: { color: 'red', @@ -93,6 +95,16 @@ const defaults = { zeromq: `tcp://${defaultIp}:2101` } ], + defaultConfigParseXML: { + attributeNamePrefix: '', + attrNodeName: '', + ignoreAttributes: false, + ignoreNameSpace: true, + allowBooleanAttributes: false, + parseNodeValue: false, + parseAttributeValue: true, + trimValues: true + }, defaultCommandProvision: 'oneprovision', defaultCommandProvisionTemplate: 'oneprovision-template', defaultCommandProvider: 'oneprovider', @@ -119,7 +131,7 @@ const defaults = { defaultBaseURL: '', endpointVmrc: `${baseUrl}vmrc`, endpointGuacamole: `${baseUrl}guacamole`, - defaultNamespace: 'one.', + defaultNamespace: 'one', defaultMessageInvalidZone: 'Invalid Zone', default2FAIssuer: `${appName}-UI`, default2FAOpennebulaVar, diff --git a/src/fireedge/src/server/utils/jwt.js b/src/fireedge/src/server/utils/jwt.js index 7763890220..ffb6c90b50 100644 --- a/src/fireedge/src/server/utils/jwt.js +++ b/src/fireedge/src/server/utils/jwt.js @@ -58,7 +58,7 @@ const validateAuth = (req = {}) => { let rtn = false if (req && req.headers && req.headers.authorization) { const authorization = req.headers.authorization - const removeBearer = new RegExp('^Bearer ', 'i') + const removeBearer = /^Bearer /i const token = authorization.replace(removeBearer, '') const fireedgeKey = global && global.paths && global.paths.FIREEDGE_KEY if (token && fireedgeKey) { diff --git a/src/fireedge/src/server/utils/logger.js b/src/fireedge/src/server/utils/logger.js index 0cc2bc6635..be410ac6ae 100644 --- a/src/fireedge/src/server/utils/logger.js +++ b/src/fireedge/src/server/utils/logger.js @@ -27,28 +27,39 @@ let logger = null */ const initLogger = () => { if (global && global.paths && global.paths.FIREEDGE_LOG) { - logger = winston.createLogger({ - transports: [ + const transports = [] + + if (env && env.NODE_ENV && env.NODE_ENV === defaultWebpackMode) { + transports.push( + new winston.transports.Console({ + format: winston.format.simple() + })) + } else { + transports.push( new winston.transports.File({ + silent: true, level: 'info', filename: global.paths.FIREEDGE_LOG, handleExceptions: true, - json: true, + json: false, maxsize: 5242880, // 5MB - maxFiles: 5, colorize: false }) - ], + ) + } + + logger = winston.createLogger({ + transports, exitOnError: false }) logger.stream = { - write: function (message, encoding) { - logger.info(message) + write: (message = '') => { + writeInLogger(message) } } if (env && env.NODE_ENV && env.NODE_ENV === defaultWebpackMode) { - logger.add(new winston.transports.Console({ + logger.clear().add(new winston.transports.Console({ format: winston.format.simple() })) } @@ -69,7 +80,7 @@ const getLogger = () => logger */ const getLoggerMiddleware = () => { const logger = getLogger() - if (logger) { + if (logger && logger.stream) { return morgan('combined', { stream: logger.stream }) } } diff --git a/src/fireedge/src/server/utils/opennebula.js b/src/fireedge/src/server/utils/opennebula.js index 6c3204d7c0..4773b7632f 100644 --- a/src/fireedge/src/server/utils/opennebula.js +++ b/src/fireedge/src/server/utils/opennebula.js @@ -18,7 +18,7 @@ const upcast = require('upcast') // eslint-disable-next-line node/no-deprecated-api const { parse } = require('url') const rpc = require('xmlrpc') -const xml2js = require('xml2js') +const parser = require('fast-xml-parser') const { Map } = require('immutable') const { sprintf } = require('sprintf-js') const { global } = require('window-or-global') @@ -27,6 +27,7 @@ const commandsParams = require('./constants/commands') const { from, defaultEmptyFunction, + defaultConfigParseXML, defaultNamespace, defaultMessageProblemOpennebula } = require('./constants/defaults') @@ -36,6 +37,25 @@ const { getConfig } = require('./yml') // regex for separate the commands .info const regexInfoAction = /^(\w+).info$/ +/** + * Parse xml to JSON. + * + * @param {string} xml - xml data in string + * @param {Function} callback - callback data + */ +const xml2json = (xml = '', callback = defaultEmptyFunction) => { + let rtn = [] + try { + const jsonObj = parser.parse(xml, defaultConfigParseXML) + rtn = [null, jsonObj] + } catch (error) { + rtn = [error] + } + + // eslint-disable-next-line standard/no-callback-literal + callback(...rtn) +} + /** * Authorizes if the user has access to the resource, for their connection to the HOOK. * @@ -87,56 +107,44 @@ const opennebulaConnect = (username = '', password = '', zoneURL = '') => { const namespace = appConfig.namespace || defaultNamespace const xmlParameters = [`${username}:${password}`, ...parameters] xmlClient.methodCall( - namespace + action, + `${namespace}.${action}`, xmlParameters, (err, value) => { - const configParseXML = { - explicitArray: false, - trim: true, - normalize: true, - includeWhiteChars: true, - strict: false - } - if (err && err.body) { - xml2js.parseString( - err.body, - configParseXML, - (error, result) => { - if (error) { - callback(error, undefined) // error parse xml - return - } - if ( - result && - result.METHODRESPONSE && - result.METHODRESPONSE.PARAMS && - result.METHODRESPONSE.PARAMS.PARAM && - result.METHODRESPONSE.PARAMS.PARAM.VALUE && - result.METHODRESPONSE.PARAMS.PARAM.VALUE.ARRAY && - result.METHODRESPONSE.PARAMS.PARAM.VALUE.ARRAY.DATA && + xml2json(err.body, (error, result) => { + if (error) { + callback(error, undefined) // error parse xml + return + } + if ( + result && + result.METHODRESPONSE && + result.METHODRESPONSE.PARAMS && + result.METHODRESPONSE.PARAMS.PARAM && + result.METHODRESPONSE.PARAMS.PARAM.VALUE && + result.METHODRESPONSE.PARAMS.PARAM.VALUE.ARRAY && + result.METHODRESPONSE.PARAMS.PARAM.VALUE.ARRAY.DATA && + result.METHODRESPONSE.PARAMS.PARAM.VALUE.ARRAY.DATA + .VALUE && + Array.isArray( result.METHODRESPONSE.PARAMS.PARAM.VALUE.ARRAY.DATA - .VALUE && - Array.isArray( - result.METHODRESPONSE.PARAMS.PARAM.VALUE.ARRAY.DATA - .VALUE - ) + .VALUE + ) + ) { + const errorData = result.METHODRESPONSE.PARAMS.PARAM.VALUE.ARRAY.DATA.VALUE.filter( + element => element.STRING + ) + if ( + Array.isArray(errorData) && + errorData[0] && + errorData[0].STRING ) { - const errorData = result.METHODRESPONSE.PARAMS.PARAM.VALUE.ARRAY.DATA.VALUE.filter( - element => element.STRING - ) - if ( - Array.isArray(errorData) && - errorData[0] && - errorData[0].STRING - ) { - // success - fillHookResource && fillResourceforHookConnection(username, action, parameters) - callback(undefined, errorData[0].STRING) - } + // success + fillHookResource && fillResourceforHookConnection(username, action, parameters) + callback(undefined, errorData[0].STRING) } } - ) + }) return } else if (value && value[0] && value[1]) { let messageCall @@ -146,22 +154,18 @@ const opennebulaConnect = (username = '', password = '', zoneURL = '') => { messageCall = value } if (typeof messageCall === 'string' && messageCall.length > 0) { - xml2js.parseString( - messageCall, - configParseXML, - (error, result) => { - if (error) { - callback(error, undefined) // error parse xml - return - } - // success - fillHookResource && fillResourceforHookConnection(username, action, parameters) - callback( - undefined, - error === null && result === null ? messageCall : result - ) + xml2json(messageCall, (error, result) => { + if (error) { + callback(error, undefined) // error parse xml + return } - ) + // success + fillHookResource && fillResourceforHookConnection(username, action, parameters) + callback( + undefined, + error === null && result === null ? messageCall : result + ) + }) return } } @@ -449,5 +453,6 @@ module.exports = { checkOpennebulaCommand, getDefaultParamsOfOpennebulaCommand, generateNewResourceTemplate, - fillResourceforHookConnection + fillResourceforHookConnection, + xml2json } diff --git a/src/fireedge/webpack.config.prod.client.js b/src/fireedge/webpack.config.prod.client.js index 10f250d523..6ed11605eb 100644 --- a/src/fireedge/webpack.config.prod.client.js +++ b/src/fireedge/webpack.config.prod.client.js @@ -16,6 +16,7 @@ const path = require('path') const webpack = require('webpack') +const TerserPlugin = require('terser-webpack-plugin') const CopyPlugin = require('copy-webpack-plugin') const LoadablePlugin = require('@loadable/webpack-plugin') const TimeFixPlugin = require('time-fix-plugin') @@ -74,6 +75,11 @@ const bundle = ({ assets = false, name = 'sunstone' }) => { } }, plugins, + optimization: { + minimizer: [ + new TerserPlugin({ extractComments: false }) + ] + }, module: { rules: [js] } diff --git a/src/fireedge/webpack.config.prod.server.js b/src/fireedge/webpack.config.prod.server.js index b80622742f..436b193261 100644 --- a/src/fireedge/webpack.config.prod.server.js +++ b/src/fireedge/webpack.config.prod.server.js @@ -17,6 +17,7 @@ const path = require('path') const webpack = require('webpack') const nodeExternals = require('webpack-node-externals') +const TerserPlugin = require('terser-webpack-plugin') const TimeFixPlugin = require('time-fix-plugin') const { defaultProductionWebpackMode } = require('./src/server/utils/constants/defaults') @@ -60,6 +61,11 @@ module.exports = { maxChunks: 1 }) ], + optimization: { + minimizer: [ + new TerserPlugin({ extractComments: false }) + ] + }, module: { rules: [js, worker] }