This is an automated email from the ASF dual-hosted git repository. svenmeier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/wicket.git
commit a1a53a9d8da0e06520ff68d58b3f4dd64d329a9f Author: Sven Meier <svenme...@apache.org> AuthorDate: Fri Sep 27 12:40:55 2019 +0200 WICKET-6682 CSP must use 'strict-dynamic' to allow dynamically added JS resources --- .../markup/head/filter/CspNonceHeaderResponse.java | 4 ++-- .../markup/head/filter/CspNoncePageExpected.html | 2 +- .../apache/wicket/examples/csp/NonceDemoPage.html | 2 ++ .../apache/wicket/examples/csp/NonceDemoPage.java | 28 ++++++++++++++++++++++ .../apache/wicket/examples/csp/delayedVisible.css | 7 ++++++ .../apache/wicket/examples/csp/delayedVisible.js | 3 +++ 6 files changed, 43 insertions(+), 3 deletions(-) diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/head/filter/CspNonceHeaderResponse.java b/wicket-core/src/main/java/org/apache/wicket/markup/head/filter/CspNonceHeaderResponse.java index 7a911ca..6376518 100644 --- a/wicket-core/src/main/java/org/apache/wicket/markup/head/filter/CspNonceHeaderResponse.java +++ b/wicket-core/src/main/java/org/apache/wicket/markup/head/filter/CspNonceHeaderResponse.java @@ -80,7 +80,7 @@ public class CspNonceHeaderResponse extends DecoratingHeaderResponse * Get the <em>Content-Security-Policy</em> (CSP). * <p> * There is a variety of CSP configurations, this default implementation uses the nonce for scripts and styles - * and allows <code>unsafe-eval</code>s (needed for Wicket Ajax). + * and allows <code>unsafe-eval</code> and <code>strict-dynamic</code>s (needed for Wicket Ajax). * * @param nonce * the nonce @@ -88,6 +88,6 @@ public class CspNonceHeaderResponse extends DecoratingHeaderResponse */ protected String getContentSecurityPolicy(String nonce) { - return String.format("script-src 'unsafe-eval' 'nonce-%1$s'; style-src 'nonce-%1$s';", nonce); + return String.format("script-src 'unsafe-eval' 'strict-dynamic' 'nonce-%1$s'; style-src 'nonce-%1$s';", nonce); } } diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/head/filter/CspNoncePageExpected.html b/wicket-core/src/test/java/org/apache/wicket/markup/head/filter/CspNoncePageExpected.html index baa33ba..63c9d08 100644 --- a/wicket-core/src/test/java/org/apache/wicket/markup/head/filter/CspNoncePageExpected.html +++ b/wicket-core/src/test/java/org/apache/wicket/markup/head/filter/CspNoncePageExpected.html @@ -1,5 +1,5 @@ <html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd" > - <head><meta http-equiv="Content-Security-Policy" content="script-src 'unsafe-eval' 'nonce-NONCE'; style-src 'nonce-NONCE';" /> + <head><meta http-equiv="Content-Security-Policy" content="script-src 'unsafe-eval' 'strict-dynamic' 'nonce-NONCE'; style-src 'nonce-NONCE';" /> <script type="text/javascript" src="../resource/org.apache.wicket.resource.JQueryResourceReference/jquery/jquery-3.4.1.js" nonce="NONCE"></script> <script type="text/javascript" src="../resource/org.apache.wicket.ajax.AbstractDefaultAjaxBehavior/res/js/wicket-ajax-jquery.js" nonce="NONCE"></script> <script type="text/javascript" id="wicket-ajax-debug-enable" nonce="NONCE"> diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/csp/NonceDemoPage.html b/wicket-examples/src/main/java/org/apache/wicket/examples/csp/NonceDemoPage.html index 9115256..6aab2b8 100644 --- a/wicket-examples/src/main/java/org/apache/wicket/examples/csp/NonceDemoPage.html +++ b/wicket-examples/src/main/java/org/apache/wicket/examples/csp/NonceDemoPage.html @@ -14,6 +14,8 @@ <div class="click-me-text">Click a button above to replace this text</div> <div><wicket:message key="clickMeCount" /> <span wicket:id="clickMeCount"></span></div> <p></p> + <div wicket:id="delayedVisible" class="delayed-visible">This delayed shown text should be green and bold</div> + <p></p> <p><wicket:message key="ieDisclaimer"/></p> <!-- Injections below will work in IE11, because IE 11 doesn't support nonce --> diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/csp/NonceDemoPage.java b/wicket-examples/src/main/java/org/apache/wicket/examples/csp/NonceDemoPage.java index d092f8d..dce8079 100644 --- a/wicket-examples/src/main/java/org/apache/wicket/examples/csp/NonceDemoPage.java +++ b/wicket-examples/src/main/java/org/apache/wicket/examples/csp/NonceDemoPage.java @@ -22,15 +22,23 @@ import org.apache.wicket.examples.WicketExamplePage; import org.apache.wicket.markup.head.CssHeaderItem; import org.apache.wicket.markup.head.IHeaderResponse; import org.apache.wicket.markup.head.JavaScriptHeaderItem; +import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; +import org.apache.wicket.request.resource.CssResourceReference; +import org.apache.wicket.request.resource.JavaScriptResourceReference; +import org.apache.wicket.request.resource.ResourceReference; /** * Page which disallows execution of inline scripts without nonce */ public class NonceDemoPage extends WicketExamplePage { + + private static final ResourceReference JS_DELAYED = new JavaScriptResourceReference(NonceDemoPage.class, "delayedVisible.js"); + private static final ResourceReference CSS_DELAYED = new CssResourceReference(NonceDemoPage.class, "delayedVisible.css"); + private final IModel<Integer> clickMeCountModel = Model.of(0); public NonceDemoPage() @@ -38,9 +46,25 @@ public class NonceDemoPage extends WicketExamplePage super(); add(new Label("testNonceScript", getString("testNonceScript"))); add(new Label("testNoNonceScript", getString("testNoNonceScript"))); + final Label clickMeCount = new Label("clickMeCount", clickMeCountModel); clickMeCount.setOutputMarkupId(true); add(clickMeCount); + + final WebMarkupContainer delayedVisible = new WebMarkupContainer("delayedVisible") { + @Override + public void renderHead(IHeaderResponse response) + { + super.renderHead(response); + + response.render(JavaScriptHeaderItem.forReference(JS_DELAYED)); + response.render(CssHeaderItem.forReference(CSS_DELAYED)); + } + }; + delayedVisible.setOutputMarkupPlaceholderTag(true); + delayedVisible.setVisible(false); + add(delayedVisible); + add(new AjaxLink<String>("clickMe") { @Override @@ -50,8 +74,12 @@ public class NonceDemoPage extends WicketExamplePage // target.add (works even without unsafe-eval) target.add(clickMeCount); + // append javascript (won't work without unsafe-eval) target.appendJavaScript("document.querySelector(\".click-me-text\").innerHTML = \"replaced\";"); + + delayedVisible.setVisible(true); + target.add(delayedVisible); } }.setOutputMarkupId(true)); } diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/csp/delayedVisible.css b/wicket-examples/src/main/java/org/apache/wicket/examples/csp/delayedVisible.css new file mode 100644 index 0000000..d16b283c --- /dev/null +++ b/wicket-examples/src/main/java/org/apache/wicket/examples/csp/delayedVisible.css @@ -0,0 +1,7 @@ +.delayed-visible { + font-weight: bold; +} + +.delayed-ready .delayed-visible { + color: green; +} diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/csp/delayedVisible.js b/wicket-examples/src/main/java/org/apache/wicket/examples/csp/delayedVisible.js new file mode 100644 index 0000000..cc2f7eb --- /dev/null +++ b/wicket-examples/src/main/java/org/apache/wicket/examples/csp/delayedVisible.js @@ -0,0 +1,3 @@ +jQuery(document).ready(function() { + jQuery('body').addClass('delayed-ready'); +});