Skip to content

Commit ac2682a

Browse files
committed
Remove constants from CloudFoundryVcapEnvironmentPostProcessor
This commit removes the VCAP_APPLICATION, VCAP_SERVICES, and VCAP_PROPERTY_SOURCE_NAME constants from the CloudFoundryVcapEnvironmentPostProcessor class, replacing them with string literals. This change simplifies the code and aligns with the team's decision to avoid using constants in this context. Signed-off-by: wonyongg <111210881+wonyongg@users.noreply.github.com>
2 parents ea39b30 + 5b759c7 commit ac2682a

File tree

23 files changed

+192
-139
lines changed

23 files changed

+192
-139
lines changed

There

Whitespace-only changes.

buildSrc/src/main/java/org/springframework/boot/build/autoconfigure/DocumentAutoConfigurationClasses.java

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2024 the original author or authors.
2+
* Copyright 2012-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -22,6 +22,8 @@
2222
import java.io.IOException;
2323
import java.io.PrintWriter;
2424
import java.io.Reader;
25+
import java.io.UncheckedIOException;
26+
import java.util.List;
2527
import java.util.Properties;
2628
import java.util.Set;
2729
import java.util.SortedSet;
@@ -61,22 +63,39 @@ public void setAutoConfiguration(FileCollection autoConfiguration) {
6163

6264
@TaskAction
6365
void documentAutoConfigurationClasses() throws IOException {
66+
List<AutoConfiguration> autoConfigurations = load();
67+
autoConfigurations.forEach(this::writeModuleAdoc);
6468
for (File metadataFile : this.autoConfiguration) {
6569
Properties metadata = new Properties();
6670
try (Reader reader = new FileReader(metadataFile)) {
6771
metadata.load(reader);
6872
}
6973
AutoConfiguration autoConfiguration = new AutoConfiguration(metadata.getProperty("module"), new TreeSet<>(
7074
StringUtils.commaDelimitedListToSet(metadata.getProperty("autoConfigurationClassNames"))));
71-
writeTable(autoConfiguration);
75+
writeModuleAdoc(autoConfiguration);
7276
}
77+
writeNavAdoc(autoConfigurations);
7378
}
7479

75-
private void writeTable(AutoConfiguration autoConfigurationClasses) throws IOException {
80+
private List<AutoConfiguration> load() {
81+
return this.autoConfiguration.getFiles()
82+
.stream()
83+
.map(AutoConfiguration::of)
84+
.sorted((a1, a2) -> a1.module.compareTo(a2.module))
85+
.toList();
86+
}
87+
88+
private void writeModuleAdoc(AutoConfiguration autoConfigurationClasses) {
7689
File outputDir = getOutputDir().getAsFile().get();
7790
outputDir.mkdirs();
7891
try (PrintWriter writer = new PrintWriter(
7992
new FileWriter(new File(outputDir, autoConfigurationClasses.module + ".adoc")))) {
93+
writer.println("[[appendix.auto-configuration-classes.%s]]".formatted(autoConfigurationClasses.module));
94+
writer.println("= %s".formatted(autoConfigurationClasses.module));
95+
writer.println();
96+
writer.println("The following auto-configuration classes are from the `%s` module:"
97+
.formatted(autoConfigurationClasses.module));
98+
writer.println();
8099
writer.println("[cols=\"4,1\"]");
81100
writer.println("|===");
82101
writer.println("| Configuration Class | Links");
@@ -88,6 +107,22 @@ private void writeTable(AutoConfiguration autoConfigurationClasses) throws IOExc
88107
}
89108
writer.println("|===");
90109
}
110+
catch (IOException ex) {
111+
throw new UncheckedIOException(ex);
112+
}
113+
}
114+
115+
private void writeNavAdoc(List<AutoConfiguration> autoConfigurations) {
116+
File outputDir = getOutputDir().getAsFile().get();
117+
outputDir.mkdirs();
118+
try (PrintWriter writer = new PrintWriter(new FileWriter(new File(outputDir, "nav.adoc")))) {
119+
autoConfigurations.forEach((autoConfigurationClasses) -> writer
120+
.println("*** xref:appendix:auto-configuration-classes/%s.adoc[]"
121+
.formatted(autoConfigurationClasses.module)));
122+
}
123+
catch (IOException ex) {
124+
throw new UncheckedIOException(ex);
125+
}
91126
}
92127

93128
private static final class AutoConfiguration {
@@ -105,6 +140,18 @@ private AutoConfiguration(String module, Set<String> classNames) {
105140
}).collect(Collectors.toCollection(TreeSet::new));
106141
}
107142

143+
private static AutoConfiguration of(File metadataFile) {
144+
Properties metadata = new Properties();
145+
try (Reader reader = new FileReader(metadataFile)) {
146+
metadata.load(reader);
147+
}
148+
catch (IOException ex) {
149+
throw new UncheckedIOException(ex);
150+
}
151+
return new AutoConfiguration(metadata.getProperty("module"), new TreeSet<>(
152+
StringUtils.commaDelimitedListToSet(metadata.getProperty("autoConfigurationClassNames"))));
153+
}
154+
108155
}
109156

