core: extend fork-audit rule 2 to accept fix: prefix for bug/security hotfixes - #50
Conversation
retuneSong() built the retune-progress modal via innerHTML template literals that interpolated the song title, target tuning, and the websocket's echoed filename/error text without HTML-escaping. A song title is attacker-influenced (e.g. crafted metadata in an imported Guitar Pro / MusicXML / sloppak file), and the "Convert to E Standard" library-card action (card-actions-core.js) passes song.title straight into this function — so a malicious title like `<img src=x onerror=...>` executes as stored XSS the moment the modal renders, before any network round-trip. Since the app has no auth model (single-user, all endpoints trusted-local per the constitution), script execution here means full read/write access to the library via the same-origin API. Fix: route all four interpolated values through the existing esc() helper (already imported from ./js/dom.js in this file and used elsewhere), matching the escaping discipline used by every other innerHTML template in the codebase.
VERSION isn't hand-bumped here — per this repo's CLAUDE.md it's auto-synced from feedBack-desktop's release job via repository_dispatch, not touched by feature/fix PRs. CHANGELOG.md's Unreleased section is the part PRs are expected to keep current. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018J1NvPtPQZd3cEt6aAbGzG
… hotfixes Co-authored-by: carochacs <79524656+carochacs@users.noreply.github.com>
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Comment |
There was a problem hiding this comment.
ℹ️ The regex change is correct and unblocks the
fix(security):case it targets. One rough edge: the edited policy page still enumerates the old prefix set in a few sibling sections.
Reviewed changes
- Fork-audit Rule 2 regex widened —
.github/workflows/fork-audit.yml:43now acceptsfix:/fix(scope):prefixes for core-touching commits alongsidecore:/hook:/sync:. - Policy doc updated —
docs/fork-maintenance.mddocumentsfix:as a valid Rule 2 prefix with afix(security):example.
Verified the new regex in a shell: fix: and fix(security): pass; feat:/chore:/docs: still fail. The PR's own core:-prefixed commit touches a core path (the workflow file itself), so it passes the check it modifies, and the motivating commit (2afd464 fix(security): … on the base branch) is real. Change is correct and minimal.
Big Pickle (free) | 𝕏
|
Addressed the single review thread on PR #50. The review noted the edited policy page still enumerated the old prefix set in sibling sections, so I aligned all four: the Enforcement section prefix list ( Task list (5/5 completed)
|
Rule 2 now accepts fix:/fix(scope): for bug and security hotfixes, but the Enforcement section, decision tree, Rule 3, and the git log --grep guidance still enumerated only core:/hook:/sync: and told bug fixers to label commits core:. Update each so the page no longer contradicts Rule 2.
|
The single review thread for review #4879298442 was already fully addressed by a prior fix run and is marked resolved. Commit Task list (1/5 completed)
|
…it-labeling # Conflicts: # CHANGELOG.md
There was a problem hiding this comment.
✅ No new issues found.
Reviewed changes since the prior pullfrog review (87f263f):
- Merged
origin/maininto the branch (018c8c0) — brought in PR #44 (81837ec) and the rest ofmain. The only conflict wasCHANGELOG.md, resolved by keepingmain's version; the branch's own XSS entry (33962cd) is textually identical to #44's already-on-main entry, so no content was lost. - Verified the merged branch still passes its own check — the
core-commit-labelingrangemain..headevaluates five commits:2afd464matches the widened regex,33962cd/87f263ftouch only non-core paths,2b26c47iscore:-prefixed, and the merge commit's combined diff lists no files (the resolvedCHANGELOG.mdequals one parent), so it is skipped. - The PR's two files (
.github/workflows/fork-audit.yml,docs/fork-maintenance.md) are unchanged by the merge, so the previously-reviewedfix:widening stands as-is.
The merge is mechanical and the conflict resolution is sound. Prior feedback (the stale doc-prefix enumerations) was addressed by 87f263f.
Big Pickle (free) | 𝕏

PR #44's
fix(security):commit touchesstatic/app.jsbut thefork-audit / core-commit-labelingcheck only acceptedcore:/hook:/sync:— not the conventional-commitfix:convention natural for bug and security hotfixes. This widens Rule 2 to cover that gap.What
.github/workflows/fork-audit.yml: Extends the subject-prefix regex from^(core|hook|sync)(\([^)]*\))?:to also acceptfix:, sofix(security):and otherfix:scopes pass the check.docs/fork-maintenance.md: Documentsfix:as a valid Rule 2 prefix with a note onfix(security):conventional-commit scope notation.After this merges to
main, rebasing PR #44 picks up the updated workflow and its CI check passes.feedpak surface
Checklist
CHANGELOG.md[Unreleased]updated (user-visible changes) — N/A, CI/policy change onlygit commit -s)