diff --git a/spring-vault-core/src/main/java/org/springframework/vault/client/VaultEndpoint.java b/spring-vault-core/src/main/java/org/springframework/vault/client/VaultEndpoint.java index 6e96549e..11431e47 100644 --- a/spring-vault-core/src/main/java/org/springframework/vault/client/VaultEndpoint.java +++ b/spring-vault-core/src/main/java/org/springframework/vault/client/VaultEndpoint.java @@ -75,6 +75,18 @@ public class VaultEndpoint implements Serializable { return vaultEndpoint; } + /** + * Create a {@link VaultEndpoint} given a {@link String URI}. + * @param uri must contain hostname, port and scheme, must not be empty or + * {@literal null}. + * @return a new {@link VaultEndpoint}. + * @see #from(URI) + * @since 3.1 + */ + public static VaultEndpoint from(String uri) { + return from(URI.create(uri)); + } + /** * Create a {@link VaultEndpoint} given a {@link URI}. * @param uri must contain hostname, port and scheme, must not be empty or diff --git a/spring-vault-core/src/main/java/org/springframework/vault/support/Policy.java b/spring-vault-core/src/main/java/org/springframework/vault/support/Policy.java index 3f17d413..39fa9b9d 100644 --- a/spring-vault-core/src/main/java/org/springframework/vault/support/Policy.java +++ b/spring-vault-core/src/main/java/org/springframework/vault/support/Policy.java @@ -19,6 +19,7 @@ import java.io.IOException; import java.time.Duration; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.LinkedHashMap; import java.util.LinkedHashSet; @@ -59,9 +60,9 @@ import org.springframework.vault.support.Policy.PolicySerializer; * {@link Policy} support JSON serialization and deserialization using Jackson. * * @author Mark Paluch - * @since 2.0 * @see Rule * @see com.fasterxml.jackson.databind.ObjectMapper + * @since 2.0 */ @JsonSerialize(using = PolicySerializer.class) @JsonDeserialize(using = PolicyDeserializer.class) @@ -356,7 +357,7 @@ public class Policy { } /** - * Configure capabilities. apabilities are added when calling this method and + * Configure capabilities. Capabilities are added when calling this method and * do not replace already configured capabilities. * @param capabilities must not be {@literal null}. * @return {@code this} {@link RuleBuilder}. @@ -369,6 +370,25 @@ public class Policy { return capabilities(Arrays.asList(capabilities)); } + /** + * Configure capabilities. Capabilities are added when calling this method and + * do not replace already configured capabilities. + * @param capabilities must not be {@literal null}. + * @return {@code this} {@link RuleBuilder}. + * @since 3.1 + */ + public RuleBuilder capabilities(Collection capabilities) { + + Assert.notNull(capabilities, "Capabilities must not be null"); + Assert.noNullElements(capabilities, "Capabilities must not contain null elements"); + + for (Capability capability : capabilities) { + this.capabilities.add(capability); + } + + return this; + } + /** * Configure capabilities represented as {@link String} literals. This method * resolves capabilities using {@link BuiltinCapabilities}. Capabilities are @@ -397,15 +417,6 @@ public class Policy { return capabilities(mapped); } - private RuleBuilder capabilities(Iterable capabilities) { - - for (Capability capability : capabilities) { - this.capabilities.add(capability); - } - - return this; - } - /** * Configure a min TTL for response wrapping. * @param ttl must not be {@literal null}. @@ -749,7 +760,9 @@ public class Policy { static class StringToDurationConverter implements Converter { static Pattern SECONDS = Pattern.compile("(\\d+)s"); + static Pattern MINUTES = Pattern.compile("(\\d+)m"); + static Pattern HOURS = Pattern.compile("(\\d+)h"); @Override diff --git a/spring-vault-core/src/test/java/org/springframework/vault/core/lease/TokenExpiryRotatingSecretsIntegrationTests.java b/spring-vault-core/src/test/java/org/springframework/vault/core/lease/TokenExpiryRotatingSecretsIntegrationTests.java index 65e3b6d4..b97685ba 100644 --- a/spring-vault-core/src/test/java/org/springframework/vault/core/lease/TokenExpiryRotatingSecretsIntegrationTests.java +++ b/spring-vault-core/src/test/java/org/springframework/vault/core/lease/TokenExpiryRotatingSecretsIntegrationTests.java @@ -81,8 +81,7 @@ class TokenExpiryRotatingSecretsIntegrationTests extends IntegrationTestSupport VaultOperations vaultOperations = prepare.getVaultOperations(); - Policy policy = Policy - .of(Rule.builder().capabilities(BuiltinCapabilities.crud().toArray(new Capability[0])).path("/*").build()); + Policy policy = Policy.of(Rule.builder().capabilities(BuiltinCapabilities.crud()).path("/*").build()); vaultOperations.opsForSys().createOrUpdatePolicy("TokenExpiryRotatingSecretsIntegrationTests", policy); vaultOperations.write("auth/userpass/users/token-expiry", Map.of("password", "token-expiry", "token_ttl", 8,