From edbcc3062c5ebe83800e6c971216440591b8cc7b Mon Sep 17 00:00:00 2001 From: Kyle McGovern Date: Thu, 8 Apr 2021 18:33:01 -0700 Subject: [PATCH] update to appropriately write lists out to the vault secret object --- .../io/ianferguson/vault/api/Logical.java | 77 +++++++++++++------ .../io/ianferguson/vault/api/LogicalTest.java | 28 +++++++ 2 files changed, 82 insertions(+), 23 deletions(-) create mode 100644 src/test/java/io/ianferguson/vault/api/LogicalTest.java diff --git a/src/main/java/io/ianferguson/vault/api/Logical.java b/src/main/java/io/ianferguson/vault/api/Logical.java index 198bf1b6..7ba9e08f 100644 --- a/src/main/java/io/ianferguson/vault/api/Logical.java +++ b/src/main/java/io/ianferguson/vault/api/Logical.java @@ -3,6 +3,7 @@ import io.ianferguson.vault.VaultConfig; import io.ianferguson.vault.VaultException; import io.ianferguson.vault.json.Json; +import io.ianferguson.vault.json.JsonArray; import io.ianferguson.vault.json.JsonObject; import io.ianferguson.vault.json.JsonValue; import io.ianferguson.vault.response.LogicalResponse; @@ -11,6 +12,7 @@ import io.ianferguson.vault.rest.RestResponse; import java.nio.charset.StandardCharsets; import java.util.Arrays; +import java.util.List; import java.util.Map; import static io.ianferguson.vault.api.LogicalUtilities.adjustPathForDelete; @@ -225,34 +227,63 @@ public LogicalResponse write(final String path, final Map nameVa } else return write(path, nameValuePairs, logicalOperations.writeV1); } + private void addToArrayJson(JsonArray requestJson, Object value) { + if (value == null) { + requestJson = requestJson.add((String) null); + } else if (value instanceof Boolean) { + requestJson = requestJson.add((Boolean) value); + } else if (value instanceof Integer) { + requestJson = requestJson.add((Integer) value); + } else if (value instanceof Long) { + requestJson = requestJson.add((Long) value); + } else if (value instanceof Float) { + requestJson = requestJson.add((Float) value); + } else if (value instanceof Double) { + requestJson = requestJson.add((Double) value); + } else { + requestJson = requestJson.add(value.toString()); + } + } + + protected JsonObject mapToJsonObject(Map nameValuePairs) { + JsonObject requestJson = Json.object(); + if (nameValuePairs != null) { + for (final Map.Entry pair : nameValuePairs.entrySet()) { + final Object value = pair.getValue(); + if (value == null) { + requestJson = requestJson.add(pair.getKey(), (String) null); + } else if (value instanceof Boolean) { + requestJson = requestJson.add(pair.getKey(), (Boolean) pair.getValue()); + } else if (value instanceof Integer) { + requestJson = requestJson.add(pair.getKey(), (Integer) pair.getValue()); + } else if (value instanceof Long) { + requestJson = requestJson.add(pair.getKey(), (Long) pair.getValue()); + } else if (value instanceof Float) { + requestJson = requestJson.add(pair.getKey(), (Float) pair.getValue()); + } else if (value instanceof Double) { + requestJson = requestJson.add(pair.getKey(), (Double) pair.getValue()); + } else if (value instanceof List) { + JsonArray jsonArray = new JsonArray(); + for (Object v: (List) value) { + addToArrayJson(jsonArray, v); + } + requestJson.add(pair.getKey(), jsonArray); + } else if (value instanceof JsonValue) { + requestJson = requestJson.add(pair.getKey(), (JsonValue) pair.getValue()); + } else { + requestJson = requestJson.add(pair.getKey(), pair.getValue().toString()); + } + } + } + return requestJson; + } + private LogicalResponse write(final String path, final Map nameValuePairs, final logicalOperations operation) throws VaultException { int retryCount = 0; while (true) { try { - JsonObject requestJson = Json.object(); - if (nameValuePairs != null) { - for (final Map.Entry pair : nameValuePairs.entrySet()) { - final Object value = pair.getValue(); - if (value == null) { - requestJson = requestJson.add(pair.getKey(), (String) null); - } else if (value instanceof Boolean) { - requestJson = requestJson.add(pair.getKey(), (Boolean) pair.getValue()); - } else if (value instanceof Integer) { - requestJson = requestJson.add(pair.getKey(), (Integer) pair.getValue()); - } else if (value instanceof Long) { - requestJson = requestJson.add(pair.getKey(), (Long) pair.getValue()); - } else if (value instanceof Float) { - requestJson = requestJson.add(pair.getKey(), (Float) pair.getValue()); - } else if (value instanceof Double) { - requestJson = requestJson.add(pair.getKey(), (Double) pair.getValue()); - } else if (value instanceof JsonValue) { - requestJson = requestJson.add(pair.getKey(), (JsonValue) pair.getValue()); - } else { - requestJson = requestJson.add(pair.getKey(), pair.getValue().toString()); - } - } - } + JsonObject requestJson = mapToJsonObject(nameValuePairs); // Make an HTTP request to Vault final RestResponse restResponse = new Rest()//NOPMD .url(config.getAddress() + "/v1/" + adjustPathForReadOrWrite(path, config.getPrefixPathDepth(), operation)) diff --git a/src/test/java/io/ianferguson/vault/api/LogicalTest.java b/src/test/java/io/ianferguson/vault/api/LogicalTest.java new file mode 100644 index 00000000..86736c95 --- /dev/null +++ b/src/test/java/io/ianferguson/vault/api/LogicalTest.java @@ -0,0 +1,28 @@ +package io.ianferguson.vault.api; + +import io.ianferguson.vault.VaultConfig; +import io.ianferguson.vault.json.JsonObject; +import junit.framework.TestCase; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +public class LogicalTest extends TestCase { + + public void testMapToJsonObject() { + Logical logical = new Logical(new VaultConfig()); + Map data = new HashMap<>(); + ArrayList testList = new ArrayList<>(); + testList.add("value1"); + testList.add(2); + testList.add(true); + data.put("ArrayValue", testList); + data.put("IntValue", 1); + data.put("BoolValue", false); + JsonObject jsonObject = logical.mapToJsonObject(data); + + String expectedValue = "{\"BoolValue\":false,\"ArrayValue\":[\"value1\",2,true],\"IntValue\":1}"; + assertTrue(jsonObject.toString().equals(expectedValue)); + } +} \ No newline at end of file