On Tue, Feb 11, 2025 at 10:15 PM Michael Pritt <
michael.pr...@westringtechnologies.com> wrote:

> Hi, we're currently using wicket 10.1.0, and trying to implement SRI
> hashes for all the javascript/css modules we use for PCI compliance.   It
> is easy to create the integrity and cross origin values needed when the we
> have the control over the creation of the JavaScriptHeaderItem or
> CssReferenceHeaderItem.  It becomes much more difficult when there are
> resources that are created and then stored in wicket framework classes
> (whether we create or the framework that creates these resource references)
> and then these resources are used LATER within the framework which does the
> actual creation of the header items.
>
> As an example try setting the integrity hash for the
> "wicket-ajax-jquery.js" file which is referenced from the
> wicket-core-10.1.0.jar.  This resource is created initially through the
> WicketAjaxJQueryResourceReference class and used in the
> JavaScriptLibrarySettings class.    The call getWicketAjaxReference()
> inside the JavaScriptLibrarySettings is used by the framework in various
> places, and those places create the actual JavaScriptReferenceHeaderItem
> (see OnDomReadyHeaderItem.getDependencies()  as an example).   If we can
> add both an integrity and cross-origin variables to the definition of a
> ResourceReference class, those values could then be used in the rendering
> of the JavaScriptReferenceHeaderItem.   This can be done by overriding the
> getIntegrity function, so if the header item's integrity value is not
> defined (i.e. null) then use the value defined from the ResourceReference
> (same would go for handling the cross-origin).
>
> The same changes for handling CSS header items, by changing the function
> AbstractCssReferenceHeaderItem. internalRenderCSSReference() to more
> correctly handle integrity and cross origin values  (note that the below
> code changes matches what is already being done in
> AbstractJavaScriptReferenceHeaderItem.internalRenderJavaScriptReference, it
> shouldn't reference the class variables directly but through their accessor
> methods)
>
> attributes.putAttribute(CssUtils.ATTR_CROSS_ORIGIN,
>                                                 crossOrigin == null ? null
> : crossOrigin.getRealName());
>
> attributes.putAttribute(CssUtils.ATTR_INTEGRITY, integrity);
> changes to
>
> attributes.putAttribute(CssUtils.ATTR_CROSS_ORIGIN,
>                                                 getCrossOrigin() == null ?
> null : getCrossOrigin().getRealName());
>
> attributes.putAttribute(CssUtils.ATTR_INTEGRITY, getIntegrity());
>
> The above would help in solving the calls by the framework internally that
> create the header items, without having to override main framework classes
> to support this need.
>
> In addition to this, another change would be to change the
> JavaScriptLibrarySettings.getWicketAjaxReference() to not return a
> ResourceReference but instead return a JavaScriptReferenceHeaderItem.  It
> looks like in all cases we saw, the framework was just taking the resource
> reference and creating the JavaScriptReferenceHeaderItem.  Again, that way
> it will give more control over the actual header reference at least for
> this particular example mentioned above.   Note that this wouldn't solve
> the other places that use other wicket javascript/css resources.
>
> Thoughts?  Does this sound reasonable and would be something to change in
> wicket?
>

It sounds reasonable to me!
Do you want to send a Pull Request ?

Reply via email to