From 199aa7ebf99c24783d804a9bc0c996ef106855a4 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Mon, 23 Apr 2018 15:47:13 +0200 Subject: [PATCH] Introduce VaultLoginException. We now throw a more specific exception (VaultLoginException) in cases login fails. Exception creation considers HTTP and other causes extracting relevant details and pulls this into a single method rather than spreading message construction in various places. See gh-203. --- .../authentication/AppIdAuthentication.java | 9 +-- .../authentication/AppRoleAuthentication.java | 27 ++++--- .../AuthenticationStepsExecutor.java | 6 +- .../AuthenticationStepsOperator.java | 2 +- .../authentication/AwsEc2Authentication.java | 9 +-- .../authentication/AwsIamAuthentication.java | 10 ++- .../ClientCertificateAuthentication.java | 10 +-- .../CubbyholeAuthentication.java | 12 ++-- .../GcpComputeAuthentication.java | 2 +- .../authentication/GcpIamAuthentication.java | 2 +- .../GcpJwtAuthenticationSupport.java | 10 +-- .../KubernetesAuthentication.java | 8 +-- .../authentication/LoginTokenAdapter.java | 4 ++ .../authentication/TokenAuthentication.java | 7 -- .../authentication/VaultLoginException.java | 70 +++++++++++++++++++ .../VaultTokenLookupException.java | 14 +++- .../AuthenticationStepsExecutorUnitTests.java | 2 +- ...bbyholeAuthenticationIntegrationTests.java | 2 +- 18 files changed, 132 insertions(+), 74 deletions(-) create mode 100644 spring-vault-core/src/main/java/org/springframework/vault/authentication/VaultLoginException.java diff --git a/spring-vault-core/src/main/java/org/springframework/vault/authentication/AppIdAuthentication.java b/spring-vault-core/src/main/java/org/springframework/vault/authentication/AppIdAuthentication.java index 122785c3..d575d6d4 100644 --- a/spring-vault-core/src/main/java/org/springframework/vault/authentication/AppIdAuthentication.java +++ b/spring-vault-core/src/main/java/org/springframework/vault/authentication/AppIdAuthentication.java @@ -22,11 +22,9 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.util.Assert; -import org.springframework.vault.VaultException; -import org.springframework.vault.client.VaultResponses; import org.springframework.vault.support.VaultResponse; import org.springframework.vault.support.VaultToken; -import org.springframework.web.client.HttpStatusCodeException; +import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestOperations; /** @@ -111,9 +109,8 @@ public class AppIdAuthentication implements ClientAuthentication, return LoginTokenUtil.from(response.getAuth()); } - catch (HttpStatusCodeException e) { - throw new VaultException(String.format("Cannot login using app-id: %s", - VaultResponses.getError(e.getResponseBodyAsString()))); + catch (RestClientException e) { + throw VaultLoginException.create("app-id", e); } } diff --git a/spring-vault-core/src/main/java/org/springframework/vault/authentication/AppRoleAuthentication.java b/spring-vault-core/src/main/java/org/springframework/vault/authentication/AppRoleAuthentication.java index 3e65440d..d8138db4 100644 --- a/spring-vault-core/src/main/java/org/springframework/vault/authentication/AppRoleAuthentication.java +++ b/spring-vault-core/src/main/java/org/springframework/vault/authentication/AppRoleAuthentication.java @@ -28,7 +28,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; -import org.springframework.vault.VaultException; import org.springframework.vault.authentication.AppRoleAuthenticationOptions.RoleId; import org.springframework.vault.authentication.AppRoleAuthenticationOptions.SecretId; import org.springframework.vault.authentication.AppRoleTokens.AbsentSecretId; @@ -40,6 +39,7 @@ import org.springframework.vault.client.VaultResponses; import org.springframework.vault.support.VaultResponse; import org.springframework.vault.support.VaultToken; import org.springframework.web.client.HttpStatusCodeException; +import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestOperations; import static org.springframework.vault.authentication.AuthenticationSteps.HttpRequestBuilder.get; @@ -225,13 +225,12 @@ public class AppRoleAuthentication implements ClientAuthentication, return LoginTokenUtil.from(response.getAuth()); } - catch (HttpStatusCodeException e) { - throw new VaultException(String.format("Cannot login using AppRole: %s", - VaultResponses.getError(e.getResponseBodyAsString()))); + catch (RestClientException e) { + throw VaultLoginException.create("AppRole", e); } } - private String getRoleId(RoleId roleId) { + private String getRoleId(RoleId roleId) throws VaultLoginException { if (roleId instanceof Provided) { return ((Provided) roleId).getValue(); @@ -250,9 +249,9 @@ public class AppRoleAuthentication implements ClientAuthentication, return (String) entity.getBody().getRequiredData().get("role_id"); } catch (HttpStatusCodeException e) { - throw new VaultException(String.format( + throw new VaultLoginException(String.format( "Cannot get Role id using AppRole: %s", - VaultResponses.getError(e.getResponseBodyAsString()))); + VaultResponses.getError(e.getResponseBodyAsString())), e); } } @@ -273,16 +272,16 @@ public class AppRoleAuthentication implements ClientAuthentication, return (String) response.getRequiredData().get("role_id"); } catch (HttpStatusCodeException e) { - throw new VaultException(String.format( + throw new VaultLoginException(String.format( "Cannot unwrap Role id using AppRole: %s", - VaultResponses.getError(e.getResponseBodyAsString()))); + VaultResponses.getError(e.getResponseBodyAsString())), e); } } throw new IllegalArgumentException("Unknown RoleId configuration: " + roleId); } - private String getSecretId(SecretId secretId) { + private String getSecretId(SecretId secretId) throws VaultLoginException { if (secretId instanceof Provided) { return ((Provided) secretId).getValue(); @@ -299,9 +298,9 @@ public class AppRoleAuthentication implements ClientAuthentication, return (String) response.getRequiredData().get("secret_id"); } catch (HttpStatusCodeException e) { - throw new VaultException(String.format( + throw new VaultLoginException(String.format( "Cannot get Secret id using AppRole: %s", - VaultResponses.getError(e.getResponseBodyAsString()))); + VaultResponses.getError(e.getResponseBodyAsString())), e); } } @@ -322,9 +321,9 @@ public class AppRoleAuthentication implements ClientAuthentication, return (String) response.getRequiredData().get("secret_id"); } catch (HttpStatusCodeException e) { - throw new VaultException(String.format( + throw new VaultLoginException(String.format( "Cannot unwrap Role id using AppRole: %s", - VaultResponses.getError(e.getResponseBodyAsString()))); + VaultResponses.getError(e.getResponseBodyAsString())), e); } } diff --git a/spring-vault-core/src/main/java/org/springframework/vault/authentication/AuthenticationStepsExecutor.java b/spring-vault-core/src/main/java/org/springframework/vault/authentication/AuthenticationStepsExecutor.java index 9040ec8a..0f70b4c6 100644 --- a/spring-vault-core/src/main/java/org/springframework/vault/authentication/AuthenticationStepsExecutor.java +++ b/spring-vault-core/src/main/java/org/springframework/vault/authentication/AuthenticationStepsExecutor.java @@ -104,13 +104,13 @@ public class AuthenticationStepsExecutor implements ClientAuthentication { } } catch (HttpStatusCodeException e) { - throw new VaultException(String.format( + throw new VaultLoginException(String.format( "HTTP request %s in state %s failed with Status %s and body %s", o, state, e.getStatusCode(), - VaultResponses.getError(e.getResponseBodyAsString()))); + VaultResponses.getError(e.getResponseBodyAsString())), e); } catch (RuntimeException e) { - throw new VaultException(String.format( + throw new VaultLoginException(String.format( "Authentication execution failed in %s", o), e); } } diff --git a/spring-vault-core/src/main/java/org/springframework/vault/authentication/AuthenticationStepsOperator.java b/spring-vault-core/src/main/java/org/springframework/vault/authentication/AuthenticationStepsOperator.java index 2ec6e549..b9ccebd7 100644 --- a/spring-vault-core/src/main/java/org/springframework/vault/authentication/AuthenticationStepsOperator.java +++ b/spring-vault-core/src/main/java/org/springframework/vault/authentication/AuthenticationStepsOperator.java @@ -133,7 +133,7 @@ public class AuthenticationStepsOperator implements VaultTokenSupplier { stateObject)); }) .onErrorMap( - t -> new VaultException( + t -> new VaultLoginException( "Cannot retrieve VaultToken from authentication chain", t)); } diff --git a/spring-vault-core/src/main/java/org/springframework/vault/authentication/AwsEc2Authentication.java b/spring-vault-core/src/main/java/org/springframework/vault/authentication/AwsEc2Authentication.java index 1855efba..a1826c86 100644 --- a/spring-vault-core/src/main/java/org/springframework/vault/authentication/AwsEc2Authentication.java +++ b/spring-vault-core/src/main/java/org/springframework/vault/authentication/AwsEc2Authentication.java @@ -28,10 +28,8 @@ import org.springframework.util.Assert; import org.springframework.util.StringUtils; import org.springframework.vault.VaultException; import org.springframework.vault.authentication.AuthenticationSteps.HttpRequestBuilder; -import org.springframework.vault.client.VaultResponses; import org.springframework.vault.support.VaultResponse; import org.springframework.vault.support.VaultToken; -import org.springframework.web.client.HttpStatusCodeException; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestOperations; @@ -183,9 +181,8 @@ public class AwsEc2Authentication implements ClientAuthentication, return LoginTokenUtil.from(response.getAuth()); } - catch (HttpStatusCodeException e) { - throw new VaultException(String.format("Cannot login using AWS-EC2: %s", - VaultResponses.getError(e.getResponseBodyAsString()))); + catch (RestClientException e) { + throw VaultLoginException.create("AWS-EC2", e); } } @@ -213,7 +210,7 @@ public class AwsEc2Authentication implements ClientAuthentication, return login; } catch (RestClientException e) { - throw new VaultException(String.format( + throw new VaultLoginException(String.format( "Cannot obtain Identity Document from %s", options.getIdentityDocumentUri()), e); } diff --git a/spring-vault-core/src/main/java/org/springframework/vault/authentication/AwsIamAuthentication.java b/spring-vault-core/src/main/java/org/springframework/vault/authentication/AwsIamAuthentication.java index 8bd88322..bab6b0c4 100644 --- a/spring-vault-core/src/main/java/org/springframework/vault/authentication/AwsIamAuthentication.java +++ b/spring-vault-core/src/main/java/org/springframework/vault/authentication/AwsIamAuthentication.java @@ -36,10 +36,9 @@ import org.springframework.util.Assert; import org.springframework.util.Base64Utils; import org.springframework.util.StringUtils; import org.springframework.vault.VaultException; -import org.springframework.vault.client.VaultResponses; import org.springframework.vault.support.VaultResponse; import org.springframework.vault.support.VaultToken; -import org.springframework.web.client.HttpStatusCodeException; +import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestOperations; /** @@ -134,16 +133,15 @@ public class AwsIamAuthentication implements ClientAuthentication { return LoginTokenUtil.from(response.getAuth()); } - catch (HttpStatusCodeException e) { - throw new VaultException(String.format("Cannot login using AWS-IAM: %s", - VaultResponses.getError(e.getResponseBodyAsString()))); + catch (RestClientException e) { + throw VaultLoginException.create("AWS-IAM", e); } } /** * Create the request body to perform a Vault login using the AWS-IAM authentication * method. - * + * * @param options must not be {@literal null}. * @return the map containing body key-value pairs. */ diff --git a/spring-vault-core/src/main/java/org/springframework/vault/authentication/ClientCertificateAuthentication.java b/spring-vault-core/src/main/java/org/springframework/vault/authentication/ClientCertificateAuthentication.java index 4976f8b1..9d9eb36a 100644 --- a/spring-vault-core/src/main/java/org/springframework/vault/authentication/ClientCertificateAuthentication.java +++ b/spring-vault-core/src/main/java/org/springframework/vault/authentication/ClientCertificateAuthentication.java @@ -21,11 +21,9 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.util.Assert; -import org.springframework.vault.VaultException; -import org.springframework.vault.client.VaultResponses; import org.springframework.vault.support.VaultResponse; import org.springframework.vault.support.VaultToken; -import org.springframework.web.client.HttpStatusCodeException; +import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestOperations; import static org.springframework.vault.authentication.AuthenticationSteps.HttpRequestBuilder.post; @@ -87,10 +85,8 @@ public class ClientCertificateAuthentication implements ClientAuthentication, return LoginTokenUtil.from(response.getAuth()); } - catch (HttpStatusCodeException e) { - throw new VaultException(String.format( - "Cannot login using TLS certificates: %s", - VaultResponses.getError(e.getResponseBodyAsString()))); + catch (RestClientException e) { + throw VaultLoginException.create("TLS Certificates", e); } } } diff --git a/spring-vault-core/src/main/java/org/springframework/vault/authentication/CubbyholeAuthentication.java b/spring-vault-core/src/main/java/org/springframework/vault/authentication/CubbyholeAuthentication.java index f5bf3873..9455100f 100644 --- a/spring-vault-core/src/main/java/org/springframework/vault/authentication/CubbyholeAuthentication.java +++ b/spring-vault-core/src/main/java/org/springframework/vault/authentication/CubbyholeAuthentication.java @@ -32,7 +32,7 @@ import org.springframework.vault.client.VaultResponses; import org.springframework.vault.support.VaultResponse; import org.springframework.vault.support.VaultResponseSupport; import org.springframework.vault.support.VaultToken; -import org.springframework.web.client.HttpStatusCodeException; +import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestOperations; import static org.springframework.vault.authentication.AuthenticationSteps.HttpRequestBuilder.get; @@ -222,10 +222,8 @@ public class CubbyholeAuthentication implements ClientAuthentication, return entity.getBody().getData(); } - catch (HttpStatusCodeException e) { - throw new VaultException(String.format( - "Cannot retrieve Token from Cubbyhole: %s %s", e.getStatusCode(), - VaultResponses.getError(e.getResponseBodyAsString()))); + catch (RestClientException e) { + throw VaultLoginException.create("Cubbyhole", e); } } @@ -263,7 +261,7 @@ public class CubbyholeAuthentication implements ClientAuthentication, } if (data == null || data.isEmpty()) { - throw new VaultException( + throw new VaultLoginException( String.format( "Cannot retrieve Token from Cubbyhole: Response at %s does not contain a token", options.getPath())); @@ -274,7 +272,7 @@ public class CubbyholeAuthentication implements ClientAuthentication, return VaultToken.of(token); } - throw new VaultException( + throw new VaultLoginException( String.format( "Cannot retrieve Token from Cubbyhole: Response at %s does not contain an unique token", options.getPath())); diff --git a/spring-vault-core/src/main/java/org/springframework/vault/authentication/GcpComputeAuthentication.java b/spring-vault-core/src/main/java/org/springframework/vault/authentication/GcpComputeAuthentication.java index b98f94ba..e77d8061 100644 --- a/spring-vault-core/src/main/java/org/springframework/vault/authentication/GcpComputeAuthentication.java +++ b/spring-vault-core/src/main/java/org/springframework/vault/authentication/GcpComputeAuthentication.java @@ -153,7 +153,7 @@ public class GcpComputeAuthentication extends GcpJwtAuthenticationSupport implem return response.getBody(); } catch (HttpStatusCodeException e) { - throw new VaultException("Cannot obtain signed identity", e); + throw new VaultLoginException("Cannot obtain signed identity", e); } } diff --git a/spring-vault-core/src/main/java/org/springframework/vault/authentication/GcpIamAuthentication.java b/spring-vault-core/src/main/java/org/springframework/vault/authentication/GcpIamAuthentication.java index d601b35e..da782652 100644 --- a/spring-vault-core/src/main/java/org/springframework/vault/authentication/GcpIamAuthentication.java +++ b/spring-vault-core/src/main/java/org/springframework/vault/authentication/GcpIamAuthentication.java @@ -150,7 +150,7 @@ public class GcpIamAuthentication extends GcpJwtAuthenticationSupport implements return response.getSignedJwt(); } catch (IOException e) { - throw new VaultException("Cannot sign JWT", e); + throw new VaultLoginException("Cannot sign JWT", e); } } diff --git a/spring-vault-core/src/main/java/org/springframework/vault/authentication/GcpJwtAuthenticationSupport.java b/spring-vault-core/src/main/java/org/springframework/vault/authentication/GcpJwtAuthenticationSupport.java index ac751cb8..466ab01a 100644 --- a/spring-vault-core/src/main/java/org/springframework/vault/authentication/GcpJwtAuthenticationSupport.java +++ b/spring-vault-core/src/main/java/org/springframework/vault/authentication/GcpJwtAuthenticationSupport.java @@ -22,11 +22,9 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.util.Assert; -import org.springframework.vault.VaultException; -import org.springframework.vault.client.VaultResponses; import org.springframework.vault.support.VaultResponse; import org.springframework.vault.support.VaultToken; -import org.springframework.web.client.HttpStatusCodeException; +import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestOperations; /** @@ -89,10 +87,8 @@ public abstract class GcpJwtAuthenticationSupport { return LoginTokenUtil.from(response.getAuth()); } - catch (HttpStatusCodeException e) { - throw new VaultException(String.format("Cannot login using %s: %s", - authenticationName, - VaultResponses.getError(e.getResponseBodyAsString()))); + catch (RestClientException e) { + throw VaultLoginException.create(authenticationName, e); } } diff --git a/spring-vault-core/src/main/java/org/springframework/vault/authentication/KubernetesAuthentication.java b/spring-vault-core/src/main/java/org/springframework/vault/authentication/KubernetesAuthentication.java index 3976ab4e..e41f1da7 100644 --- a/spring-vault-core/src/main/java/org/springframework/vault/authentication/KubernetesAuthentication.java +++ b/spring-vault-core/src/main/java/org/springframework/vault/authentication/KubernetesAuthentication.java @@ -23,10 +23,9 @@ import org.apache.commons.logging.LogFactory; import org.springframework.util.Assert; import org.springframework.vault.VaultException; -import org.springframework.vault.client.VaultResponses; import org.springframework.vault.support.VaultResponse; import org.springframework.vault.support.VaultToken; -import org.springframework.web.client.HttpStatusCodeException; +import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestOperations; /** @@ -104,9 +103,8 @@ public class KubernetesAuthentication implements ClientAuthentication, return LoginTokenUtil.from(response.getAuth()); } - catch (HttpStatusCodeException e) { - throw new VaultException(String.format("Cannot login using kubernetes: %s", - VaultResponses.getError(e.getResponseBodyAsString()))); + catch (RestClientException e) { + throw VaultLoginException.create("Kubernetes", e); } } diff --git a/spring-vault-core/src/main/java/org/springframework/vault/authentication/LoginTokenAdapter.java b/spring-vault-core/src/main/java/org/springframework/vault/authentication/LoginTokenAdapter.java index 28d76e57..82e61b61 100644 --- a/spring-vault-core/src/main/java/org/springframework/vault/authentication/LoginTokenAdapter.java +++ b/spring-vault-core/src/main/java/org/springframework/vault/authentication/LoginTokenAdapter.java @@ -29,6 +29,7 @@ import org.springframework.vault.client.VaultResponses; import org.springframework.vault.support.VaultResponse; import org.springframework.vault.support.VaultToken; import org.springframework.web.client.HttpStatusCodeException; +import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestOperations; /** @@ -106,6 +107,9 @@ public class LoginTokenAdapter implements ClientAuthentication { "Token self-lookup failed: %s %s", e.getStatusCode(), VaultResponses.getError(e.getResponseBodyAsString()))); } + catch (RestClientException e) { + throw new VaultTokenLookupException("Token self-lookup failed", e); + } } static Duration getLeaseDuration(@Nullable Number ttl) { diff --git a/spring-vault-core/src/main/java/org/springframework/vault/authentication/TokenAuthentication.java b/spring-vault-core/src/main/java/org/springframework/vault/authentication/TokenAuthentication.java index e552543e..680bbe31 100644 --- a/spring-vault-core/src/main/java/org/springframework/vault/authentication/TokenAuthentication.java +++ b/spring-vault-core/src/main/java/org/springframework/vault/authentication/TokenAuthentication.java @@ -15,9 +15,6 @@ */ package org.springframework.vault.authentication; -import java.time.Duration; - -import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.vault.authentication.AuthenticationSteps.HttpRequest; import org.springframework.vault.client.VaultHttpHeaders; @@ -100,8 +97,4 @@ public class TokenAuthentication implements ClientAuthentication, public AuthenticationSteps getAuthenticationSteps() { return createAuthenticationSteps(this.token, false); } - - private static Duration getLeaseDuration(@Nullable Number ttl) { - return ttl == null ? Duration.ZERO : Duration.ofSeconds(ttl.longValue()); - } } diff --git a/spring-vault-core/src/main/java/org/springframework/vault/authentication/VaultLoginException.java b/spring-vault-core/src/main/java/org/springframework/vault/authentication/VaultLoginException.java new file mode 100644 index 00000000..483c61ee --- /dev/null +++ b/spring-vault-core/src/main/java/org/springframework/vault/authentication/VaultLoginException.java @@ -0,0 +1,70 @@ +/* + * Copyright 2018 the original author or authors. + * + * 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 org.springframework.vault.authentication; + +import org.springframework.vault.VaultException; +import org.springframework.vault.client.VaultResponses; +import org.springframework.web.client.RestClientResponseException; + +/** + * Exception thrown if Vault login fails. The root cause is typically attached as cause. + * + * @author Mark Paluch + * @since 2.1 + */ +public class VaultLoginException extends VaultException { + + /** + * Create a {@code VaultLoginException} with the specified detail message. + * + * @param msg the detail message. + */ + public VaultLoginException(String msg) { + super(msg); + } + + /** + * Create a {@code VaultLoginException} with the specified detail message and nested + * exception. + * + * @param msg the detail message. + * @param cause the nested exception. + */ + public VaultLoginException(String msg, Throwable cause) { + super(msg, cause); + } + + /** + * Create a {@link VaultLoginException} given {@code authMethod} and a + * {@link Throwable cause}. + * + * @param authMethod must not be {@literal null}. + * @param cause must not be {@literal null}. + * @return the {@link VaultLoginException}. + */ + public static VaultLoginException create(String authMethod, Throwable cause) { + + if (cause instanceof RestClientResponseException) { + + String response = ((RestClientResponseException) cause) + .getResponseBodyAsString(); + return new VaultLoginException(String.format("Cannot login using %s: %s", + authMethod, VaultResponses.getError(response)), cause); + } + + return new VaultLoginException(String.format("Cannot login using %s", cause)); + } +} diff --git a/spring-vault-core/src/main/java/org/springframework/vault/authentication/VaultTokenLookupException.java b/spring-vault-core/src/main/java/org/springframework/vault/authentication/VaultTokenLookupException.java index e6ff09fd..8d7d3185 100644 --- a/spring-vault-core/src/main/java/org/springframework/vault/authentication/VaultTokenLookupException.java +++ b/spring-vault-core/src/main/java/org/springframework/vault/authentication/VaultTokenLookupException.java @@ -26,11 +26,23 @@ import org.springframework.vault.VaultException; public class VaultTokenLookupException extends VaultException { /** - * Create a {@code VaultException} with the specified detail message. + * Create a {@code VaultTokenLookupException} with the specified detail message. * * @param msg the detail message. */ public VaultTokenLookupException(String msg) { super(msg); } + + /** + * Create a {@code VaultTokenLookupException} with the specified detail message and + * nested exception. + * + * @param msg the detail message. + * @param cause the nested exception. + * @since 2.1 + */ + public VaultTokenLookupException(String msg, Throwable cause) { + super(msg, cause); + } } diff --git a/spring-vault-core/src/test/java/org/springframework/vault/authentication/AuthenticationStepsExecutorUnitTests.java b/spring-vault-core/src/test/java/org/springframework/vault/authentication/AuthenticationStepsExecutorUnitTests.java index d6ff04da..d85d23a0 100644 --- a/spring-vault-core/src/test/java/org/springframework/vault/authentication/AuthenticationStepsExecutorUnitTests.java +++ b/spring-vault-core/src/test/java/org/springframework/vault/authentication/AuthenticationStepsExecutorUnitTests.java @@ -108,7 +108,7 @@ public class AuthenticationStepsExecutorUnitTests { assertThatExceptionOfType(VaultException.class) .isThrownBy(() -> login(steps)) - .withMessage( + .withMessageContaining( "HTTP request POST /auth/{path}/login AS class org.springframework.vault.support.VaultResponse " + "in state null failed with Status 400 and body foo"); } diff --git a/spring-vault-core/src/test/java/org/springframework/vault/authentication/CubbyholeAuthenticationIntegrationTests.java b/spring-vault-core/src/test/java/org/springframework/vault/authentication/CubbyholeAuthenticationIntegrationTests.java index 9d947322..0fb479e3 100644 --- a/spring-vault-core/src/test/java/org/springframework/vault/authentication/CubbyholeAuthenticationIntegrationTests.java +++ b/spring-vault-core/src/test/java/org/springframework/vault/authentication/CubbyholeAuthenticationIntegrationTests.java @@ -70,7 +70,7 @@ public class CubbyholeAuthenticationIntegrationTests extends fail("Missing VaultException"); } catch (VaultException e) { - assertThat(e).hasMessageContaining("Cannot retrieve Token from Cubbyhole") + assertThat(e).hasMessageContaining("Cannot login using Cubbyhole") .hasMessageContaining("permission denied"); } }