diff options
author | Vitalii Lysak <v.lysak@dunice.net> | 2022-08-10 15:46:15 +0300 |
---|---|---|
committer | Vitalii Lysak <v.lysak@dunice.net> | 2022-08-10 15:46:15 +0300 |
commit | b4d1fb8b8e6e6cdb7be76a2d4fa0d2b9a84f3ba2 (patch) | |
tree | 8806fa43f2e0d1301a89ddd4c7667d10568e531f | |
parent | 5fff754d48ec658673c11f8e593d3af4f94d79df (diff) | |
download | webui-vue-b4d1fb8b8e6e6cdb7be76a2d4fa0d2b9a84f3ba2.tar.xz |
SILABMC-236: upd layput for ReadOnly role
37 files changed, 348 insertions, 180 deletions
diff --git a/package-lock.json b/package-lock.json index 048d4936..2c8623cf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "core-js": "3.9.1", "date-fns": "2.19.0", "date-fns-tz": "1.1.3", + "encrypt-storage": "2.2.10", "highcharts-vue": "1.4.0", "js-cookie": "2.2.1", "lodash": "4.17.21", @@ -7547,7 +7548,6 @@ "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, "dependencies": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -7558,8 +7558,7 @@ "node_modules/asn1.js/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/assert": { "version": "1.5.0", @@ -8404,8 +8403,7 @@ "node_modules/bn.js": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", - "dev": true + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" }, "node_modules/body-parser": { "version": "1.19.0", @@ -8603,8 +8601,7 @@ "node_modules/brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, "node_modules/browser-process-hrtime": { "version": "1.0.0", @@ -8631,7 +8628,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, "dependencies": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -8645,7 +8641,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, "dependencies": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -8656,7 +8651,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, "dependencies": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -8668,7 +8662,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, "dependencies": { "bn.js": "^5.0.0", "randombytes": "^2.0.1" @@ -8678,7 +8671,6 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, "dependencies": { "bn.js": "^5.1.1", "browserify-rsa": "^4.0.1", @@ -8695,7 +8687,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -8709,7 +8700,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -8810,8 +8800,7 @@ "node_modules/buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, "node_modules/builtin-status-codes": { "version": "3.0.0", @@ -9227,7 +9216,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -10454,7 +10442,6 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, "dependencies": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" @@ -10463,14 +10450,12 @@ "node_modules/create-ecdh/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -10483,7 +10468,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, "dependencies": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -10522,7 +10506,6 @@ "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, "dependencies": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", @@ -10540,6 +10523,11 @@ "node": "*" } }, + "node_modules/crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + }, "node_modules/crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", @@ -11358,7 +11346,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, "dependencies": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" @@ -11398,7 +11385,6 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, "dependencies": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -11408,8 +11394,7 @@ "node_modules/diffie-hellman/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/dir-glob": { "version": "2.2.2", @@ -11721,7 +11706,6 @@ "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -11735,8 +11719,7 @@ "node_modules/elliptic/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -11762,6 +11745,15 @@ "node": ">= 0.8" } }, + "node_modules/encrypt-storage": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/encrypt-storage/-/encrypt-storage-2.2.10.tgz", + "integrity": "sha512-3Z2gD+kBQYrFXvofNzLB6p5kMuoq9wHTGrR6srJoUhMrbWSbpoCsOAd0pfCiVJ2VS+5rbZzZXNCjhB1s4uykXA==", + "dependencies": { + "crypto-browserify": "^3.12.0", + "crypto-js": "^4.1.1" + } + }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -12562,7 +12554,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, "dependencies": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -13823,7 +13814,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, "dependencies": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -13837,7 +13827,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -13851,7 +13840,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -13877,7 +13865,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -13926,7 +13913,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -14570,8 +14556,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "1.3.8", @@ -18500,7 +18485,6 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -18614,7 +18598,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, "dependencies": { "bn.js": "^4.0.0", "brorand": "^1.0.1" @@ -18626,8 +18609,7 @@ "node_modules/miller-rabin/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/mime": { "version": "2.5.2", @@ -18739,14 +18721,12 @@ "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, "node_modules/minimatch": { "version": "3.0.4", @@ -19838,7 +19818,6 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, "dependencies": { "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", @@ -19986,7 +19965,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", - "dev": true, "dependencies": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -21108,7 +21086,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, "dependencies": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -21121,8 +21098,7 @@ "node_modules/public-encrypt/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/pump": { "version": "3.0.0", @@ -21257,7 +21233,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, "dependencies": { "safe-buffer": "^5.1.0" } @@ -21271,7 +21246,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, "dependencies": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" @@ -21881,7 +21855,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -21943,8 +21916,7 @@ "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/safe-regex": { "version": "1.1.0", @@ -21958,8 +21930,7 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sane": { "version": "4.1.0", @@ -22364,7 +22335,6 @@ "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -23011,7 +22981,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -24500,8 +24469,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "node_modules/util.promisify": { "version": "1.1.1", @@ -32776,7 +32744,6 @@ "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", @@ -32787,8 +32754,7 @@ "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, @@ -33480,8 +33446,7 @@ "bn.js": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", - "dev": true + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" }, "body-parser": { "version": "1.19.0", @@ -33652,8 +33617,7 @@ "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, "browser-process-hrtime": { "version": "1.0.0", @@ -33682,7 +33646,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, "requires": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -33696,7 +33659,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, "requires": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -33707,7 +33669,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, "requires": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", @@ -33719,7 +33680,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", - "dev": true, "requires": { "bn.js": "^5.0.0", "randombytes": "^2.0.1" @@ -33729,7 +33689,6 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, "requires": { "bn.js": "^5.1.1", "browserify-rsa": "^4.0.1", @@ -33746,7 +33705,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -33756,8 +33714,7 @@ "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, @@ -33833,8 +33790,7 @@ "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" }, "builtin-status-codes": { "version": "3.0.0", @@ -34166,7 +34122,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -35157,7 +35112,6 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, "requires": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" @@ -35166,8 +35120,7 @@ "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, @@ -35175,7 +35128,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, "requires": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -35188,7 +35140,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, "requires": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -35223,7 +35174,6 @@ "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, "requires": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", @@ -35238,6 +35188,11 @@ "randomfill": "^1.0.3" } }, + "crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + }, "crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", @@ -35878,7 +35833,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, "requires": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" @@ -35912,7 +35866,6 @@ "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, "requires": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -35922,8 +35875,7 @@ "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, @@ -36201,7 +36153,6 @@ "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, "requires": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -36215,8 +36166,7 @@ "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, @@ -36238,6 +36188,15 @@ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "dev": true }, + "encrypt-storage": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/encrypt-storage/-/encrypt-storage-2.2.10.tgz", + "integrity": "sha512-3Z2gD+kBQYrFXvofNzLB6p5kMuoq9wHTGrR6srJoUhMrbWSbpoCsOAd0pfCiVJ2VS+5rbZzZXNCjhB1s4uykXA==", + "requires": { + "crypto-browserify": "^3.12.0", + "crypto-js": "^4.1.1" + } + }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -36822,7 +36781,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, "requires": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -37839,7 +37797,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, "requires": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -37850,7 +37807,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -37860,8 +37816,7 @@ "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, @@ -37875,7 +37830,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -37915,7 +37869,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, "requires": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -38436,8 +38389,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.8", @@ -41570,7 +41522,6 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -41671,7 +41622,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" @@ -41680,8 +41630,7 @@ "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, @@ -41767,14 +41716,12 @@ "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, "minimatch": { "version": "3.0.4", @@ -42665,7 +42612,6 @@ "version": "5.1.6", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, "requires": { "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", @@ -42790,7 +42736,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", - "dev": true, "requires": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -43743,7 +43688,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, "requires": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -43756,8 +43700,7 @@ "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, @@ -43859,7 +43802,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, "requires": { "safe-buffer": "^5.1.0" } @@ -43873,7 +43815,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, "requires": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" @@ -44356,7 +44297,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, "requires": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -44398,8 +44338,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-regex": { "version": "1.1.0", @@ -44413,8 +44352,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sane": { "version": "4.1.0", @@ -44748,7 +44686,6 @@ "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, "requires": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -45313,7 +45250,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -46516,8 +46452,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "util.promisify": { "version": "1.1.1", diff --git a/package.json b/package.json index 6410a3f1..0604492e 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "core-js": "3.9.1", "date-fns": "2.19.0", "date-fns-tz": "1.1.3", + "encrypt-storage": "2.2.10", "highcharts-vue": "1.4.0", "js-cookie": "2.2.1", "lodash": "4.17.21", diff --git a/src/assets/styles/bmc/_sila/_base.scss b/src/assets/styles/bmc/_sila/_base.scss index cf5ffeb5..cc01b569 100644 --- a/src/assets/styles/bmc/_sila/_base.scss +++ b/src/assets/styles/bmc/_sila/_base.scss @@ -150,11 +150,6 @@ h6, } } -.disabledDiv { - pointer-events: none; - opacity: 0.3; -} - .white-space--nowrap { white-space: nowrap; } @@ -165,3 +160,22 @@ h6, .align-items--center { align-items: center; } + +.disabledDiv { + pointer-events: none !important; + opacity: 0.5 !important; +} + +.custom-select { + opacity: 0.5 !important; +} + +.custom-control { + input:disabled ~ label::before { + opacity: 0.5 !important; + } +} + +button:disabled { + opacity: 0.5 !important; +} diff --git a/src/components/_sila/Global/FormFile.vue b/src/components/_sila/Global/FormFile.vue index ee93ba49..686c9a09 100644 --- a/src/components/_sila/Global/FormFile.vue +++ b/src/components/_sila/Global/FormFile.vue @@ -28,6 +28,7 @@ 'btn-secondary': isSecondary, 'btn-primary': !isSecondary, }" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" @click="$bvModal.show(`modal-${id}`)" > {{ $t('global.fileUpload.browseText') }} diff --git a/src/components/_sila/Global/TableToolbar.vue b/src/components/_sila/Global/TableToolbar.vue index 028b0497..53d004cf 100644 --- a/src/components/_sila/Global/TableToolbar.vue +++ b/src/components/_sila/Global/TableToolbar.vue @@ -13,6 +13,7 @@ :data-test-id="`table-button-${action.value}Selected`" variant="primary" class="d-block" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" @click="$emit('batch-action', action.value)" > {{ action.label }} diff --git a/src/store/modules/Authentication/AuthenticanStore.js b/src/store/modules/Authentication/AuthenticanStore.js index 07d5ee8b..a574331b 100644 --- a/src/store/modules/Authentication/AuthenticanStore.js +++ b/src/store/modules/Authentication/AuthenticanStore.js @@ -1,6 +1,7 @@ import api from '@/store/api'; import Cookies from 'js-cookie'; import router from '@/router'; +import { EncryptStorage } from 'encrypt-storage'; const AuthenticationStore = { namespaced: true, @@ -17,6 +18,10 @@ const AuthenticationStore = { ); }, token: (state) => state.xsrfCookie, + role: () => { + const encryptStorage = new EncryptStorage('ZAaZi(P,m5+BcM|UTox5'); + return encryptStorage.getItem('storedUserrole'); + }, }, mutations: { authSuccess(state) { @@ -33,13 +38,30 @@ const AuthenticationStore = { state.xsrfCookie = undefined; state.isAuthenticatedCookie = undefined; }, + setRole(state, role) { + const encryptStorage = new EncryptStorage('ZAaZi(P,m5+BcM|UTox5'); + encryptStorage.setItem('storedUserrole', role); + }, }, actions: { - login({ commit }, { username, password }) { + login({ commit, dispatch }, { username, password }) { commit('authError', false); return api .post('/login', { data: [username, password] }) - .then(() => commit('authSuccess')) + .then(() => { + dispatch('getUser', username) + .then((response) => { + if (response.data?.RoleId) { + commit('setRole', response.data.RoleId); + } + }) + .catch((error) => { + commit('authError'); + throw new Error(error); + }); + + commit('authSuccess'); + }) .catch((error) => { commit('authError'); throw new Error(error); @@ -52,9 +74,8 @@ const AuthenticationStore = { .then(() => router.go('/login')) .catch((error) => console.log(error)); }, - checkPasswordChangeRequired(_, username) { - api - .get(`/redfish/v1/AccountService/Accounts/${username}`) + checkPasswordChangeRequired({ dispatch }, username) { + dispatch('getUser', username) .then(({ data: { PasswordChangeRequired } }) => PasswordChangeRequired) .catch((error) => console.log(error)); }, @@ -63,6 +84,9 @@ const AuthenticationStore = { state.xsrfCookie = Cookies.get('XSRF-TOKEN'); state.isAuthenticatedCookie = Cookies.get('IsAuthenticated'); }, + getUser(_, username) { + return api.get(`/redfish/v1/AccountService/Accounts/${username}`); + }, }, }; diff --git a/src/views/_sila/Login/Login.vue b/src/views/_sila/Login/Login.vue index b3bd37c8..db6a6a09 100644 --- a/src/views/_sila/Login/Login.vue +++ b/src/views/_sila/Login/Login.vue @@ -129,9 +129,13 @@ export default { }) .then((passwordChangeRequired) => { if (passwordChangeRequired) { - window.location.href = '/change-password'; + setTimeout(() => { + window.location.href = '/change-password'; + }, 1000); } else { - window.location.href = '/'; + setTimeout(() => { + window.location.href = '/'; + }, 1000); } }) .catch((error) => console.log(error)) diff --git a/src/views/_sila/Logs/EventLogs/EventLogs.vue b/src/views/_sila/Logs/EventLogs/EventLogs.vue index 8cc65bfb..f283fc8b 100644 --- a/src/views/_sila/Logs/EventLogs/EventLogs.vue +++ b/src/views/_sila/Logs/EventLogs/EventLogs.vue @@ -32,7 +32,10 @@ <table-filter :filters="tableFilters" @filter-change="onFilterChange" /> <b-button variant="link" - :disabled="allLogs.length === 0" + :disabled=" + allLogs.length === 0 && + $store.getters['authentication/role'] === 'ReadOnly' + " @click="deleteAllLogs" > <icon-delete /> {{ $t('global.action.deleteAll') }} @@ -57,10 +60,18 @@ @batch-action="onBatchAction" > <template #toolbar-buttons> - <b-button variant="primary" @click="resolveLogs"> + <b-button + variant="primary" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" + @click="resolveLogs" + > {{ $t('pageEventLogs.resolve') }} </b-button> - <b-button variant="primary" @click="unresolveLogs"> + <b-button + variant="primary" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" + @click="unresolveLogs" + > {{ $t('pageEventLogs.unresolve') }} </b-button> <table-toolbar-export @@ -184,6 +195,7 @@ v-model="row.item.status" name="switch" switch + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" @change="changelogStatus(row.item)" > <span v-if="row.item.status"> @@ -206,6 +218,11 @@ :row-data="row.item" :export-name="exportFileNameByDate('export')" :data-test-id="`eventLogs-button-deleteRow-${row.index}`" + :class="{ + disabledDiv: + $store.getters['authentication/role'] === 'ReadOnly' && + action.value === 'delete', + }" @click-table-action="onTableRowAction($event, row.item)" > <template #icon> diff --git a/src/views/_sila/Operations/FactoryReset/FactoryReset.vue b/src/views/_sila/Operations/FactoryReset/FactoryReset.vue index 4e315619..b7ae5b8d 100644 --- a/src/views/_sila/Operations/FactoryReset/FactoryReset.vue +++ b/src/views/_sila/Operations/FactoryReset/FactoryReset.vue @@ -17,6 +17,7 @@ value="resetBios" aria-describedby="reset-bios" data-test-id="factoryReset-radio-resetBios" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" > {{ $t('pageFactoryReset.form.resetBiosOptionLabel') }} </b-form-radio> @@ -29,6 +30,7 @@ value="resetToDefaults" aria-describedby="reset-to-defaults" data-test-id="factoryReset-radio-resetToDefaults" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" > {{ $t('pageFactoryReset.form.resetToDefaultsOptionLabel') }} </b-form-radio> diff --git a/src/views/_sila/Operations/Firmware/FirmwareFormUpdate.vue b/src/views/_sila/Operations/Firmware/FirmwareFormUpdate.vue index 23fe90f2..dcf867ee 100644 --- a/src/views/_sila/Operations/Firmware/FirmwareFormUpdate.vue +++ b/src/views/_sila/Operations/Firmware/FirmwareFormUpdate.vue @@ -60,7 +60,10 @@ data-test-id="firmware-button-startUpdate" type="submit" variant="primary" - :disabled="isPageDisabled" + :disabled=" + isPageDisabled || + $store.getters['authentication/role'] === 'ReadOnly' + " > {{ $t('pageFirmware.form.updateFirmware.startUpdate') }} </b-btn> diff --git a/src/views/_sila/Operations/KeyClear/KeyClear.vue b/src/views/_sila/Operations/KeyClear/KeyClear.vue index 8955f6cd..b49118d1 100644 --- a/src/views/_sila/Operations/KeyClear/KeyClear.vue +++ b/src/views/_sila/Operations/KeyClear/KeyClear.vue @@ -23,19 +23,31 @@ v-model="keyOption" stacked > - <b-form-radio class="mb-1" value="NONE"> + <b-form-radio + class="mb-1" + value="NONE" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" + > {{ $t('pageKeyClear.form.none') }} </b-form-radio> <b-form-text id="key-clear-not-requested" class="ml-4 mb-3"> {{ $t('pageKeyClear.form.keyClearNotRequested') }} </b-form-text> - <b-form-radio class="mb-1" value="ALL"> + <b-form-radio + class="mb-1" + value="ALL" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" + > {{ $t('pageKeyClear.form.clearAllLabel') }} </b-form-radio> <b-form-text id="clear-all" class="ml-4 mb-3"> {{ $t('pageKeyClear.form.clearAllHeperText') }} </b-form-text> - <b-form-radio class="mb-1" value="POWERVM_SYSKEY"> + <b-form-radio + class="mb-1" + value="POWERVM_SYSKEY" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" + > {{ $t('pageKeyClear.form.clearHypervisorSystemKeyLabel') }} </b-form-radio> <b-form-text id="clear-hypervisor-key" class="ml-4 mb-3"> diff --git a/src/views/_sila/Operations/Kvm/Kvm.vue b/src/views/_sila/Operations/Kvm/Kvm.vue index ede24608..4db46372 100644 --- a/src/views/_sila/Operations/Kvm/Kvm.vue +++ b/src/views/_sila/Operations/Kvm/Kvm.vue @@ -1,7 +1,12 @@ <template> <b-container fluid="xl"> <page-title /> - <div class="terminal-container"> + <div + class="terminal-container" + :class="{ + disabledDiv: $store.getters['authentication/role'] === 'ReadOnly', + }" + > <kvm-console :is-full-window="false" /> </div> </b-container> diff --git a/src/views/_sila/Operations/RebootBmc/RebootBmc.vue b/src/views/_sila/Operations/RebootBmc/RebootBmc.vue index fa16f55e..f332de88 100644 --- a/src/views/_sila/Operations/RebootBmc/RebootBmc.vue +++ b/src/views/_sila/Operations/RebootBmc/RebootBmc.vue @@ -23,6 +23,7 @@ variant="primary" class="d-block mt-5" data-test-id="rebootBmc-button-reboot" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" @click="onClick" > {{ $t('pageRebootBmc.rebootBmc') }} diff --git a/src/views/_sila/Operations/SerialOverLan/SerialOverLan.vue b/src/views/_sila/Operations/SerialOverLan/SerialOverLan.vue index 22824772..e09b43d3 100644 --- a/src/views/_sila/Operations/SerialOverLan/SerialOverLan.vue +++ b/src/views/_sila/Operations/SerialOverLan/SerialOverLan.vue @@ -3,7 +3,12 @@ <page-title class="mb-4" :description="$t('pageSerialOverLan.subTitle')" /> <page-section class="mb-0"> - <serial-over-lan-console :is-full-window="false" /> + <serial-over-lan-console + :is-full-window="false" + :class="{ + disabledDiv: $store.getters['authentication/role'] === 'ReadOnly', + }" + /> </page-section> </b-container> </template> diff --git a/src/views/_sila/Operations/ServerPowerOperations/BootSettings.vue b/src/views/_sila/Operations/ServerPowerOperations/BootSettings.vue index 8d74e381..1288af0a 100644 --- a/src/views/_sila/Operations/ServerPowerOperations/BootSettings.vue +++ b/src/views/_sila/Operations/ServerPowerOperations/BootSettings.vue @@ -11,7 +11,10 @@ <b-form-select id="boot-option" v-model="form.bootOption" - :disabled="bootSourceOptions.length === 0" + :disabled=" + bootSourceOptions.length === 0 || + $store.getters['authentication/role'] === 'ReadOnly' + " :options="bootSourceOptions" @change="onChangeSelect" > @@ -20,7 +23,10 @@ <b-form-checkbox v-model="form.oneTimeBoot" class="mb-4" - :disabled="form.bootOption === 'None'" + :disabled=" + form.bootOption === 'None' || + $store.getters['authentication/role'] === 'ReadOnly' + " @change="$v.form.oneTimeBoot.$touch()" > {{ $t('pageServerPowerOperations.bootSettings.enableOneTimeBoot') }} @@ -37,12 +43,18 @@ id="tpm-required-policy" v-model="form.tpmPolicyOn" aria-describedby="tpm-required-policy-help-block" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" @change="$v.form.tpmPolicyOn.$touch()" > {{ $t('global.status.enabled') }} </b-form-checkbox> </b-form-group> - <b-button variant="primary" type="submit" class="mb-3"> + <b-button + variant="primary" + type="submit" + class="mb-3" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" + > {{ $t('global.action.save') }} </b-button> </b-form> diff --git a/src/views/_sila/Operations/ServerPowerOperations/ServerPowerOperations.vue b/src/views/_sila/Operations/ServerPowerOperations/ServerPowerOperations.vue index e848215f..f8a18a9e 100644 --- a/src/views/_sila/Operations/ServerPowerOperations/ServerPowerOperations.vue +++ b/src/views/_sila/Operations/ServerPowerOperations/ServerPowerOperations.vue @@ -72,6 +72,7 @@ <b-button variant="primary" data-test-id="serverPowerOperations-button-powerOn" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" @click="powerOn" > {{ $t('pageServerPowerOperations.powerOn') }} @@ -88,6 +89,9 @@ name="reboot-option" data-test-id="serverPowerOperations-radio-rebootOrderly" value="orderly" + :disabled=" + $store.getters['authentication/role'] === 'ReadOnly' + " > {{ $t('pageServerPowerOperations.orderlyReboot') }} </b-form-radio> @@ -96,6 +100,9 @@ name="reboot-option" data-test-id="serverPowerOperations-radio-rebootImmediate" value="immediate" + :disabled=" + $store.getters['authentication/role'] === 'ReadOnly' + " > {{ $t('pageServerPowerOperations.immediateReboot') }} </b-form-radio> @@ -104,6 +111,7 @@ variant="primary" type="submit" data-test-id="serverPowerOperations-button-reboot" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" > {{ $t('pageServerPowerOperations.reboot') }} </b-button> @@ -118,6 +126,9 @@ name="shutdown-option" data-test-id="serverPowerOperations-radio-shutdownOrderly" value="orderly" + :disabled=" + $store.getters['authentication/role'] === 'ReadOnly' + " > {{ $t('pageServerPowerOperations.orderlyShutdown') }} </b-form-radio> @@ -126,6 +137,9 @@ name="shutdown-option" data-test-id="serverPowerOperations-radio-shutdownImmediate" value="immediate" + :disabled=" + $store.getters['authentication/role'] === 'ReadOnly' + " > {{ $t('pageServerPowerOperations.immediateShutdown') }} </b-form-radio> @@ -134,6 +148,7 @@ variant="primary" type="submit" data-test-id="serverPowerOperations-button-shutDown" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" > {{ $t('pageServerPowerOperations.shutDown') }} </b-button> diff --git a/src/views/_sila/Operations/VirtualMedia/VirtualMedia.vue b/src/views/_sila/Operations/VirtualMedia/VirtualMedia.vue index 8b396f41..be5e2ee9 100644 --- a/src/views/_sila/Operations/VirtualMedia/VirtualMedia.vue +++ b/src/views/_sila/Operations/VirtualMedia/VirtualMedia.vue @@ -17,6 +17,9 @@ v-if="!dev.isActive" :id="concatId(dev.id)" v-model="dev.file" + :disabled=" + $store.getters['authentication/role'] === 'ReadOnly' + " > <template #invalid> <b-form-invalid-feedback role="alert"> @@ -73,7 +76,10 @@ > <b-button variant="primary" - :disabled="device.isActive" + :disabled=" + device.isActive || + $store.getters['authentication/role'] === 'ReadOnly' + " @click="configureConnection(device)" > {{ $t('pageVirtualMedia.configureConnection') }} diff --git a/src/views/_sila/Overview/DateTime/DateTime.vue b/src/views/_sila/Overview/DateTime/DateTime.vue index 796a57ac..e9de12c5 100644 --- a/src/views/_sila/Overview/DateTime/DateTime.vue +++ b/src/views/_sila/Overview/DateTime/DateTime.vue @@ -42,6 +42,7 @@ v-model="form.configurationSelected" value="manual" data-test-id="dateTime-radio-configureManual" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" > {{ $t('pageDateTime.form.manual') }} </b-form-radio> @@ -57,7 +58,10 @@ id="input-manual-date" v-model="form.manual.date" :state="getValidationState($v.form.manual.date)" - :disabled="ntpOptionSelected" + :disabled=" + ntpOptionSelected || + $store.getters['authentication/role'] === 'ReadOnly' + " data-test-id="dateTime-input-manualDate" class="form-control-with-button" @blur="$v.form.manual.date.$touch()" @@ -81,7 +85,10 @@ $t('global.calendar.useCursorKeysToNavigateCalendarDates') " :title="$t('global.calendar.selectDate')" - :disabled="ntpOptionSelected" + :disabled=" + ntpOptionSelected || + $store.getters['authentication/role'] === 'ReadOnly' + " button-variant="link" aria-controls="input-manual-date" > @@ -106,7 +113,10 @@ id="input-manual-time" v-model="form.manual.time" :state="getValidationState($v.form.manual.time)" - :disabled="ntpOptionSelected" + :disabled=" + ntpOptionSelected || + $store.getters['authentication/role'] === 'ReadOnly' + " data-test-id="dateTime-input-manualTime" @blur="$v.form.manual.time.$touch()" /> @@ -126,6 +136,7 @@ v-model="form.configurationSelected" value="ntp" data-test-id="dateTime-radio-configureNTP" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" > NTP </b-form-radio> @@ -140,7 +151,10 @@ id="input-ntp-1" v-model="form.ntp.firstAddress" :state="getValidationState($v.form.ntp.firstAddress)" - :disabled="manualOptionSelected" + :disabled=" + manualOptionSelected || + $store.getters['authentication/role'] === 'ReadOnly' + " data-test-id="dateTime-input-ntpServer1" @blur="$v.form.ntp.firstAddress.$touch()" /> @@ -165,7 +179,10 @@ id="input-ntp-2" v-model="form.ntp.secondAddress" :state="getValidationState($v.form.ntp.secondAddress)" - :disabled="manualOptionSelected" + :disabled=" + manualOptionSelected || + $store.getters['authentication/role'] === 'ReadOnly' + " data-test-id="dateTime-input-ntpServer2" @blur="$v.form.ntp.secondAddress.$touch()" /> @@ -187,7 +204,10 @@ id="input-ntp-3" v-model="form.ntp.thirdAddress" :state="getValidationState($v.form.ntp.thirdAddress)" - :disabled="manualOptionSelected" + :disabled=" + manualOptionSelected || + $store.getters['authentication/role'] === 'ReadOnly' + " data-test-id="dateTime-input-ntpServer3" @blur="$v.form.ntp.thirdAddress.$touch()" /> @@ -204,6 +224,7 @@ variant="primary" type="submit" data-test-id="dateTime-button-saveSettings" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" > {{ $t('global.action.saveSettings') }} </b-button> diff --git a/src/views/_sila/Overview/Inventory/InventoryServiceIndicator.vue b/src/views/_sila/Overview/Inventory/InventoryServiceIndicator.vue index b4531be7..7f0c9030 100644 --- a/src/views/_sila/Overview/Inventory/InventoryServiceIndicator.vue +++ b/src/views/_sila/Overview/Inventory/InventoryServiceIndicator.vue @@ -23,6 +23,7 @@ v-model="systems.locationIndicatorActive" data-test-id="inventoryService-toggle-identifyLed" switch + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" @change="toggleIdentifyLedSwitch" > <span v-if="systems.locationIndicatorActive"> diff --git a/src/views/_sila/Overview/Inventory/InventoryTableAssembly.vue b/src/views/_sila/Overview/Inventory/InventoryTableAssembly.vue index 9c284533..929c172b 100644 --- a/src/views/_sila/Overview/Inventory/InventoryTableAssembly.vue +++ b/src/views/_sila/Overview/Inventory/InventoryTableAssembly.vue @@ -32,6 +32,7 @@ v-model="row.item.identifyLed" name="switch" switch + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" @change="toggleIdentifyLedValue(row.item)" > <span v-if="row.item.identifyLed"> diff --git a/src/views/_sila/Overview/Inventory/InventoryTableBmcManager.vue b/src/views/_sila/Overview/Inventory/InventoryTableBmcManager.vue index e3375d57..5fb23bfd 100644 --- a/src/views/_sila/Overview/Inventory/InventoryTableBmcManager.vue +++ b/src/views/_sila/Overview/Inventory/InventoryTableBmcManager.vue @@ -36,6 +36,7 @@ v-model="row.item.identifyLed" name="switch" switch + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" @change="toggleIdentifyLedValue(row.item)" > <span v-if="row.item.identifyLed"> diff --git a/src/views/_sila/Overview/Inventory/InventoryTableChassis.vue b/src/views/_sila/Overview/Inventory/InventoryTableChassis.vue index a5eb5ae6..d141924f 100644 --- a/src/views/_sila/Overview/Inventory/InventoryTableChassis.vue +++ b/src/views/_sila/Overview/Inventory/InventoryTableChassis.vue @@ -35,6 +35,7 @@ v-model="row.item.identifyLed" name="switch" switch + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" @change="toggleIdentifyLedValue(row.item)" > <span v-if="row.item.identifyLed"> diff --git a/src/views/_sila/Overview/Inventory/InventoryTableDimmSlot.vue b/src/views/_sila/Overview/Inventory/InventoryTableDimmSlot.vue index f1858ae9..40c30d4c 100644 --- a/src/views/_sila/Overview/Inventory/InventoryTableDimmSlot.vue +++ b/src/views/_sila/Overview/Inventory/InventoryTableDimmSlot.vue @@ -52,19 +52,18 @@ </template> <!-- Toggle identify LED --> <template #cell(identifyLed)="row"> - <div class="disabledDiv"> - <b-form-checkbox - v-model="row.item.identifyLed" - name="switch" - switch - @change="toggleIdentifyLedValue(row.item)" - > - <span v-if="row.item.identifyLed"> - {{ $t('global.status.on') }} - </span> - <span v-else> {{ $t('global.status.off') }} </span> - </b-form-checkbox> - </div> + <b-form-checkbox + v-model="row.item.identifyLed" + name="switch" + switch + disabled + @change="toggleIdentifyLedValue(row.item)" + > + <span v-if="row.item.identifyLed"> + {{ $t('global.status.on') }} + </span> + <span v-else> {{ $t('global.status.off') }} </span> + </b-form-checkbox> </template> <template #row-details="{ item }"> <b-container fluid> diff --git a/src/views/_sila/Overview/Inventory/InventoryTableProcessors.vue b/src/views/_sila/Overview/Inventory/InventoryTableProcessors.vue index 27633495..ed9ca194 100644 --- a/src/views/_sila/Overview/Inventory/InventoryTableProcessors.vue +++ b/src/views/_sila/Overview/Inventory/InventoryTableProcessors.vue @@ -59,6 +59,7 @@ v-model="row.item.identifyLed" name="switch" switch + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" @change="toggleIdentifyLedValue(row.item)" > <span v-if="row.item.identifyLed"> diff --git a/src/views/_sila/Overview/Inventory/InventoryTableSystem.vue b/src/views/_sila/Overview/Inventory/InventoryTableSystem.vue index eacc4a06..286df969 100644 --- a/src/views/_sila/Overview/Inventory/InventoryTableSystem.vue +++ b/src/views/_sila/Overview/Inventory/InventoryTableSystem.vue @@ -35,6 +35,7 @@ v-model="item.locationIndicatorActive" data-test-id="inventorySystem-toggle-identifyLed" switch + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" @change="toggleIdentifyLedSwitch" > <span v-if="item.locationIndicatorActive"> diff --git a/src/views/_sila/Overview/Network/NetworkGlobalSettings.vue b/src/views/_sila/Overview/Network/NetworkGlobalSettings.vue index 44035ae6..6a08c2c2 100644 --- a/src/views/_sila/Overview/Network/NetworkGlobalSettings.vue +++ b/src/views/_sila/Overview/Network/NetworkGlobalSettings.vue @@ -8,7 +8,12 @@ <dl> <dt> {{ $t('pageNetwork.hostname') }} - <b-button variant="link" class="p-1" @click="initSettingsModal()"> + <b-button + variant="link" + class="p-1" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" + @click="initSettingsModal()" + > <icon-edit :title="$t('pageNetwork.modal.editHostnameTitle')" /> </b-button> </dt> @@ -24,6 +29,7 @@ v-model="useDomainNameState" data-test-id="networkSettings-switch-useDomainName" switch + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" @change="changeDomainNameState" > <span v-if="useDomainNameState"> @@ -43,6 +49,7 @@ v-model="useDnsState" data-test-id="networkSettings-switch-useDns" switch + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" @change="changeDnsState" > <span v-if="useDnsState"> @@ -62,6 +69,7 @@ v-model="useNtpState" data-test-id="networkSettings-switch-useNtp" switch + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" @change="changeNtpState" > <span v-if="useNtpState"> diff --git a/src/views/_sila/Overview/Network/NetworkInterfaceSettings.vue b/src/views/_sila/Overview/Network/NetworkInterfaceSettings.vue index 657a2270..6eccb455 100644 --- a/src/views/_sila/Overview/Network/NetworkInterfaceSettings.vue +++ b/src/views/_sila/Overview/Network/NetworkInterfaceSettings.vue @@ -39,6 +39,7 @@ <b-button variant="link" class="p-1" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" @click="initMacAddressModal()" > <icon-edit diff --git a/src/views/_sila/Overview/Network/TableDns.vue b/src/views/_sila/Overview/Network/TableDns.vue index ee830ee4..e522d69b 100644 --- a/src/views/_sila/Overview/Network/TableDns.vue +++ b/src/views/_sila/Overview/Network/TableDns.vue @@ -3,7 +3,11 @@ <b-row> <b-col> <div class="text-right"> - <b-button variant="primary" @click="initDnsModal()"> + <b-button + variant="primary" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" + @click="initDnsModal()" + > <icon-add /> {{ $t('pageNetwork.table.addDnsAddress') }} </b-button> diff --git a/src/views/_sila/Overview/Network/TableIpv4.vue b/src/views/_sila/Overview/Network/TableIpv4.vue index 2fa3d1f3..4cdc6a92 100644 --- a/src/views/_sila/Overview/Network/TableIpv4.vue +++ b/src/views/_sila/Overview/Network/TableIpv4.vue @@ -7,7 +7,11 @@ </h3> </b-col> <b-col class="text-right"> - <b-button variant="primary" @click="initAddIpv4Address()"> + <b-button + variant="primary" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" + @click="initAddIpv4Address()" + > <icon-add /> {{ $t('pageNetwork.table.addIpv4Address') }} </b-button> diff --git a/src/views/_sila/Overview/OverviewInventory.vue b/src/views/_sila/Overview/OverviewInventory.vue index 575cb7b7..bc0fd69e 100644 --- a/src/views/_sila/Overview/OverviewInventory.vue +++ b/src/views/_sila/Overview/OverviewInventory.vue @@ -13,6 +13,7 @@ v-model="systems.locationIndicatorActive" data-test-id="overviewInventory-checkbox-identifyLed" switch + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" @change="toggleIdentifyLedSwitch" > <span v-if="systems.locationIndicatorActive"> diff --git a/src/views/_sila/ResourceManagement/Power.vue b/src/views/_sila/ResourceManagement/Power.vue index 3c1e6412..db1104e6 100644 --- a/src/views/_sila/ResourceManagement/Power.vue +++ b/src/views/_sila/ResourceManagement/Power.vue @@ -26,6 +26,7 @@ v-model="isPowerCapFieldEnabled" data-test-id="power-checkbox-togglePowerCapField" name="power-cap-setting" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" > {{ $t('pagePower.powerCapSettingData') }} </b-form-checkbox> @@ -52,7 +53,10 @@ <b-form-input id="input-1" v-model.number="powerCapValue" - :disabled="!isPowerCapFieldEnabled" + :disabled=" + !isPowerCapFieldEnabled || + $store.getters['authentication/role'] === 'ReadOnly' + " data-test-id="power-input-powerCapValue" type="number" aria-describedby="power-help-text" @@ -75,6 +79,7 @@ variant="primary" type="submit" data-test-id="power-button-savePowerCapValue" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" > {{ $t('global.action.save') }} </b-button> diff --git a/src/views/_sila/SecurityAndAccess/Certificates/Certificates.vue b/src/views/_sila/SecurityAndAccess/Certificates/Certificates.vue index 27950b76..cdfb1e47 100644 --- a/src/views/_sila/SecurityAndAccess/Certificates/Certificates.vue +++ b/src/views/_sila/SecurityAndAccess/Certificates/Certificates.vue @@ -37,13 +37,17 @@ v-b-modal.generate-csr data-test-id="certificates-button-generateCsr" variant="link" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" > <icon-add /> {{ $t('pageCertificates.generateCsr') }} </b-button> <b-button variant="primary" - :disabled="certificatesForUpload.length === 0" + :disabled=" + certificatesForUpload.length === 0 || + $store.getters['authentication/role'] === 'ReadOnly' + " @click="initModalUploadCertificate(null)" > <icon-add /> @@ -81,6 +85,11 @@ :value="action.value" :title="action.title" :enabled="action.enabled" + :class="{ + disabledDiv: + $store.getters['authentication/role'] === 'ReadOnly' && + (action.value === 'delete' || action.value === 'replace'), + }" @click-table-action="onTableRowAction($event, item)" > <template #icon> diff --git a/src/views/_sila/SecurityAndAccess/Ldap/Ldap.vue b/src/views/_sila/SecurityAndAccess/Ldap/Ldap.vue index 6800ead5..12584fac 100644 --- a/src/views/_sila/SecurityAndAccess/Ldap/Ldap.vue +++ b/src/views/_sila/SecurityAndAccess/Ldap/Ldap.vue @@ -13,6 +13,7 @@ <b-form-checkbox v-model="form.ldapAuthenticationEnabled" data-test-id="ldap-checkbox-ldapAuthenticationEnabled" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" @change="onChangeldapAuthenticationEnabled" > {{ $t('global.action.enable') }} @@ -42,7 +43,9 @@ aria-describedby="enable-secure-help-block" data-test-id="ldap-checkbox-secureLdapEnabled" :disabled=" - !caCertificateExpiration || !ldapCertificateExpiration + !caCertificateExpiration || + !ldapCertificateExpiration || + $store.getters['authentication/role'] === 'ReadOnly' " @change="$v.form.secureLdapEnabled.$touch()" > @@ -76,6 +79,9 @@ v-model="form.activeDirectoryEnabled" data-test-id="ldap-radio-activeDirectoryEnabled" :value="false" + :disabled=" + $store.getters['authentication/role'] === 'ReadOnly' + " @change="onChangeServiceType" > OpenLDAP @@ -84,6 +90,9 @@ v-model="form.activeDirectoryEnabled" data-test-id="ldap-radio-activeDirectoryEnabled" :value="true" + :disabled=" + $store.getters['authentication/role'] === 'ReadOnly' + " @change="onChangeServiceType" > Active Directory @@ -106,6 +115,9 @@ v-model="form.serverUri" data-test-id="ldap-input-serverUri" :state="getValidationState($v.form.serverUri)" + :disabled=" + $store.getters['authentication/role'] === 'ReadOnly' + " @change="$v.form.serverUri.$touch()" /> <b-form-invalid-feedback role="alert"> @@ -124,6 +136,9 @@ v-model="form.bindDn" data-test-id="ldap-input-bindDn" :state="getValidationState($v.form.bindDn)" + :disabled=" + $store.getters['authentication/role'] === 'ReadOnly' + " @change="$v.form.bindDn.$touch()" /> <b-form-invalid-feedback role="alert"> @@ -145,6 +160,9 @@ type="password" :state="getValidationState($v.form.bindPassword)" class="form-control-with-button" + :disabled=" + $store.getters['authentication/role'] === 'ReadOnly' + " @change="$v.form.bindPassword.$touch()" /> <b-form-invalid-feedback role="alert"> @@ -163,6 +181,9 @@ v-model="form.baseDn" data-test-id="ldap-input-baseDn" :state="getValidationState($v.form.baseDn)" + :disabled=" + $store.getters['authentication/role'] === 'ReadOnly' + " @change="$v.form.baseDn.$touch()" /> <b-form-invalid-feedback role="alert"> @@ -182,6 +203,9 @@ id="user-id-attribute" v-model="form.userIdAttribute" data-test-id="ldap-input-userIdAttribute" + :disabled=" + $store.getters['authentication/role'] === 'ReadOnly' + " @change="$v.form.userIdAttribute.$touch()" /> </b-form-group> @@ -198,6 +222,9 @@ id="group-id-attribute" v-model="form.groupIdAttribute" data-test-id="ldap-input-groupIdAttribute" + :disabled=" + $store.getters['authentication/role'] === 'ReadOnly' + " @change="$v.form.groupIdAttribute.$touch()" /> </b-form-group> @@ -213,7 +240,9 @@ variant="primary" type="submit" data-test-id="ldap-button-saveSettings" - :disabled="loading" + :disabled=" + loading || $store.getters['authentication/role'] === 'ReadOnly' + " > {{ $t('global.action.saveSettings') }} </b-btn> diff --git a/src/views/_sila/SecurityAndAccess/Ldap/TableRoleGroups.vue b/src/views/_sila/SecurityAndAccess/Ldap/TableRoleGroups.vue index ca52da13..6168ae63 100644 --- a/src/views/_sila/SecurityAndAccess/Ldap/TableRoleGroups.vue +++ b/src/views/_sila/SecurityAndAccess/Ldap/TableRoleGroups.vue @@ -11,7 +11,10 @@ <b-col class="text-right" md="9"> <b-btn variant="primary" - :disabled="!isServiceEnabled" + :disabled=" + !isServiceEnabled || + $store.getters['authentication/role'] === 'ReadOnly' + " @click="initRoleGroupModal(null)" > <icon-add /> diff --git a/src/views/_sila/SecurityAndAccess/Policies/Policies.vue b/src/views/_sila/SecurityAndAccess/Policies/Policies.vue index 0de80de2..8e690557 100644 --- a/src/views/_sila/SecurityAndAccess/Policies/Policies.vue +++ b/src/views/_sila/SecurityAndAccess/Policies/Policies.vue @@ -16,6 +16,7 @@ v-model="sshProtocolState" data-test-id="policies-toggle-bmcShell" switch + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" @change="changeSshProtocolState" > <span class="sr-only"> @@ -41,6 +42,7 @@ v-model="ipmiProtocolState" data-test-id="polices-toggle-networkIpmi" switch + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" @change="changeIpmiProtocolState" > <span class="sr-only"> @@ -66,6 +68,7 @@ v-model="vtpmState" data-test-id="policies-toggle-vtpm" switch + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" @change="changeVtpmState" > <span class="sr-only"> @@ -91,6 +94,7 @@ v-model="rtadState" data-test-id="policies-toggle-rtad" switch + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" @change="changeRtadState" > <span class="sr-only"> diff --git a/src/views/_sila/SecurityAndAccess/UserManagement/UserManagement.vue b/src/views/_sila/SecurityAndAccess/UserManagement/UserManagement.vue index ae8c5209..e65b00df 100644 --- a/src/views/_sila/SecurityAndAccess/UserManagement/UserManagement.vue +++ b/src/views/_sila/SecurityAndAccess/UserManagement/UserManagement.vue @@ -3,13 +3,18 @@ <page-title /> <b-row> <b-col xl="9" class="text-right"> - <b-button variant="link" @click="initModalSettings"> + <b-button + variant="link" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" + @click="initModalSettings" + > <icon-settings /> {{ $t('pageUserManagement.accountPolicySettings') }} </b-button> <b-button variant="primary" data-test-id="userManagement-button-addUser" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" @click="initModalUser(null)" > <icon-add /> @@ -68,6 +73,11 @@ :value="action.value" :enabled="action.enabled" :title="action.title" + :class="{ + disabledDiv: + $store.getters['authentication/role'] === 'ReadOnly' && + (action.value === 'delete' || action.value === 'edit'), + }" @click-table-action="onTableRowAction($event, item)" > <template #icon> diff --git a/src/views/_sila/Settings/PowerRestorePolicy/PowerRestorePolicy.vue b/src/views/_sila/Settings/PowerRestorePolicy/PowerRestorePolicy.vue index c357d47a..ec6f332f 100644 --- a/src/views/_sila/Settings/PowerRestorePolicy/PowerRestorePolicy.vue +++ b/src/views/_sila/Settings/PowerRestorePolicy/PowerRestorePolicy.vue @@ -9,12 +9,18 @@ v-model="currentPowerRestorePolicy" :options="options" name="power-restore-policy" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" ></b-form-radio-group> </b-form-group> </b-col> </b-row> - <b-button variant="primary" type="submit" @click="submitForm"> + <b-button + variant="primary" + type="submit" + :disabled="$store.getters['authentication/role'] === 'ReadOnly'" + @click="submitForm" + > {{ $t('global.action.saveSettings') }} </b-button> </b-container> |