diff --git a/spring-vault-core/src/main/java/org/springframework/vault/authentication/LifecycleAwareSessionManager.java b/spring-vault-core/src/main/java/org/springframework/vault/authentication/LifecycleAwareSessionManager.java index ef0d66d9..212cb903 100644 --- a/spring-vault-core/src/main/java/org/springframework/vault/authentication/LifecycleAwareSessionManager.java +++ b/spring-vault-core/src/main/java/org/springframework/vault/authentication/LifecycleAwareSessionManager.java @@ -31,7 +31,6 @@ import org.springframework.scheduling.TaskScheduler; import org.springframework.scheduling.Trigger; import org.springframework.scheduling.TriggerContext; import org.springframework.util.Assert; -import org.springframework.util.NumberUtils; import org.springframework.vault.VaultException; import org.springframework.vault.client.VaultHttpHeaders; import org.springframework.vault.client.VaultResponses; @@ -55,6 +54,7 @@ import org.springframework.web.client.RestOperations; * login attempt. * * @author Mark Paluch + * @author Steven Swor * @see LoginToken * @see SessionManager * @see AsyncTaskExecutor @@ -172,15 +172,14 @@ public class LifecycleAwareSessionManager implements SessionManager, DisposableB catch (HttpStatusCodeException e) { if (e.getStatusCode().is4xxClientError()) { - logger.debug(String.format( - "Cannot refresh token, resetting token and performing re-login: %s", - VaultResponses.getError(e.getResponseBodyAsString()))); + logger.debug(String + .format("Cannot refresh token, resetting token and performing re-login: %s", + VaultResponses.getError(e.getResponseBodyAsString()))); token = null; return false; } - throw new VaultException( - VaultResponses.getError(e.getResponseBodyAsString())); + throw new VaultException(VaultResponses.getError(e.getResponseBodyAsString())); } catch (RestClientException e) { throw new VaultException("Cannot refresh token", e); @@ -318,12 +317,10 @@ public class LifecycleAwareSessionManager implements SessionManager, DisposableB @Override public Date nextExecutionTime(LoginToken loginToken) { - long milliseconds = NumberUtils - .convertNumberToTargetClass( - Math.max(1000, - 1000 * loginToken.getLeaseDuration() - - timeUnit.toMillis(duration)), - Integer.class); + long milliseconds = Math.max( + TimeUnit.SECONDS.toMillis(1), + TimeUnit.SECONDS.toMillis(loginToken.getLeaseDuration()) + - timeUnit.toMillis(duration)); return new Date(System.currentTimeMillis() + milliseconds); } diff --git a/spring-vault-core/src/main/java/org/springframework/vault/authentication/LoginToken.java b/spring-vault-core/src/main/java/org/springframework/vault/authentication/LoginToken.java index 3721d4f7..cbbc0078 100644 --- a/spring-vault-core/src/main/java/org/springframework/vault/authentication/LoginToken.java +++ b/spring-vault-core/src/main/java/org/springframework/vault/authentication/LoginToken.java @@ -30,13 +30,16 @@ public class LoginToken extends VaultToken { private final boolean renewable; + /** + * Duration in seconds. + */ private final long leaseDuration; - private LoginToken(String token, long leaseDuration, boolean renewable) { + private LoginToken(String token, long leaseDurationSeconds, boolean renewable) { super(token); - this.leaseDuration = leaseDuration; + this.leaseDuration = leaseDurationSeconds; this.renewable = renewable; } @@ -51,35 +54,35 @@ public class LoginToken extends VaultToken { } /** - * Create a new {@link LoginToken} with a {@code leaseDuration}. + * Create a new {@link LoginToken} with a {@code leaseDurationSeconds}. * * @param token must not be {@literal null}. - * @param leaseDuration the lease duration. + * @param leaseDurationSeconds the lease duration in seconds. * @return the created {@link VaultToken} */ - public static LoginToken of(String token, long leaseDuration) { + public static LoginToken of(String token, long leaseDurationSeconds) { Assert.hasText(token, "Token must not be empty"); - return new LoginToken(token, leaseDuration, false); + return new LoginToken(token, leaseDurationSeconds, false); } /** - * Create a new renewable {@link LoginToken} with a {@code leaseDuration}. + * Create a new renewable {@link LoginToken} with a {@code leaseDurationSeconds}. * * @param token must not be {@literal null}. - * @param leaseDuration the lease duration. + * @param leaseDurationSeconds the lease duration in seconds. * @return the created {@link VaultToken} */ - public static LoginToken renewable(String token, long leaseDuration) { + public static LoginToken renewable(String token, long leaseDurationSeconds) { Assert.hasText(token, "Token must not be empty"); - return new LoginToken(token, leaseDuration, true); + return new LoginToken(token, leaseDurationSeconds, true); } /** - * @return the lease duration. May be {@literal 0} if none. + * @return the lease duration in seconds. May be {@literal 0} if none. */ public long getLeaseDuration() { return leaseDuration; diff --git a/spring-vault-core/src/test/java/org/springframework/vault/authentication/LifecycleAwareSessionManagerUnitTests.java b/spring-vault-core/src/test/java/org/springframework/vault/authentication/LifecycleAwareSessionManagerUnitTests.java index 64cbe6a5..1190f102 100644 --- a/spring-vault-core/src/test/java/org/springframework/vault/authentication/LifecycleAwareSessionManagerUnitTests.java +++ b/spring-vault-core/src/test/java/org/springframework/vault/authentication/LifecycleAwareSessionManagerUnitTests.java @@ -15,6 +15,9 @@ */ package org.springframework.vault.authentication; +import java.util.Date; +import java.util.concurrent.TimeUnit; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -27,6 +30,7 @@ import org.springframework.http.HttpEntity; import org.springframework.http.HttpStatus; import org.springframework.scheduling.TaskScheduler; import org.springframework.scheduling.Trigger; +import org.springframework.vault.authentication.LifecycleAwareSessionManager.FixedTimeoutRefreshTrigger; import org.springframework.vault.client.VaultHttpHeaders; import org.springframework.vault.support.VaultToken; import org.springframework.web.client.HttpServerErrorException; @@ -107,7 +111,7 @@ public class LifecycleAwareSessionManagerUnitTests { when( restOperations.postForObject(anyString(), any(), - ArgumentMatchers.any())).thenThrow( + ArgumentMatchers. any())).thenThrow( new HttpServerErrorException(HttpStatus.INTERNAL_SERVER_ERROR)); sessionManager.renewToken(); @@ -187,7 +191,7 @@ public class LifecycleAwareSessionManagerUnitTests { when(clientAuthentication.login()).thenReturn(LoginToken.renewable("login", 5)); when( restOperations.postForObject(anyString(), any(), - ArgumentMatchers.any())).thenThrow( + ArgumentMatchers. any())).thenThrow( new HttpServerErrorException(HttpStatus.INTERNAL_SERVER_ERROR)); ArgumentCaptor runnableCaptor = ArgumentCaptor.forClass(Runnable.class); @@ -217,13 +221,37 @@ public class LifecycleAwareSessionManagerUnitTests { when(clientAuthentication.login()).thenReturn(LoginToken.renewable("login", 5)); when( - restOperations.postForObject(anyString(), ArgumentMatchers.any(), - ArgumentMatchers.any())).thenThrow( - new HttpServerErrorException(HttpStatus.BAD_REQUEST)); + restOperations.postForObject(anyString(), + ArgumentMatchers. any(), ArgumentMatchers. any())) + .thenThrow(new HttpServerErrorException(HttpStatus.BAD_REQUEST)); sessionManager.getSessionToken(); assertThat(sessionManager.renewToken()).isFalse(); verify(clientAuthentication, times(1)).login(); } + + @Test + public void shouldScheduleNextExecutionTimeCorrectly() { + + FixedTimeoutRefreshTrigger trigger = new FixedTimeoutRefreshTrigger(5, + TimeUnit.SECONDS); + + Date nextExecutionTime = trigger.nextExecutionTime(LoginToken.of("foo", 60)); + assertThat(nextExecutionTime).isBetween( + new Date(System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(52)), + new Date(System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(56))); + } + + @Test + public void shouldScheduleNextExecutionIfValidityLessThanTimeout() { + + FixedTimeoutRefreshTrigger trigger = new FixedTimeoutRefreshTrigger(5, + TimeUnit.SECONDS); + + Date nextExecutionTime = trigger.nextExecutionTime(LoginToken.of("foo", 2)); + assertThat(nextExecutionTime).isBetween( + new Date(System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(0)), + new Date(System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(1))); + } } diff --git a/spring-vault-core/src/test/java/org/springframework/vault/authentication/LoginTokenUnitTests.java b/spring-vault-core/src/test/java/org/springframework/vault/authentication/LoginTokenUnitTests.java index 492f6d40..517cd904 100644 --- a/spring-vault-core/src/test/java/org/springframework/vault/authentication/LoginTokenUnitTests.java +++ b/spring-vault-core/src/test/java/org/springframework/vault/authentication/LoginTokenUnitTests.java @@ -21,7 +21,7 @@ import static org.assertj.core.api.Assertions.assertThat; /** * Unit tests for {@link LoginToken}. - * + * * @author Mark Paluch */ public class LoginTokenUnitTests {