From b606806066a35a1d9deab4b56b56b4b92e50cf01 Mon Sep 17 00:00:00 2001 From: Jone Date: Tue, 17 Apr 2018 17:20:21 +0800 Subject: [PATCH] Fixes decryption of CompositePropertySource Since CompositePropertySource extends EnumerablePropertySource the else statement in EnvironmentDecryptApplicationInitializer.decrypt() was never reached. --- ...ironmentDecryptApplicationInitializer.java | 19 ++++++++------- ...entDecryptApplicationInitializerTests.java | 23 +++++++++++++++++++ 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/EnvironmentDecryptApplicationInitializer.java b/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/EnvironmentDecryptApplicationInitializer.java index ec67ef5c..b4e7d94e 100644 --- a/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/EnvironmentDecryptApplicationInitializer.java +++ b/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/EnvironmentDecryptApplicationInitializer.java @@ -179,7 +179,15 @@ public class EnvironmentDecryptApplicationInitializer implements private void decrypt(PropertySource source, Map overrides) { - if (source instanceof EnumerablePropertySource) { + if (source instanceof CompositePropertySource) { + + for (PropertySource nested : ((CompositePropertySource) source) + .getPropertySources()) { + decrypt(nested, overrides); + } + + } + else if (source instanceof EnumerablePropertySource) { Map otherCollectionProperties = new LinkedHashMap<>(); boolean sourceHasDecryptedCollection = false; @@ -229,15 +237,6 @@ public class EnvironmentDecryptApplicationInitializer implements } } - else if (source instanceof CompositePropertySource) { - - for (PropertySource nested : ((CompositePropertySource) source) - .getPropertySources()) { - decrypt(nested, overrides); - } - - } - } } diff --git a/spring-cloud-context/src/test/java/org/springframework/cloud/bootstrap/encrypt/EnvironmentDecryptApplicationInitializerTests.java b/spring-cloud-context/src/test/java/org/springframework/cloud/bootstrap/encrypt/EnvironmentDecryptApplicationInitializerTests.java index 60889642..b7ef9d68 100644 --- a/spring-cloud-context/src/test/java/org/springframework/cloud/bootstrap/encrypt/EnvironmentDecryptApplicationInitializerTests.java +++ b/spring-cloud-context/src/test/java/org/springframework/cloud/bootstrap/encrypt/EnvironmentDecryptApplicationInitializerTests.java @@ -25,15 +25,18 @@ import org.springframework.boot.test.util.TestPropertyValues.Type; import org.springframework.context.ApplicationContext; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.core.env.CompositePropertySource; import org.springframework.core.env.Environment; import org.springframework.core.env.MapPropertySource; import org.springframework.core.env.MutablePropertySources; import org.springframework.core.env.PropertySource; import org.springframework.security.crypto.encrypt.Encryptors; +import org.springframework.security.crypto.encrypt.TextEncryptor; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.springframework.cloud.bootstrap.encrypt.EnvironmentDecryptApplicationInitializer.DECRYPTED_PROPERTY_SOURCE_NAME; @@ -150,4 +153,24 @@ public class EnvironmentDecryptApplicationInitializerTests { assertEquals("value", ctx.getEnvironment().getProperty("key")); } + @Test + public void testDecryptCompositePropertySource() { + String expected = "always"; + TextEncryptor textEncryptor = mock(TextEncryptor.class); + when(textEncryptor.decrypt(anyString())).thenReturn(expected); + + ConfigurableApplicationContext ctx = new AnnotationConfigApplicationContext(); + EnvironmentDecryptApplicationInitializer initializer = new EnvironmentDecryptApplicationInitializer( + textEncryptor); + + MapPropertySource source = new MapPropertySource("nobody", + Collections.singletonMap("key", "{cipher}value")); + CompositePropertySource cps = mock(CompositePropertySource.class); + when(cps.getPropertyNames()).thenReturn(source.getPropertyNames()); + when(cps.getPropertySources()).thenReturn(Collections.singleton(source)); + ctx.getEnvironment().getPropertySources().addLast(cps); + + initializer.initialize(ctx); + assertEquals(expected, ctx.getEnvironment().getProperty("key")); + } }