From 8f10bbfed705e2970f92019bf599995f9c9dedcf Mon Sep 17 00:00:00 2001 From: Stefan Kalscheuer Date: Sun, 29 Mar 2020 12:34:19 +0200 Subject: [PATCH] add missing fields to token data * entity_id * expire_time * explicit_max_ttl * issue_time * renewable * type --- CHANGELOG.md | 1 + .../model/response/embedded/TokenData.java | 84 ++++++++++++++++++- .../connector/HTTPVaultConnectorTest.java | 1 + .../model/response/TokenResponseTest.java | 40 +++++++-- 4 files changed, 117 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index be674ab..a107dea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ ### Improvements * Added `entity_id`, `token_policies`, `token_type` and `orphan` flags to auth response +* Added `entity_id`, `expire_time`, `explicit_max_ttl`, `issue_time`, `renewable` and `type` flags to token data * Minor dependency updates diff --git a/src/main/java/de/stklcode/jvault/connector/model/response/embedded/TokenData.java b/src/main/java/de/stklcode/jvault/connector/model/response/embedded/TokenData.java index b45c3c4..e68aab4 100644 --- a/src/main/java/de/stklcode/jvault/connector/model/response/embedded/TokenData.java +++ b/src/main/java/de/stklcode/jvault/connector/model/response/embedded/TokenData.java @@ -19,6 +19,7 @@ package de.stklcode.jvault.connector.model.response.embedded; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; +import java.time.ZonedDateTime; import java.util.List; import java.util.Map; @@ -42,11 +43,20 @@ public final class TokenData { @JsonProperty("display_name") private String name; + @JsonProperty("entity_id") + private String entityId; + + @JsonProperty("expire_time") + private String expireTime; + + @JsonProperty("explicit_max_ttl") + private Integer explicitMaxTtl; + @JsonProperty("id") private String id; - @JsonProperty("type") - private String type; + @JsonProperty("issue_time") + private String issueTime; @JsonProperty("meta") private Map meta; @@ -63,9 +73,15 @@ public final class TokenData { @JsonProperty("policies") private List policies; + @JsonProperty("renewable") + private boolean renewable; + @JsonProperty("ttl") private Integer ttl; + @JsonProperty("type") + private String type; + /** * @return Token accessor */ @@ -94,6 +110,42 @@ public final class TokenData { return name; } + /** + * @return Entity ID + * @since 0.9 + */ + public String getEntityId() { + return entityId; + } + + /** + * @return Expire time as raw string value + * @since 0.9 + */ + public String getExpireTimeString() { + return expireTime; + } + + /** + * @return Expire time (parsed) + * @since 0.9 + */ + public ZonedDateTime getExpireTime() { + if (expireTime == null) { + return null; + } else { + return ZonedDateTime.parse(expireTime); + } + } + + /** + * @return Explicit maximum TTL + * @since 0.9 + */ + public Integer getExplicitMaxTtl() { + return explicitMaxTtl; + } + /** * @return Token ID */ @@ -101,6 +153,26 @@ public final class TokenData { return id; } + /** + * @return Issue time as raw string value + * @since 0.9 + */ + public String getIssueTimeString() { + return issueTime; + } + + /** + * @return Expire time (parsed) + * @since 0.9 + */ + public ZonedDateTime getIssueTime() { + if (issueTime == null) { + return null; + } else { + return ZonedDateTime.parse(issueTime); + } + } + /** * @return Token type * @since 0.9 @@ -138,6 +210,14 @@ public final class TokenData { return policies; } + /** + * @return Token is renewable + * @since 0.9 + */ + public boolean isRenewable() { + return renewable; + } + /** * @return Token TTL (in seconds) */ diff --git a/src/test/java/de/stklcode/jvault/connector/HTTPVaultConnectorTest.java b/src/test/java/de/stklcode/jvault/connector/HTTPVaultConnectorTest.java index ca8f6a5..3e6d497 100644 --- a/src/test/java/de/stklcode/jvault/connector/HTTPVaultConnectorTest.java +++ b/src/test/java/de/stklcode/jvault/connector/HTTPVaultConnectorTest.java @@ -1158,6 +1158,7 @@ public class HTTPVaultConnectorTest { assertThat("Unexpected number of policies", res.getData().getPolicies(), hasSize(1)); assertThat("Unexpected policy", res.getData().getPolicies(), contains("root")); assertThat("Unexpected token type", res.getData().getType(), is(token.getType())); + assertThat("Issue time expected to be filled", res.getData().getIssueTime(), is(notNullValue())); } catch (VaultConnectorException e) { fail("Token creation failed."); } diff --git a/src/test/java/de/stklcode/jvault/connector/model/response/TokenResponseTest.java b/src/test/java/de/stklcode/jvault/connector/model/response/TokenResponseTest.java index bd853a4..a083aa6 100644 --- a/src/test/java/de/stklcode/jvault/connector/model/response/TokenResponseTest.java +++ b/src/test/java/de/stklcode/jvault/connector/model/response/TokenResponseTest.java @@ -22,6 +22,7 @@ import de.stklcode.jvault.connector.model.response.embedded.TokenData; import org.junit.jupiter.api.Test; import java.io.IOException; +import java.time.ZonedDateTime; import java.util.HashMap; import java.util.Map; @@ -38,26 +39,40 @@ import static org.junit.jupiter.api.Assertions.fail; public class TokenResponseTest { private static final Integer TOKEN_CREATION_TIME = 1457533232; private static final Integer TOKEN_TTL = 2764800; + private static final Integer TOKEN_EXPLICIT_MAX_TTL = 0; private static final String TOKEN_DISPLAY_NAME = "token"; private static final String TOKEN_META_KEY = "foo"; private static final String TOKEN_META_VALUE = "bar"; private static final Integer TOKEN_NUM_USES = 0; private static final Boolean TOKEN_ORPHAN = false; + private static final Boolean TOKEN_RENEWABLE = true; private static final String TOKEN_PATH = "auth/token/create"; private static final String TOKEN_POLICY_1 = "default"; private static final String TOKEN_POLICY_2 = "web"; private static final Boolean RES_RENEWABLE = false; private static final Integer RES_TTL = 2591976; private static final Integer RES_LEASE_DURATION = 0; + private static final String TOKEN_ACCESSOR = "VKvzT2fKHFsZFUus9LyoXCvu"; + private static final String TOKEN_ENTITY_ID = "7d2e3179-f69b-450c-7179-ac8ee8bd8ca9"; + private static final String TOKEN_EXPIRE_TIME = "2018-05-19T11:35:54.466476215-04:00"; + private static final String TOKEN_ID = "my-token"; + private static final String TOKEN_ISSUE_TIME = "2018-04-17T11:35:54.466476078-04:00"; + private static final String TOKEN_TYPE = "service"; private static final String RES_JSON = "{\n" + " \"lease_id\": \"\",\n" + " \"renewable\": " + RES_RENEWABLE + ",\n" + " \"lease_duration\": " + RES_LEASE_DURATION + ",\n" + " \"data\": {\n" + + " \"accessor\": \"" + TOKEN_ACCESSOR + "\",\n" + " \"creation_time\": " + TOKEN_CREATION_TIME + ",\n" + " \"creation_ttl\": " + TOKEN_TTL + ",\n" + " \"display_name\": \"" + TOKEN_DISPLAY_NAME + "\",\n" + + " \"entity_id\": \"" + TOKEN_ENTITY_ID + "\",\n" + + " \"expire_time\": \"" + TOKEN_EXPIRE_TIME + "\",\n" + + " \"explicit_max_ttl\": \"" + TOKEN_EXPLICIT_MAX_TTL + "\",\n" + + " \"id\": \"" + TOKEN_ID + "\",\n" + + " \"issue_time\": \"" + TOKEN_ISSUE_TIME + "\",\n" + " \"meta\": {\n" + " \"" + TOKEN_META_KEY + "\": \"" + TOKEN_META_VALUE + "\"\n" + " },\n" + @@ -68,7 +83,9 @@ public class TokenResponseTest { " \"" + TOKEN_POLICY_1 + "\", \n" + " \"" + TOKEN_POLICY_2 + "\"\n" + " ],\n" + - " \"ttl\": " + RES_TTL + "\n" + + " \"renewable\": " + TOKEN_RENEWABLE + ",\n" + + " \"ttl\": " + RES_TTL + ",\n" + + " \"type\": \"" + TOKEN_TYPE + "\"\n" + " },\n" + " \"warnings\": null,\n" + " \"auth\": null\n" + @@ -107,23 +124,32 @@ public class TokenResponseTest { TokenResponse res = new ObjectMapper().readValue(RES_JSON, TokenResponse.class); assertThat("Parsed response is NULL", res, is(notNullValue())); assertThat("Incorrect lease duration", res.getLeaseDuration(), is(RES_LEASE_DURATION)); - assertThat("Incorrect renewable status", res.isRenewable(), is(RES_RENEWABLE)); + assertThat("Incorrect response renewable flag", res.isRenewable(), is(RES_RENEWABLE)); + assertThat("Incorrect response lease duration", res.getLeaseDuration(), is(RES_LEASE_DURATION)); // Extract token data. TokenData data = res.getData(); assertThat("Token data is NULL", data, is(notNullValue())); + assertThat("Incorrect token accessor", data.getAccessor(), is(TOKEN_ACCESSOR)); assertThat("Incorrect token creation time", data.getCreationTime(), is(TOKEN_CREATION_TIME)); assertThat("Incorrect token creation TTL", data.getCreationTtl(), is(TOKEN_TTL)); assertThat("Incorrect token display name", data.getName(), is(TOKEN_DISPLAY_NAME)); + assertThat("Incorrect token entity ID", data.getEntityId(), is(TOKEN_ENTITY_ID)); + assertThat("Incorrect token expire time", data.getExpireTimeString(), is(TOKEN_EXPIRE_TIME)); + assertThat("Incorrect parsed token expire time", data.getExpireTime(), is(ZonedDateTime.parse(TOKEN_EXPIRE_TIME))); + assertThat("Incorrect token explicit max TTL", data.getExplicitMaxTtl(), is(TOKEN_EXPLICIT_MAX_TTL)); + assertThat("Incorrect token ID", data.getId(), is(TOKEN_ID)); + assertThat("Incorrect token issue time", data.getIssueTimeString(), is(TOKEN_ISSUE_TIME)); + assertThat("Incorrect parsed token issue time", data.getIssueTime(), is(ZonedDateTime.parse(TOKEN_ISSUE_TIME))); + assertThat("Incorrect token metadata size", data.getMeta().entrySet(), hasSize(1)); + assertThat("Incorrect token metadata", data.getMeta().get(TOKEN_META_KEY), is(TOKEN_META_VALUE)); assertThat("Incorrect token number of uses", data.getNumUses(), is(TOKEN_NUM_USES)); assertThat("Incorrect token orphan flag", data.isOrphan(), is(TOKEN_ORPHAN)); assertThat("Incorrect token path", data.getPath(), is(TOKEN_PATH)); - assertThat("Incorrect token metadata size", data.getMeta().entrySet(), hasSize(1)); - assertThat("Incorrect token metadata", data.getMeta().get(TOKEN_META_KEY), is(TOKEN_META_VALUE)); assertThat("Incorrect number of token policies", data.getPolicies(), hasSize(2)); assertThat("Incorrect token policies", data.getPolicies(), contains(TOKEN_POLICY_1, TOKEN_POLICY_2)); - assertThat("Incorrect response renewable flag", res.isRenewable(), is(RES_RENEWABLE)); - assertThat("Incorrect response TTL", data.getTtl(), is(RES_TTL)); - assertThat("Incorrect response lease duration", res.getLeaseDuration(), is(RES_LEASE_DURATION)); + assertThat("Incorrect token renewable flag", data.isRenewable(), is(TOKEN_RENEWABLE)); + assertThat("Incorrect token TTL", data.getTtl(), is(RES_TTL)); + assertThat("Incorrect token type", data.getType(), is(TOKEN_TYPE)); } catch (IOException e) { fail("TokenResponse deserialization failed: " + e.getMessage()); }