mirror of
https://github.com/hashicorp/vault-action.git
synced 2026-07-26 00:13:16 +03:00
Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ba90f2d74c | |||
| 32afcc7f20 | |||
| d12e95ba40 | |||
| 4ef647191c | |||
| 1a47f33407 | |||
| b239ef37f5 | |||
| ccc7cef6eb | |||
| 8e836c6e8e | |||
| a2cae737a3 | |||
| b536ec9ec6 | |||
| e5605de996 | |||
| 788264dddd | |||
| a24b038252 |
@@ -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:
|
||||
|
||||
Vendored
+2
-4
@@ -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:
|
||||
|
||||
@@ -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
@@ -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({
|
||||
|
||||
+74
-5
@@ -67,26 +67,95 @@ 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));
|
||||
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)
|
||||
const storedAsJSONData = isObject(d);
|
||||
|
||||
// if (isJSONString(d)) {
|
||||
// If we already have a JSON string we will not "stringify" it yet so
|
||||
// that we don't end up calling JSON.parse. This would break the
|
||||
// secrets that are stored as pure JSON. See: https://github.com/hashicorp/vault-action/issues/194
|
||||
// result = d;
|
||||
// } else {
|
||||
result = jsonstringify(d, 0);
|
||||
// }
|
||||
|
||||
// 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));
|
||||
result = jsonstringify(await jsonata(`data.${selector}`).evaluate(data), 1);
|
||||
} else if (!result) {
|
||||
throw Error(`Unable to retrieve result for ${selector}. No match data was found. Double check your Key or Selector.`);
|
||||
}
|
||||
|
||||
if (result.startsWith(`"`)) {
|
||||
result = JSON.parse(result);
|
||||
// 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}"`
|
||||
result = JSON.parse(result);
|
||||
}
|
||||
} else if (isJSONString(result)) {
|
||||
if (storedAsJSONData) {
|
||||
// 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 = jsonstringify(result, 2);
|
||||
result = result.substring(1, result.length - 1);
|
||||
} else {
|
||||
// Support secrets stored in Vault as JSON Strings
|
||||
result = jsonstringify(result, 3);
|
||||
result = JSON.parse(result);
|
||||
}
|
||||
}
|
||||
console.log()
|
||||
return result;
|
||||
}
|
||||
|
||||
function jsonstringify(input, call) {
|
||||
console.log('stringify', call);
|
||||
return JSON.stringify(input)
|
||||
}
|
||||
|
||||
/**
|
||||
* isOjbect returns true if target is a Javascript object
|
||||
* @param {Type} target
|
||||
*/
|
||||
function isObject(target) {
|
||||
console.log('isObject: ', typeof target === 'object' && target !== null)
|
||||
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"){
|
||||
console.log('isJSONString: false, not string')
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
JSON.parse(target);
|
||||
} catch (e) {
|
||||
console.log('isJSONString: false, failed to parse')
|
||||
return false;
|
||||
}
|
||||
|
||||
console.log('isJSONString: true')
|
||||
return true;
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getSecrets,
|
||||
selectData
|
||||
|
||||
Reference in New Issue
Block a user