mirror of
https://github.com/hashicorp/vault-action.git
synced 2026-07-29 01:43:15 +03:00
Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0b1f582bde | |||
| 32afcc7f20 | |||
| d12e95ba40 | |||
| 4ef647191c | |||
| 1a47f33407 | |||
| b239ef37f5 | |||
| ccc7cef6eb | |||
| 8e836c6e8e | |||
| a2cae737a3 | |||
| b536ec9ec6 | |||
| e5605de996 | |||
| 788264dddd | |||
| a24b038252 |
@@ -2,12 +2,6 @@
|
|||||||
|
|
||||||
* Add changes here
|
* Add changes here
|
||||||
|
|
||||||
## 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)
|
## 2.7.1 (July 3, 2023)
|
||||||
|
|
||||||
Bugs:
|
Bugs:
|
||||||
|
|||||||
Vendored
+2
-15
@@ -19004,13 +19004,12 @@ async function getSecrets(secretRequests, client) {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Uses a Jsonata selector retrieve a bit of data from the result
|
* Uses a Jsonata selector retrieve a bit of data from the result
|
||||||
* @param {object} data
|
* @param {object} data
|
||||||
* @param {string} selector
|
* @param {string} selector
|
||||||
*/
|
*/
|
||||||
async function selectData(data, selector) {
|
async function selectData(data, selector) {
|
||||||
const ata = jsonata(selector);
|
const ata = jsonata(selector);
|
||||||
let result = JSON.stringify(await ata.evaluate(data));
|
let result = JSON.stringify(await ata.evaluate(data));
|
||||||
|
|
||||||
// Compat for custom engines
|
// Compat for custom engines
|
||||||
if (!result && ((ata.ast().type === "path" && ata.ast()['steps'].length === 1) || ata.ast().type === "string") && selector !== 'data' && 'data' in data) {
|
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 = JSON.stringify(await jsonata(`data.${selector}`).evaluate(data));
|
||||||
@@ -19019,18 +19018,7 @@ async function selectData(data, selector) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (result.startsWith(`"`)) {
|
if (result.startsWith(`"`)) {
|
||||||
// Support multi-line secrets like JSON strings and ssh keys, see https://github.com/hashicorp/vault-action/pull/173
|
|
||||||
// Deserialize the value so that newlines and special characters are
|
|
||||||
// not escaped in our return value.
|
|
||||||
result = JSON.parse(result);
|
result = JSON.parse(result);
|
||||||
} else {
|
|
||||||
// Support secrets stored in Vault as pure JSON, see https://github.com/hashicorp/vault-action/issues/194
|
|
||||||
// Serialize the value so that any special characters in the data are
|
|
||||||
// properly escaped.
|
|
||||||
result = JSON.stringify(result);
|
|
||||||
// strip the surrounding quotes added by stringify because the data did
|
|
||||||
// not have them in the first place
|
|
||||||
result = result.substring(1, result.length - 1);
|
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -19040,7 +19028,6 @@ module.exports = {
|
|||||||
selectData
|
selectData
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
/***/ 9491:
|
/***/ 9491:
|
||||||
|
|||||||
+1
-1
@@ -224,7 +224,7 @@ describe('exportSecrets', () => {
|
|||||||
const jsonData = {"x":1,"y":2};
|
const jsonData = {"x":1,"y":2};
|
||||||
|
|
||||||
// for secrets stored in Vault as pure JSON, we call stringify twice
|
// for secrets stored in Vault as pure JSON, we call stringify twice
|
||||||
// and remove the surrounding quotes
|
// and remove the added surrounding quotes
|
||||||
let result = JSON.stringify(JSON.stringify(jsonData));
|
let result = JSON.stringify(JSON.stringify(jsonData));
|
||||||
result = result.substring(1, result.length - 1);
|
result = result.substring(1, result.length - 1);
|
||||||
|
|
||||||
|
|||||||
+45
-9
@@ -72,7 +72,13 @@ async function getSecrets(secretRequests, client) {
|
|||||||
*/
|
*/
|
||||||
async function selectData(data, selector) {
|
async function selectData(data, selector) {
|
||||||
const ata = jsonata(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
|
// Compat for custom engines
|
||||||
if (!result && ((ata.ast().type === "path" && ata.ast()['steps'].length === 1) || ata.ast().type === "string") && selector !== 'data' && 'data' in data) {
|
if (!result && ((ata.ast().type === "path" && ata.ast()['steps'].length === 1) || ata.ast().type === "string") && selector !== 'data' && 'data' in data) {
|
||||||
@@ -82,22 +88,52 @@ async function selectData(data, selector) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (result.startsWith(`"`)) {
|
if (result.startsWith(`"`)) {
|
||||||
// Support multi-line secrets like JSON strings and ssh keys, see https://github.com/hashicorp/vault-action/pull/173
|
// we need to strip the beginning and ending quotes otherwise it will
|
||||||
// Deserialize the value so that newlines and special characters are
|
// always successfully parse as a JSON string
|
||||||
// not escaped in our return value.
|
// 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);
|
result = JSON.parse(result);
|
||||||
|
// }
|
||||||
} else {
|
} else {
|
||||||
// Support secrets stored in Vault as pure JSON, see https://github.com/hashicorp/vault-action/issues/194
|
console.log('does not start with quote')
|
||||||
// Serialize the value so that any special characters in the data are
|
// Support secrets stored in Vault as pure JSON.
|
||||||
// properly escaped.
|
// See https://github.com/hashicorp/vault-action/issues/194 and https://github.com/hashicorp/vault-action/pull/173
|
||||||
result = JSON.stringify(result);
|
result = JSON.stringify(result);
|
||||||
// strip the surrounding quotes added by stringify because the data did
|
|
||||||
// not have them in the first place
|
|
||||||
result = result.substring(1, result.length - 1);
|
result = result.substring(1, result.length - 1);
|
||||||
}
|
}
|
||||||
return result;
|
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 = {
|
module.exports = {
|
||||||
getSecrets,
|
getSecrets,
|
||||||
selectData
|
selectData
|
||||||
|
|||||||
Reference in New Issue
Block a user