|
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