mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-08 20:28:16 +00:00
feat(secret-rotation): changed to mysql2 client and refactored queue util functions
This commit is contained in:
Generated
+143
-93
@@ -46,7 +46,7 @@
|
|||||||
"libsodium-wrappers": "^0.7.10",
|
"libsodium-wrappers": "^0.7.10",
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"mongoose": "^7.4.1",
|
"mongoose": "^7.4.1",
|
||||||
"mysql": "^2.18.1",
|
"mysql2": "^3.6.2",
|
||||||
"nanoid": "^3.3.6",
|
"nanoid": "^3.3.6",
|
||||||
"node-cache": "^5.1.2",
|
"node-cache": "^5.1.2",
|
||||||
"nodemailer": "^6.8.0",
|
"nodemailer": "^6.8.0",
|
||||||
@@ -82,7 +82,6 @@
|
|||||||
"@types/jmespath": "^0.15.1",
|
"@types/jmespath": "^0.15.1",
|
||||||
"@types/jsonwebtoken": "^8.5.9",
|
"@types/jsonwebtoken": "^8.5.9",
|
||||||
"@types/lodash": "^4.14.191",
|
"@types/lodash": "^4.14.191",
|
||||||
"@types/mysql": "^2.15.23",
|
|
||||||
"@types/node": "^18.11.3",
|
"@types/node": "^18.11.3",
|
||||||
"@types/nodemailer": "^6.4.6",
|
"@types/nodemailer": "^6.4.6",
|
||||||
"@types/passport": "^1.0.12",
|
"@types/passport": "^1.0.12",
|
||||||
@@ -5925,15 +5924,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz",
|
"resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz",
|
||||||
"integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA=="
|
"integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA=="
|
||||||
},
|
},
|
||||||
"node_modules/@types/mysql": {
|
|
||||||
"version": "2.15.23",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.23.tgz",
|
|
||||||
"integrity": "sha512-l3mEJpU1VNkt7uJP2vYWZrfjxlzQtwJNKSWe+7sgChuDjFoyRfu263f9pBDlhFPmyda23o8GNGq6FL5CHSd/QA==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"@types/node": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@types/node": {
|
"node_modules/@types/node": {
|
||||||
"version": "18.16.19",
|
"version": "18.16.19",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.19.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.19.tgz",
|
||||||
@@ -7011,14 +7001,6 @@
|
|||||||
"@juanelas/base64": "^1.1.2"
|
"@juanelas/base64": "^1.1.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/bignumber.js": {
|
|
||||||
"version": "9.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz",
|
|
||||||
"integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==",
|
|
||||||
"engines": {
|
|
||||||
"node": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/binary-extensions": {
|
"node_modules/binary-extensions": {
|
||||||
"version": "2.2.0",
|
"version": "2.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
|
||||||
@@ -8760,6 +8742,14 @@
|
|||||||
"node": ">=10"
|
"node": ">=10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/generate-function": {
|
||||||
|
"version": "2.3.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
|
||||||
|
"integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"is-property": "^1.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/gensync": {
|
"node_modules/gensync": {
|
||||||
"version": "1.0.0-beta.2",
|
"version": "1.0.0-beta.2",
|
||||||
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
|
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
|
||||||
@@ -9435,6 +9425,11 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/is-property": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
|
||||||
|
"integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g=="
|
||||||
|
},
|
||||||
"node_modules/is-retry-allowed": {
|
"node_modules/is-retry-allowed": {
|
||||||
"version": "2.2.0",
|
"version": "2.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz",
|
||||||
@@ -10861,45 +10856,76 @@
|
|||||||
"@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.2"
|
"@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/mysql": {
|
"node_modules/mysql2": {
|
||||||
"version": "2.18.1",
|
"version": "3.6.2",
|
||||||
"resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz",
|
"resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.2.tgz",
|
||||||
"integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==",
|
"integrity": "sha512-m5erE6bMoWfPXW1D5UrVwlT8PowAoSX69KcZzPuARQ3wY1RJ52NW9PdvdPo076XiSIkQ5IBTis7hxdlrQTlyug==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"bignumber.js": "9.0.0",
|
"denque": "^2.1.0",
|
||||||
"readable-stream": "2.3.7",
|
"generate-function": "^2.3.1",
|
||||||
"safe-buffer": "5.1.2",
|
"iconv-lite": "^0.6.3",
|
||||||
"sqlstring": "2.3.1"
|
"long": "^5.2.1",
|
||||||
|
"lru-cache": "^8.0.0",
|
||||||
|
"named-placeholders": "^1.1.3",
|
||||||
|
"seq-queue": "^0.0.5",
|
||||||
|
"sqlstring": "^2.3.2"
|
||||||
},
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 8.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/mysql2/node_modules/denque": {
|
||||||
|
"version": "2.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
|
||||||
|
"integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.10"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/mysql2/node_modules/iconv-lite": {
|
||||||
|
"version": "0.6.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
|
||||||
|
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
|
||||||
|
"dependencies": {
|
||||||
|
"safer-buffer": ">= 2.1.2 < 3.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.10.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/mysql2/node_modules/lru-cache": {
|
||||||
|
"version": "8.0.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz",
|
||||||
|
"integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=16.14"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/mysql2/node_modules/sqlstring": {
|
||||||
|
"version": "2.3.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
|
||||||
|
"integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.6"
|
"node": ">= 0.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/mysql/node_modules/readable-stream": {
|
"node_modules/named-placeholders": {
|
||||||
"version": "2.3.7",
|
"version": "1.1.3",
|
||||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
|
"resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz",
|
||||||
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
|
"integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"core-util-is": "~1.0.0",
|
"lru-cache": "^7.14.1"
|
||||||
"inherits": "~2.0.3",
|
},
|
||||||
"isarray": "~1.0.0",
|
"engines": {
|
||||||
"process-nextick-args": "~2.0.0",
|
"node": ">=12.0.0"
|
||||||
"safe-buffer": "~5.1.1",
|
|
||||||
"string_decoder": "~1.1.1",
|
|
||||||
"util-deprecate": "~1.0.1"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/mysql/node_modules/safe-buffer": {
|
"node_modules/named-placeholders/node_modules/lru-cache": {
|
||||||
"version": "5.1.2",
|
"version": "7.18.3",
|
||||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
|
||||||
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
|
"integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
|
||||||
},
|
"engines": {
|
||||||
"node_modules/mysql/node_modules/string_decoder": {
|
"node": ">=12"
|
||||||
"version": "1.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
|
|
||||||
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
|
||||||
"dependencies": {
|
|
||||||
"safe-buffer": "~5.1.0"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/nanoid": {
|
"node_modules/nanoid": {
|
||||||
@@ -15588,6 +15614,11 @@
|
|||||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
|
||||||
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
|
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
|
||||||
},
|
},
|
||||||
|
"node_modules/seq-queue": {
|
||||||
|
"version": "0.0.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz",
|
||||||
|
"integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="
|
||||||
|
},
|
||||||
"node_modules/serve-static": {
|
"node_modules/serve-static": {
|
||||||
"version": "1.15.0",
|
"version": "1.15.0",
|
||||||
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
|
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
|
||||||
@@ -21688,15 +21719,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz",
|
"resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz",
|
||||||
"integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA=="
|
"integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA=="
|
||||||
},
|
},
|
||||||
"@types/mysql": {
|
|
||||||
"version": "2.15.23",
|
|
||||||
"resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.23.tgz",
|
|
||||||
"integrity": "sha512-l3mEJpU1VNkt7uJP2vYWZrfjxlzQtwJNKSWe+7sgChuDjFoyRfu263f9pBDlhFPmyda23o8GNGq6FL5CHSd/QA==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"@types/node": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@types/node": {
|
"@types/node": {
|
||||||
"version": "18.16.19",
|
"version": "18.16.19",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.19.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.19.tgz",
|
||||||
@@ -22528,11 +22550,6 @@
|
|||||||
"@juanelas/base64": "^1.1.2"
|
"@juanelas/base64": "^1.1.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"bignumber.js": {
|
|
||||||
"version": "9.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz",
|
|
||||||
"integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A=="
|
|
||||||
},
|
|
||||||
"binary-extensions": {
|
"binary-extensions": {
|
||||||
"version": "2.2.0",
|
"version": "2.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
|
||||||
@@ -23830,6 +23847,14 @@
|
|||||||
"wide-align": "^1.1.2"
|
"wide-align": "^1.1.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"generate-function": {
|
||||||
|
"version": "2.3.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
|
||||||
|
"integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
|
||||||
|
"requires": {
|
||||||
|
"is-property": "^1.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"gensync": {
|
"gensync": {
|
||||||
"version": "1.0.0-beta.2",
|
"version": "1.0.0-beta.2",
|
||||||
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
|
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
|
||||||
@@ -24306,6 +24331,11 @@
|
|||||||
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
|
||||||
"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
|
"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
|
||||||
},
|
},
|
||||||
|
"is-property": {
|
||||||
|
"version": "1.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
|
||||||
|
"integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g=="
|
||||||
|
},
|
||||||
"is-retry-allowed": {
|
"is-retry-allowed": {
|
||||||
"version": "2.2.0",
|
"version": "2.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz",
|
||||||
@@ -25391,43 +25421,58 @@
|
|||||||
"node-gyp-build-optional-packages": "5.0.7"
|
"node-gyp-build-optional-packages": "5.0.7"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mysql": {
|
"mysql2": {
|
||||||
"version": "2.18.1",
|
"version": "3.6.2",
|
||||||
"resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz",
|
"resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.6.2.tgz",
|
||||||
"integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==",
|
"integrity": "sha512-m5erE6bMoWfPXW1D5UrVwlT8PowAoSX69KcZzPuARQ3wY1RJ52NW9PdvdPo076XiSIkQ5IBTis7hxdlrQTlyug==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"bignumber.js": "9.0.0",
|
"denque": "^2.1.0",
|
||||||
"readable-stream": "2.3.7",
|
"generate-function": "^2.3.1",
|
||||||
"safe-buffer": "5.1.2",
|
"iconv-lite": "^0.6.3",
|
||||||
"sqlstring": "2.3.1"
|
"long": "^5.2.1",
|
||||||
|
"lru-cache": "^8.0.0",
|
||||||
|
"named-placeholders": "^1.1.3",
|
||||||
|
"seq-queue": "^0.0.5",
|
||||||
|
"sqlstring": "^2.3.2"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"readable-stream": {
|
"denque": {
|
||||||
"version": "2.3.7",
|
"version": "2.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
|
"resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
|
||||||
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
|
"integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="
|
||||||
|
},
|
||||||
|
"iconv-lite": {
|
||||||
|
"version": "0.6.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
|
||||||
|
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"core-util-is": "~1.0.0",
|
"safer-buffer": ">= 2.1.2 < 3.0.0"
|
||||||
"inherits": "~2.0.3",
|
|
||||||
"isarray": "~1.0.0",
|
|
||||||
"process-nextick-args": "~2.0.0",
|
|
||||||
"safe-buffer": "~5.1.1",
|
|
||||||
"string_decoder": "~1.1.1",
|
|
||||||
"util-deprecate": "~1.0.1"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"safe-buffer": {
|
"lru-cache": {
|
||||||
"version": "5.1.2",
|
"version": "8.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz",
|
||||||
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
|
"integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA=="
|
||||||
},
|
},
|
||||||
"string_decoder": {
|
"sqlstring": {
|
||||||
"version": "1.1.1",
|
"version": "2.3.3",
|
||||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
|
||||||
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
"integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg=="
|
||||||
"requires": {
|
}
|
||||||
"safe-buffer": "~5.1.0"
|
}
|
||||||
}
|
},
|
||||||
|
"named-placeholders": {
|
||||||
|
"version": "1.1.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz",
|
||||||
|
"integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==",
|
||||||
|
"requires": {
|
||||||
|
"lru-cache": "^7.14.1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"lru-cache": {
|
||||||
|
"version": "7.18.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
|
||||||
|
"integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -28839,6 +28884,11 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"seq-queue": {
|
||||||
|
"version": "0.0.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz",
|
||||||
|
"integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="
|
||||||
|
},
|
||||||
"serve-static": {
|
"serve-static": {
|
||||||
"version": "1.15.0",
|
"version": "1.15.0",
|
||||||
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
|
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
"libsodium-wrappers": "^0.7.10",
|
"libsodium-wrappers": "^0.7.10",
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"mongoose": "^7.4.1",
|
"mongoose": "^7.4.1",
|
||||||
"mysql": "^2.18.1",
|
"mysql2": "^3.6.2",
|
||||||
"nanoid": "^3.3.6",
|
"nanoid": "^3.3.6",
|
||||||
"node-cache": "^5.1.2",
|
"node-cache": "^5.1.2",
|
||||||
"nodemailer": "^6.8.0",
|
"nodemailer": "^6.8.0",
|
||||||
@@ -105,7 +105,6 @@
|
|||||||
"@types/jmespath": "^0.15.1",
|
"@types/jmespath": "^0.15.1",
|
||||||
"@types/jsonwebtoken": "^8.5.9",
|
"@types/jsonwebtoken": "^8.5.9",
|
||||||
"@types/lodash": "^4.14.191",
|
"@types/lodash": "^4.14.191",
|
||||||
"@types/mysql": "^2.15.23",
|
|
||||||
"@types/node": "^18.11.3",
|
"@types/node": "^18.11.3",
|
||||||
"@types/nodemailer": "^6.4.6",
|
"@types/nodemailer": "^6.4.6",
|
||||||
"@types/passport": "^1.0.12",
|
"@types/passport": "^1.0.12",
|
||||||
|
|||||||
+17
-175
@@ -1,191 +1,33 @@
|
|||||||
import axios from "axios";
|
|
||||||
import Queue, { Job } from "bull";
|
import Queue, { Job } from "bull";
|
||||||
import jmespath from "jmespath";
|
import { client, getEncryptionKey, getRootEncryptionKey } from "../../../config";
|
||||||
import { customAlphabet } from "nanoid";
|
import { BotService, EventService, TelemetryService } from "../../../services";
|
||||||
import { Client as PgClient } from "pg";
|
import { SecretRotation } from "../models";
|
||||||
import mysql from "mysql";
|
import { rotationTemplates } from "../templates";
|
||||||
|
|
||||||
import { client, getEncryptionKey, getRootEncryptionKey } from "../../config";
|
|
||||||
import { BotService, EventService, TelemetryService } from "../../services";
|
|
||||||
import { SecretRotation } from "./models";
|
|
||||||
import { rotationTemplates } from "./templates";
|
|
||||||
import {
|
import {
|
||||||
ISecretRotationData,
|
ISecretRotationData,
|
||||||
ISecretRotationEncData,
|
ISecretRotationEncData,
|
||||||
ISecretRotationProviderTemplate,
|
ISecretRotationProviderTemplate,
|
||||||
TAssignOp,
|
|
||||||
TDbProviderClients,
|
|
||||||
TDbProviderFunction,
|
|
||||||
TDirectAssignOp,
|
|
||||||
THttpProviderFunction,
|
|
||||||
TProviderFunction,
|
|
||||||
TProviderFunctionTypes
|
TProviderFunctionTypes
|
||||||
} from "./types";
|
} from "../types";
|
||||||
import {
|
import {
|
||||||
decryptSymmetric128BitHexKeyUTF8,
|
decryptSymmetric128BitHexKeyUTF8,
|
||||||
encryptSymmetric128BitHexKeyUTF8
|
encryptSymmetric128BitHexKeyUTF8
|
||||||
} from "../../utils/crypto";
|
} from "../../../utils/crypto";
|
||||||
import { ISecret, Secret } from "../../models";
|
import { ISecret, Secret } from "../../../models";
|
||||||
import { ENCODING_SCHEME_BASE64, ENCODING_SCHEME_UTF8, SECRET_SHARED } from "../../variables";
|
import { ENCODING_SCHEME_BASE64, ENCODING_SCHEME_UTF8, SECRET_SHARED } from "../../../variables";
|
||||||
import { EESecretService } from "../services";
|
import { EESecretService } from "../../services";
|
||||||
import { SecretVersion } from "../models";
|
import { SecretVersion } from "../../models";
|
||||||
import { eventPushSecrets } from "../../events";
|
import { eventPushSecrets } from "../../../events";
|
||||||
|
|
||||||
const REGEX = /\${([^}]+)}/g;
|
import {
|
||||||
const SLUG_ALPHABETS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
secretRotationPreSetFn,
|
||||||
const nanoId = customAlphabet(SLUG_ALPHABETS, 10);
|
secretRotationRemoveFn,
|
||||||
|
secretRotationSetFn,
|
||||||
|
secretRotationTestFn
|
||||||
|
} from "./queue.utils";
|
||||||
|
|
||||||
const secretRotationQueue = new Queue("secret-rotation-service", process.env.REDIS_URL as string);
|
const secretRotationQueue = new Queue("secret-rotation-service", process.env.REDIS_URL as string);
|
||||||
|
|
||||||
const interpolate = (data: any, getValue: (key: string) => unknown) => {
|
|
||||||
if (!data) return;
|
|
||||||
|
|
||||||
if (typeof data === "number") return data;
|
|
||||||
|
|
||||||
if (typeof data === "string") {
|
|
||||||
return data.replace(REGEX, (_a, b) => getValue(b) as string);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof data === "object" && Array.isArray(data)) {
|
|
||||||
data.forEach((el, index) => {
|
|
||||||
data[index] = interpolate(el, getValue);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof data === "object") {
|
|
||||||
if ((data as { ref: string })?.ref) return getValue((data as { ref: string }).ref);
|
|
||||||
const temp = data as Record<string, unknown>; // for converting ts object to record type
|
|
||||||
Object.keys(temp).forEach((key) => {
|
|
||||||
temp[key as keyof typeof temp] = interpolate(data[key as keyof typeof temp], getValue);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return data;
|
|
||||||
};
|
|
||||||
|
|
||||||
const getInterpolationValue = (variables: ISecretRotationData) => (key: string) => {
|
|
||||||
if (key.includes("|")) {
|
|
||||||
const [keyword, ...arg] = key.split("|").map((el) => el.trim());
|
|
||||||
switch (keyword) {
|
|
||||||
case "random": {
|
|
||||||
return nanoId(parseInt(arg[0], 10));
|
|
||||||
}
|
|
||||||
default: {
|
|
||||||
throw Error(`Interpolation key not found - ${key}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const [type, keyName] = key.split(".").map((el) => el.trim());
|
|
||||||
return variables[type as keyof ISecretRotationData][keyName];
|
|
||||||
};
|
|
||||||
|
|
||||||
const secretRotationHttpFn = async (
|
|
||||||
func: THttpProviderFunction,
|
|
||||||
variables: ISecretRotationData
|
|
||||||
) => {
|
|
||||||
// string interpolation
|
|
||||||
const headers = interpolate(func.header, getInterpolationValue(variables));
|
|
||||||
const url = interpolate(func.url, getInterpolationValue(variables));
|
|
||||||
const body = interpolate(func.body, getInterpolationValue(variables));
|
|
||||||
// axios will automatically throw error if req status is not between 2xx range
|
|
||||||
return axios({ method: func.method, url, headers, data: body });
|
|
||||||
};
|
|
||||||
|
|
||||||
const secretRotationDbFn = async (func: TDbProviderFunction, variables: ISecretRotationData) => {
|
|
||||||
const { type, client, pre, ...dbConnection } = func;
|
|
||||||
const { username, password, host, database, port, query, ca } = interpolate(
|
|
||||||
dbConnection,
|
|
||||||
getInterpolationValue(variables)
|
|
||||||
);
|
|
||||||
const ssl = ca ? { rejectUnauthorized: false, ca } : undefined;
|
|
||||||
if (host === "localhost" || host === "127.0.0.1") throw new Error("Invalid db host");
|
|
||||||
if (client === TDbProviderClients.Pg) {
|
|
||||||
const pgClient = new PgClient({ user: username, password, host, database, port, ssl });
|
|
||||||
await pgClient.connect();
|
|
||||||
const res = await pgClient.query(query);
|
|
||||||
await pgClient.end();
|
|
||||||
return res.rows[0];
|
|
||||||
} else if (client === TDbProviderClients.Sql) {
|
|
||||||
const sqlClient = mysql.createPool({
|
|
||||||
user: username,
|
|
||||||
password,
|
|
||||||
host,
|
|
||||||
database,
|
|
||||||
port,
|
|
||||||
connectionLimit: 1,
|
|
||||||
ssl
|
|
||||||
});
|
|
||||||
const res = await new Promise((resolve, reject) => {
|
|
||||||
sqlClient.query(query, (err, data) => {
|
|
||||||
if (err) return reject(err);
|
|
||||||
resolve(data);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
await new Promise((resolve, reject) => {
|
|
||||||
sqlClient.end(function (err) {
|
|
||||||
if (err) return reject(err);
|
|
||||||
return resolve({});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
return (res as any)?.[0];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const secretRotationPreSetFn = (
|
|
||||||
op: Record<string, TDirectAssignOp>,
|
|
||||||
variables: ISecretRotationData
|
|
||||||
) => {
|
|
||||||
const getValFn = getInterpolationValue(variables);
|
|
||||||
Object.entries(op || {}).forEach(([key, assignFn]) => {
|
|
||||||
const [type, keyName] = key.split(".") as [keyof ISecretRotationData, string];
|
|
||||||
variables[type][keyName] = interpolate(assignFn.value, getValFn);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
const secretRotationSetFn = async (func: TProviderFunction, variables: ISecretRotationData) => {
|
|
||||||
const getValFn = getInterpolationValue(variables);
|
|
||||||
// http setter
|
|
||||||
if (func.type === TProviderFunctionTypes.HTTP) {
|
|
||||||
const res = await secretRotationHttpFn(func, variables);
|
|
||||||
Object.entries(func.setter || {}).forEach(([key, assignFn]) => {
|
|
||||||
const [type, keyName] = key.split(".") as [keyof ISecretRotationData, string];
|
|
||||||
if (assignFn.assign === TAssignOp.JmesPath) {
|
|
||||||
variables[type][keyName] = jmespath.search(res.data, assignFn.path);
|
|
||||||
} else if (assignFn.value) {
|
|
||||||
variables[type][keyName] = interpolate(assignFn.value, getValFn);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
// db setter
|
|
||||||
} else if (func.type === TProviderFunctionTypes.DB) {
|
|
||||||
const data = await secretRotationDbFn(func, variables);
|
|
||||||
Object.entries(func.setter || {}).forEach(([key, assignFn]) => {
|
|
||||||
const [type, keyName] = key.split(".") as [keyof ISecretRotationData, string];
|
|
||||||
if (assignFn.assign === TAssignOp.JmesPath) {
|
|
||||||
if (typeof data === "object") {
|
|
||||||
variables[type][keyName] = jmespath.search(data, assignFn.path);
|
|
||||||
}
|
|
||||||
} else if (assignFn.value) {
|
|
||||||
variables[type][keyName] = interpolate(assignFn.value, getValFn);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const secretRotationTestFn = async (func: TProviderFunction, variables: ISecretRotationData) => {
|
|
||||||
if (func.type === TProviderFunctionTypes.HTTP) {
|
|
||||||
await secretRotationHttpFn(func, variables);
|
|
||||||
} else if (func.type === TProviderFunctionTypes.DB) {
|
|
||||||
await secretRotationDbFn(func, variables);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const secretRotationRemoveFn = async (func: TProviderFunction, variables: ISecretRotationData) => {
|
|
||||||
if (!func) return;
|
|
||||||
if (func.type === TProviderFunctionTypes.HTTP) {
|
|
||||||
// string interpolation
|
|
||||||
return await secretRotationHttpFn(func, variables);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
secretRotationQueue.process(async (job: Job) => {
|
secretRotationQueue.process(async (job: Job) => {
|
||||||
const rotationStratDocId = job.data.rotationDocId;
|
const rotationStratDocId = job.data.rotationDocId;
|
||||||
const secretRotation = await SecretRotation.findById(rotationStratDocId)
|
const secretRotation = await SecretRotation.findById(rotationStratDocId)
|
||||||
@@ -0,0 +1,179 @@
|
|||||||
|
import axios from "axios";
|
||||||
|
import jmespath from "jmespath";
|
||||||
|
import { customAlphabet } from "nanoid";
|
||||||
|
import { Client as PgClient } from "pg";
|
||||||
|
import mysql from "mysql2";
|
||||||
|
import {
|
||||||
|
ISecretRotationData,
|
||||||
|
TAssignOp,
|
||||||
|
TDbProviderClients,
|
||||||
|
TDbProviderFunction,
|
||||||
|
TDirectAssignOp,
|
||||||
|
THttpProviderFunction,
|
||||||
|
TProviderFunction,
|
||||||
|
TProviderFunctionTypes
|
||||||
|
} from "../types";
|
||||||
|
const REGEX = /\${([^}]+)}/g;
|
||||||
|
const SLUG_ALPHABETS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
||||||
|
const nanoId = customAlphabet(SLUG_ALPHABETS, 10);
|
||||||
|
|
||||||
|
export const interpolate = (data: any, getValue: (key: string) => unknown) => {
|
||||||
|
if (!data) return;
|
||||||
|
|
||||||
|
if (typeof data === "number") return data;
|
||||||
|
|
||||||
|
if (typeof data === "string") {
|
||||||
|
return data.replace(REGEX, (_a, b) => getValue(b) as string);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof data === "object" && Array.isArray(data)) {
|
||||||
|
data.forEach((el, index) => {
|
||||||
|
data[index] = interpolate(el, getValue);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof data === "object") {
|
||||||
|
if ((data as { ref: string })?.ref) return getValue((data as { ref: string }).ref);
|
||||||
|
const temp = data as Record<string, unknown>; // for converting ts object to record type
|
||||||
|
Object.keys(temp).forEach((key) => {
|
||||||
|
temp[key as keyof typeof temp] = interpolate(data[key as keyof typeof temp], getValue);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
};
|
||||||
|
|
||||||
|
const getInterpolationValue = (variables: ISecretRotationData) => (key: string) => {
|
||||||
|
if (key.includes("|")) {
|
||||||
|
const [keyword, ...arg] = key.split("|").map((el) => el.trim());
|
||||||
|
switch (keyword) {
|
||||||
|
case "random": {
|
||||||
|
return nanoId(parseInt(arg[0], 10));
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
throw Error(`Interpolation key not found - ${key}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const [type, keyName] = key.split(".").map((el) => el.trim());
|
||||||
|
return variables[type as keyof ISecretRotationData][keyName];
|
||||||
|
};
|
||||||
|
|
||||||
|
export const secretRotationHttpFn = async (
|
||||||
|
func: THttpProviderFunction,
|
||||||
|
variables: ISecretRotationData
|
||||||
|
) => {
|
||||||
|
// string interpolation
|
||||||
|
const headers = interpolate(func.header, getInterpolationValue(variables));
|
||||||
|
const url = interpolate(func.url, getInterpolationValue(variables));
|
||||||
|
const body = interpolate(func.body, getInterpolationValue(variables));
|
||||||
|
// axios will automatically throw error if req status is not between 2xx range
|
||||||
|
return axios({ method: func.method, url, headers, data: body });
|
||||||
|
};
|
||||||
|
|
||||||
|
export const secretRotationDbFn = async (
|
||||||
|
func: TDbProviderFunction,
|
||||||
|
variables: ISecretRotationData
|
||||||
|
) => {
|
||||||
|
const { type, client, pre, ...dbConnection } = func;
|
||||||
|
const { username, password, host, database, port, query, ca } = interpolate(
|
||||||
|
dbConnection,
|
||||||
|
getInterpolationValue(variables)
|
||||||
|
);
|
||||||
|
const ssl = ca ? { rejectUnauthorized: false, ca } : undefined;
|
||||||
|
if (host === "localhost" || host === "127.0.0.1") throw new Error("Invalid db host");
|
||||||
|
if (client === TDbProviderClients.Pg) {
|
||||||
|
const pgClient = new PgClient({ user: username, password, host, database, port, ssl });
|
||||||
|
await pgClient.connect();
|
||||||
|
const res = await pgClient.query(query);
|
||||||
|
await pgClient.end();
|
||||||
|
return res.rows[0];
|
||||||
|
} else if (client === TDbProviderClients.Sql) {
|
||||||
|
const sqlClient = mysql.createPool({
|
||||||
|
user: username,
|
||||||
|
password,
|
||||||
|
host,
|
||||||
|
database,
|
||||||
|
port,
|
||||||
|
connectionLimit: 1,
|
||||||
|
ssl
|
||||||
|
});
|
||||||
|
const res = await new Promise((resolve, reject) => {
|
||||||
|
sqlClient.query(query, (err, data) => {
|
||||||
|
if (err) return reject(err);
|
||||||
|
resolve(data);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
await new Promise((resolve, reject) => {
|
||||||
|
sqlClient.end(function (err) {
|
||||||
|
if (err) return reject(err);
|
||||||
|
return resolve({});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return (res as any)?.[0];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const secretRotationPreSetFn = (
|
||||||
|
op: Record<string, TDirectAssignOp>,
|
||||||
|
variables: ISecretRotationData
|
||||||
|
) => {
|
||||||
|
const getValFn = getInterpolationValue(variables);
|
||||||
|
Object.entries(op || {}).forEach(([key, assignFn]) => {
|
||||||
|
const [type, keyName] = key.split(".") as [keyof ISecretRotationData, string];
|
||||||
|
variables[type][keyName] = interpolate(assignFn.value, getValFn);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export const secretRotationSetFn = async (
|
||||||
|
func: TProviderFunction,
|
||||||
|
variables: ISecretRotationData
|
||||||
|
) => {
|
||||||
|
const getValFn = getInterpolationValue(variables);
|
||||||
|
// http setter
|
||||||
|
if (func.type === TProviderFunctionTypes.HTTP) {
|
||||||
|
const res = await secretRotationHttpFn(func, variables);
|
||||||
|
Object.entries(func.setter || {}).forEach(([key, assignFn]) => {
|
||||||
|
const [type, keyName] = key.split(".") as [keyof ISecretRotationData, string];
|
||||||
|
if (assignFn.assign === TAssignOp.JmesPath) {
|
||||||
|
variables[type][keyName] = jmespath.search(res.data, assignFn.path);
|
||||||
|
} else if (assignFn.value) {
|
||||||
|
variables[type][keyName] = interpolate(assignFn.value, getValFn);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// db setter
|
||||||
|
} else if (func.type === TProviderFunctionTypes.DB) {
|
||||||
|
const data = await secretRotationDbFn(func, variables);
|
||||||
|
Object.entries(func.setter || {}).forEach(([key, assignFn]) => {
|
||||||
|
const [type, keyName] = key.split(".") as [keyof ISecretRotationData, string];
|
||||||
|
if (assignFn.assign === TAssignOp.JmesPath) {
|
||||||
|
if (typeof data === "object") {
|
||||||
|
variables[type][keyName] = jmespath.search(data, assignFn.path);
|
||||||
|
}
|
||||||
|
} else if (assignFn.value) {
|
||||||
|
variables[type][keyName] = interpolate(assignFn.value, getValFn);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const secretRotationTestFn = async (
|
||||||
|
func: TProviderFunction,
|
||||||
|
variables: ISecretRotationData
|
||||||
|
) => {
|
||||||
|
if (func.type === TProviderFunctionTypes.HTTP) {
|
||||||
|
await secretRotationHttpFn(func, variables);
|
||||||
|
} else if (func.type === TProviderFunctionTypes.DB) {
|
||||||
|
await secretRotationDbFn(func, variables);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const secretRotationRemoveFn = async (
|
||||||
|
func: TProviderFunction,
|
||||||
|
variables: ISecretRotationData
|
||||||
|
) => {
|
||||||
|
if (!func) return;
|
||||||
|
if (func.type === TProviderFunctionTypes.HTTP) {
|
||||||
|
// string interpolation
|
||||||
|
return await secretRotationHttpFn(func, variables);
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -4,7 +4,7 @@ import { SecretRotation } from "./models";
|
|||||||
import { client, getEncryptionKey, getRootEncryptionKey } from "../../config";
|
import { client, getEncryptionKey, getRootEncryptionKey } from "../../config";
|
||||||
import { BadRequestError } from "../../utils/errors";
|
import { BadRequestError } from "../../utils/errors";
|
||||||
import Ajv from "ajv";
|
import Ajv from "ajv";
|
||||||
import { removeSecretRotationQueue, startSecretRotationQueue } from "./queue";
|
import { removeSecretRotationQueue, startSecretRotationQueue } from "./queue/queue";
|
||||||
import {
|
import {
|
||||||
ALGORITHM_AES_256_GCM,
|
ALGORITHM_AES_256_GCM,
|
||||||
ENCODING_SCHEME_BASE64,
|
ENCODING_SCHEME_BASE64,
|
||||||
|
|||||||
@@ -50,8 +50,7 @@ export const MYSQL_TEMPLATE = {
|
|||||||
database: "${inputs.database}",
|
database: "${inputs.database}",
|
||||||
port: "${inputs.port}",
|
port: "${inputs.port}",
|
||||||
ca: "${inputs.ca}",
|
ca: "${inputs.ca}",
|
||||||
query:
|
query: "ALTER USER ${internal.username} IDENTIFIED BY '${internal.rotated_password}'",
|
||||||
"ALTER USER ${internal.username} IDENTIFIED WITH mysql_native_password BY '${internal.rotated_password}'",
|
|
||||||
setter: {
|
setter: {
|
||||||
"outputs.db_username": {
|
"outputs.db_username": {
|
||||||
assign: TAssignOp.Direct as const,
|
assign: TAssignOp.Direct as const,
|
||||||
|
|||||||
Reference in New Issue
Block a user