feedBack/plugins/career
byrongamatos 49da3022cf fix(career): path-traversal guard on prepare; a cap test that actually tests the cap
CodeRabbit again, and the first one is a real hole I put there.

1. PATH TRAVERSAL. sloppak.resolve_source_dir() does a bare `dlc_root / filename`
   with NO containment guard — so `../../x` walks straight out of the library, and
   my new endpoint handed it attacker-supplied filenames. Every filename now goes
   through _resolve_dlc_path first, the same check every other filename-bound
   handler applies. Pinned: `..`, backslash traversal, an absolute POSIX path and
   a Windows drive path are all refused, and nothing outside the library is
   unpacked.

2. THE CAP TEST WAS VACUOUS. It asserted `prepared == 0` against a fixture with no
   library — where the endpoint exits before extraction — so it passed whether or
   not MAX_GIG_SONGS existed. It now runs against a real library and asserts the
   endpoint CONSIDERED at most MAX_GIG_SONGS of the 82 it was handed. Verified to
   fail when the cap is removed.

   Same class of mistake as the notedetect gigBlock: a test that passes for the
   wrong reason. Worth saying out loud since it is twice in one day.

3. E702 — semicolon-joined statements in the new tests, split.

51 career tests; full suite green.
2026-07-15 00:31:07 +02:00
..
assets Career v3: Gold tier — verified improv upgrades an earned badge (#960) 2026-07-14 11:26:36 +02:00
tests Career v3: Gold tier — verified improv upgrades an earned badge (#960) 2026-07-14 11:26:36 +02:00
venue-packs feat(career): bundle the AXA club venue pack (career stage 2) (#963) 2026-07-14 16:54:08 +02:00
passports.json feat(career): gigs backend — propose a setlist, log the completed set (#954) 2026-07-14 01:26:23 +02:00
plugin.json feat(career): passport backend — genre badges computed from stars (#935) 2026-07-13 11:47:59 +02:00
routes.py fix(career): path-traversal guard on prepare; a cap test that actually tests the cap 2026-07-15 00:31:07 +02:00
screen.html feat(career): practice invitations — closest stamps + bring-these-up (#953) 2026-07-14 01:10:55 +02:00
screen.js fix(career): bound the prepare request; validate the setlist (PR #971 review) 2026-07-15 00:18:56 +02:00
settings.html Bar pack v4 refresh + crowd sound reactions (#940) 2026-07-13 14:29:34 +02:00
venues.json feat(career): career plugin — stars, venue tiers, pack downloads (career mode 2/3) (#907) 2026-07-12 22:39:19 +02:00