diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cloudfoundry/reactive/ReactiveTokenValidator.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cloudfoundry/reactive/ReactiveTokenValidator.java index c154c9c7002..3593a59aa8a 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cloudfoundry/reactive/ReactiveTokenValidator.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cloudfoundry/reactive/ReactiveTokenValidator.java @@ -23,7 +23,6 @@ import java.security.PublicKey; import java.security.Signature; import java.security.spec.InvalidKeySpecException; import java.security.spec.X509EncodedKeySpec; -import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; @@ -71,24 +70,31 @@ class ReactiveTokenValidator { } private Mono validateKeyIdAndSignature(Token token) { - String keyId = token.getKeyId(); - Map localCachedTokenKeys = new HashMap<>(this.cachedTokenKeys); - return Mono.just(localCachedTokenKeys) - .filter((tokenKeys) -> tokenKeys.containsKey(keyId)) - .switchIfEmpty(this.securityService.fetchTokenKeys() - .doOnSuccess((fetchedTokenKeys) -> { - this.cachedTokenKeys.clear(); - this.cachedTokenKeys.putAll(fetchedTokenKeys); - }).filter((tokenKeys) -> tokenKeys.containsKey(keyId)) - .switchIfEmpty((Mono.error(new CloudFoundryAuthorizationException( - Reason.INVALID_KEY_ID, - "Key Id present in token header does not match"))))) - .filter((tokenKeys) -> hasValidSignature(token, tokenKeys.get(keyId))) + return getTokenKey(token).filter((tokenKey) -> hasValidSignature(token, tokenKey)) .switchIfEmpty(Mono.error(new CloudFoundryAuthorizationException( Reason.INVALID_SIGNATURE, "RSA Signature did not match content"))) .then(); } + private Mono getTokenKey(Token token) { + String keyId = token.getKeyId(); + String cached = this.cachedTokenKeys.get(keyId); + if (cached != null) { + return Mono.just(cached); + } + return this.securityService.fetchTokenKeys().doOnSuccess(this::cacheTokenKeys) + .filter((tokenKeys) -> tokenKeys.containsKey(keyId)) + .map((tokenKeys) -> tokenKeys.get(keyId)) + .switchIfEmpty(Mono.error( + new CloudFoundryAuthorizationException(Reason.INVALID_KEY_ID, + "Key Id present in token header does not match"))); + } + + private void cacheTokenKeys(Map tokenKeys) { + this.cachedTokenKeys.clear(); + this.cachedTokenKeys.putAll(tokenKeys); + } + private boolean hasValidSignature(Token token, String key) { try { PublicKey publicKey = getPublicKey(key); diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/atlas/AtlasPropertiesConfigAdapter.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/atlas/AtlasPropertiesConfigAdapter.java index 3bfcd0128fc..2116ff62e75 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/atlas/AtlasPropertiesConfigAdapter.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/atlas/AtlasPropertiesConfigAdapter.java @@ -28,8 +28,8 @@ import org.springframework.boot.actuate.autoconfigure.metrics.export.PropertiesC * @author Jon Schneider * @author Phillip Webb */ -class AtlasPropertiesConfigAdapter extends - PropertiesConfigAdapter implements AtlasConfig { +class AtlasPropertiesConfigAdapter extends PropertiesConfigAdapter + implements AtlasConfig { AtlasPropertiesConfigAdapter(AtlasProperties properties) { super(properties); diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/ganglia/GangliaPropertiesConfigAdapter.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/ganglia/GangliaPropertiesConfigAdapter.java index e14a5da23b7..f1e7868235f 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/ganglia/GangliaPropertiesConfigAdapter.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/ganglia/GangliaPropertiesConfigAdapter.java @@ -30,8 +30,7 @@ import org.springframework.boot.actuate.autoconfigure.metrics.export.PropertiesC * @author Jon Schneider * @author Phillip Webb */ -class GangliaPropertiesConfigAdapter - extends PropertiesConfigAdapter +class GangliaPropertiesConfigAdapter extends PropertiesConfigAdapter implements GangliaConfig { GangliaPropertiesConfigAdapter(GangliaProperties properties) { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/graphite/GraphitePropertiesConfigAdapter.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/graphite/GraphitePropertiesConfigAdapter.java index cafebe4c112..fcf5853896b 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/graphite/GraphitePropertiesConfigAdapter.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/graphite/GraphitePropertiesConfigAdapter.java @@ -30,8 +30,7 @@ import org.springframework.boot.actuate.autoconfigure.metrics.export.PropertiesC * @author Jon Schneider * @author Phillip Webb */ -class GraphitePropertiesConfigAdapter - extends PropertiesConfigAdapter +class GraphitePropertiesConfigAdapter extends PropertiesConfigAdapter implements GraphiteConfig { GraphitePropertiesConfigAdapter(GraphiteProperties properties) { diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusPropertiesConfigAdapter.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusPropertiesConfigAdapter.java index 8742861413f..c9af83c62a7 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusPropertiesConfigAdapter.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/prometheus/PrometheusPropertiesConfigAdapter.java @@ -28,9 +28,8 @@ import org.springframework.boot.actuate.autoconfigure.metrics.export.PropertiesC * @author Jon Schneider * @author Phillip Webb */ -class PrometheusPropertiesConfigAdapter - extends PropertiesConfigAdapter - implements PrometheusConfig { +class PrometheusPropertiesConfigAdapter extends + PropertiesConfigAdapter implements PrometheusConfig { PrometheusPropertiesConfigAdapter(PrometheusProperties properties) { super(properties); diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/simple/SimplePropertiesConfigAdapter.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/simple/SimplePropertiesConfigAdapter.java index 59cc2c72191..d851c9034f9 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/simple/SimplePropertiesConfigAdapter.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/simple/SimplePropertiesConfigAdapter.java @@ -28,8 +28,8 @@ import org.springframework.boot.actuate.autoconfigure.metrics.export.PropertiesC * @author Jon Schneider * @since 2.0.0 */ -public class SimplePropertiesConfigAdapter extends - PropertiesConfigAdapter implements SimpleConfig { +public class SimplePropertiesConfigAdapter + extends PropertiesConfigAdapter implements SimpleConfig { public SimplePropertiesConfigAdapter(SimpleProperties properties) { super(properties); diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/statsd/StatsdPropertiesConfigAdapter.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/statsd/StatsdPropertiesConfigAdapter.java index e6a8648f9fe..839705173f5 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/statsd/StatsdPropertiesConfigAdapter.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/metrics/export/statsd/StatsdPropertiesConfigAdapter.java @@ -29,8 +29,8 @@ import org.springframework.boot.actuate.autoconfigure.metrics.export.PropertiesC * @author Jon Schneider * @since 2.0.0 */ -public class StatsdPropertiesConfigAdapter extends - PropertiesConfigAdapter implements StatsdConfig { +public class StatsdPropertiesConfigAdapter + extends PropertiesConfigAdapter implements StatsdConfig { public StatsdPropertiesConfigAdapter(StatsdProperties properties) { super(properties); diff --git a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/cloudfoundry/reactive/ReactiveTokenValidatorTests.java b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/cloudfoundry/reactive/ReactiveTokenValidatorTests.java index ebb25b4f039..04e88510209 100644 --- a/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/cloudfoundry/reactive/ReactiveTokenValidatorTests.java +++ b/spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/cloudfoundry/reactive/ReactiveTokenValidatorTests.java @@ -93,8 +93,10 @@ public class ReactiveTokenValidatorTests { } @Test - public void validateTokenWhenKidValidationFailsTwiceShouldThrowException() throws Exception { - PublisherProbe> fetchTokenKeys = PublisherProbe.of(Mono.just(VALID_KEYS)); + public void validateTokenWhenKidValidationFailsTwiceShouldThrowException() + throws Exception { + PublisherProbe> fetchTokenKeys = PublisherProbe + .of(Mono.just(VALID_KEYS)); ReflectionTestUtils.setField(this.tokenValidator, "cachedTokenKeys", VALID_KEYS); given(this.securityService.fetchTokenKeys()).willReturn(fetchTokenKeys.mono()); given(this.securityService.getUaaUrl()) @@ -110,15 +112,19 @@ public class ReactiveTokenValidatorTests { assertThat(((CloudFoundryAuthorizationException) ex).getReason()) .isEqualTo(Reason.INVALID_KEY_ID); }).verify(); - Object cachedTokenKeys = ReflectionTestUtils.getField(this.tokenValidator, "cachedTokenKeys"); + Object cachedTokenKeys = ReflectionTestUtils.getField(this.tokenValidator, + "cachedTokenKeys"); assertThat(cachedTokenKeys).isEqualTo(VALID_KEYS); fetchTokenKeys.assertWasSubscribed(); } @Test - public void validateTokenWhenKidValidationSucceedsInTheSecondAttempt() throws Exception { - PublisherProbe> fetchTokenKeys = PublisherProbe.of(Mono.just(VALID_KEYS)); - ReflectionTestUtils.setField(this.tokenValidator, "cachedTokenKeys", INVALID_KEYS); + public void validateTokenWhenKidValidationSucceedsInTheSecondAttempt() + throws Exception { + PublisherProbe> fetchTokenKeys = PublisherProbe + .of(Mono.just(VALID_KEYS)); + ReflectionTestUtils.setField(this.tokenValidator, "cachedTokenKeys", + INVALID_KEYS); given(this.securityService.fetchTokenKeys()).willReturn(fetchTokenKeys.mono()); given(this.securityService.getUaaUrl()) .willReturn(Mono.just("http://localhost:8080/uaa")); @@ -128,14 +134,16 @@ public class ReactiveTokenValidatorTests { .create(this.tokenValidator.validate( new Token(getSignedToken(header.getBytes(), claims.getBytes())))) .verifyComplete(); - Object cachedTokenKeys = ReflectionTestUtils.getField(this.tokenValidator, "cachedTokenKeys"); + Object cachedTokenKeys = ReflectionTestUtils.getField(this.tokenValidator, + "cachedTokenKeys"); assertThat(cachedTokenKeys).isEqualTo(VALID_KEYS); fetchTokenKeys.assertWasSubscribed(); } @Test public void validateTokenWhenCacheIsEmptyShouldFetchTokenKeys() throws Exception { - PublisherProbe> fetchTokenKeys = PublisherProbe.of(Mono.just(VALID_KEYS)); + PublisherProbe> fetchTokenKeys = PublisherProbe + .of(Mono.just(VALID_KEYS)); given(this.securityService.fetchTokenKeys()).willReturn(fetchTokenKeys.mono()); given(this.securityService.getUaaUrl()) .willReturn(Mono.just("http://localhost:8080/uaa")); @@ -145,14 +153,17 @@ public class ReactiveTokenValidatorTests { .create(this.tokenValidator.validate( new Token(getSignedToken(header.getBytes(), claims.getBytes())))) .verifyComplete(); - Object cachedTokenKeys = ReflectionTestUtils.getField(this.tokenValidator, "cachedTokenKeys"); + Object cachedTokenKeys = ReflectionTestUtils.getField(this.tokenValidator, + "cachedTokenKeys"); assertThat(cachedTokenKeys).isEqualTo(VALID_KEYS); fetchTokenKeys.assertWasSubscribed(); } @Test - public void validateTokenWhenCacheEmptyAndInvalidKeyShouldThrowException() throws Exception { - PublisherProbe> fetchTokenKeys = PublisherProbe.of(Mono.just(VALID_KEYS)); + public void validateTokenWhenCacheEmptyAndInvalidKeyShouldThrowException() + throws Exception { + PublisherProbe> fetchTokenKeys = PublisherProbe + .of(Mono.just(VALID_KEYS)); given(this.securityService.fetchTokenKeys()).willReturn(fetchTokenKeys.mono()); given(this.securityService.getUaaUrl()) .willReturn(Mono.just("http://localhost:8080/uaa")); @@ -167,7 +178,8 @@ public class ReactiveTokenValidatorTests { assertThat(((CloudFoundryAuthorizationException) ex).getReason()) .isEqualTo(Reason.INVALID_KEY_ID); }).verify(); - Object cachedTokenKeys = ReflectionTestUtils.getField(this.tokenValidator, "cachedTokenKeys"); + Object cachedTokenKeys = ReflectionTestUtils.getField(this.tokenValidator, + "cachedTokenKeys"); assertThat(cachedTokenKeys).isEqualTo(VALID_KEYS); fetchTokenKeys.assertWasSubscribed(); } diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/couchbase/CouchbaseHealthIndicatorTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/couchbase/CouchbaseHealthIndicatorTests.java index 9c3ee8a5ed9..07c4ce8d4ad 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/couchbase/CouchbaseHealthIndicatorTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/couchbase/CouchbaseHealthIndicatorTests.java @@ -42,8 +42,8 @@ public class CouchbaseHealthIndicatorTests { public void couchbaseIsUp() { CouchbaseOperations couchbaseOperations = mock(CouchbaseOperations.class); ClusterInfo clusterInfo = mock(ClusterInfo.class); - given(clusterInfo.getAllVersions()).willReturn( - Arrays.asList(new Version(1, 2, 3))); + given(clusterInfo.getAllVersions()) + .willReturn(Arrays.asList(new Version(1, 2, 3))); given(couchbaseOperations.getCouchbaseClusterInfo()).willReturn(clusterInfo); CouchbaseHealthIndicator healthIndicator = new CouchbaseHealthIndicator( couchbaseOperations); @@ -56,8 +56,8 @@ public class CouchbaseHealthIndicatorTests { @Test public void couchbaseIsDown() { CouchbaseOperations couchbaseOperations = mock(CouchbaseOperations.class); - given(couchbaseOperations.getCouchbaseClusterInfo()).willThrow( - new IllegalStateException("test, expected")); + given(couchbaseOperations.getCouchbaseClusterInfo()) + .willThrow(new IllegalStateException("test, expected")); CouchbaseHealthIndicator healthIndicator = new CouchbaseHealthIndicator( couchbaseOperations); Health health = healthIndicator.health(); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/alt/couchbase/ReactiveCityCouchbaseRepository.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/alt/couchbase/ReactiveCityCouchbaseRepository.java index 0a0e1d0c928..5f19fb0b14f 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/alt/couchbase/ReactiveCityCouchbaseRepository.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/alt/couchbase/ReactiveCityCouchbaseRepository.java @@ -19,7 +19,7 @@ package org.springframework.boot.autoconfigure.data.alt.couchbase; import org.springframework.boot.autoconfigure.data.couchbase.city.City; import org.springframework.data.repository.reactive.ReactiveCrudRepository; -public interface ReactiveCityCouchbaseRepository extends - ReactiveCrudRepository { +public interface ReactiveCityCouchbaseRepository + extends ReactiveCrudRepository { }