Repository navigation
Check the UI's third-party libraries for advisories every week - #2745
Merged
Merged
Conversation
Loading them from CDNs breaks the UI on poor or no internet connections. FlexMeasures moved to CDNs in #21 as a small speed tweak, to be revisited if CDNs ever failed. BREAKING CHANGE: FLEXMEASURES_JS_VERSIONS no longer has a default and is ignored, so plugins must read the js_versions template variable or flexmeasures.ui.utils.vendor_versions.JS_VERSIONS instead. Refs #18 Signed-off-by: Stijn van Houwelingen <teadrinkingprogrammer@proton.me>
Signed-off-by: Stijn van Houwelingen <teadrinkingprogrammer@proton.me>
Signed-off-by: Stijn van Houwelingen <teadrinkingprogrammer@proton.me>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019bawYg67N5T5csiFdwWgZ1 Signed-off-by: F.N. Claessen <felix@seita.nl>
…ir licences The icons have no fixed release to fetch from, as Iconify renders them on request, so they stay committed under static/icons/. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019bawYg67N5T5csiFdwWgZ1 Signed-off-by: F.N. Claessen <felix@seita.nl>
…their files and hashes Instead of committing ~5 MB of third-party files, record each library's version, files and SHA-256 hashes in flexmeasures/ui/utils/vendor_assets.py. Running python -m flexmeasures.ui.utils.fetch_vendor_assets downloads them, with their licences, and checks each file against its hash. Fetched files are served by FlexMeasures, and files that were not fetched load from their CDN, with the recorded hash as the tag's integrity attribute. Fonts and images which flexmeasures.css referred to move into the vendor.html macros, since a static stylesheet cannot tell whether they were fetched. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019bawYg67N5T5csiFdwWgZ1 Signed-off-by: F.N. Claessen <felix@seita.nl>
… them Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019bawYg67N5T5csiFdwWgZ1 Signed-off-by: F.N. Claessen <felix@seita.nl>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019bawYg67N5T5csiFdwWgZ1 Signed-off-by: F.N. Claessen <felix@seita.nl>
Dependabot only reads uv.lock, so it does not know about the UI's third-party libraries. A scheduled workflow now looks up each library's npm package and version in the OSV database, and fails when one has an advisory, listing them in the job summary. It also runs on pull requests that change the libraries. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019bawYg67N5T5csiFdwWgZ1 Signed-off-by: F.N. Claessen <felix@seita.nl>
…exMeasures does not use Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019bawYg67N5T5csiFdwWgZ1 Signed-off-by: F.N. Claessen <felix@seita.nl>
… on one line Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019bawYg67N5T5csiFdwWgZ1 Signed-off-by: F.N. Claessen <felix@seita.nl>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019bawYg67N5T5csiFdwWgZ1 Signed-off-by: F.N. Claessen <felix@seita.nl>
6 of 8 tasks
Documentation build overview
11 files changed ·
|
…ource copy in the Docker build Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019bawYg67N5T5csiFdwWgZ1 Signed-off-by: F.N. Claessen <felix@seita.nl>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019bawYg67N5T5csiFdwWgZ1 Signed-off-by: F.N. Claessen <felix@seita.nl>
…rsions of the UI's libraries, optionally with the hashes of their files Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019bawYg67N5T5csiFdwWgZ1 Signed-off-by: F.N. Claessen <felix@seita.nl>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019bawYg67N5T5csiFdwWgZ1 Signed-off-by: F.N. Claessen <felix@seita.nl> # Conflicts: # flexmeasures/ui/utils/vendor_assets.py
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019bawYg67N5T5csiFdwWgZ1 Signed-off-by: F.N. Claessen <felix@seita.nl>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019bawYg67N5T5csiFdwWgZ1 Signed-off-by: F.N. Claessen <felix@seita.nl>
Flix6x
added a commit
that referenced
this pull request
Oct 19, 2026
…2746) The background fetch's lock test now also counts the fake library's notice. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019bawYg67N5T5csiFdwWgZ1 Signed-off-by: F.N. Claessen <felix@seita.nl>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Closes #2725. Stacked on #2711: its base branch,
feat/vendor-ui-assets, mirrors #2711's head, so this diff only shows the check.Dependabot only reads
uv.lock, so nothing tells us when one of the UI's third-party libraries has a security advisory. This PR adds a workflow that looks up each library from the manifest inflexmeasures/ui/utils/vendor_assets.pyin the OSV database:ci/check_ui_library_advisories.pyqueries OSV for each library's npm package and version, prints a table of advisories (also into the job summary), and exits with 1 if it finds any..github/workflows/ui-library-advisories.ymlruns it every Monday, on demand, and on pull requests that change the libraries or the check.VendorLibrarygets annpm_packagefield for libraries served from elsewhere, so DataTables is looked up asdatatables.net. The Poppins font isn't on npm, so it isn't checked.linesseries type, which we don't use (fast-chart.jsdrawslineandbarseries). So I didn't open an ECharts 6 upgrade, which would change the default theme and layout for no gain here.This check fails until the Vega and DataTables upgrades are merged. Those are #2743 and #2744, so it's best to merge them first.
A scheduled workflow that fails notifies the person who last changed its schedule. If we'd rather have it open an issue, that's a small change.
How to test
python ci/check_ui_library_advisories.py, with Flask installed.pytest flexmeasures/ui/tests/test_ui_library_advisories.pyRelated Items
#2725, #2718, #2711
🤖 Generated with Claude Code
https://claude.ai/code/session_019bawYg67N5T5csiFdwWgZ1