Fixes possible infinite loop

Fixes edge case of an infinite loop in decrypting properties in a hierarchy of application contexts.


fixes gh-178
This commit is contained in:
Biju Kunjummen
2017-03-01 09:41:00 -08:00
committed by Spencer Gibb
parent d2ab1c6de9
commit 4e0d2e520f
2 changed files with 30 additions and 12 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2013-2014 the original author or authors.
* Copyright 2013-2017 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.
@@ -15,26 +15,30 @@
*/
package org.springframework.cloud.bootstrap.encrypt;
import java.util.Collections;
import java.util.Map;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
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 java.util.Collections;
import java.util.Map;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.springframework.boot.test.util.EnvironmentTestUtils.addEnvironment;
import static org.springframework.cloud.bootstrap.encrypt.EnvironmentDecryptApplicationInitializer.DECRYPTED_PROPERTY_SOURCE_NAME;
/**
* @author Dave Syer
*
* @author Biju Kunjummen
*/
public class EnvironmentDecryptApplicationInitializerTests {
@@ -115,4 +119,23 @@ public class EnvironmentDecryptApplicationInitializerTests {
assertThat("decrypted property source had wrong size", decrypted.getSource().size(), is(4));
}
@Test
public void testDecryptNonStandardParent() {
ConfigurableApplicationContext ctx = new AnnotationConfigApplicationContext();
EnvironmentDecryptApplicationInitializer initializer =
new EnvironmentDecryptApplicationInitializer(Encryptors.noOpText());
addEnvironment(ctx, "key:{cipher}value");
ApplicationContext ctxParent = mock(ApplicationContext.class);
when(ctxParent.getEnvironment()).thenReturn(mock(Environment.class));
ctx.setParent(ctxParent);
initializer.initialize(ctx);
assertEquals("value", ctx.getEnvironment().getProperty("key"));
}
}