From 961f42bd43f60acb38e611513a81111718edffce Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 15 Jan 2014 17:44:17 +0100 Subject: [PATCH] Introduced "spring.getenv.ignore" system property for preventing System.getenv calls Issue: SPR-11297 --- .../config/PropertyPlaceholderConfigurer.java | 6 ++- .../core/env/AbstractEnvironment.java | 54 ++++++++++++------- 2 files changed, 39 insertions(+), 21 deletions(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/config/PropertyPlaceholderConfigurer.java b/spring-beans/src/main/java/org/springframework/beans/factory/config/PropertyPlaceholderConfigurer.java index c9d39f3bf5..3671c5e51c 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/config/PropertyPlaceholderConfigurer.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/config/PropertyPlaceholderConfigurer.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2012 the original author or authors. + * Copyright 2002-2013 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. @@ -21,6 +21,7 @@ import java.util.Set; import org.springframework.beans.BeansException; import org.springframework.core.Constants; +import org.springframework.core.env.AbstractEnvironment; import org.springframework.util.PropertyPlaceholderHelper; import org.springframework.util.PropertyPlaceholderHelper.PlaceholderResolver; import org.springframework.util.StringValueResolver; @@ -82,7 +83,8 @@ public class PropertyPlaceholderConfigurer extends PlaceholderConfigurerSupport private int systemPropertiesMode = SYSTEM_PROPERTIES_MODE_FALLBACK; - private boolean searchSystemEnvironment = true; + private boolean searchSystemEnvironment = + !"true".equalsIgnoreCase(System.getProperty(AbstractEnvironment.IGNORE_GETENV_PROPERTY_NAME)); /** diff --git a/spring-core/src/main/java/org/springframework/core/env/AbstractEnvironment.java b/spring-core/src/main/java/org/springframework/core/env/AbstractEnvironment.java index 24188c9fdd..aec1287185 100644 --- a/spring-core/src/main/java/org/springframework/core/env/AbstractEnvironment.java +++ b/spring-core/src/main/java/org/springframework/core/env/AbstractEnvironment.java @@ -52,6 +52,18 @@ import static org.springframework.util.StringUtils.*; */ public abstract class AbstractEnvironment implements ConfigurableEnvironment { + /** + * System property that instructs Spring to ignore system environment variables, + * i.e. to never attempt to retrieve such a variable via {@link System#getenv()}. + *

The default is "false", falling back to system environment variable checks if a + * Spring environment property (e.g. a placeholder in a configuration String) isn't + * resolvable otherwise. Consider switching this flag to "true" if you experience + * log warnings from {@code getenv} calls coming from Spring, e.g. on WebSphere + * with strict SecurityManager settings and AccessControlExceptions warnings. + */ + public static final String IGNORE_GETENV_PROPERTY_NAME = "spring.getenv.ignore"; + + /** * Name of property to set to specify active profiles: {@value}. Value may be comma * delimited. @@ -168,8 +180,7 @@ public abstract class AbstractEnvironment implements ConfigurableEnvironment { * {@code remove}, or {@code replace} methods exposed by {@link MutablePropertySources} * in order to create the exact arrangement of property sources desired. * - *

The base implementation in {@link AbstractEnvironment#customizePropertySources} - * registers no property sources. + *

The base implementation registers no property sources. * *

Note that clients of any {@link ConfigurableEnvironment} may further customize * property sources via the {@link #getPropertySources()} accessor, typically within @@ -229,7 +240,7 @@ public abstract class AbstractEnvironment implements ConfigurableEnvironment { */ protected Set doGetActiveProfiles() { if (this.activeProfiles.isEmpty()) { - String profiles = this.getProperty(ACTIVE_PROFILES_PROPERTY_NAME); + String profiles = getProperty(ACTIVE_PROFILES_PROPERTY_NAME); if (StringUtils.hasText(profiles)) { setActiveProfiles(commaDelimitedListToStringArray(trimAllWhitespace(profiles))); } @@ -277,7 +288,7 @@ public abstract class AbstractEnvironment implements ConfigurableEnvironment { */ protected Set doGetDefaultProfiles() { if (this.defaultProfiles.equals(getReservedDefaultProfiles())) { - String profiles = this.getProperty(DEFAULT_PROFILES_PROPERTY_NAME); + String profiles = getProperty(DEFAULT_PROFILES_PROPERTY_NAME); if (StringUtils.hasText(profiles)) { setDefaultProfiles(commaDelimitedListToStringArray(trimAllWhitespace(profiles))); } @@ -356,12 +367,22 @@ public abstract class AbstractEnvironment implements ConfigurableEnvironment { @Override @SuppressWarnings("unchecked") public Map getSystemEnvironment() { - Map systemEnvironment; try { - systemEnvironment = System.getenv(); + if ("true".equalsIgnoreCase(System.getProperty(IGNORE_GETENV_PROPERTY_NAME))) { + return Collections.emptyMap(); + } + } + catch (Throwable ex) { + if (logger.isDebugEnabled()) { + logger.debug("Could not obtain system property '" + IGNORE_GETENV_PROPERTY_NAME + "': " + ex); + } + } + + try { + return (Map) System.getenv(); } catch (AccessControlException ex) { - systemEnvironment = new ReadOnlySystemAttributesMap() { + return (Map) new ReadOnlySystemAttributesMap() { @Override protected String getSystemAttribute(String variableName) { try { @@ -369,9 +390,8 @@ public abstract class AbstractEnvironment implements ConfigurableEnvironment { } catch (AccessControlException ex) { if (logger.isInfoEnabled()) { - logger.info(format("Caught AccessControlException when " + - "accessing system environment variable [%s]; its " + - "value will be returned [null]. Reason: %s", + logger.info(format("Caught AccessControlException when accessing system " + + "environment variable [%s]; its value will be returned [null]. Reason: %s", variableName, ex.getMessage())); } return null; @@ -379,18 +399,16 @@ public abstract class AbstractEnvironment implements ConfigurableEnvironment { } }; } - return (Map) systemEnvironment; } @Override - @SuppressWarnings({"unchecked", "rawtypes"}) + @SuppressWarnings("unchecked") public Map getSystemProperties() { - Map systemProperties; try { - systemProperties = System.getProperties(); + return (Map) System.getProperties(); } catch (AccessControlException ex) { - systemProperties = new ReadOnlySystemAttributesMap() { + return (Map) new ReadOnlySystemAttributesMap() { @Override protected String getSystemAttribute(String propertyName) { try { @@ -398,9 +416,8 @@ public abstract class AbstractEnvironment implements ConfigurableEnvironment { } catch (AccessControlException ex) { if (logger.isInfoEnabled()) { - logger.info(format("Caught AccessControlException when " + - "accessing system property [%s]; its value will be " + - "returned [null]. Reason: %s", + logger.info(format("Caught AccessControlException when accessing system " + + "property [%s]; its value will be returned [null]. Reason: %s", propertyName, ex.getMessage())); } return null; @@ -408,7 +425,6 @@ public abstract class AbstractEnvironment implements ConfigurableEnvironment { } }; } - return systemProperties; } @Override -- GitLab