|
|
|
|
@ -125,9 +125,10 @@ public class CsrfWebFilterTests {
@@ -125,9 +125,10 @@ public class CsrfWebFilterTests {
|
|
|
|
|
this.csrfFilter.setCsrfTokenRepository(this.repository); |
|
|
|
|
given(this.repository.loadToken(any())).willReturn(Mono.just(this.token)); |
|
|
|
|
given(this.repository.generateToken(any())).willReturn(Mono.just(this.token)); |
|
|
|
|
CsrfToken csrfToken = createXorCsrfToken(); |
|
|
|
|
this.post = MockServerWebExchange |
|
|
|
|
.from(MockServerHttpRequest.post("/").contentType(MediaType.APPLICATION_FORM_URLENCODED) |
|
|
|
|
.body(this.token.getParameterName() + "=" + this.token.getToken())); |
|
|
|
|
.body(csrfToken.getParameterName() + "=" + csrfToken.getToken())); |
|
|
|
|
Mono<Void> result = this.csrfFilter.filter(this.post, this.chain); |
|
|
|
|
StepVerifier.create(result).verifyComplete(); |
|
|
|
|
chainResult.assertWasSubscribed(); |
|
|
|
|
@ -151,8 +152,9 @@ public class CsrfWebFilterTests {
@@ -151,8 +152,9 @@ public class CsrfWebFilterTests {
|
|
|
|
|
this.csrfFilter.setCsrfTokenRepository(this.repository); |
|
|
|
|
given(this.repository.loadToken(any())).willReturn(Mono.just(this.token)); |
|
|
|
|
given(this.repository.generateToken(any())).willReturn(Mono.just(this.token)); |
|
|
|
|
CsrfToken csrfToken = createXorCsrfToken(); |
|
|
|
|
this.post = MockServerWebExchange |
|
|
|
|
.from(MockServerHttpRequest.post("/").header(this.token.getHeaderName(), this.token.getToken())); |
|
|
|
|
.from(MockServerHttpRequest.post("/").header(csrfToken.getHeaderName(), csrfToken.getToken())); |
|
|
|
|
Mono<Void> result = this.csrfFilter.filter(this.post, this.chain); |
|
|
|
|
StepVerifier.create(result).verifyComplete(); |
|
|
|
|
chainResult.assertWasSubscribed(); |
|
|
|
|
@ -181,30 +183,22 @@ public class CsrfWebFilterTests {
@@ -181,30 +183,22 @@ public class CsrfWebFilterTests {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void filterWhenXorServerCsrfTokenRequestProcessorAndValidTokenThenSuccess() { |
|
|
|
|
public void filterWhenXorServerCsrfTokenRequestAttributeHandlerAndValidTokenThenSuccess() { |
|
|
|
|
PublisherProbe<Void> chainResult = PublisherProbe.empty(); |
|
|
|
|
given(this.chain.filter(any())).willReturn(chainResult.mono()); |
|
|
|
|
this.csrfFilter.setCsrfTokenRepository(this.repository); |
|
|
|
|
given(this.repository.generateToken(any())).willReturn(Mono.just(this.token)); |
|
|
|
|
given(this.repository.loadToken(any())).willReturn(Mono.just(this.token)); |
|
|
|
|
XorServerCsrfTokenRequestAttributeHandler requestHandler = new XorServerCsrfTokenRequestAttributeHandler(); |
|
|
|
|
this.csrfFilter.setRequestHandler(requestHandler); |
|
|
|
|
StepVerifier.create(this.csrfFilter.filter(this.get, this.chain)).verifyComplete(); |
|
|
|
|
chainResult.assertWasSubscribed(); |
|
|
|
|
|
|
|
|
|
Mono<CsrfToken> csrfTokenAttribute = this.get.getAttribute(CsrfToken.class.getName()); |
|
|
|
|
assertThat(csrfTokenAttribute).isNotNull(); |
|
|
|
|
StepVerifier.create(csrfTokenAttribute) |
|
|
|
|
.consumeNextWith((csrfToken) -> this.post = MockServerWebExchange |
|
|
|
|
.from(MockServerHttpRequest.post("/").header(csrfToken.getHeaderName(), csrfToken.getToken()))) |
|
|
|
|
.verifyComplete(); |
|
|
|
|
|
|
|
|
|
CsrfToken csrfToken = createXorCsrfToken(); |
|
|
|
|
this.post = MockServerWebExchange |
|
|
|
|
.from(MockServerHttpRequest.post("/").header(csrfToken.getHeaderName(), csrfToken.getToken())); |
|
|
|
|
StepVerifier.create(this.csrfFilter.filter(this.post, this.chain)).verifyComplete(); |
|
|
|
|
chainResult.assertWasSubscribed(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void filterWhenXorServerCsrfTokenRequestProcessorAndRawTokenThenAccessDeniedException() { |
|
|
|
|
public void filterWhenXorServerCsrfTokenRequestAttributeHandlerAndRawTokenThenAccessDeniedException() { |
|
|
|
|
PublisherProbe<Void> chainResult = PublisherProbe.empty(); |
|
|
|
|
this.csrfFilter.setCsrfTokenRepository(this.repository); |
|
|
|
|
given(this.repository.loadToken(any())).willReturn(Mono.just(this.token)); |
|
|
|
|
@ -305,6 +299,7 @@ public class CsrfWebFilterTests {
@@ -305,6 +299,7 @@ public class CsrfWebFilterTests {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// gh-9561
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void doFilterWhenTokenIsNullThenNoNullPointer() { |
|
|
|
|
this.csrfFilter.setCsrfTokenRepository(this.repository); |
|
|
|
|
@ -318,8 +313,8 @@ public class CsrfWebFilterTests {
@@ -318,8 +313,8 @@ public class CsrfWebFilterTests {
|
|
|
|
|
.bodyValue(this.token.getParameterName() + "=" + this.token.getToken()).exchange().expectStatus() |
|
|
|
|
.isForbidden(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// gh-9113
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
public void filterWhenSubscribingCsrfTokenMultipleTimesThenGenerateOnlyOnce() { |
|
|
|
|
PublisherProbe<CsrfToken> chainResult = PublisherProbe.empty(); |
|
|
|
|
@ -334,6 +329,14 @@ public class CsrfWebFilterTests {
@@ -334,6 +329,14 @@ public class CsrfWebFilterTests {
|
|
|
|
|
assertThat(chainResult.subscribeCount()).isEqualTo(1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private CsrfToken createXorCsrfToken() { |
|
|
|
|
ServerCsrfTokenRequestHandler handler = new XorServerCsrfTokenRequestAttributeHandler(); |
|
|
|
|
MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("/")); |
|
|
|
|
handler.handle(exchange, Mono.just(this.token)); |
|
|
|
|
Mono<CsrfToken> csrfToken = exchange.getAttribute(CsrfToken.class.getName()); |
|
|
|
|
return csrfToken.block(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@RestController |
|
|
|
|
static class OkController { |
|
|
|
|
|
|
|
|
|
|