Skip to content

Commit da96177

Browse files
committed
MYFACES-4748 / MYFACES-4747: CSP script rendering
1 parent 3d1ff92 commit da96177

13 files changed

Lines changed: 516 additions & 114 deletions

File tree

impl/src/main/java/org/apache/myfaces/context/servlet/PartialViewContextImpl.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
import org.apache.myfaces.context.PartialResponseWriterImpl;
6060
import org.apache.myfaces.context.RequestViewContext;
6161
import org.apache.myfaces.renderkit.html.HtmlResponseStateManager;
62+
import org.apache.myfaces.renderkit.html.util.CommonHtmlEventsUtil;
6263
import org.apache.myfaces.renderkit.html.util.ResourceUtils;
6364
import org.apache.myfaces.util.lang.StringUtils;
6465
import org.apache.myfaces.component.visit.MyFacesVisitHints;
@@ -572,6 +573,8 @@ else if (viewRoot.isTransient())
572573
writer.writeText(cw.getId(), null);
573574
writer.endUpdate();
574575
}
576+
577+
CommonHtmlEventsUtil.flushDeferredCspBehaviorScripts(context, writer);
575578
}
576579
catch (IOException ex)
577580
{

impl/src/main/java/org/apache/myfaces/renderkit/html/HtmlResponseWriterImpl.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import jakarta.faces.render.Renderer;
3636

3737
import org.apache.myfaces.config.webparameters.MyfacesConfig;
38+
import org.apache.myfaces.renderkit.html.util.CommonHtmlEventsUtil;
3839
import org.apache.myfaces.core.api.shared.ComponentUtils;
3940
import org.apache.myfaces.renderkit.ContentTypeUtils;
4041
import org.apache.myfaces.renderkit.html.util.UnicodeEncoder;
@@ -306,6 +307,7 @@ public void startDocument()
306307
public void endDocument() throws IOException
307308
{
308309
FacesContext facesContext = getFacesContext();
310+
CommonHtmlEventsUtil.flushDeferredCspBehaviorScripts(facesContext, this);
309311
MyfacesConfig myfacesConfig = MyfacesConfig.getCurrentInstance(facesContext);
310312
if (myfacesConfig.isEarlyFlushEnabled())
311313
{

impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlBodyRendererBase.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,8 @@ public void encodeEnd(FacesContext facesContext, UIComponent component) throws I
158158
child.encodeAll(facesContext);
159159
}
160160
}
161+
162+
CommonHtmlEventsUtil.flushDeferredCspBehaviorScripts(facesContext, writer);
161163

162164
// render all unhandled FacesMessages when ProjectStage is Development
163165
if (facesContext.isProjectStage(ProjectStage.Development))

impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlButtonRendererBase.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444

4545
import org.apache.myfaces.renderkit.ClientBehaviorEvents;
4646
import org.apache.myfaces.renderkit.RendererUtils;
47+
import org.apache.myfaces.renderkit.html.util.CommonHtmlEventsUtil;
4748
import org.apache.myfaces.renderkit.html.util.JavascriptUtils;
4849
import org.apache.myfaces.renderkit.html.util.ResourceUtils;
4950
import org.apache.myfaces.renderkit.html.util.HTML;
@@ -187,7 +188,11 @@ public void encodeBegin(FacesContext facesContext, UIComponent uiComponent) thro
187188
form, validParams);
188189
if (onClick.length() != 0)
189190
{
190-
writer.writeAttribute(HTML.ONCLICK_ATTR, onClick, null);
191+
if (!CommonHtmlEventsUtil.deferClientBehaviorScriptIfCspNonceActive(
192+
facesContext, clientId, HTML.ONCLICK_ATTR, onClick))
193+
{
194+
writer.writeAttribute(HTML.ONCLICK_ATTR, onClick, null);
195+
}
191196
}
192197
}
193198
else
@@ -201,7 +206,11 @@ public void encodeBegin(FacesContext facesContext, UIComponent uiComponent) thro
201206
commandOnclick , null);
202207
if (onClick.length() != 0)
203208
{
204-
writer.writeAttribute(HTML.ONCLICK_ATTR, onClick, null);
209+
if (!CommonHtmlEventsUtil.deferClientBehaviorScriptIfCspNonceActive(
210+
facesContext, clientId, HTML.ONCLICK_ATTR, onClick))
211+
{
212+
writer.writeAttribute(HTML.ONCLICK_ATTR, onClick, null);
213+
}
205214
}
206215
}
207216

impl/src/main/java/org/apache/myfaces/renderkit/html/base/HtmlLinkRendererBase.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,14 @@ protected void renderBehaviorizedJavaScriptAnchorStart(FacesContext facesContext
549549

550550
writer.startElement(HTML.ANCHOR_ELEM, component);
551551
writer.writeURIAttribute(HTML.HREF_ATTR, "#", null);
552-
writer.writeAttribute(HTML.ONCLICK_ATTR, onclick, null);
552+
if (onclick != null && !onclick.isEmpty())
553+
{
554+
if (!CommonHtmlEventsUtil.deferClientBehaviorScriptIfCspNonceActive(
555+
facesContext, clientId, HTML.ONCLICK_ATTR, onclick))
556+
{
557+
writer.writeAttribute(HTML.ONCLICK_ATTR, onclick, null);
558+
}
559+
}
553560
}
554561

555562
private boolean hasSubmittingBehavior(Map<String, List<ClientBehavior>> clientBehaviors, String eventName)

0 commit comments

Comments
 (0)