From 5d25588d7b9d1fb19f5b45f6976648738ba81fba Mon Sep 17 00:00:00 2001 From: Christian Dupuis Date: Mon, 9 Jun 2014 15:06:06 +0200 Subject: [PATCH] Make properties to sanitize configurable in EnvironmentEndpoint. Add "key" to default keys that will be sanitized. fixes #1027 --- ...ConfigurationPropertiesReportEndpoint.java | 6 +----- .../actuate/endpoint/EnvironmentEndpoint.java | 18 ++++++++++++++---- .../endpoint/mvc/EnvironmentMvcEndpoint.java | 3 ++- .../endpoint/EnvironmentEndpointTests.java | 19 ++++++++++++++++++- 4 files changed, 35 insertions(+), 11 deletions(-) diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpoint.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpoint.java index b70dacf887..9fa3e03c81 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpoint.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpoint.java @@ -66,7 +66,7 @@ public class ConfigurationPropertiesReportEndpoint extends private static final String CGLIB_FILTER_ID = "cglibFilter"; - private String[] keysToSanitize = new String[] { "password", "secret" }; + private String[] keysToSanitize = new String[] { "password", "secret", "key" }; private ApplicationContext context; @@ -76,10 +76,6 @@ public class ConfigurationPropertiesReportEndpoint extends super("configprops"); } - public String[] getKeysToSanitize() { - return this.keysToSanitize; - } - @Override public void setApplicationContext(ApplicationContext context) throws BeansException { this.context = context; diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/EnvironmentEndpoint.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/EnvironmentEndpoint.java index 6c62835272..7de906075b 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/EnvironmentEndpoint.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/EnvironmentEndpoint.java @@ -26,12 +26,14 @@ import org.springframework.core.env.EnumerablePropertySource; import org.springframework.core.env.Environment; import org.springframework.core.env.PropertySource; import org.springframework.core.env.StandardEnvironment; +import org.springframework.util.Assert; /** * {@link Endpoint} to expose {@link ConfigurableEnvironment environment} information. * * @author Dave Syer * @author Phillip Webb + * @author Christian Dupuis */ @ConfigurationProperties(prefix = "endpoints.env", ignoreUnknownFields = false) public class EnvironmentEndpoint extends AbstractEndpoint> implements @@ -39,6 +41,8 @@ public class EnvironmentEndpoint extends AbstractEndpoint> i private Environment environment; + private String[] keysToSanitize = new String[] { "password", "secret", "key" }; + /** * Create a new {@link EnvironmentEndpoint} instance. */ @@ -46,6 +50,11 @@ public class EnvironmentEndpoint extends AbstractEndpoint> i super("env"); } + public void setKeysToSanitize(String... keysToSanitize) { + Assert.notNull(keysToSanitize, "KeysToSanitize must not be null"); + this.keysToSanitize = keysToSanitize; + } + @Override public Map invoke() { Map result = new LinkedHashMap(); @@ -71,10 +80,11 @@ public class EnvironmentEndpoint extends AbstractEndpoint> i return new StandardEnvironment().getPropertySources(); } - public static Object sanitize(String name, Object object) { - if (name.toLowerCase().endsWith("password") - || name.toLowerCase().endsWith("secret")) { - return object == null ? null : "******"; + public Object sanitize(String name, Object object) { + for (String keyToSanitize : this.keysToSanitize) { + if (name.toLowerCase().endsWith(keyToSanitize)) { + return (object == null ? null : "******"); + } } return object; } diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/EnvironmentMvcEndpoint.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/EnvironmentMvcEndpoint.java index f8a741a003..b9690b494f 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/EnvironmentMvcEndpoint.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/EnvironmentMvcEndpoint.java @@ -30,6 +30,7 @@ import org.springframework.web.bind.annotation.ResponseStatus; * Adapter to expose {@link EnvironmentEndpoint} as an {@link MvcEndpoint}. * * @author Dave Syer + * @author Christian Dupuis */ public class EnvironmentMvcEndpoint extends EndpointMvcAdapter implements EnvironmentAware { @@ -47,7 +48,7 @@ public class EnvironmentMvcEndpoint extends EndpointMvcAdapter implements if (result == null) { throw new NoSuchPropertyException("No such property: " + name); } - return EnvironmentEndpoint.sanitize(name, result); + return ((EnvironmentEndpoint) getDelegate()).sanitize(name, result); } @Override diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/EnvironmentEndpointTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/EnvironmentEndpointTests.java index 3ca7f893c4..ccb0b0a04d 100644 --- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/EnvironmentEndpointTests.java +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/EnvironmentEndpointTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2013 the original author or authors. + * Copyright 2012-2014 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. @@ -16,18 +16,22 @@ package org.springframework.boot.actuate.endpoint; +import java.util.Map; + import org.junit.Test; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import static org.hamcrest.Matchers.greaterThan; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; /** * Tests for {@link EnvironmentEndpoint}. * * @author Phillip Webb + * @author Christian Dupuis */ public class EnvironmentEndpointTests extends AbstractEndpointTests { @@ -40,6 +44,19 @@ public class EnvironmentEndpointTests extends AbstractEndpointTests env = report.invoke(); + assertEquals("******", + ((Map) env.get("systemProperties")).get("dbPassword")); + assertEquals("******", + ((Map) env.get("systemProperties")).get("apiKey")); + } + @Configuration @EnableConfigurationProperties public static class Config {