1
1
/*
2
- * Copyright 2002-2018 the original author or authors.
2
+ * Copyright 2002-2021 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.
16
16
17
17
package org .springframework .security .web .server .csrf ;
18
18
19
+ import java .security .cert .X509Certificate ;
19
20
import java .time .Duration ;
20
21
22
+ import org .junit .Before ;
21
23
import org .junit .Test ;
22
24
23
25
import org .springframework .http .HttpCookie ;
24
26
import org .springframework .http .ResponseCookie ;
27
+ import org .springframework .http .server .reactive .SslInfo ;
25
28
import org .springframework .mock .http .server .reactive .MockServerHttpRequest ;
26
29
import org .springframework .mock .web .server .MockServerWebExchange ;
27
30
import org .springframework .util .StringUtils ;
30
33
31
34
/**
32
35
* @author Eric Deandrea
36
+ * @author Thomas Vitale
33
37
* @since 5.1
34
38
*/
35
39
public class CookieServerCsrfTokenRepositoryTests {
36
40
37
- private MockServerWebExchange exchange = MockServerWebExchange . from ( MockServerHttpRequest . get ( "/someUri" )) ;
41
+ private CookieServerCsrfTokenRepository csrfTokenRepository ;
38
42
39
- private CookieServerCsrfTokenRepository csrfTokenRepository = new CookieServerCsrfTokenRepository () ;
43
+ private MockServerHttpRequest . BaseBuilder <?> request ;
40
44
41
45
private String expectedHeaderName = CookieServerCsrfTokenRepository .DEFAULT_CSRF_HEADER_NAME ;
42
46
@@ -56,6 +60,12 @@ public class CookieServerCsrfTokenRepositoryTests {
56
60
57
61
private String expectedCookieValue = "csrfToken" ;
58
62
63
+ @ Before
64
+ public void setUp () {
65
+ this .csrfTokenRepository = new CookieServerCsrfTokenRepository ();
66
+ this .request = MockServerHttpRequest .get ("/someUri" );
67
+ }
68
+
59
69
@ Test
60
70
public void generateTokenWhenDefaultThenDefaults () {
61
71
generateTokenAndAssertExpectedValues ();
@@ -82,8 +92,9 @@ public void generateTokenWhenCustomHeaderAndParameterThenCustomHeaderAndParamete
82
92
83
93
@ Test
84
94
public void saveTokenWhenNoSubscriptionThenNotWritten () {
85
- this .csrfTokenRepository .saveToken (this .exchange , createToken ());
86
- assertThat (this .exchange .getResponse ().getCookies ().getFirst (this .expectedCookieName )).isNull ();
95
+ MockServerWebExchange exchange = MockServerWebExchange .from (this .request );
96
+ this .csrfTokenRepository .saveToken (exchange , createToken ());
97
+ assertThat (exchange .getResponse ().getCookies ().getFirst (this .expectedCookieName )).isNull ();
87
98
}
88
99
89
100
@ Test
@@ -112,6 +123,56 @@ public void saveTokenWhenCustomPropertiesThenCustomProperties() {
112
123
saveAndAssertExpectedValues (createToken ());
113
124
}
114
125
126
+ @ Test
127
+ public void saveTokenWhenSslInfoPresentThenSecure () {
128
+ this .request .sslInfo (new MockSslInfo ());
129
+ MockServerWebExchange exchange = MockServerWebExchange .from (this .request );
130
+ this .csrfTokenRepository .saveToken (exchange , createToken ()).block ();
131
+ ResponseCookie cookie = exchange .getResponse ().getCookies ().getFirst (this .expectedCookieName );
132
+ assertThat (cookie ).isNotNull ();
133
+ assertThat (cookie .isSecure ()).isTrue ();
134
+ }
135
+
136
+ @ Test
137
+ public void saveTokenWhenSslInfoNullThenNotSecure () {
138
+ MockServerWebExchange exchange = MockServerWebExchange .from (this .request );
139
+ this .csrfTokenRepository .saveToken (exchange , createToken ()).block ();
140
+ ResponseCookie cookie = exchange .getResponse ().getCookies ().getFirst (this .expectedCookieName );
141
+ assertThat (cookie ).isNotNull ();
142
+ assertThat (cookie .isSecure ()).isFalse ();
143
+ }
144
+
145
+ @ Test
146
+ public void saveTokenWhenSecureFlagTrueThenSecure () {
147
+ MockServerWebExchange exchange = MockServerWebExchange .from (this .request );
148
+ this .csrfTokenRepository .setSecure (true );
149
+ this .csrfTokenRepository .saveToken (exchange , createToken ()).block ();
150
+ ResponseCookie cookie = exchange .getResponse ().getCookies ().getFirst (this .expectedCookieName );
151
+ assertThat (cookie ).isNotNull ();
152
+ assertThat (cookie .isSecure ()).isTrue ();
153
+ }
154
+
155
+ @ Test
156
+ public void saveTokenWhenSecureFlagFalseThenNotSecure () {
157
+ MockServerWebExchange exchange = MockServerWebExchange .from (this .request );
158
+ this .csrfTokenRepository .setSecure (false );
159
+ this .csrfTokenRepository .saveToken (exchange , createToken ()).block ();
160
+ ResponseCookie cookie = exchange .getResponse ().getCookies ().getFirst (this .expectedCookieName );
161
+ assertThat (cookie ).isNotNull ();
162
+ assertThat (cookie .isSecure ()).isFalse ();
163
+ }
164
+
165
+ @ Test
166
+ public void saveTokenWhenSecureFlagFalseAndSslInfoThenNotSecure () {
167
+ MockServerWebExchange exchange = MockServerWebExchange .from (this .request );
168
+ this .request .sslInfo (new MockSslInfo ());
169
+ this .csrfTokenRepository .setSecure (false );
170
+ this .csrfTokenRepository .saveToken (exchange , createToken ()).block ();
171
+ ResponseCookie cookie = exchange .getResponse ().getCookies ().getFirst (this .expectedCookieName );
172
+ assertThat (cookie ).isNotNull ();
173
+ assertThat (cookie .isSecure ()).isFalse ();
174
+ }
175
+
115
176
@ Test
116
177
public void loadTokenWhenCookieExistThenTokenFound () {
117
178
loadAndAssertExpectedValues ();
@@ -127,7 +188,8 @@ public void loadTokenWhenCustomThenTokenFound() {
127
188
128
189
@ Test
129
190
public void loadTokenWhenNoCookiesThenNullToken () {
130
- CsrfToken csrfToken = this .csrfTokenRepository .loadToken (this .exchange ).block ();
191
+ MockServerWebExchange exchange = MockServerWebExchange .from (this .request );
192
+ CsrfToken csrfToken = this .csrfTokenRepository .loadToken (exchange ).block ();
131
193
assertThat (csrfToken ).isNull ();
132
194
}
133
195
@@ -180,8 +242,8 @@ private void setExpectedCookieValue(String expectedCookieValue) {
180
242
private void loadAndAssertExpectedValues () {
181
243
MockServerHttpRequest .BodyBuilder request = MockServerHttpRequest .post ("/someUri" )
182
244
.cookie (new HttpCookie (this .expectedCookieName , this .expectedCookieValue ));
183
- this . exchange = MockServerWebExchange .from (request );
184
- CsrfToken csrfToken = this .csrfTokenRepository .loadToken (this . exchange ).block ();
245
+ MockServerWebExchange exchange = MockServerWebExchange .from (request );
246
+ CsrfToken csrfToken = this .csrfTokenRepository .loadToken (exchange ).block ();
185
247
if (StringUtils .hasText (this .expectedCookieValue )) {
186
248
assertThat (csrfToken ).isNotNull ();
187
249
assertThat (csrfToken .getHeaderName ()).isEqualTo (this .expectedHeaderName );
@@ -198,8 +260,9 @@ private void saveAndAssertExpectedValues(CsrfToken token) {
198
260
this .expectedMaxAge = Duration .ofSeconds (0 );
199
261
this .expectedCookieValue = "" ;
200
262
}
201
- this .csrfTokenRepository .saveToken (this .exchange , token ).block ();
202
- ResponseCookie cookie = this .exchange .getResponse ().getCookies ().getFirst (this .expectedCookieName );
263
+ MockServerWebExchange exchange = MockServerWebExchange .from (this .request );
264
+ this .csrfTokenRepository .saveToken (exchange , token ).block ();
265
+ ResponseCookie cookie = exchange .getResponse ().getCookies ().getFirst (this .expectedCookieName );
203
266
assertThat (cookie ).isNotNull ();
204
267
assertThat (cookie .getMaxAge ()).isEqualTo (this .expectedMaxAge );
205
268
assertThat (cookie .getDomain ()).isEqualTo (this .expectedDomain );
@@ -211,7 +274,8 @@ private void saveAndAssertExpectedValues(CsrfToken token) {
211
274
}
212
275
213
276
private void generateTokenAndAssertExpectedValues () {
214
- CsrfToken csrfToken = this .csrfTokenRepository .generateToken (this .exchange ).block ();
277
+ MockServerWebExchange exchange = MockServerWebExchange .from (this .request );
278
+ CsrfToken csrfToken = this .csrfTokenRepository .generateToken (exchange ).block ();
215
279
assertThat (csrfToken ).isNotNull ();
216
280
assertThat (csrfToken .getHeaderName ()).isEqualTo (this .expectedHeaderName );
217
281
assertThat (csrfToken .getParameterName ()).isEqualTo (this .expectedParameterName );
@@ -226,4 +290,18 @@ private static CsrfToken createToken(String headerName, String parameterName, St
226
290
return new DefaultCsrfToken (headerName , parameterName , tokenValue );
227
291
}
228
292
293
+ static class MockSslInfo implements SslInfo {
294
+
295
+ @ Override
296
+ public String getSessionId () {
297
+ return "sessionId" ;
298
+ }
299
+
300
+ @ Override
301
+ public X509Certificate [] getPeerCertificates () {
302
+ return new X509Certificate [] {};
303
+ }
304
+
305
+ }
306
+
229
307
}
0 commit comments