From fa7036921a00b2bb45b9a119fc303e0399456545 Mon Sep 17 00:00:00 2001 From: Stefan Kalscheuer Date: Wed, 15 Apr 2020 17:13:50 +0200 Subject: [PATCH] move builders into model classes and deprecate constructors Enforces use of builder pattern in future releases. Builder API is unchanged despite the class itself. --- CHANGELOG.md | 2 + .../jvault/connector/VaultConnector.java | 2 +- .../jvault/connector/model/AppRole.java | 373 +++++++++++++++++- .../connector/model/AppRoleBuilder.java | 2 + .../jvault/connector/model/Token.java | 284 ++++++++++++- .../jvault/connector/model/TokenBuilder.java | 2 + .../jvault/connector/model/TokenRole.java | 323 ++++++++++++--- .../connector/model/TokenRoleBuilder.java | 292 -------------- .../connector/model/AppRoleBuilderTest.java | 117 ++++++ .../connector/model/TokenBuilderTest.java | 101 +++++ .../connector/model/TokenRoleBuilderTest.java | 4 +- 11 files changed, 1150 insertions(+), 352 deletions(-) delete mode 100644 src/main/java/de/stklcode/jvault/connector/model/TokenRoleBuilder.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 7152a1f..f9d280f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,8 @@ ### Deprecations * `AppRole#getPolicies()` and `#setPolicies()` are deprecated in favor of `#getTokenPolicies()` and `#setTokenPolicies()` * `AppRole#getPeriod()` is deprecated in favor of `#getTokenPeriod()` +* `AppRoleBuilder` and `TokenBuilder` in favor of `AppRole.Builder` and `Token.Builder` +* All-arg constructors of `AppRole` and `Token` in favor of `.builder()....build()` introduced in 0.8 ### Removals * Deprecated methods `AppRole#getBoundCidrList()`, `#setBoundCidrList()` and `getBoundCidrListString()` have been removed. diff --git a/src/main/java/de/stklcode/jvault/connector/VaultConnector.java b/src/main/java/de/stklcode/jvault/connector/VaultConnector.java index 0b0adb9..c3cfd5d 100644 --- a/src/main/java/de/stklcode/jvault/connector/VaultConnector.java +++ b/src/main/java/de/stklcode/jvault/connector/VaultConnector.java @@ -226,7 +226,7 @@ public interface VaultConnector extends AutoCloseable, Serializable { */ default boolean createAppRole(final String roleName, final List policies, final String roleID) throws VaultConnectorException { - return createAppRole(new AppRoleBuilder(roleName).withTokenPolicies(policies).withId(roleID).build()); + return createAppRole(AppRole.builder(roleName).withTokenPolicies(policies).withId(roleID).build()); } /** diff --git a/src/main/java/de/stklcode/jvault/connector/model/AppRole.java b/src/main/java/de/stklcode/jvault/connector/model/AppRole.java index 8dbb1a6..d65c12b 100644 --- a/src/main/java/de/stklcode/jvault/connector/model/AppRole.java +++ b/src/main/java/de/stklcode/jvault/connector/model/AppRole.java @@ -18,6 +18,7 @@ package de.stklcode.jvault.connector.model; import com.fasterxml.jackson.annotation.*; +import java.util.ArrayList; import java.util.List; /** @@ -29,14 +30,14 @@ import java.util.List; @JsonIgnoreProperties(ignoreUnknown = true) public final class AppRole { /** - * Get {@link AppRoleBuilder} instance. + * Get {@link Builder} instance. * * @param name Role name. * @return AppRole Builder. * @since 0.8 */ - public static AppRoleBuilder builder(final String name) { - return new AppRoleBuilder(name); + public static Builder builder(final String name) { + return new Builder(name); } @JsonProperty("role_name") @@ -102,7 +103,6 @@ public final class AppRole { * Construct empty {@link AppRole} object. */ public AppRole() { - } /** @@ -126,7 +126,9 @@ public final class AppRole { * @param tokenNumUses Number of uses for tokens (optional) * @param tokenPeriod Duration in seconds, if set the token is a periodic token (optional) * @param tokenType Token type (optional) + * @deprecated As of 0.9 in favor of {@link #builder(String)}. Will be removed with next major release. */ + @Deprecated AppRole(final String name, final String id, final Boolean bindSecretId, final List secretIdBoundCidrs, final Integer secretIdNumUses, final Integer secretIdTtl, final Boolean enableLocalSecretIds, final Integer tokenTtl, final Integer tokenMaxTtl, final List tokenPolicies, @@ -150,6 +152,30 @@ public final class AppRole { this.tokenType = tokenType; } + /** + * Construct {@link AppRole} object from {@link AppRole.Builder}. + * + * @param builder AppRole builder. + */ + public AppRole(final Builder builder) { + this.name = builder.name; + this.id = builder.id; + this.bindSecretId = builder.bindSecretId; + this.secretIdBoundCidrs = builder.secretIdBoundCidrs; + this.secretIdNumUses = builder.secretIdNumUses; + this.secretIdTtl = builder.secretIdTtl; + this.enableLocalSecretIds = builder.enableLocalSecretIds; + this.tokenTtl = builder.tokenTtl; + this.tokenMaxTtl = builder.tokenMaxTtl; + this.tokenPolicies = builder.tokenPolicies; + this.tokenBoundCidrs = builder.tokenBoundCidrs; + this.tokenExplicitMaxTtl = builder.tokenExplicitMaxTtl; + this.tokenNoDefaultPolicy = builder.tokenNoDefaultPolicy; + this.tokenNumUses = builder.tokenNumUses; + this.tokenPeriod = builder.tokenPeriod; + this.tokenType = builder.tokenType != null ? builder.tokenType.value() : null; + } + /** * @return the role name */ @@ -376,4 +402,343 @@ public final class AppRole { public String getTokenType() { return tokenType; } + + + /** + * A builder for vault AppRole roles.. + * + * @author Stefan Kalscheuer + * @since 0.4.0 + * @since 0.9 Moved into subclass of {@link AppRole}. + */ + public static final class Builder { + private String name; + private String id; + private Boolean bindSecretId; + private List secretIdBoundCidrs; + private List tokenPolicies; + private Integer secretIdNumUses; + private Integer secretIdTtl; + private Boolean enableLocalSecretIds; + private Integer tokenTtl; + private Integer tokenMaxTtl; + private List tokenBoundCidrs; + private Integer tokenExplicitMaxTtl; + private Boolean tokenNoDefaultPolicy; + private Integer tokenNumUses; + private Integer tokenPeriod; + private Token.Type tokenType; + + /** + * Construct {@link Builder} with only the role name set. + * + * @param name Role name + */ + public Builder(final String name) { + this.name = name; + } + + /** + * Add role name. + * + * @param name Role name + * @return self + */ + public Builder withName(final String name) { + this.name = name; + return this; + } + + /** + * Add custom role ID. (optional) + * + * @param id the ID + * @return self + */ + public Builder withId(final String id) { + this.id = id; + return this; + } + + /** + * Set if role is bound to secret ID. + * + * @param bindSecretId the display name + * @return self + */ + public Builder withBindSecretID(final Boolean bindSecretId) { + this.bindSecretId = bindSecretId; + return this; + } + + /** + * Bind role to secret ID. + * Convenience method for {@link #withBindSecretID(Boolean)} + * + * @return self + */ + public Builder withBindSecretID() { + return withBindSecretID(true); + } + + /** + * Do not bind role to secret ID. + * Convenience method for {@link #withBindSecretID(Boolean)} + * + * @return self + */ + public Builder withoutBindSecretID() { + return withBindSecretID(false); + } + + /** + * Set bound CIDR blocks. + * + * @param secretIdBoundCidrs List of CIDR blocks which can perform login + * @return self + * @since 0.8 replaces {@code withBoundCidrList(List)} + */ + public Builder withSecretIdBoundCidrs(final List secretIdBoundCidrs) { + if (this.secretIdBoundCidrs == null) { + this.secretIdBoundCidrs = new ArrayList<>(); + } + this.secretIdBoundCidrs.addAll(secretIdBoundCidrs); + return this; + } + + /** + * Add a CIDR block to list of bound blocks for secret. + * + * @param secretBoundCidr the CIDR block + * @return self + * @since 0.9 + */ + public Builder withSecretBoundCidr(final String secretBoundCidr) { + if (secretIdBoundCidrs == null) { + secretIdBoundCidrs = new ArrayList<>(); + } + secretIdBoundCidrs.add(secretBoundCidr); + return this; + } + + /** + * Add given policies. + * + * @param tokenPolicies the token policies + * @return self + * @since 0.9 + */ + public Builder withTokenPolicies(final List tokenPolicies) { + if (this.tokenPolicies == null) { + this.tokenPolicies = new ArrayList<>(); + } + this.tokenPolicies.addAll(tokenPolicies); + return this; + } + + /** + * Add given policies. + * + * @param policies the policies + * @return self + * @deprecated Use {@link #withTokenPolicies(List)} instead. + */ + @Deprecated + public Builder withPolicies(final List policies) { + return withTokenPolicies(policies); + } + + /** + * Add a single policy. + * + * @param tokenPolicy the token policy + * @return self + * @since 0.9 + */ + public Builder withTokenPolicy(final String tokenPolicy) { + if (this.tokenPolicies == null) { + this.tokenPolicies = new ArrayList<>(); + } + tokenPolicies.add(tokenPolicy); + return this; + } + + /** + * Add a single policy. + * + * @param policy the policy + * @return self + * @deprecated Use {@link #withTokenPolicy(String)} instead. + */ + @Deprecated + public Builder withPolicy(final String policy) { + return withTokenPolicy(policy); + } + + /** + * Set number of uses for sectet IDs. + * + * @param secredIdNumUses the number of uses + * @return self + */ + public Builder withSecretIdNumUses(final Integer secredIdNumUses) { + this.secretIdNumUses = secredIdNumUses; + return this; + } + + /** + * Set default sectet ID TTL in seconds. + * + * @param secredIdTtl the TTL + * @return self + */ + public Builder withSecretIdTtl(final Integer secredIdTtl) { + this.secretIdTtl = secredIdTtl; + return this; + } + + /** + * Enable or disable local secret IDs. + * + * @param enableLocalSecretIds Enable local secret IDs? + * @return self + * @since 0.9 + */ + public Builder withEnableLocalSecretIds(final Boolean enableLocalSecretIds) { + this.enableLocalSecretIds = enableLocalSecretIds; + return this; + } + + /** + * Set default token TTL in seconds. + * + * @param tokenTtl the TTL + * @return self + */ + public Builder withTokenTtl(final Integer tokenTtl) { + this.tokenTtl = tokenTtl; + return this; + } + + /** + * Set maximum token TTL in seconds. + * + * @param tokenMaxTtl the TTL + * @return self + */ + public Builder withTokenMaxTtl(final Integer tokenMaxTtl) { + this.tokenMaxTtl = tokenMaxTtl; + return this; + } + + /** + * Set bound CIDR blocks for associated tokens. + * + * @param tokenBoundCidrs List of CIDR blocks which can perform login + * @return self + * @since 0.9 + */ + public Builder withTokenBoundCidrs(final List tokenBoundCidrs) { + if (this.tokenBoundCidrs == null) { + this.tokenBoundCidrs = new ArrayList<>(); + } + this.tokenBoundCidrs.addAll(tokenBoundCidrs); + return this; + } + + /** + * Add a CIDR block to list of bound blocks for token. + * + * @param tokenBoundCidr the CIDR block + * @return self + * @since 0.9 + */ + public Builder withTokenBoundCidr(final String tokenBoundCidr) { + if (tokenBoundCidrs == null) { + tokenBoundCidrs = new ArrayList<>(); + } + tokenBoundCidrs.add(tokenBoundCidr); + return this; + } + + /** + * Set explicit maximum token TTL in seconds. + * + * @param tokenExplicitMaxTtl the TTL + * @return self + */ + public Builder withTokenExplicitMaxTtl(final Integer tokenExplicitMaxTtl) { + this.tokenExplicitMaxTtl = tokenExplicitMaxTtl; + return this; + } + + /** + * Enable or disable default policy for generated token. + * + * @param tokenNoDefaultPolicy Enable default policy for token? + * @return self + * @since 0.9 + */ + public Builder withTokenNoDefaultPolicy(final Boolean tokenNoDefaultPolicy) { + this.tokenNoDefaultPolicy = tokenNoDefaultPolicy; + return this; + } + + /** + * Set number of uses for generated tokens. + * + * @param tokenNumUses number of uses for tokens + * @return self + * @since 0.9 + */ + public Builder withTokenNumUses(final Integer tokenNumUses) { + this.tokenNumUses = tokenNumUses; + return this; + } + + /** + * Set renewal period for generated token in seconds. + * + * @param tokenPeriod period in seconds + * @return self + * @since 0.9 + */ + public Builder wit0hTokenPeriod(final Integer tokenPeriod) { + this.tokenPeriod = tokenPeriod; + return this; + } + + /** + * Set renewal period for generated token in seconds. + * + * @param period period in seconds + * @return self + * @deprecated Use {@link #wit0hTokenPeriod(Integer)} instead. + */ + @Deprecated + public Builder withPeriod(final Integer period) { + return wit0hTokenPeriod(period); + } + + /** + * Set type of generated token. + * + * @param tokenType token type + * @return self + * @since 0.9 + */ + public Builder withTokenType(final Token.Type tokenType) { + this.tokenType = tokenType; + return this; + } + + /** + * Build the AppRole role based on given parameters. + * + * @return the role + */ + public AppRole build() { + return new AppRole(this); + } + } } diff --git a/src/main/java/de/stklcode/jvault/connector/model/AppRoleBuilder.java b/src/main/java/de/stklcode/jvault/connector/model/AppRoleBuilder.java index 58859ca..9fd0e3d 100644 --- a/src/main/java/de/stklcode/jvault/connector/model/AppRoleBuilder.java +++ b/src/main/java/de/stklcode/jvault/connector/model/AppRoleBuilder.java @@ -24,7 +24,9 @@ import java.util.List; * * @author Stefan Kalscheuer * @since 0.4.0 + * @deprecated As of 0.9 in favor of {@link AppRole.Builder}. */ +@Deprecated public final class AppRoleBuilder { private String name; private String id; diff --git a/src/main/java/de/stklcode/jvault/connector/model/Token.java b/src/main/java/de/stklcode/jvault/connector/model/Token.java index 083464b..de9995c 100644 --- a/src/main/java/de/stklcode/jvault/connector/model/Token.java +++ b/src/main/java/de/stklcode/jvault/connector/model/Token.java @@ -20,8 +20,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.List; -import java.util.Map; +import java.util.*; /** * Vault Token metamodel. @@ -32,13 +31,13 @@ import java.util.Map; @JsonIgnoreProperties(ignoreUnknown = true) public final class Token { /** - * Get {@link TokenBuilder} instance. + * Get {@link Builder} instance. * * @return Token Builder. * @since 0.8 */ - public static TokenBuilder builder() { - return new TokenBuilder(); + public static Builder builder() { + return new Builder(); } @JsonProperty("id") @@ -81,6 +80,12 @@ public final class Token { @JsonInclude(JsonInclude.Include.NON_NULL) private Boolean renewable; + /** + * Construct empty {@link Token} object. + */ + public Token() { + } + /** * Construct complete {@link Token} object with default type. * @@ -93,7 +98,7 @@ public final class Token { * @param policies List of policies (optional) * @param meta Metadata (optional) * @param renewable Is the token renewable (optional) - * @deprecated As of 0.9, use {@link #Token(String, String, String, Boolean, Boolean, Integer, Integer, List, Map, Boolean)} instead. + * @deprecated As of 0.9 in favor of {@link #builder()}. Will be removed with next major release. */ @Deprecated public Token(final String id, @@ -121,7 +126,9 @@ public final class Token { * @param policies List of policies (optional) * @param meta Metadata (optional) * @param renewable Is the token renewable (optional) + * @deprecated As of 0.9 in favor of {@link #builder()}. Will be removed with next major release. */ + @Deprecated public Token(final String id, final String type, final String displayName, @@ -144,6 +151,24 @@ public final class Token { this.renewable = renewable; } + /** + * Construct {@link Token} object from {@link Builder}. + * + * @param builder Token builder. + */ + public Token(final Builder builder) { + this.id = builder.id; + this.type = builder.type != null ? builder.type.value() : null; + this.displayName = builder.displayName; + this.noParent = builder.noParent; + this.noDefaultPolicy = builder.noDefaultPolicy; + this.ttl = builder.ttl; + this.numUses = builder.numUses; + this.policies = builder.policies; + this.meta = builder.meta; + this.renewable = builder.renewable; + } + /** * @return Token ID */ @@ -235,4 +260,251 @@ public final class Token { return value; } } + + + /** + * A builder for vault tokens. + * + * @author Stefan Kalscheuer + * @since 0.4.0 + * @since 0.9 Moved into subclass of {@link Token}. + */ + public static final class Builder { + private String id; + private Type type; + private String displayName; + private Boolean noParent; + private Boolean noDefaultPolicy; + private Integer ttl; + private Integer numUses; + private List policies; + private Map meta; + private Boolean renewable; + + /** + * Add token ID. (optional) + * + * @param id the ID + * @return self + */ + public Builder withId(final String id) { + this.id = id; + return this; + } + + /** + * Specify token type. + * + * @param type the type + * @return self + * @since 0.9 + */ + public Builder withType(final Token.Type type) { + this.type = type; + return this; + } + + /** + * Add display name. + * + * @param displayName the display name + * @return self + */ + public Builder withDisplayName(final String displayName) { + this.displayName = displayName; + return this; + } + + /** + * Set desired time to live. + * + * @param ttl the ttl + * @return self + */ + public Builder withTtl(final Integer ttl) { + this.ttl = ttl; + return this; + } + + /** + * Set desired number of uses. + * + * @param numUses the number of uses + * @return self + */ + public Builder withNumUses(final Integer numUses) { + this.numUses = numUses; + return this; + } + + /** + * Set TRUE if the token should be created without parent. + * + * @param noParent if TRUE, token is created as orphan + * @return self + */ + public Builder withNoParent(final boolean noParent) { + this.noParent = noParent; + return this; + } + + /** + * Create token without parent. + * Convenience method for withNoParent() + * + * @return self + */ + public Builder asOrphan() { + return withNoParent(true); + } + + /** + * Create token with parent. + * Convenience method for withNoParent() + * + * @return self + */ + public Builder withParent() { + return withNoParent(false); + } + + /** + * Set TRUE if the default policy should not be part of this token. + * + * @param noDefaultPolicy if TRUE, default policy is not attached + * @return self + */ + public Builder withNoDefaultPolicy(final boolean noDefaultPolicy) { + this.noDefaultPolicy = noDefaultPolicy; + return this; + } + + /** + * Attach default policy to token. + * Convenience method for withNoDefaultPolicy() + * + * @return self + */ + public Builder withDefaultPolicy() { + return withNoDefaultPolicy(false); + } + + /** + * Do not attach default policy to token. + * Convenience method for withNoDefaultPolicy() + * + * @return self + */ + public Builder withoutDefaultPolicy() { + return withNoDefaultPolicy(true); + } + + /** + * Add given policies. + * + * @param policies the policies + * @return self + * @since 0.5.0 + */ + public Builder withPolicies(final String... policies) { + return withPolicies(Arrays.asList(policies)); + } + + /** + * Add given policies. + * + * @param policies the policies + * @return self + */ + public Builder withPolicies(final List policies) { + if (this.policies == null) { + this.policies = new ArrayList<>(); + } + this.policies.addAll(policies); + return this; + } + + /** + * Add a single policy. + * + * @param policy the policy + * @return self + */ + public Builder withPolicy(final String policy) { + if (this.policies == null) { + this.policies = new ArrayList<>(); + } + policies.add(policy); + return this; + } + + /** + * Add meta data. + * + * @param meta the metadata + * @return self + */ + public Builder withMeta(final Map meta) { + if (this.meta == null) { + this.meta = new HashMap<>(); + } + this.meta.putAll(meta); + return this; + } + + /** + * Add meta data. + * + * @param key the key + * @param value the value + * @return self + */ + public Builder withMeta(final String key, final String value) { + if (this.meta == null) { + this.meta = new HashMap<>(); + } + this.meta.put(key, value); + return this; + } + + /** + * Set if token is renewable. + * + * @param renewable TRUE, if renewable + * @return self + */ + public Builder withRenewable(final Boolean renewable) { + this.renewable = renewable; + return this; + } + + /** + * Set token to be renewable. + * Convenience method for withRenewable() + * + * @return self + */ + public Builder renewable() { + return withRenewable(true); + } + + /** + * Set token to be not renewable. + * Convenience method for withRenewable() + * + * @return self + */ + public Builder notRenewable() { + return withRenewable(false); + } + + /** + * Build the token based on given parameters. + * + * @return the token + */ + public Token build() { + return new Token(this); + } + } } diff --git a/src/main/java/de/stklcode/jvault/connector/model/TokenBuilder.java b/src/main/java/de/stklcode/jvault/connector/model/TokenBuilder.java index 18ef7fd..589a2d5 100644 --- a/src/main/java/de/stklcode/jvault/connector/model/TokenBuilder.java +++ b/src/main/java/de/stklcode/jvault/connector/model/TokenBuilder.java @@ -23,7 +23,9 @@ import java.util.*; * * @author Stefan Kalscheuer * @since 0.4.0 + * @deprecated As of 0.9 in favor of {@link Token.Builder}. */ +@Deprecated public final class TokenBuilder { private String id; private Token.Type type; diff --git a/src/main/java/de/stklcode/jvault/connector/model/TokenRole.java b/src/main/java/de/stklcode/jvault/connector/model/TokenRole.java index a980408..3526f49 100644 --- a/src/main/java/de/stklcode/jvault/connector/model/TokenRole.java +++ b/src/main/java/de/stklcode/jvault/connector/model/TokenRole.java @@ -20,6 +20,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.ArrayList; import java.util.List; /** @@ -31,13 +32,12 @@ import java.util.List; @JsonIgnoreProperties(ignoreUnknown = true) public final class TokenRole { /** - * Get {@link TokenRoleBuilder} instance. + * Get {@link Builder} instance. * * @return Token Role Builder. - * @since 0.9 */ - public static TokenRoleBuilder builder() { - return new TokenRoleBuilder(); + public static Builder builder() { + return new Builder(); } @JsonProperty("name") @@ -98,49 +98,20 @@ public final class TokenRole { public TokenRole() { } - /** - * Construct complete {@link TokenRole} object. - * - * @param name Token Role name (redundant for creation). - * @param allowedPolicies Allowed policies (optional) - * @param disallowedPolicies Disallowed policies (optional) - * @param orphan Role is orphan? (optional) - * @param renewable Role is renewable? (optional) - * @param pathSuffix Paht suffix (optional) - * @param allowedEntityAliases Allowed entity aliases (optional) - * @param tokenBoundCidrs Token bound CIDR blocks (optional) - * @param tokenExplicitMaxTtl Token explicit maximum TTL (optional) - * @param tokenNoDefaultPolicy Token wihtout default policy? (optional) - * @param tokenNumUses Token number of uses (optional) - * @param tokenPeriod Token period (optional) - * @param tokenType Token type (optional) - */ - public TokenRole(final String name, - final List allowedPolicies, - final List disallowedPolicies, - final Boolean orphan, - final Boolean renewable, - final String pathSuffix, - final List allowedEntityAliases, - final List tokenBoundCidrs, - final Integer tokenExplicitMaxTtl, - final Boolean tokenNoDefaultPolicy, - final Integer tokenNumUses, - final Integer tokenPeriod, - final String tokenType) { - this.name = name; - this.allowedPolicies = allowedPolicies; - this.disallowedPolicies = disallowedPolicies; - this.orphan = orphan; - this.renewable = renewable; - this.pathSuffix = pathSuffix; - this.allowedEntityAliases = allowedEntityAliases; - this.tokenBoundCidrs = tokenBoundCidrs; - this.tokenExplicitMaxTtl = tokenExplicitMaxTtl; - this.tokenNoDefaultPolicy = tokenNoDefaultPolicy; - this.tokenNumUses = tokenNumUses; - this.tokenPeriod = tokenPeriod; - this.tokenType = tokenType; + public TokenRole(final Builder builder) { + this.name = builder.name; + this.allowedPolicies = builder.allowedPolicies; + this.disallowedPolicies = builder.disallowedPolicies; + this.orphan = builder.orphan; + this.renewable = builder.renewable; + this.pathSuffix = builder.pathSuffix; + this.allowedEntityAliases = builder.allowedEntityAliases; + this.tokenBoundCidrs = builder.tokenBoundCidrs; + this.tokenExplicitMaxTtl = builder.tokenExplicitMaxTtl; + this.tokenNoDefaultPolicy = builder.tokenNoDefaultPolicy; + this.tokenNumUses = builder.tokenNumUses; + this.tokenPeriod = builder.tokenPeriod; + this.tokenType = builder.tokenType != null ? builder.tokenType.value() : null; } /** @@ -233,4 +204,262 @@ public final class TokenRole { public String getTokenType() { return tokenType; } + + /** + * A builder for vault token roles. + * + * @author Stefan Kalscheuer + * @since 0.9 + */ + public static final class Builder { + private String name; + private List allowedPolicies; + private List disallowedPolicies; + private Boolean orphan; + private Boolean renewable; + private String pathSuffix; + private List allowedEntityAliases; + private List tokenBoundCidrs; + private Integer tokenExplicitMaxTtl; + private Boolean tokenNoDefaultPolicy; + private Integer tokenNumUses; + private Integer tokenPeriod; + private Token.Type tokenType; + + /** + * Add token role name. + * + * @param name role name + * @return self + */ + public Builder forName(final String name) { + this.name = name; + return this; + } + + /** + * Add an allowed policy. + * + * @param allowedPolicy allowed policy to add + * @return self + */ + public Builder withAllowedPolicy(final String allowedPolicy) { + if (allowedPolicy != null) { + if (this.allowedPolicies == null) { + this.allowedPolicies = new ArrayList<>(); + } + this.allowedPolicies.add(allowedPolicy); + } + return this; + } + + /** + * Add allowed policies. + * + * @param allowedPolicies list of allowed policies + * @return self + */ + public Builder withAllowedPolicies(final List allowedPolicies) { + if (allowedPolicies != null) { + if (this.allowedPolicies == null) { + this.allowedPolicies = new ArrayList<>(); + } + this.allowedPolicies.addAll(allowedPolicies); + } + return this; + } + + /** + * Add a disallowed policy. + * + * @param disallowedPolicy disallowed policy to add + * @return self + */ + public Builder withDisallowedPolicy(final String disallowedPolicy) { + if (disallowedPolicy != null) { + if (this.disallowedPolicies == null) { + this.disallowedPolicies = new ArrayList<>(); + } + this.disallowedPolicies.add(disallowedPolicy); + } + return this; + } + + /** + * Add disallowed policies. + * + * @param disallowedPolicies list of disallowed policies + * @return self + */ + public Builder withDisallowedPolicies(final List disallowedPolicies) { + if (disallowedPolicies != null) { + if (this.disallowedPolicies == null) { + this.disallowedPolicies = new ArrayList<>(); + } + this.disallowedPolicies.addAll(disallowedPolicies); + } + return this; + } + + /** + * Set TRUE if the token role should be created orphan. + * + * @param orphan if TRUE, token role is created as orphan + * @return self + */ + public Builder orphan(final Boolean orphan) { + this.orphan = orphan; + return this; + } + + /** + * Set TRUE if the token role should be created renewable. + * + * @param renewable if TRUE, token role is created renewable + * @return self + */ + public Builder renewable(final Boolean renewable) { + this.renewable = renewable; + return this; + } + + /** + * Set token role path suffix. + * + * @param pathSuffix path suffix to use + * @return self + */ + public Builder withPathSuffix(final String pathSuffix) { + this.pathSuffix = pathSuffix; + return this; + } + + /** + * Add an allowed entity alias. + * + * @param allowedEntityAlias allowed entity alias to add + * @return self + */ + public Builder withAllowedEntityAlias(final String allowedEntityAlias) { + if (allowedEntityAlias != null) { + if (this.allowedEntityAliases == null) { + this.allowedEntityAliases = new ArrayList<>(); + } + this.allowedEntityAliases.add(allowedEntityAlias); + } + return this; + } + + /** + * Add allowed entity aliases. + * + * @param allowedEntityAliases list of allowed entity aliases to add + * @return self + */ + public Builder withAllowedEntityAliases(final List allowedEntityAliases) { + if (allowedEntityAliases != null) { + if (this.allowedEntityAliases == null) { + this.allowedEntityAliases = new ArrayList<>(); + } + this.allowedEntityAliases.addAll(allowedEntityAliases); + } + return this; + } + + /** + * Add a single bound CIDR. + * + * @param tokenBoundCidr bound CIDR to add + * @return self + */ + public Builder withTokenBoundCidr(final String tokenBoundCidr) { + if (tokenBoundCidr != null) { + if (this.tokenBoundCidrs == null) { + this.tokenBoundCidrs = new ArrayList<>(); + } + this.tokenBoundCidrs.add(tokenBoundCidr); + } + return this; + } + + /** + * Add a list of bound CIDRs. + * + * @param tokenBoundCidrs list of bound CIDRs to add + * @return self + */ + public Builder withTokenBoundCidrs(final List tokenBoundCidrs) { + if (tokenBoundCidrs != null) { + if (this.tokenBoundCidrs == null) { + this.tokenBoundCidrs = new ArrayList<>(); + } + this.tokenBoundCidrs.addAll(tokenBoundCidrs); + } + return this; + } + + /** + * Set explicit max. TTL for token. + * + * @param tokenExplicitMaxTtl explicit maximum TTL + * @return self + */ + public Builder withTokenExplicitMaxTtl(final Integer tokenExplicitMaxTtl) { + this.tokenExplicitMaxTtl = tokenExplicitMaxTtl; + return this; + } + + /** + * Set TRUE if the token role should be created renewable. + * + * @param tokenNoDefaultPolicy if TRUE, token is created without default policy. + * @return self + */ + public Builder withTokenNoDefaultPolicy(final Boolean tokenNoDefaultPolicy) { + this.tokenNoDefaultPolicy = tokenNoDefaultPolicy; + return this; + } + + /** + * Set number of uses for tokens. + * + * @param tokenNumUses number of uses for associated tokens. + * @return self + */ + public Builder withTokenNumUses(final Integer tokenNumUses) { + this.tokenNumUses = tokenNumUses; + return this; + } + + /** + * Set token period. + * + * @param tokenPeriod token period + * @return self + */ + public Builder withTokenPeriod(final Integer tokenPeriod) { + this.tokenPeriod = tokenPeriod; + return this; + } + + /** + * Set token type. + * + * @param tokenType token type + * @return self + */ + public Builder withTokenType(final Token.Type tokenType) { + this.tokenType = tokenType; + return this; + } + + /** + * Build the token based on given parameters. + * + * @return the token + */ + public TokenRole build() { + return new TokenRole(this); + } + } } diff --git a/src/main/java/de/stklcode/jvault/connector/model/TokenRoleBuilder.java b/src/main/java/de/stklcode/jvault/connector/model/TokenRoleBuilder.java deleted file mode 100644 index 0c5a4b8..0000000 --- a/src/main/java/de/stklcode/jvault/connector/model/TokenRoleBuilder.java +++ /dev/null @@ -1,292 +0,0 @@ -/* - * Copyright 2016-2020 Stefan Kalscheuer - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package de.stklcode.jvault.connector.model; - -import java.util.ArrayList; -import java.util.List; - -/** - * A builder for vault token roles. - * - * @author Stefan Kalscheuer - * @since 0.9 - */ -public final class TokenRoleBuilder { - private String name; - private List allowedPolicies; - private List disallowedPolicies; - private Boolean orphan; - private Boolean renewable; - private String pathSuffix; - private List allowedEntityAliases; - private List tokenBoundCidrs; - private Integer tokenExplicitMaxTtl; - private Boolean tokenNoDefaultPolicy; - private Integer tokenNumUses; - private Integer tokenPeriod; - private Token.Type tokenType; - - /** - * Add token role name. - * - * @param name role name - * @return self - */ - public TokenRoleBuilder forName(final String name) { - this.name = name; - return this; - } - - /** - * Add an allowed policy. - * - * @param allowedPolicy allowed policy to add - * @return self - */ - public TokenRoleBuilder withAllowedPolicy(final String allowedPolicy) { - if (allowedPolicy != null) { - if (this.allowedPolicies == null) { - this.allowedPolicies = new ArrayList<>(); - } - this.allowedPolicies.add(allowedPolicy); - } - return this; - } - - /** - * Add allowed policies. - * - * @param allowedPolicies list of allowed policies - * @return self - */ - public TokenRoleBuilder withAllowedPolicies(final List allowedPolicies) { - if (allowedPolicies != null) { - if (this.allowedPolicies == null) { - this.allowedPolicies = new ArrayList<>(); - } - this.allowedPolicies.addAll(allowedPolicies); - } - return this; - } - - /** - * Add a disallowed policy. - * - * @param disallowedPolicy disallowed policy to add - * @return self - */ - public TokenRoleBuilder withDisallowedPolicy(final String disallowedPolicy) { - if (disallowedPolicy != null) { - if (this.disallowedPolicies == null) { - this.disallowedPolicies = new ArrayList<>(); - } - this.disallowedPolicies.add(disallowedPolicy); - } - return this; - } - - /** - * Add disallowed policies. - * - * @param disallowedPolicies list of disallowed policies - * @return self - */ - public TokenRoleBuilder withDisallowedPolicies(final List disallowedPolicies) { - if (disallowedPolicies != null) { - if (this.disallowedPolicies == null) { - this.disallowedPolicies = new ArrayList<>(); - } - this.disallowedPolicies.addAll(disallowedPolicies); - } - return this; - } - - /** - * Set TRUE if the token role should be created orphan. - * - * @param orphan if TRUE, token role is created as orphan - * @return self - */ - public TokenRoleBuilder orphan(final Boolean orphan) { - this.orphan = orphan; - return this; - } - - /** - * Set TRUE if the token role should be created renewable. - * - * @param renewable if TRUE, token role is created renewable - * @return self - */ - public TokenRoleBuilder renewable(final Boolean renewable) { - this.renewable = renewable; - return this; - } - - /** - * Set token role path suffix. - * - * @param pathSuffix path suffix to use - * @return self - */ - public TokenRoleBuilder withPathSuffix(final String pathSuffix) { - this.pathSuffix = pathSuffix; - return this; - } - - /** - * Add an allowed entity alias. - * - * @param allowedEntityAlias allowed entity alias to add - * @return self - */ - public TokenRoleBuilder withAllowedEntityAlias(final String allowedEntityAlias) { - if (allowedEntityAlias != null) { - if (this.allowedEntityAliases == null) { - this.allowedEntityAliases = new ArrayList<>(); - } - this.allowedEntityAliases.add(allowedEntityAlias); - } - return this; - } - - /** - * Add allowed entity aliases. - * - * @param allowedEntityAliases list of allowed entity aliases to add - * @return self - */ - public TokenRoleBuilder withAllowedEntityAliases(final List allowedEntityAliases) { - if (allowedEntityAliases != null) { - if (this.allowedEntityAliases == null) { - this.allowedEntityAliases = new ArrayList<>(); - } - this.allowedEntityAliases.addAll(allowedEntityAliases); - } - return this; - } - - /** - * Add a single bound CIDR. - * - * @param tokenBoundCidr bound CIDR to add - * @return self - */ - public TokenRoleBuilder withTokenBoundCidr(final String tokenBoundCidr) { - if (tokenBoundCidr != null) { - if (this.tokenBoundCidrs == null) { - this.tokenBoundCidrs = new ArrayList<>(); - } - this.tokenBoundCidrs.add(tokenBoundCidr); - } - return this; - } - - /** - * Add a list of bound CIDRs. - * - * @param tokenBoundCidrs list of bound CIDRs to add - * @return self - */ - public TokenRoleBuilder withTokenBoundCidrs(final List tokenBoundCidrs) { - if (tokenBoundCidrs != null) { - if (this.tokenBoundCidrs == null) { - this.tokenBoundCidrs = new ArrayList<>(); - } - this.tokenBoundCidrs.addAll(tokenBoundCidrs); - } - return this; - } - - /** - * Set explicit max. TTL for token. - * - * @param tokenExplicitMaxTtl explicit maximum TTL - * @return self - */ - public TokenRoleBuilder withTokenExplicitMaxTtl(final Integer tokenExplicitMaxTtl) { - this.tokenExplicitMaxTtl = tokenExplicitMaxTtl; - return this; - } - - /** - * Set TRUE if the token role should be created renewable. - * - * @param tokenNoDefaultPolicy if TRUE, token is created without default policy. - * @return self - */ - public TokenRoleBuilder withTokenNoDefaultPolicy(final Boolean tokenNoDefaultPolicy) { - this.tokenNoDefaultPolicy = tokenNoDefaultPolicy; - return this; - } - - /** - * Set number of uses for tokens. - * - * @param tokenNumUses number of uses for associated tokens. - * @return self - */ - public TokenRoleBuilder withTokenNumUses(final Integer tokenNumUses) { - this.tokenNumUses = tokenNumUses; - return this; - } - - /** - * Set token period. - * - * @param tokenPeriod token period - * @return self - */ - public TokenRoleBuilder withTokenPeriod(final Integer tokenPeriod) { - this.tokenPeriod = tokenPeriod; - return this; - } - - /** - * Set token type. - * - * @param tokenType token type - * @return self - */ - public TokenRoleBuilder withTokenType(final Token.Type tokenType) { - this.tokenType = tokenType; - return this; - } - - /** - * Build the token based on given parameters. - * - * @return the token - */ - public TokenRole build() { - return new TokenRole( - name, - allowedPolicies, - disallowedPolicies, - orphan, - renewable, - pathSuffix, - allowedEntityAliases, - tokenBoundCidrs, - tokenExplicitMaxTtl, - tokenNoDefaultPolicy, - tokenNumUses, - tokenPeriod, - tokenType != null ? tokenType.value() : null - ); - } -} diff --git a/src/test/java/de/stklcode/jvault/connector/model/AppRoleBuilderTest.java b/src/test/java/de/stklcode/jvault/connector/model/AppRoleBuilderTest.java index 690ad2e..2a98f7f 100644 --- a/src/test/java/de/stklcode/jvault/connector/model/AppRoleBuilderTest.java +++ b/src/test/java/de/stklcode/jvault/connector/model/AppRoleBuilderTest.java @@ -68,6 +68,34 @@ public class AppRoleBuilderTest { */ @Test public void buildDefaultTest() throws JsonProcessingException { + AppRole role = AppRole.builder(NAME).build(); + assertThat(role.getId(), is(nullValue())); + assertThat(role.getBindSecretId(), is(nullValue())); + assertThat(role.getSecretIdBoundCidrs(), is(nullValue())); + assertThat(role.getTokenPolicies(), is(nullValue())); + assertThat(role.getPolicies(), is(nullValue())); + assertThat(role.getSecretIdNumUses(), is(nullValue())); + assertThat(role.getSecretIdTtl(), is(nullValue())); + assertThat(role.getEnableLocalSecretIds(), is(nullValue())); + assertThat(role.getTokenTtl(), is(nullValue())); + assertThat(role.getTokenMaxTtl(), is(nullValue())); + assertThat(role.getTokenBoundCidrs(), is(nullValue())); + assertThat(role.getTokenExplicitMaxTtl(), is(nullValue())); + assertThat(role.getTokenNoDefaultPolicy(), is(nullValue())); + assertThat(role.getTokenNumUses(), is(nullValue())); + assertThat(role.getTokenPeriod(), is(nullValue())); + assertThat(role.getPeriod(), is(nullValue())); + assertThat(role.getTokenType(), is(nullValue())); + + /* optional fields should be ignored, so JSON string should only contain role_name */ + assertThat(new ObjectMapper().writeValueAsString(role), is(JSON_MIN)); + } + + /** + * Build role with only a name. + */ + @Test + public void legacyBuildDefaultTest() throws JsonProcessingException { AppRole role = new AppRoleBuilder(NAME).build(); assertThat(role.getId(), is(nullValue())); assertThat(role.getBindSecretId(), is(nullValue())); @@ -96,6 +124,51 @@ public class AppRoleBuilderTest { */ @Test public void buildFullTest() throws JsonProcessingException { + AppRole role = AppRole.builder(NAME) + .withId(ID) + .withBindSecretID(BIND_SECRET_ID) + .withSecretIdBoundCidrs(BOUND_CIDR_LIST) + .withTokenPolicies(POLICIES) + .withSecretIdNumUses(SECRET_ID_NUM_USES) + .withSecretIdTtl(SECRET_ID_TTL) + .withEnableLocalSecretIds(ENABLE_LOCAL_SECRET_IDS) + .withTokenTtl(TOKEN_TTL) + .withTokenMaxTtl(TOKEN_MAX_TTL) + .withTokenBoundCidrs(BOUND_CIDR_LIST) + .withTokenExplicitMaxTtl(TOKEN_EXPLICIT_MAX_TTL) + .withTokenNoDefaultPolicy(TOKEN_NO_DEFAULT_POLICY) + .withTokenNumUses(TOKEN_NUM_USES) + .wit0hTokenPeriod(TOKEN_PERIOD) + .withTokenType(TOKEN_TYPE) + .build(); + assertThat(role.getName(), is(NAME)); + assertThat(role.getId(), is(ID)); + assertThat(role.getBindSecretId(), is(BIND_SECRET_ID)); + assertThat(role.getSecretIdBoundCidrs(), is(BOUND_CIDR_LIST)); + assertThat(role.getTokenPolicies(), is(POLICIES)); + assertThat(role.getPolicies(), is(role.getTokenPolicies())); + assertThat(role.getSecretIdNumUses(), is(SECRET_ID_NUM_USES)); + assertThat(role.getSecretIdTtl(), is(SECRET_ID_TTL)); + assertThat(role.getEnableLocalSecretIds(), is(ENABLE_LOCAL_SECRET_IDS)); + assertThat(role.getTokenTtl(), is(TOKEN_TTL)); + assertThat(role.getTokenMaxTtl(), is(TOKEN_MAX_TTL)); + assertThat(role.getTokenBoundCidrs(), is(BOUND_CIDR_LIST)); + assertThat(role.getTokenExplicitMaxTtl(), is(TOKEN_EXPLICIT_MAX_TTL)); + assertThat(role.getTokenNoDefaultPolicy(), is(TOKEN_NO_DEFAULT_POLICY)); + assertThat(role.getTokenNumUses(), is(TOKEN_NUM_USES)); + assertThat(role.getTokenPeriod(), is(TOKEN_PERIOD)); + assertThat(role.getPeriod(), is(TOKEN_PERIOD)); + assertThat(role.getTokenType(), is(TOKEN_TYPE.value())); + + /* Verify that all parameters are included in JSON string */ + assertThat(new ObjectMapper().writeValueAsString(role), is(JSON_FULL)); + } + + /** + * Build token without all parameters set. + */ + @Test + public void legacyBuildFullTest() throws JsonProcessingException { AppRole role = new AppRoleBuilder(NAME) .withId(ID) .withBindSecretID(BIND_SECRET_ID) @@ -141,6 +214,50 @@ public class AppRoleBuilderTest { */ @Test public void convenienceMethodsTest() { + /* bind_secret_id */ + AppRole role = AppRole.builder(NAME).build(); + assertThat(role.getBindSecretId(), is(nullValue())); + role = AppRole.builder(NAME).withBindSecretID().build(); + assertThat(role.getBindSecretId(), is(true)); + role = AppRole.builder(NAME).withoutBindSecretID().build(); + assertThat(role.getBindSecretId(), is(false)); + + /* Add single CIDR subnet */ + role = AppRole.builder(NAME).withSecretBoundCidr(CIDR_2).withTokenBoundCidr(CIDR_2).build(); + assertThat(role.getSecretIdBoundCidrs(), hasSize(1)); + assertThat(role.getSecretIdBoundCidrs(), contains(CIDR_2)); + assertThat(role.getTokenBoundCidrs(), hasSize(1)); + assertThat(role.getTokenBoundCidrs(), contains(CIDR_2)); + role = AppRole.builder(NAME) + .withSecretIdBoundCidrs(BOUND_CIDR_LIST) + .withSecretBoundCidr(CIDR_2) + .withTokenBoundCidrs(BOUND_CIDR_LIST) + .withTokenBoundCidr(CIDR_2) + .build(); + assertThat(role.getSecretIdBoundCidrs(), hasSize(2)); + assertThat(role.getSecretIdBoundCidrs(), contains(CIDR_1, CIDR_2)); + assertThat(role.getTokenBoundCidrs(), hasSize(2)); + assertThat(role.getSecretIdBoundCidrs(), contains(CIDR_1, CIDR_2)); + + /* Add single policy */ + role = AppRole.builder(NAME).withTokenPolicy(POLICY_2).build(); + assertThat(role.getTokenPolicies(), hasSize(1)); + assertThat(role.getTokenPolicies(), contains(POLICY_2)); + assertThat(role.getPolicies(), is(role.getTokenPolicies())); + role = AppRole.builder(NAME) + .withTokenPolicies(POLICIES) + .withTokenPolicy(POLICY_2) + .build(); + assertThat(role.getTokenPolicies(), hasSize(2)); + assertThat(role.getTokenPolicies(), contains(POLICY, POLICY_2)); + assertThat(role.getPolicies(), is(role.getTokenPolicies())); + } + + /** + * Test convenience methods + */ + @Test + public void legacyConvenienceMethodsTest() { /* bind_secret_id */ AppRole role = new AppRoleBuilder(NAME).build(); assertThat(role.getBindSecretId(), is(nullValue())); diff --git a/src/test/java/de/stklcode/jvault/connector/model/TokenBuilderTest.java b/src/test/java/de/stklcode/jvault/connector/model/TokenBuilderTest.java index 6672815..3f228f6 100644 --- a/src/test/java/de/stklcode/jvault/connector/model/TokenBuilderTest.java +++ b/src/test/java/de/stklcode/jvault/connector/model/TokenBuilderTest.java @@ -66,6 +66,27 @@ public class TokenBuilderTest { */ @Test public void buildDefaultTest() throws JsonProcessingException { + Token token = Token.builder().build(); + assertThat(token.getId(), is(nullValue())); + assertThat(token.getType(), is(nullValue())); + assertThat(token.getDisplayName(), is(nullValue())); + assertThat(token.getNoParent(), is(nullValue())); + assertThat(token.getNoDefaultPolicy(), is(nullValue())); + assertThat(token.getTtl(), is(nullValue())); + assertThat(token.getNumUses(), is(nullValue())); + assertThat(token.getPolicies(), is(nullValue())); + assertThat(token.getMeta(), is(nullValue())); + assertThat(token.isRenewable(), is(nullValue())); + + /* optional fields should be ignored, so JSON string should be empty */ + assertThat(new ObjectMapper().writeValueAsString(token), is("{}")); + } + + /** + * Build token without any parameters. + */ + @Test + public void legadcyBuildDefaultTest() throws JsonProcessingException { Token token = new TokenBuilder().build(); assertThat(token.getId(), is(nullValue())); assertThat(token.getType(), is(nullValue())); @@ -87,6 +108,38 @@ public class TokenBuilderTest { */ @Test public void buildFullTest() throws JsonProcessingException { + Token token = Token.builder() + .withId(ID) + .withType(Token.Type.SERVICE) + .withDisplayName(DISPLAY_NAME) + .withNoParent(NO_PARENT) + .withNoDefaultPolicy(NO_DEFAULT_POLICY) + .withTtl(TTL) + .withNumUses(NUM_USES) + .withPolicies(POLICIES) + .withMeta(META) + .withRenewable(RENEWABLE) + .build(); + assertThat(token.getId(), is(ID)); + assertThat(token.getType(), is(Token.Type.SERVICE.value())); + assertThat(token.getDisplayName(), is(DISPLAY_NAME)); + assertThat(token.getNoParent(), is(NO_PARENT)); + assertThat(token.getNoDefaultPolicy(), is(NO_DEFAULT_POLICY)); + assertThat(token.getTtl(), is(TTL)); + assertThat(token.getNumUses(), is(NUM_USES)); + assertThat(token.getPolicies(), is(POLICIES)); + assertThat(token.getMeta(), is(META)); + assertThat(token.isRenewable(), is(RENEWABLE)); + + /* Verify that all parameters are included in JSON string */ + assertThat(new ObjectMapper().writeValueAsString(token), is(JSON_FULL)); + } + + /** + * Build token without all parameters set. + */ + @Test + public void legacyBuildFullTest() throws JsonProcessingException { Token token = new TokenBuilder() .withId(ID) .withType(Token.Type.SERVICE) @@ -119,6 +172,54 @@ public class TokenBuilderTest { */ @Test public void convenienceMethodsTest() { + /* Parent */ + Token token = Token.builder().asOrphan().build(); + assertThat(token.getNoParent(), is(true)); + token = Token.builder().withParent().build(); + assertThat(token.getNoParent(), is(false)); + + /* Default policy */ + token = Token.builder().withDefaultPolicy().build(); + assertThat(token.getNoDefaultPolicy(), is(false)); + token = Token.builder().withoutDefaultPolicy().build(); + assertThat(token.getNoDefaultPolicy(), is(true)); + + /* Renewability */ + token = Token.builder().renewable().build(); + assertThat(token.isRenewable(), is(true)); + token = Token.builder().notRenewable().build(); + assertThat(token.isRenewable(), is(false)); + + /* Add single policy */ + token = Token.builder().withPolicy(POLICY_2).build(); + assertThat(token.getPolicies(), hasSize(1)); + assertThat(token.getPolicies(), contains(POLICY_2)); + token = Token.builder() + .withPolicies(POLICY, POLICY_2) + .withPolicy(POLICY_3) + .build(); + assertThat(token.getPolicies(), hasSize(3)); + assertThat(token.getPolicies(), contains(POLICY, POLICY_2, POLICY_3)); + + /* Add single metadata */ + token = Token.builder().withMeta(META_KEY_2, META_VALUE_2).build(); + assertThat(token.getMeta().size(), is(1)); + assertThat(token.getMeta().keySet(), contains(META_KEY_2)); + assertThat(token.getMeta().get(META_KEY_2), is(META_VALUE_2)); + token = Token.builder() + .withMeta(META) + .withMeta(META_KEY_2, META_VALUE_2) + .build(); + assertThat(token.getMeta().size(), is(2)); + assertThat(token.getMeta().get(META_KEY), is(META_VALUE)); + assertThat(token.getMeta().get(META_KEY_2), is(META_VALUE_2)); + } + + /** + * Test convenience methods + */ + @Test + public void legacyConvenienceMethodsTest() { /* Parent */ Token token = new TokenBuilder().asOrphan().build(); assertThat(token.getNoParent(), is(true)); diff --git a/src/test/java/de/stklcode/jvault/connector/model/TokenRoleBuilderTest.java b/src/test/java/de/stklcode/jvault/connector/model/TokenRoleBuilderTest.java index f738fbc..e1b2bc7 100644 --- a/src/test/java/de/stklcode/jvault/connector/model/TokenRoleBuilderTest.java +++ b/src/test/java/de/stklcode/jvault/connector/model/TokenRoleBuilderTest.java @@ -27,7 +27,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; /** - * Unit Test for {@link TokenRoleBuilder} + * Unit Test for {@link Token.Builder} * * @author Stefan Kalscheuer * @since 0.9 @@ -79,7 +79,7 @@ public class TokenRoleBuilderTest { */ @Test public void buildDefaultTest() throws JsonProcessingException { - TokenRole role = new TokenRoleBuilder().build(); + TokenRole role = TokenRole.builder().build(); assertThat(role.getAllowedPolicies(), is(nullValue())); assertThat(role.getDisallowedPolicies(), is(nullValue())); assertThat(role.getOrphan(), is(nullValue()));