Skip to content

Commit 8888f75

Browse files
committed
Polish "Add dedicated namespace for RemoteIpValve properties"
See gh-18489
1 parent 479cd88 commit 8888f75

File tree

5 files changed

+80
-111
lines changed

5 files changed

+80
-111
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java

Lines changed: 47 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -300,43 +300,6 @@ public static class Tomcat {
300300
*/
301301
private final Accesslog accesslog = new Accesslog();
302302

303-
/**
304-
* Regular expression that matches proxies that are to be trusted.
305-
*/
306-
private String internalProxies = "10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|" // 10/8
307-
+ "192\\.168\\.\\d{1,3}\\.\\d{1,3}|" // 192.168/16
308-
+ "169\\.254\\.\\d{1,3}\\.\\d{1,3}|" // 169.254/16
309-
+ "127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|" // 127/8
310-
+ "172\\.1[6-9]{1}\\.\\d{1,3}\\.\\d{1,3}|" // 172.16/12
311-
+ "172\\.2[0-9]{1}\\.\\d{1,3}\\.\\d{1,3}|172\\.3[0-1]{1}\\.\\d{1,3}\\.\\d{1,3}|" //
312-
+ "0:0:0:0:0:0:0:1|::1";
313-
314-
/**
315-
* Header that holds the incoming protocol, usually named "X-Forwarded-Proto".
316-
*/
317-
private String protocolHeader;
318-
319-
/**
320-
* Value of the protocol header indicating whether the incoming request uses SSL.
321-
*/
322-
private String protocolHeaderHttpsValue = "https";
323-
324-
/**
325-
* Name of the HTTP header used to override the original port value.
326-
*/
327-
private String portHeader = "X-Forwarded-Port";
328-
329-
/**
330-
* Name of the HTTP header from which the remote IP is extracted. For instance,
331-
* `X-FORWARDED-FOR`.
332-
*/
333-
private String remoteIpHeader;
334-
335-
/**
336-
* Name of the HTTP header from which the remote host is extracted.
337-
*/
338-
private String hostHeader = "X-Forwarded-Host";
339-
340303
/**
341304
* Tomcat base directory. If not specified, a temporary directory is used.
342305
*/
@@ -444,7 +407,7 @@ public static class Tomcat {
444407
/**
445408
* Remote Ip Valve configuration.
446409
*/
447-
private final RemoteIpValve remoteIpValve = new RemoteIpValve();
410+
private final Remoteip remoteip = new Remoteip();
448411

449412
public int getMaxThreads() {
450413
return this.maxThreads;
@@ -501,40 +464,58 @@ public void setBasedir(File basedir) {
501464
this.basedir = basedir;
502465
}
503466

504-
@DeprecatedConfigurationProperty(replacement = "server.tomcat.remote-ip-valve.internal-proxies")
467+
@DeprecatedConfigurationProperty(replacement = "server.tomcat.remoteip.internal-proxies")
505468
public String getInternalProxies() {
506-
return this.remoteIpValve.getInternalProxies();
469+
return this.remoteip.getInternalProxies();
507470
}
508471

509472
public void setInternalProxies(String internalProxies) {
510-
this.remoteIpValve.setInternalProxies(internalProxies);
473+
this.remoteip.setInternalProxies(internalProxies);
511474
}
512475

513-
@DeprecatedConfigurationProperty(replacement = "server.tomcat.remote-ip-valve.protocol-header")
476+
@DeprecatedConfigurationProperty(replacement = "server.tomcat.remoteip.protocol-header")
514477
public String getProtocolHeader() {
515-
return this.remoteIpValve.getProtocolHeader();
478+
return this.remoteip.getProtocolHeader();
516479
}
517480

518481
public void setProtocolHeader(String protocolHeader) {
519-
this.remoteIpValve.setProtocolHeader(protocolHeader);
482+
this.remoteip.setProtocolHeader(protocolHeader);
520483
}
521484

522-
@DeprecatedConfigurationProperty(replacement = "server.tomcat.remote-ip-valve.protocol-header-https-value")
485+
@DeprecatedConfigurationProperty(replacement = "server.tomcat.remoteip.protocol-header-https-value")
523486
public String getProtocolHeaderHttpsValue() {
524-
return this.remoteIpValve.getProtocolHeaderHttpsValue();
487+
return this.remoteip.getProtocolHeaderHttpsValue();
525488
}
526489

527490
public void setProtocolHeaderHttpsValue(String protocolHeaderHttpsValue) {
528-
this.remoteIpValve.setProtocolHeaderHttpsValue(protocolHeaderHttpsValue);
491+
this.remoteip.setProtocolHeaderHttpsValue(protocolHeaderHttpsValue);
529492
}
530493

531-
@DeprecatedConfigurationProperty(replacement = "server.tomcat.remote-ip-valve.port-header")
494+
@DeprecatedConfigurationProperty(replacement = "server.tomcat.remoteip.host-header")
495+
public String getHostHeader() {
496+
return this.remoteip.getHostHeader();
497+
}
498+
499+
public void setHostHeader(String hostHeader) {
500+
this.remoteip.setHostHeader(hostHeader);
501+
}
502+
503+
@DeprecatedConfigurationProperty(replacement = "server.tomcat.remote.port-header")
532504
public String getPortHeader() {
533-
return this.remoteIpValve.getPortHeader();
505+
return this.remoteip.getPortHeader();
534506
}
535507

536508
public void setPortHeader(String portHeader) {
537-
this.remoteIpValve.setPortHeader(portHeader);
509+
this.remoteip.setPortHeader(portHeader);
510+
}
511+
512+
@DeprecatedConfigurationProperty(replacement = "server.tomcat.remoteip.remote-ip-header")
513+
public String getRemoteIpHeader() {
514+
return this.remoteip.getRemoteIpHeader();
515+
}
516+
517+
public void setRemoteIpHeader(String remoteIpHeader) {
518+
this.remoteip.setRemoteIpHeader(remoteIpHeader);
538519
}
539520

540521
public Boolean getRedirectContextRoot() {
@@ -553,24 +534,6 @@ public void setUseRelativeRedirects(Boolean useRelativeRedirects) {
553534
this.useRelativeRedirects = useRelativeRedirects;
554535
}
555536

556-
@DeprecatedConfigurationProperty(replacement = "server.tomcat.remote-ip-valve.remote-ip-header")
557-
public String getRemoteIpHeader() {
558-
return this.remoteIpValve.getRemoteIpHeader();
559-
}
560-
561-
public void setRemoteIpHeader(String remoteIpHeader) {
562-
this.remoteIpValve.setRemoteIpHeader(remoteIpHeader);
563-
}
564-
565-
@DeprecatedConfigurationProperty(replacement = "server.tomcat.remote-ip-valve.host-header")
566-
public String getHostHeader() {
567-
return this.remoteIpValve.getHostHeader();
568-
}
569-
570-
public void setHostHeader(String hostHeader) {
571-
this.remoteIpValve.setHostHeader(hostHeader);
572-
}
573-
574537
public Charset getUriEncoding() {
575538
return this.uriEncoding;
576539
}
@@ -651,8 +614,8 @@ public Mbeanregistry getMbeanregistry() {
651614
return this.mbeanregistry;
652615
}
653616

654-
public RemoteIpValve getRemoteIpValve() {
655-
return this.remoteIpValve;
617+
public Remoteip getRemoteip() {
618+
return this.remoteip;
656619
}
657620

658621
/**
@@ -941,12 +904,7 @@ public void setEnabled(boolean enabled) {
941904

942905
}
943906

944-
public static class RemoteIpValve {
945-
946-
/**
947-
* Name of the HTTP header from which the remote host is extracted.
948-
*/
949-
private String hostHeader = "X-Forwarded-Host";
907+
public static class Remoteip {
950908

951909
/**
952910
* Regular expression that matches proxies that are to be trusted.
@@ -970,6 +928,11 @@ public static class RemoteIpValve {
970928
*/
971929
private String protocolHeaderHttpsValue = "https";
972930

931+
/**
932+
* Name of the HTTP header from which the remote host is extracted.
933+
*/
934+
private String hostHeader = "X-Forwarded-Host";
935+
973936
/**
974937
* Name of the HTTP header used to override the original port value.
975938
*/
@@ -981,14 +944,6 @@ public static class RemoteIpValve {
981944
*/
982945
private String remoteIpHeader;
983946

984-
public String getHostHeader() {
985-
return this.hostHeader;
986-
}
987-
988-
public void setHostHeader(String hostHeader) {
989-
this.hostHeader = hostHeader;
990-
}
991-
992947
public String getInternalProxies() {
993948
return this.internalProxies;
994949
}
@@ -1009,6 +964,14 @@ public String getProtocolHeaderHttpsValue() {
1009964
return this.protocolHeaderHttpsValue;
1010965
}
1011966

967+
public String getHostHeader() {
968+
return this.hostHeader;
969+
}
970+
971+
public void setHostHeader(String hostHeader) {
972+
this.hostHeader = hostHeader;
973+
}
974+
1012975
public void setProtocolHeaderHttpsValue(String protocolHeaderHttpsValue) {
1013976
this.protocolHeaderHttpsValue = protocolHeaderHttpsValue;
1014977
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/embedded/TomcatWebServerFactoryCustomizer.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@
3131
import org.springframework.boot.autoconfigure.web.ErrorProperties;
3232
import org.springframework.boot.autoconfigure.web.ErrorProperties.IncludeStacktrace;
3333
import org.springframework.boot.autoconfigure.web.ServerProperties;
34-
import org.springframework.boot.autoconfigure.web.ServerProperties.Tomcat;
3534
import org.springframework.boot.autoconfigure.web.ServerProperties.Tomcat.Accesslog;
35+
import org.springframework.boot.autoconfigure.web.ServerProperties.Tomcat.Remoteip;
3636
import org.springframework.boot.cloud.CloudPlatform;
3737
import org.springframework.boot.context.properties.PropertyMapper;
3838
import org.springframework.boot.web.embedded.tomcat.ConfigurableTomcatWebServerFactory;
@@ -173,9 +173,9 @@ private String joinCharacters(List<Character> content) {
173173
}
174174

175175
private void customizeRemoteIpValve(ConfigurableTomcatWebServerFactory factory) {
176-
Tomcat tomcatProperties = this.serverProperties.getTomcat();
177-
String protocolHeader = tomcatProperties.getRemoteIpValve().getProtocolHeader();
178-
String remoteIpHeader = tomcatProperties.getRemoteIpValve().getRemoteIpHeader();
176+
Remoteip remoteIpProperties = this.serverProperties.getTomcat().getRemoteip();
177+
String protocolHeader = remoteIpProperties.getProtocolHeader();
178+
String remoteIpHeader = remoteIpProperties.getRemoteIpHeader();
179179
// For back compatibility the valve is also enabled if protocol-header is set
180180
if (StringUtils.hasText(protocolHeader) || StringUtils.hasText(remoteIpHeader)
181181
|| getOrDeduceUseForwardHeaders()) {
@@ -186,10 +186,10 @@ private void customizeRemoteIpValve(ConfigurableTomcatWebServerFactory factory)
186186
}
187187
// The internal proxies default to a white list of "safe" internal IP
188188
// addresses
189-
valve.setInternalProxies(tomcatProperties.getRemoteIpValve().getInternalProxies());
190-
valve.setHostHeader(tomcatProperties.getRemoteIpValve().getHostHeader());
191-
valve.setPortHeader(tomcatProperties.getRemoteIpValve().getPortHeader());
192-
valve.setProtocolHeaderHttpsValue(tomcatProperties.getRemoteIpValve().getProtocolHeaderHttpsValue());
189+
valve.setInternalProxies(remoteIpProperties.getInternalProxies());
190+
valve.setHostHeader(remoteIpProperties.getHostHeader());
191+
valve.setPortHeader(remoteIpProperties.getPortHeader());
192+
valve.setProtocolHeaderHttpsValue(remoteIpProperties.getProtocolHeaderHttpsValue());
193193
// ... so it's safe to add this valve by default.
194194
factory.addEngineValves(valve);
195195
}

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/ServerPropertiesTests.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,9 @@ void testTomcatBinding() {
125125
map.put("server.tomcat.accesslog.rename-on-rotate", "true");
126126
map.put("server.tomcat.accesslog.ipv6Canonical", "true");
127127
map.put("server.tomcat.accesslog.request-attributes-enabled", "true");
128-
map.put("server.tomcat.protocol-header", "X-Forwarded-Protocol");
129-
map.put("server.tomcat.remote-ip-header", "Remote-Ip");
130-
map.put("server.tomcat.internal-proxies", "10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}");
128+
map.put("server.tomcat.remoteip.protocol-header", "X-Forwarded-Protocol");
129+
map.put("server.tomcat.remoteip.remote-ip-header", "Remote-Ip");
130+
map.put("server.tomcat.remoteip.internal-proxies", "10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}");
131131
map.put("server.tomcat.background-processor-delay", "10");
132132
map.put("server.tomcat.relaxed-path-chars", "|,<");
133133
map.put("server.tomcat.relaxed-query-chars", "^ , | ");

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/embedded/TomcatWebServerFactoryCustomizerTests.java

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -178,9 +178,12 @@ void customMaxSwallowSize() {
178178

179179
@Test
180180
void customRemoteIpValve() {
181-
bind("server.tomcat.remote-ip-header=x-my-remote-ip-header",
182-
"server.tomcat.protocol-header=x-my-protocol-header", "server.tomcat.internal-proxies=192.168.0.1",
183-
"server.tomcat.port-header=x-my-forward-port", "server.tomcat.protocol-header-https-value=On");
181+
bind("server.tomcat.remoteip.remote-ip-header=x-my-remote-ip-header",
182+
"server.tomcat.remoteip.protocol-header=x-my-protocol-header",
183+
"server.tomcat.remoteip.internal-proxies=192.168.0.1",
184+
"server.tomcat.remoteip.host-header=x-my-forward-host",
185+
"server.tomcat.remoteip.port-header=x-my-forward-port",
186+
"server.tomcat.remoteip.protocol-header-https-value=On");
184187
TomcatServletWebServerFactory factory = customizeAndGetFactory();
185188
assertThat(factory.getEngineValves()).hasSize(1);
186189
Valve valve = factory.getEngineValves().iterator().next();
@@ -189,17 +192,18 @@ void customRemoteIpValve() {
189192
assertThat(remoteIpValve.getProtocolHeader()).isEqualTo("x-my-protocol-header");
190193
assertThat(remoteIpValve.getProtocolHeaderHttpsValue()).isEqualTo("On");
191194
assertThat(remoteIpValve.getRemoteIpHeader()).isEqualTo("x-my-remote-ip-header");
195+
assertThat(remoteIpValve.getHostHeader()).isEqualTo("x-my-forward-host");
192196
assertThat(remoteIpValve.getPortHeader()).isEqualTo("x-my-forward-port");
193197
assertThat(remoteIpValve.getInternalProxies()).isEqualTo("192.168.0.1");
194198
}
195199

196200
@Test
197-
void customNewPropertiesForRemoteIpValve() {
198-
bind("server.tomcat.remote-ip-valve.remote-ip-header=x-my-remote-ip-header",
199-
"server.tomcat.remote-ip-valve.protocol-header=x-my-protocol-header",
200-
"server.tomcat.remote-ip-valve.internal-proxies=192.168.0.1",
201-
"server.tomcat.remote-ip-valve.port-header=x-my-forward-port",
202-
"server.tomcat.remote-ip-valve.protocol-header-https-value=On");
201+
@Deprecated
202+
void customRemoteIpValveWithDeprecatedProperties() {
203+
bind("server.tomcat.remote-ip-header=x-my-remote-ip-header",
204+
"server.tomcat.protocol-header=x-my-protocol-header", "server.tomcat.internal-proxies=192.168.0.1",
205+
"server.tomcat.host-header=x-my-forward-host", "server.tomcat.port-header=x-my-forward-port",
206+
"server.tomcat.protocol-header-https-value=On");
203207
TomcatServletWebServerFactory factory = customizeAndGetFactory();
204208
assertThat(factory.getEngineValves()).hasSize(1);
205209
Valve valve = factory.getEngineValves().iterator().next();
@@ -208,6 +212,7 @@ void customNewPropertiesForRemoteIpValve() {
208212
assertThat(remoteIpValve.getProtocolHeader()).isEqualTo("x-my-protocol-header");
209213
assertThat(remoteIpValve.getProtocolHeaderHttpsValue()).isEqualTo("On");
210214
assertThat(remoteIpValve.getRemoteIpHeader()).isEqualTo("x-my-remote-ip-header");
215+
assertThat(remoteIpValve.getHostHeader()).isEqualTo("x-my-forward-host");
211216
assertThat(remoteIpValve.getPortHeader()).isEqualTo("x-my-forward-port");
212217
assertThat(remoteIpValve.getInternalProxies()).isEqualTo("192.168.0.1");
213218
}
@@ -257,7 +262,8 @@ void deduceUseForwardHeaders() {
257262
@Test
258263
void defaultRemoteIpValve() {
259264
// Since 1.1.7 you need to specify at least the protocol
260-
bind("server.tomcat.protocol-header=X-Forwarded-Proto", "server.tomcat.remote-ip-header=X-Forwarded-For");
265+
bind("server.tomcat.remoteip.protocol-header=X-Forwarded-Proto",
266+
"server.tomcat.remoteip.remote-ip-header=X-Forwarded-For");
261267
testRemoteIpValveConfigured();
262268
}
263269

@@ -297,7 +303,7 @@ void defaultBackgroundProcessorDelay() {
297303

298304
@Test
299305
void disableRemoteIpValve() {
300-
bind("server.tomcat.remote-ip-header=", "server.tomcat.protocol-header=");
306+
bind("server.tomcat.remoteip.remote-ip-header=", "server.tomcat.remoteip.protocol-header=");
301307
TomcatServletWebServerFactory factory = customizeAndGetFactory();
302308
assertThat(factory.getEngineValves()).isEmpty();
303309
}

spring-boot-project/spring-boot-docs/src/main/asciidoc/howto.adoc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -804,8 +804,8 @@ If you use Tomcat, you can additionally configure the names of the headers used
804804

805805
[indent=0]
806806
----
807-
server.tomcat.remote-ip-header=x-your-remote-ip-header
808-
server.tomcat.protocol-header=x-your-protocol-header
807+
server.tomcat.remoteip.remote-ip-header=x-your-remote-ip-header
808+
server.tomcat.remoteip.protocol-header=x-your-protocol-header
809809
----
810810

811811
Tomcat is also configured with a default regular expression that matches internal proxies that are to be trusted.
@@ -814,7 +814,7 @@ You can customize the valve's configuration by adding an entry to `application.p
814814

815815
[indent=0]
816816
----
817-
server.tomcat.internal-proxies=192\\.168\\.\\d{1,3}\\.\\d{1,3}
817+
server.tomcat.remoteip.internal-proxies=192\\.168\\.\\d{1,3}\\.\\d{1,3}
818818
----
819819

820820
NOTE: The double backslashes are required only when you use a properties file for configuration.
@@ -2203,8 +2203,8 @@ You can switch on the valve by adding some entries to `application.properties`,
22032203

22042204
[source,properties,indent=0,configprops]
22052205
----
2206-
server.tomcat.remote-ip-header=x-forwarded-for
2207-
server.tomcat.protocol-header=x-forwarded-proto
2206+
server.tomcat.remoteip.remote-ip-header=x-forwarded-for
2207+
server.tomcat.remoteip.protocol-header=x-forwarded-proto
22082208
----
22092209

22102210
(The presence of either of those properties switches on the valve.

0 commit comments

Comments
 (0)