Compare commits

..

13 Commits

Author SHA1 Message Date
JM Faircloth 0b1f582bde simplify more 2023-07-05 16:01:13 -05:00
JM Faircloth 32afcc7f20 remove unused var assignment 2023-07-05 14:33:14 -05:00
JM Faircloth d12e95ba40 remove comment 2023-07-05 13:21:29 -05:00
JM Faircloth 4ef647191c final cleanup 2023-07-05 12:58:41 -05:00
JM Faircloth 1a47f33407 fix test string format 2023-07-05 12:55:58 -05:00
JM Faircloth b239ef37f5 update test check 2023-07-05 12:52:39 -05:00
JM Faircloth ccc7cef6eb fix test string format 2023-07-05 12:49:58 -05:00
JM Faircloth 8e836c6e8e fix ordering of build steps 2023-07-05 12:45:57 -05:00
JM Faircloth a2cae737a3 add debug 2023-07-05 12:43:02 -05:00
JM Faircloth b536ec9ec6 add test cases 2023-07-05 12:39:34 -05:00
JM Faircloth e5605de996 fix lint and pass token to build 2023-07-05 12:30:19 -05:00
JM Faircloth 788264dddd add more tests 2023-07-05 12:25:38 -05:00
JM Faircloth a24b038252 fix secrets stored in JSON format 2023-07-03 15:57:28 -05:00
5 changed files with 58 additions and 19 deletions
-12
View File
@@ -2,18 +2,6 @@
* Add changes here
## 2.7.3 (July 13, 2023)
Bugs:
* Revert to the handling of secrets in JSON format since v2.1.2 [GH-478](https://github.com/hashicorp/vault-action/pull/478)
## 2.7.2 (July 6, 2023)
Bugs:
* Fix a regression that broke support for secrets in JSON format [GH-473](https://github.com/hashicorp/vault-action/pull/473)
## 2.7.1 (July 3, 2023)
Bugs:
+2 -4
View File
@@ -19004,13 +19004,12 @@ async function getSecrets(secretRequests, client) {
/**
* Uses a Jsonata selector retrieve a bit of data from the result
* @param {object} data
* @param {string} selector
* @param {object} data
* @param {string} selector
*/
async function selectData(data, selector) {
const ata = jsonata(selector);
let result = JSON.stringify(await ata.evaluate(data));
// Compat for custom engines
if (!result && ((ata.ast().type === "path" && ata.ast()['steps'].length === 1) || ata.ast().type === "string") && selector !== 'data' && 'data' in data) {
result = JSON.stringify(await jsonata(`data.${selector}`).evaluate(data));
@@ -19029,7 +19028,6 @@ module.exports = {
selectData
}
/***/ }),
/***/ 9491:
+4 -1
View File
@@ -12,6 +12,9 @@ describe('e2e', () => {
expect(process.env.SUBSEQUENT_TEST_SECRET).toBe("SUBSEQUENT_TEST_SECRET");
expect(process.env.JSONSTRING).toBe('{"x":1,"y":"qux"}');
expect(process.env.JSONSTRINGMULTILINE).toBe('{"x": 1, "y": "q\\nux"}');
expect(process.env.JSONDATA).toBe('{"x":1,"y":"qux"}');
let result = JSON.stringify('{"x":1,"y":"qux"}');
result = result.substring(1, result.length - 1);
expect(process.env.JSONDATA).toBe(result);
});
});
+4 -1
View File
@@ -223,7 +223,10 @@ describe('exportSecrets', () => {
it('JSON data secret retrieval', async () => {
const jsonData = {"x":1,"y":2};
let result = JSON.stringify(jsonData);
// for secrets stored in Vault as pure JSON, we call stringify twice
// and remove the added surrounding quotes
let result = JSON.stringify(JSON.stringify(jsonData));
result = result.substring(1, result.length - 1);
mockInput('test key');
mockVaultData({
+48 -1
View File
@@ -72,7 +72,13 @@ async function getSecrets(secretRequests, client) {
*/
async function selectData(data, selector) {
const ata = jsonata(selector);
let result = JSON.stringify(await ata.evaluate(data));
let d = await ata.evaluate(data);
console.log(selector);
// If we have a Javascript Object, then this data was stored in Vault as
// pure JSON (not a JSON string). We will capture that before we stringify it.
const storedAsJSONData = isObject(d);
result = JSON.stringify(d);
// Compat for custom engines
if (!result && ((ata.ast().type === "path" && ata.ast()['steps'].length === 1) || ata.ast().type === "string") && selector !== 'data' && 'data' in data) {
@@ -82,11 +88,52 @@ async function selectData(data, selector) {
}
if (result.startsWith(`"`)) {
// we need to strip the beginning and ending quotes otherwise it will
// always successfully parse as a JSON string
// result = result.substring(1, result.length - 1);
// if (!isJSONString(result)) {
// // add the quotes back so we can parse it into a Javascript object
// // to allow support for multi-line secrets. See https://github.com/hashicorp/vault-action/issues/160
// result = `"${result}"`
console.log(" =>>> PARSING")
result = JSON.parse(result);
// }
} else {
console.log('does not start with quote')
// Support secrets stored in Vault as pure JSON.
// See https://github.com/hashicorp/vault-action/issues/194 and https://github.com/hashicorp/vault-action/pull/173
result = JSON.stringify(result);
result = result.substring(1, result.length - 1);
}
return result;
}
/**
* isOjbect returns true if target is a Javascript object
* @param {Type} target
*/
function isObject(target) {
return typeof target === 'object' && target !== null;
}
/**
* isJSONString returns true if target parses as a valid JSON string
* @param {Type} target
*/
function isJSONString(target) {
if (typeof target !== "string"){
return false;
}
try {
JSON.parse(target);
} catch (e) {
return false;
}
return true;
}
module.exports = {
getSecrets,
selectData