110157
private static final class AutoConfigurationClass implements Comparable<AutoConfigurationClass> {

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,6 @@ nativeBuildToolsVersion=0.10.6
2121
snakeYamlVersion=2.4
2222
springFrameworkVersion=6.2.8-SNAPSHOT
2323
springFramework60xVersion=6.0.23
24-
tomcatVersion=10.1.41
24+
tomcatVersion=10.1.42
2525

2626
kotlin.stdlib.default.dependency=false

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cloudfoundry/servlet/CloudFoundryActuatorAutoConfiguration.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ public static class IgnoredCloudFoundryPathsWebSecurityConfiguration {
174174
SecurityFilterChain cloudFoundrySecurityFilterChain(HttpSecurity http,
175175
CloudFoundryWebEndpointServletHandlerMapping handlerMapping) throws Exception {
176176
RequestMatcher cloudFoundryRequest = getRequestMatcher(handlerMapping);
177+
http.csrf((csrf) -> csrf.ignoringRequestMatchers(cloudFoundryRequest));
177178
http.securityMatchers((matches) -> matches.requestMatchers(cloudFoundryRequest))
178179
.authorizeHttpRequests((authorize) -> authorize.anyRequest().permitAll());
179180
return http.build();

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/web/servlet/ServletManagementChildContextConfiguration.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
4040
import org.springframework.boot.autoconfigure.condition.SearchStrategy;
4141
import org.springframework.boot.autoconfigure.web.ServerProperties;
42-
import org.springframework.boot.context.properties.EnableConfigurationProperties;
4342
import org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory;
4443
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
4544
import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
@@ -67,7 +66,6 @@
6766
*/
6867
@ManagementContextConfiguration(value = ManagementContextType.CHILD, proxyBeanMethods = false)
6968
@ConditionalOnWebApplication(type = Type.SERVLET)
70-
@EnableConfigurationProperties(ManagementServerProperties.class)
7169
class ServletManagementChildContextConfiguration {
7270

7371
@Bean

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/cloudfoundry/servlet/CloudFoundryActuatorAutoConfigurationTests.java

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.springframework.boot.actuate.endpoint.EndpointId;
3434
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
3535
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
36+
import org.springframework.boot.actuate.endpoint.annotation.WriteOperation;
3637
import org.springframework.boot.actuate.endpoint.web.EndpointMapping;
3738
import org.springframework.boot.actuate.endpoint.web.ExposableWebEndpoint;
3839
import org.springframework.boot.actuate.endpoint.web.WebOperation;
@@ -49,17 +50,24 @@
4950
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
5051
import org.springframework.context.ApplicationContext;
5152
import org.springframework.http.HttpMethod;
53+
import org.springframework.http.MediaType;
5254
import org.springframework.mock.web.MockHttpServletRequest;
5355
import org.springframework.security.config.BeanIds;
5456
import org.springframework.security.web.FilterChainProxy;
5557
import org.springframework.security.web.SecurityFilterChain;
5658
import org.springframework.test.util.ReflectionTestUtils;
59+
import org.springframework.test.web.servlet.MockMvc;
5760
import org.springframework.test.web.servlet.assertj.MockMvcTester;
61+
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
5862
import org.springframework.web.client.RestTemplate;
5963
import org.springframework.web.cors.CorsConfiguration;
6064
import org.springframework.web.filter.CompositeFilter;
6165

6266
import static org.assertj.core.api.Assertions.assertThat;
67+
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
68+
import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity;
69+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
70+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
6371

6472
/**
6573
* Tests for {@link CloudFoundryActuatorAutoConfiguration}.
@@ -170,7 +178,7 @@ void cloudFoundryPlatformActiveAndCloudControllerUrlNotPresent() {
170178
}
171179

172180
@Test
173-
void cloudFoundryPathsIgnoredBySpringSecurity() {
181+
void cloudFoundryPathsPermittedBySpringSecurity() {
174182
this.contextRunner.withBean(TestEndpoint.class, TestEndpoint::new)
175183
.withPropertyValues("VCAP_APPLICATION:---", "vcap.application.application_id:my-app-id")
176184
.run((context) -> {
@@ -189,6 +197,19 @@ void cloudFoundryPathsIgnoredBySpringSecurity() {
189197
});
190198
}
191199

200+
@Test
201+
void cloudFoundryPathsPermittedWithCsrfBySpringSecurity() {
202+
this.contextRunner.withBean(TestEndpoint.class, TestEndpoint::new)
203+
.withPropertyValues("VCAP_APPLICATION:---", "vcap.application.application_id:my-app-id")
204+
.run((context) -> {
205+
MockMvc mvc = MockMvcBuilders.webAppContextSetup(context).apply(springSecurity()).build();
206+
mvc.perform(post(BASE_PATH + "/test?name=test").contentType(MediaType.APPLICATION_JSON)
207+
.with(csrf().useInvalidToken())).andExpect(status().isServiceUnavailable());
208+
// If CSRF fails we'll get a 403, if it works we get service unavailable
209+
// because of "Cloud controller URL is not available"
210+
});
211+
}
212+
192213
private SecurityFilterChain getSecurityFilterChain(AssertableWebApplicationContext context) {
193214
Filter springSecurityFilterChain = context.getBean(BeanIds.SPRING_SECURITY_FILTER_CHAIN, Filter.class);
194215
FilterChainProxy filterChainProxy = getFilterChainProxy(springSecurityFilterChain);
@@ -258,7 +279,7 @@ void endpointPathCustomizationIsNotApplied() {
258279
.findFirst()
259280
.get();
260281
Collection<WebOperation> operations = endpoint.getOperations();
261-
assertThat(operations).hasSize(1);
282+
assertThat(operations).hasSize(2);
262283
assertThat(operations.iterator().next().getRequestPredicate().getPath()).isEqualTo("test");
263284
});
264285
}
@@ -307,6 +328,10 @@ String hello() {
307328
return "hello world";
308329
}
309330

331+
@WriteOperation
332+
void update(String name) {
333+
}
334+
310335
}
311336

312337
}

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/tracing/zipkin/ZipkinAutoConfigurationIntegrationTests.java

Lines changed: 0 additions & 68 deletions
This file was deleted.

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/web/reactive/ReactiveManagementChildContextConfigurationTests.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import org.junit.jupiter.api.Test;
2020

2121
import org.springframework.boot.actuate.autoconfigure.web.reactive.ReactiveManagementChildContextConfiguration.AccessLogCustomizer;
22+
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementServerProperties;
23+
import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner;
2224

2325
import static org.assertj.core.api.Assertions.assertThat;
2426

@@ -46,4 +48,22 @@ void accessLogCustomizerWithNullPrefix() {
4648
assertThat(customizer.customizePrefix("existing")).isEqualTo("existing");
4749
}
4850

51+
@Test
52+
// gh-45857
53+
void failsWithoutManagementServerPropertiesBeanFromParent() {
54+
new ReactiveWebApplicationContextRunner()
55+
.run((parent) -> new ReactiveWebApplicationContextRunner().withParent(parent)
56+
.withUserConfiguration(ReactiveManagementChildContextConfiguration.class)
57+
.run((context) -> assertThat(context).hasFailed()));
58+
}
59+
60+
@Test
61+
// gh-45857
62+
void succeedsWithManagementServerPropertiesBeanFromParent() {
63+
new ReactiveWebApplicationContextRunner().withBean(ManagementServerProperties.class)
64+
.run((parent) -> new ReactiveWebApplicationContextRunner().withParent(parent)
65+
.withUserConfiguration(ReactiveManagementChildContextConfiguration.class)
66+
.run((context) -> assertThat(context).hasNotFailed()));
67+
}
68+
4969
}

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/web/servlet/ServletManagementChildContextConfigurationTests.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818

1919
import org.junit.jupiter.api.Test;
2020

21+
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementServerProperties;
2122
import org.springframework.boot.actuate.autoconfigure.web.servlet.ServletManagementChildContextConfiguration.AccessLogCustomizer;
23+
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
2224

2325
import static org.assertj.core.api.Assertions.assertThat;
2426

@@ -46,4 +48,21 @@ void accessLogCustomizerWithNullPrefix() {
4648
assertThat(customizer.customizePrefix("existing")).isEqualTo("existing");
4749
}
4850

51+
@Test
52+
// gh-45857
53+
void failsWithoutManagementServerPropertiesBeanFromParent() {
54+
new WebApplicationContextRunner().run((parent) -> new WebApplicationContextRunner().withParent(parent)
55+
.withUserConfiguration(ServletManagementChildContextConfiguration.class)
56+
.run((context) -> assertThat(context).hasFailed()));
57+
}
58+
59+
@Test
60+
// gh-45857
61+
void succeedsWithManagementServerPropertiesBeanFromParent() {
62+
new WebApplicationContextRunner().withBean(ManagementServerProperties.class)
63+
.run((parent) -> new WebApplicationContextRunner().withParent(parent)
64+
.withUserConfiguration(ServletManagementChildContextConfiguration.class)
65+
.run((context) -> assertThat(context).hasNotFailed()));
66+
}
67+
4968
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/graphql/GraphQlProperties.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,7 @@ public void setTimeout(Duration timeout) {
343343

344344
}
345345

346+
@Deprecated(since = "3.5.1", forRemoval = true)
346347
public static final class DeprecatedSse {
347348

348349
private final Sse sse;

0 commit comments

Comments
 (0)