Skip to content

Commit 6a0b683

Browse files
committed
StrictFirewallHttpRequest.buid returns StrictFirewallHttpRequest
Closes gh-16069
1 parent 2b6d586 commit 6a0b683

File tree

2 files changed

+85
-0
lines changed

2 files changed

+85
-0
lines changed

Diff for: web/src/main/java/org/springframework/security/web/server/firewall/StrictServerWebExchangeFirewall.java

+64
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,16 @@
1616

1717
package org.springframework.security.web.server.firewall;
1818

19+
import java.net.InetSocketAddress;
20+
import java.net.URI;
1921
import java.util.Arrays;
2022
import java.util.Collection;
2123
import java.util.Collections;
2224
import java.util.HashSet;
2325
import java.util.List;
2426
import java.util.Map;
2527
import java.util.Set;
28+
import java.util.function.Consumer;
2629
import java.util.function.Predicate;
2730
import java.util.regex.Pattern;
2831

@@ -33,6 +36,7 @@
3336
import org.springframework.http.server.reactive.ServerHttpRequest;
3437
import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
3538
import org.springframework.http.server.reactive.ServerHttpResponse;
39+
import org.springframework.http.server.reactive.SslInfo;
3640
import org.springframework.util.Assert;
3741
import org.springframework.util.MultiValueMap;
3842
import org.springframework.web.server.ServerWebExchange;
@@ -743,6 +747,11 @@ public MultiValueMap<String, String> getQueryParams() {
743747
return queryParams;
744748
}
745749

750+
@Override
751+
public Builder mutate() {
752+
return new StrictFirewallBuilder(super.mutate());
753+
}
754+
746755
private final class StrictFirewallHttpHeaders extends HttpHeaders {
747756

748757
private StrictFirewallHttpHeaders(HttpHeaders delegate) {
@@ -783,6 +792,61 @@ public Set<String> keySet() {
783792

784793
}
785794

795+
private final class StrictFirewallBuilder implements Builder {
796+
797+
private final Builder delegate;
798+
799+
private StrictFirewallBuilder(Builder delegate) {
800+
this.delegate = delegate;
801+
}
802+
803+
@Override
804+
public Builder method(HttpMethod httpMethod) {
805+
return this.delegate.method(httpMethod);
806+
}
807+
808+
@Override
809+
public Builder uri(URI uri) {
810+
return this.delegate.uri(uri);
811+
}
812+
813+
@Override
814+
public Builder path(String path) {
815+
return this.delegate.path(path);
816+
}
817+
818+
@Override
819+
public Builder contextPath(String contextPath) {
820+
return this.delegate.contextPath(contextPath);
821+
}
822+
823+
@Override
824+
public Builder header(String headerName, String... headerValues) {
825+
return this.delegate.header(headerName, headerValues);
826+
}
827+
828+
@Override
829+
public Builder headers(Consumer<HttpHeaders> headersConsumer) {
830+
return this.delegate.headers(headersConsumer);
831+
}
832+
833+
@Override
834+
public Builder sslInfo(SslInfo sslInfo) {
835+
return this.delegate.sslInfo(sslInfo);
836+
}
837+
838+
@Override
839+
public Builder remoteAddress(InetSocketAddress remoteAddress) {
840+
return this.delegate.remoteAddress(remoteAddress);
841+
}
842+
843+
@Override
844+
public ServerHttpRequest build() {
845+
return new StrictFirewallHttpRequest(this.delegate.build());
846+
}
847+
848+
}
849+
786850
}
787851

788852
}

Diff for: web/src/test/java/org/springframework/security/web/server/firewall/StrictServerWebExchangeFirewallTests.java

+21
Original file line numberDiff line numberDiff line change
@@ -513,4 +513,25 @@ void getFirewalledExchangeGetHeaderWhenNameIsNullThenNull() {
513513
assertThat(exchange.getRequest().getHeaders().get(null)).isNull();
514514
}
515515

516+
@Test
517+
void getFirewalledExchangeWhenMutateThenHeadersStillFirewalled() {
518+
String invalidHeaderName = "bad name";
519+
this.firewall.setAllowedHeaderNames((name) -> !name.equals(invalidHeaderName));
520+
ServerWebExchange exchange = getFirewalledExchange();
521+
ServerWebExchange mutatedExchange = exchange.mutate().request(exchange.getRequest().mutate().build()).build();
522+
HttpHeaders headers = mutatedExchange.getRequest().getHeaders();
523+
assertThatExceptionOfType(ServerExchangeRejectedException.class)
524+
.isThrownBy(() -> headers.get(invalidHeaderName));
525+
}
526+
527+
@Test
528+
void getMutatedFirewalledExchangeGetHeaderWhenNotAllowedHeaderNameThenException() {
529+
String invalidHeaderName = "bad name";
530+
this.firewall.setAllowedHeaderNames((name) -> !name.equals(invalidHeaderName));
531+
ServerWebExchange exchange = getFirewalledExchange();
532+
HttpHeaders headers = exchange.getRequest().mutate().build().getHeaders();
533+
assertThatExceptionOfType(ServerExchangeRejectedException.class)
534+
.isThrownBy(() -> headers.get(invalidHeaderName));
535+
}
536+
516537
}

0 commit comments

Comments
 (0)