|
1 | 1 | /* |
2 | | - * Copyright 2002-2023 the original author or authors. |
| 2 | + * Copyright 2002-2024 the original author or authors. |
3 | 3 | * |
4 | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
5 | 5 | * you may not use this file except in compliance with the License. |
|
17 | 17 | package org.springframework.security.web.csrf; |
18 | 18 |
|
19 | 19 | import jakarta.servlet.http.Cookie; |
| 20 | +import jakarta.servlet.http.HttpServletResponse; |
20 | 21 | import org.junit.jupiter.api.BeforeEach; |
21 | 22 | import org.junit.jupiter.api.Test; |
22 | 23 |
|
23 | 24 | import org.springframework.http.HttpHeaders; |
24 | 25 | import org.springframework.mock.web.MockHttpServletRequest; |
25 | 26 | import org.springframework.mock.web.MockHttpServletResponse; |
| 27 | +import org.springframework.mock.web.MockServletContext; |
26 | 28 |
|
27 | 29 | import static org.assertj.core.api.Assertions.assertThat; |
28 | 30 | import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; |
29 | 31 | import static org.mockito.ArgumentMatchers.any; |
| 32 | +import static org.mockito.Mockito.mock; |
| 33 | +import static org.mockito.Mockito.never; |
30 | 34 | import static org.mockito.Mockito.spy; |
31 | 35 | import static org.mockito.Mockito.verify; |
32 | 36 | import static org.springframework.security.web.csrf.CsrfTokenAssert.assertThatCsrfToken; |
@@ -447,6 +451,44 @@ void withHttpOnlyFalseWhenCookieCustomizerThenStillDefaultsToFalse() { |
447 | 451 | assertThat(tokenCookie.isHttpOnly()).isEqualTo(Boolean.FALSE); |
448 | 452 | } |
449 | 453 |
|
| 454 | + // gh-16173 |
| 455 | + @Test |
| 456 | + void saveTokenWhenSameSiteAndServletVersion5ThenUsesAddHeader() { |
| 457 | + HttpServletResponse response = mock(HttpServletResponse.class); |
| 458 | + ((MockServletContext) this.request.getServletContext()).setMajorVersion(5); |
| 459 | + this.repository.setCookieCustomizer((builder) -> builder.sameSite("Strict")); |
| 460 | + CsrfToken token = this.repository.generateToken(this.request); |
| 461 | + this.repository.saveToken(token, this.request, response); |
| 462 | + verify(response, never()).addCookie(any(Cookie.class)); |
| 463 | + verify(response).addHeader(any(), any()); |
| 464 | + } |
| 465 | + |
| 466 | + // gh-16173 |
| 467 | + @Test |
| 468 | + void saveTokenWhenSameSiteAndServletVersion6OrHigherThenUsesAddCookie() { |
| 469 | + HttpServletResponse response = mock(HttpServletResponse.class); |
| 470 | + this.repository.setCookieCustomizer((builder) -> builder.sameSite("Strict")); |
| 471 | + CsrfToken token = this.repository.generateToken(this.request); |
| 472 | + this.repository.saveToken(token, this.request, response); |
| 473 | + verify(response).addCookie(any(Cookie.class)); |
| 474 | + verify(response, never()).addHeader(any(), any()); |
| 475 | + } |
| 476 | + |
| 477 | + // gh-16173 |
| 478 | + @Test |
| 479 | + void saveTokenWhenNoSameSiteThenUsesAddCookie() { |
| 480 | + HttpServletResponse response = mock(HttpServletResponse.class); |
| 481 | + CsrfToken token = this.repository.generateToken(this.request); |
| 482 | + this.repository.saveToken(token, this.request, response); |
| 483 | + verify(response).addCookie(any(Cookie.class)); |
| 484 | + verify(response, never()).addHeader(any(), any()); |
| 485 | + ((MockServletContext) this.request.getServletContext()).setMajorVersion(5); |
| 486 | + response = mock(HttpServletResponse.class); |
| 487 | + this.repository.saveToken(token, this.request, response); |
| 488 | + verify(response).addCookie(any(Cookie.class)); |
| 489 | + verify(response, never()).addHeader(any(), any()); |
| 490 | + } |
| 491 | + |
450 | 492 | @Test |
451 | 493 | void setCookieNameNullIllegalArgumentException() { |
452 | 494 | assertThatIllegalArgumentException().isThrownBy(() -> this.repository.setCookieName(null)); |
|
0 commit comments