This is an automated email from the ASF dual-hosted git repository.

pedro pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/wicket.git


The following commit(s) were added to refs/heads/master by this push:
     new 6f1d6a2ce7 WICKET-7107 configure ContentSecurityPolicySettings to 
protect buffered pages
6f1d6a2ce7 is described below

commit 6f1d6a2ce7046f446c52e977ac4c9edb5d201471
Author: Pedro Santos <[email protected]>
AuthorDate: Wed Nov 27 16:06:34 2024 -0300

    WICKET-7107 configure ContentSecurityPolicySettings to protect buffered 
pages
---
 .../csp/CSPSettingRequestCycleListenerTest.java    | 75 +++++++++++++++-------
 .../wicket/csp/ContentSecurityPolicySettings.java  |  9 ++-
 2 files changed, 60 insertions(+), 24 deletions(-)

diff --git 
a/wicket-core-tests/src/test/java/org/apache/wicket/csp/CSPSettingRequestCycleListenerTest.java
 
b/wicket-core-tests/src/test/java/org/apache/wicket/csp/CSPSettingRequestCycleListenerTest.java
index 1fdd8cb92c..28c5efd738 100644
--- 
a/wicket-core-tests/src/test/java/org/apache/wicket/csp/CSPSettingRequestCycleListenerTest.java
+++ 
b/wicket-core-tests/src/test/java/org/apache/wicket/csp/CSPSettingRequestCycleListenerTest.java
@@ -16,19 +16,21 @@
  */
 package org.apache.wicket.csp;
 
-import static org.apache.wicket.csp.CSPDirective.CHILD_SRC;
-import static org.apache.wicket.csp.CSPDirective.DEFAULT_SRC;
-import static org.apache.wicket.csp.CSPDirective.FRAME_SRC;
-import static org.apache.wicket.csp.CSPDirective.IMG_SRC;
-import static org.apache.wicket.csp.CSPDirective.REPORT_URI;
-import static org.apache.wicket.csp.CSPDirective.SANDBOX;
-import static org.apache.wicket.csp.CSPDirectiveSandboxValue.ALLOW_FORMS;
-import static org.apache.wicket.csp.CSPDirectiveSandboxValue.EMPTY;
-import static org.apache.wicket.csp.CSPDirectiveSrcValue.NONE;
-import static org.apache.wicket.csp.CSPDirectiveSrcValue.SELF;
-import static org.apache.wicket.csp.CSPDirectiveSrcValue.WILDCARD;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertThrows;
+import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.RestartResponseException;
+import org.apache.wicket.markup.IMarkupResourceStreamProvider;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.mock.MockApplication;
+import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.request.cycle.RequestCycle;
+import org.apache.wicket.util.resource.IResourceStream;
+import org.apache.wicket.util.resource.StringResourceStream;
+import org.apache.wicket.util.tester.DummyHomePage;
+import org.apache.wicket.util.tester.WicketTestCase;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
 
 import java.net.URI;
 import java.net.URISyntaxException;
@@ -39,15 +41,14 @@ import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import org.apache.wicket.mock.MockApplication;
-import org.apache.wicket.protocol.http.WebApplication;
-import org.apache.wicket.request.cycle.RequestCycle;
-import org.apache.wicket.util.tester.DummyHomePage;
-import org.apache.wicket.util.tester.WicketTestCase;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.ValueSource;
+import static org.apache.wicket.csp.CSPDirective.*;
+import static org.apache.wicket.csp.CSPDirectiveSandboxValue.ALLOW_FORMS;
+import static org.apache.wicket.csp.CSPDirectiveSandboxValue.EMPTY;
+import static org.apache.wicket.csp.CSPDirectiveSrcValue.*;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 class CSPSettingRequestCycleListenerTest extends WicketTestCase
 {
@@ -381,6 +382,36 @@ class CSPSettingRequestCycleListenerTest extends 
WicketTestCase
                assertThrows(IllegalArgumentException.class, () -> 
settings.add(IMG_SRC, source + ":"));
        }
 
+       @Test
+       void addCspDirectiveInBufferedPageResponses()
+       {
+               tester.setFollowRedirects(true);
+               
tester.getApplication().getCspSettings().blocking().add(STYLE_SRC, SELF);
+
+               tester.startPage(RedirectPage.class);
+
+               
assertThat(tester.getLastResponse().getHeader("Content-Security-Policy"),
+                       containsString(STYLE_SRC.getValue()));
+       }
+
+       public static class Page extends WebPage implements 
IMarkupResourceStreamProvider
+       {
+               @Override
+               public IResourceStream getMarkupResourceStream(MarkupContainer 
container,
+                       Class<?> containerClass)
+               {
+                       return new 
StringResourceStream("<html><head></head><body></body></html>");
+               }
+       }
+
+       public static class RedirectPage extends Page
+       {
+               public RedirectPage()
+               {
+                       throw new RestartResponseException(new Page());
+               }
+       }
+
 
        private String renderDirective(List<CSPRenderable> values,
                ContentSecurityPolicySettings settings, RequestCycle cycle)
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/csp/ContentSecurityPolicySettings.java
 
b/wicket-core/src/main/java/org/apache/wicket/csp/ContentSecurityPolicySettings.java
index 65b510b7f4..4c3ba85b45 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/csp/ContentSecurityPolicySettings.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/csp/ContentSecurityPolicySettings.java
@@ -25,6 +25,7 @@ import java.util.function.Supplier;
 import org.apache.wicket.Application;
 import org.apache.wicket.MetaDataKey;
 import org.apache.wicket.Page;
+import org.apache.wicket.core.request.handler.BufferedResponseRequestHandler;
 import org.apache.wicket.core.request.handler.IPageRequestHandler;
 import org.apache.wicket.core.request.handler.RenderPageRequestHandler;
 import org.apache.wicket.protocol.http.WebApplication;
@@ -69,14 +70,18 @@ public class ContentSecurityPolicySettings
        private final Map<CSPHeaderMode, CSPHeaderConfiguration> configs = new 
EnumMap<>(
                CSPHeaderMode.class);
 
-       private Predicate<IRequestHandler> protectedFilter = 
RenderPageRequestHandler.class::isInstance;
+       private Predicate<IRequestHandler> protectedFilter;
 
        private Supplier<String> nonceCreator;
        
        public ContentSecurityPolicySettings(Application application)
        {
                Args.notNull(application, "application");
-               
+
+               Predicate<IRequestHandler> isPage = 
RenderPageRequestHandler.class::isInstance;
+               Predicate<IRequestHandler> isBufferedPage = 
BufferedResponseRequestHandler.class::isInstance;
+               protectedFilter = isPage.or(isBufferedPage);
+
                nonceCreator = () ->
                                
application.getSecuritySettings().getRandomSupplier().getRandomBase64(NONCE_LENGTH);
        }

Reply via email to