Skip to content

Commit 0aed10d

Browse files
committed
chore: add feature flag to disable Content-Security-Policy report mode.
Address to #226
1 parent bd504b1 commit 0aed10d

File tree

4 files changed

+36
-4
lines changed

4 files changed

+36
-4
lines changed

pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,13 @@
466466
<scope>test</scope>
467467
</dependency>
468468

469+
<dependency>
470+
<groupId>org.togglz</groupId>
471+
<artifactId>togglz-junit</artifactId>
472+
<version>${togglz.version}</version>
473+
<scope>test</scope>
474+
</dependency>
475+
469476
<dependency>
470477
<groupId>org.togglz</groupId>
471478
<artifactId>togglz-testing</artifactId>

src/main/java/ru/mystamps/web/support/spring/security/ContentSecurityPolicyHeaderWriter.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import ru.mystamps.web.feature.collection.CollectionUrl;
2323
import ru.mystamps.web.feature.series.SeriesUrl;
2424
import ru.mystamps.web.feature.site.SiteUrl;
25+
import ru.mystamps.web.support.togglz.Features;
2526

2627
import javax.servlet.http.HttpServletRequest;
2728
import javax.servlet.http.HttpServletResponse;
@@ -34,6 +35,9 @@
3435
@RequiredArgsConstructor
3536
class ContentSecurityPolicyHeaderWriter implements HeaderWriter {
3637

38+
private static final String CSP_HEADER = "Content-Security-Policy";
39+
private static final String CSP_REPORT_ONLY_HEADER = "Content-Security-Policy-Report-Only";
40+
3741
private static final String COLLECTION_INFO_PAGE_PATTERN =
3842
CollectionUrl.INFO_COLLECTION_PAGE.replace("{slug}", "");
3943

@@ -165,7 +169,8 @@ class ContentSecurityPolicyHeaderWriter implements HeaderWriter {
165169
@Override
166170
public void writeHeaders(HttpServletRequest request, HttpServletResponse response) {
167171
String uri = request.getRequestURI();
168-
response.setHeader("Content-Security-Policy-Report-Only", constructDirectives(uri));
172+
String header = Features.CSP_REPORT_ONLY.isActive() ? CSP_REPORT_ONLY_HEADER : CSP_HEADER;
173+
response.setHeader(header, constructDirectives(uri));
169174
}
170175

171176
@SuppressWarnings({ "PMD.NPathComplexity", "PMD.ModifiedCyclomaticComplexity" })

src/main/java/ru/mystamps/web/support/togglz/Features.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,11 @@ public enum Features implements Feature {
3434
USE_COUNTRY_MICROSERVICE,
3535

3636
@Label("/site/index: feature to check that Togglz works")
37-
ALWAYS_DISABLED;
37+
ALWAYS_DISABLED,
38+
39+
@Label("Use Content-Security-Policy-Report-Only header instead of Content-Security-Policy")
40+
@EnabledByDefault
41+
CSP_REPORT_ONLY;
3842

3943
public boolean isActive() {
4044
return FeatureContext.getFeatureManager().isActive(this);

src/test/java/ru/mystamps/web/support/spring/security/ContentSecurityPolicyHeaderWriterTest.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,13 @@
1818
package ru.mystamps.web.support.spring.security;
1919

2020
import org.assertj.core.api.WithAssertions;
21+
import org.junit.Rule;
2122
import org.junit.Test;
2223
import org.springframework.mock.web.MockHttpServletRequest;
2324
import org.springframework.mock.web.MockHttpServletResponse;
25+
import org.togglz.junit.TogglzRule;
2426
import ru.mystamps.web.feature.site.SiteUrl;
27+
import ru.mystamps.web.support.togglz.Features;
2528
import ru.mystamps.web.tests.Random;
2629

2730
import javax.servlet.http.HttpServletRequest;
@@ -36,22 +39,35 @@ public class ContentSecurityPolicyHeaderWriterTest implements WithAssertions {
3639
private static final int NUMBER_OF_DIRECTIVES_ON_INFO_SERIES_PAGE = 7;
3740
private static final int NUMBER_OF_DIRECTIVES_ON_H2_CONSOLE_PAGE = 7;
3841

42+
@Rule
43+
public TogglzRule togglz = TogglzRule.allEnabled(Features.class);
44+
3945
//
4046
// Tests for writeHeaders()
4147
//
4248

4349
@Test
4450
public void writeContentSecurityPolicyHeader() {
51+
// given
4552
ContentSecurityPolicyHeaderWriter writer =
4653
new ContentSecurityPolicyHeaderWriter(bool(), bool(), bool(), Random.host());
47-
4854
HttpServletRequest request = new MockHttpServletRequest();
4955
HttpServletResponse response = new MockHttpServletResponse();
56+
57+
// when
5058
writer.writeHeaders(request, response);
51-
59+
// then
5260
String header = response.getHeader("Content-Security-Policy-Report-Only");
5361
assertThat(header).isNotNull();
5462
assertThat(header.split(";")).hasSize(NUMBER_OF_DIRECTIVES_ON_STANDARD_PAGES);
63+
64+
// when
65+
togglz.disable(Features.CSP_REPORT_ONLY);
66+
writer.writeHeaders(request, response);
67+
// then
68+
header = response.getHeader("Content-Security-Policy");
69+
assertThat(header).isNotNull();
70+
assertThat(header.split(";")).hasSize(NUMBER_OF_DIRECTIVES_ON_STANDARD_PAGES);
5571
}
5672

5773
//

0 commit comments

Comments
 (0)