Merge pull request #49942 from dlwldnjs1009

* fix/env-endpoint-invalid-pattern:
  Polish "Handle invalid regex pattern in EnvironmentEndpoint"
  Handle invalid regex pattern in EnvironmentEndpoint

Closes gh-49942
This commit is contained in:
Stéphane Nicoll
2026-04-07 17:33:25 +02:00
2 changed files with 25 additions and 1 deletions
@@ -23,10 +23,12 @@ import java.util.List;
import java.util.Map;
import java.util.function.Predicate;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import java.util.stream.Stream;
import com.fasterxml.jackson.annotation.JsonInclude;
import org.springframework.boot.actuate.endpoint.InvalidEndpointRequestException;
import org.springframework.boot.actuate.endpoint.OperationResponseBody;
import org.springframework.boot.actuate.endpoint.SanitizableData;
import org.springframework.boot.actuate.endpoint.Sanitizer;
@@ -87,11 +89,21 @@ public class EnvironmentEndpoint {
EnvironmentDescriptor getEnvironmentDescriptor(String pattern, boolean showUnsanitized) {
if (StringUtils.hasText(pattern)) {
return getEnvironmentDescriptor(Pattern.compile(pattern).asPredicate(), showUnsanitized);
return getEnvironmentDescriptor(parsePattern(pattern).asPredicate(), showUnsanitized);
}
return getEnvironmentDescriptor((name) -> true, showUnsanitized);
}
private Pattern parsePattern(String pattern) {
try {
return Pattern.compile(pattern);
}
catch (PatternSyntaxException ex) {
throw new InvalidEndpointRequestException("Failed to parse regular expression: " + pattern,
"Invalid regular expression", ex);
}
}
private EnvironmentDescriptor getEnvironmentDescriptor(Predicate<String> propertyNamePredicate,
boolean showUnsanitized) {
List<PropertySourceDescriptor> propertySources = new ArrayList<>();
@@ -23,10 +23,12 @@ import java.math.BigInteger;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.regex.PatternSyntaxException;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.actuate.endpoint.InvalidEndpointRequestException;
import org.springframework.boot.actuate.endpoint.Show;
import org.springframework.boot.actuate.env.EnvironmentEndpoint.EnvironmentDescriptor;
import org.springframework.boot.actuate.env.EnvironmentEndpoint.EnvironmentEntryDescriptor;
@@ -48,6 +50,7 @@ import org.springframework.core.io.InputStreamSource;
import org.springframework.mock.env.MockPropertySource;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
/**
* Tests for {@link EnvironmentEndpoint}.
@@ -116,6 +119,15 @@ class EnvironmentEndpointTests {
});
}
@Test
void responseWhenPatternIsInvalidThrowsInvalidEndpointRequestException() {
ConfigurableEnvironment environment = emptyEnvironment();
EnvironmentEndpoint endpoint = new EnvironmentEndpoint(environment, Collections.emptyList(), Show.ALWAYS);
assertThatExceptionOfType(InvalidEndpointRequestException.class).isThrownBy(() -> endpoint.environment("["))
.withMessageContaining("Failed to parse regular expression: [")
.withCauseInstanceOf(PatternSyntaxException.class);
}
@Test
void compositeSourceIsHandledCorrectly() {
ConfigurableEnvironment environment = emptyEnvironment();