chore(deps): consolidate Dependabot PRs #82–#98 + security fixes#99
Merged
Conversation
Applies all 17 open Dependabot bumps (Rust crates, frontend packages, GitHub Actions, Docker base image) on one branch instead of merging 17 conflicting lockfile diffs, plus fixes for advisories the bumps surfaced or left unaddressed: - react-router-dom's own react-router@7.18.1 stayed vulnerable to a high-severity CSRF bypass (GHSA-qwww-vcr4-c8h2) even after bumping the top-level react-router dependency to 8.3.0, because nothing imported from it. Migrated all 14 import sites from react-router-dom to react-router (v8 folds DOM bindings into the main package) and dropped the now-unused react-router-dom dep. - js-yaml 4->5 dropped its CJS default export; fixed the one call site (configStore.ts) to use the named `load` export. - Rust RUSTSEC-2026-0195/0194/0185/0190/0186/0204 (quick-xml, quinn-proto, anyhow, memmap2, crossbeam-epoch): bumped calamine 0.35->0.36 and quick-xml 0.40->0.41 (both required for the fix and collapse 3 duplicate quick-xml resolutions into 1), plus lockfile updates for the rest. - pnpm audit (postcss, undici, brace-expansion): transitive lockfile bumps within existing semver ranges. serde_with and cmov bumps also close open Dependabot security alerts (GHSA-7gcf-g7xr-8hxj, GHSA-3rjw-m598-pq24).
This was referenced Jul 26, 2026
Owner
Author
✅ Snyk checks have passed. No issues have been found so far.
💻 Catch issues earlier using the plugins for VS Code, JetBrains IDEs, Visual Studio, and Eclipse. |
This was referenced Jul 26, 2026
cargo clippy --workspace --all-targets fails on the bin crate's test variant: dead-code reachability there roots at the test harness, not the real main, so the route path that calls default_true() (via ConfirmRequest's #[serde(default = "default_true")] on skip_duplicates) isn't visible. ConfirmRequest already carries the same #[allow(dead_code)] one line above for the identical reason. Pre-existing on main independent of this PR's dependency bumps - reproduces under rustc 1.97.1 (what CI's dtolnay/rust-toolchain@stable resolves to today) against unmodified main; main's last green CI run predates that toolchain.
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.
Summary
Consolidates all 17 open Dependabot PRs into a single branch instead of merging
17 branches that each touch the same lockfile (guaranteed conflicts). Applies
every bump at latest-compatible-within-major, fixes the breakage two of the
bumps caused, and closes several security advisories the bumps alone didn't
fully address.
Superseded PRs
actions/setup-nodeserde_withrust(Docker base image)cmovDavidAnson/markdownlint-cli2-actionactions/cacherust_decimalconfigjs-yaml(frontend)react-router-dom(frontend)prometheus-clientreact-router(frontend)chronotailwindcss(frontend)tower-http@playwright/test(frontend)actions/checkoutWhere a newer patch/minor existed than what Dependabot proposed (within the
same major it opened the PR for), the newer one was applied — same rule the
last two consolidation rounds (#51–#60, #61–#68, #70–#80) used.
Pre-existing / upgrade-caused fixes
These aren't in any of the 17 PRs' diffs — they're fallout from applying the
bumps, or drift that accumulated since the branch was last green (2026-06-15):
react-router-domstill pulled a vulnerablereact-router@7.18.1internally (GHSA-qwww-vcr4-c8h2, high, RSC Mode CSRF bypass, fixed at
>=8.3.0) even after bumping the top-levelreact-routerdependency to8.3.0 — nothing in
src/imported from it, so the vulnerable nested copyfrom
react-router-domwas the one actually in use.react-routerv8folds DOM bindings (
BrowserRouter,NavLink,useNavigate,Outlet,Routes,Route,Navigate,useParams,useSearchParams,useLocation, …) into the main package, andreact-router-domhas no v8release. Migrated all 14 import sites from
react-router-domtoreact-routerand droppedreact-router-domfrompackage.json— it'snow fully unused.
pnpm why react-routerconfirms a single resolved copyat 8.3.0 post-fix.
js-yaml5.x dropped its CJS default export (ESM-only build, namedexports only). The one call site (
frontend/src/stores/configStore.ts)used
import yaml from 'js-yaml'; yaml.load(...), which silently resolvedto
undefinedunder Vite/Vitest's real ESM resolution — the two YAMLconfig tests failed with
TypeError: Cannot read properties of undefined (reading 'load'). Fixed toimport { load } from 'js-yaml'.@types/js-yaml— js-yaml 5.x ships its own bundled types(
dist/js-yaml.d.ts), and no v5-compatible@types/js-yamlreleaseexists (still pinned at 4.0.9).
main's last green CI run on 2026-06-15), caught by.github/scripts/cargo-audit.sh:quick-xml, high, DoS viaunbounded namespace allocation / quadratic attribute checking) — fixed
at
>=0.41.0. Our ownquick-xml = "0.40"constraint bumped to"0.41"; the two remaining vulnerable copies were transitive(
feed-rs→quick-xml 0.37.5,calamine→quick-xml 0.39.4).Bumped
feed-rs2.3.1 → 2.4.0 andcalamine0.35 → 0.36 (both requirequick-xml ^0.41), which collapsed all three resolutions into onequick-xml 0.41.0.quinn-proto, high, remote memory exhaustion) →0.11.14 → 0.11.16.
anyhow, unsounddowncast_mut) → 1.0.102 →1.0.104.
memmap2, unsound pointer offset) → 0.9.10 →0.9.11.
crossbeam-epoch, invalid pointer deref inDebugimpl) → 0.9.18 → 0.9.20.
cargo update -p <crate> --precise <version>within the ranges the workspace's direct dependenciesalready allow.
pnpm auditfindings not covered by any of the 17 PRs (transitivedev dependencies, resolved via
pnpm updatewithin existing semverranges — no manifest changes needed):
postcss8.5.15 → 8.5.23 (path traversal viasourceMappingURLauto-loading, high, fixed
>=8.5.18) — pulled in byvite.undici7.25.0 → 7.29.0 (TLS cert bypass + others, high, fixed>=7.28.0) — pulled in byjsdom/vitest.brace-expansion5.0.6 → 5.0.8 (two DoS advisories, high, fixed>=5.0.8) — pulled in byeslint→minimatch.cargo clippy --workspace --all-targets -- -D warningsfailed on GitHub'srunner despite passing locally, first time this PR's CI ran. Root cause:
dtolnay/rust-toolchain@stableresolved to rustc 1.97.1 (current "stable"as of today), newer than the local toolchain used for the first round of
verification (1.96.0).
crates/finima-api/src/handlers/uploads.rs:51,fn default_true()— used via#[serde(default = "default_true")]onConfirmRequest.skip_duplicates, and genuinely called at runtime — gotflagged
dead_codebecause--all-targetsalso builds a test variantof the
finima-apibin crate, where dead-code reachability roots at thetest harness rather than the real
main, so the route path that reachesdefault_trueisn't visible to that pass. Fixed with#[allow(dead_code)]on the function, matching the identical annotation already on
ConfirmRequestone line above it (same false positive, same existingfix pattern). Confirmed this reproduces on unmodified
maintoo under1.97.1 — pre-existing toolchain drift, unrelated to any bump in this PR;
main's last green CI run (2026-06-15) predates that rustc release.Not touched:
docs/guides/maintainer-guide.mdsays "Rust stable (1.96+)" —still accurate after the Docker base image bump to 1.97. The Rust version in
docs/plan/origin/07-DEPLOYMENT.mdis a dated (2026-04-10) historicalplanning snapshot, not living documentation, so it was left as-is.
Security audit
cargo audit(.github/scripts/cargo-audit.sh,--deny warnings+audit-ignoreexceptions): clean. 7 pre-existing documented exceptions inaudit-ignore(RUSTSEC-2023-0071, -2026-0097, -2025-0141, -2026-0105,-2025-0057, -2025-0119, -2024-0436) untouched — none of them relate to any
dependency this PR bumps. All 6 newly-disclosed advisories found this run
are fixed (see above); none deferred.
pnpm audit: clean (was 9 findings acrossreact-router,postcss,undici,brace-expansion— 3 high, 4 moderate/low — before this PR; allfixed, see above).
GitHub Dependabot alerts (
gh api repos/pacphi/finima/dependabot/alerts,open, pre-PR):
serde_with(#24, medium, GHSA-7gcf-g7xr-8hxj) andcmov(#23, medium, GHSA-3rjw-m598-pq24) are closed by this PR's
serde_with/cmovbumps (superseding #97/#95). The remaining open alerts (
brace-expansion#25,undici#16–22) are the same findingspnpm auditsurfaced above and arefixed by this PR; they should auto-close once merged.
Verification
All commands run locally against this branch's HEAD, mirroring
.github/workflows/ci.ymlandMakefileexactly. Rerun under rustc 1.97.1(matching CI's
dtolnay/rust-toolchain@stable) after thedefault_truefix:cargo fmt --all -- --check— passcargo clippy --workspace --all-targets -- -D warnings— pass, 0 warningsTEST_DATABASE_URL=postgres://finima:test@localhost:5433/finima_test APP_ENV=test cargo test --workspace(Postgres 16 viadocker-compose.test.yml) — 28/28 test binaries pass, 0 failuresValidate Markdown,Validate YAML,Backend Lint,Backend Security Audit,Frontend Lint,Frontend Tests,Backend Testsall green (LLM Integration Tests/E2E Testsskipped —same as on
main, gated behind repo vars)bash .github/scripts/cargo-audit.sh— pass, 0 vulnerabilitiespnpm install --frozen-lockfile(frontend) — pass, lockfile reproduciblepnpm exec tsc --noEmit— passpnpm run lint(eslint) — passpnpm exec prettier --check 'src/**/*.{ts,tsx,css}'— passpnpm run test -- --run(vitest) — 9/9 tests passpnpm run build(tsc -b && vite build) — passpnpm audit— 0 vulnerabilitiespnpm exec playwright test --list— config loads under 1.62.0, 72 tests enumerated across 5 spec files (full E2E run needs a live backend/Postgres/MinIO stack and is gated behindE2E_ENABLEDin CI same as onmain; not run here)🤖 Generated with Claude Code