Skip to content

fix: the quickstart installed 1.4 (issue #188), and bump cryptography past a CVE - #194

Merged
GeiserX merged 3 commits into
mainfrom
fix/compose-pin-and-cve
Aug 4, 2026
Merged

fix: the quickstart installed 1.4 (issue #188), and bump cryptography past a CVE#194
GeiserX merged 3 commits into
mainfrom
fix/compose-pin-and-cve

Conversation

@GeiserX

@GeiserX GeiserX commented Aug 4, 2026

Copy link
Copy Markdown
Owner

Issue #188 is someone unable to create an account on v1.4. They got that version from us.

docker-compose.yml pinned 1.4 while its own header claimed the images "track the latest tag" and told the reader to replace :latesta string the file did not contain anywhere. Anyone checking whether they were current concluded they were.

The version that hands them:

v1.4.4  deps.py … first-run token gate:      present
v1.4.4  onboarding.html … setup_token field: absent

So the owner account cannot be created at all. Fixed in v1.11.0, months ago.

What changed

  • Both compose files pin 1.11.
  • The header now describes what the file actually does.
  • A test asserts the pin equals the newest released major.minor, not a fixed number — so it fails the next time it falls behind, instead of quietly aging seven minor versions.
  • cryptography>=50.0.0 for the open Dependabot alert (high — PKCS#7 EnvelopedData Bleichenbacher oracle). We use Fernet, not PKCS#7 EnvelopedData, so the vulnerable path isn't one we call, but the constraint permitted the affected range.

A verification failure worth flagging. I first concluded v1.4 had no token gate — from git show v1.4:… | grep -c returning 0. The tag is v1.4.4; git show v1.4: produced nothing, and a count of zero on empty input is indistinguishable from a confirmed absence. The corrected check prints byte counts alongside, so the two can be told apart. Had I not rechecked, I'd have told the reporter their problem was something else entirely.

Verification: 2514 tests, 95.14% coverage, ruff clean. Negative control: restoring the 1.4 pin fails the drift test.

Summary by CodeRabbit

  • Improvements
    • Updated the application and worker services to the latest 1.11 release series.
    • Improved release consistency by pinning service images to major and minor versions while allowing patch-level updates.
    • Clarified deployment guidance so image version behavior is accurately documented.
    • Strengthened security and compatibility support through updated encryption components.

Issue #188 is someone unable to create an account on v1.4. The cause is
the first-run setup-token bug — v1.4.4 has the token gate in deps.py and
no token field in onboarding.html, so the owner account cannot be created
at all — fixed months ago in v1.11.0.

They got that version from us. docker-compose.yml pinned 1.4 while its
own header said the images "track the `latest` tag", and told the reader
to replace `:latest`, a string the file did not contain anywhere. Anyone
checking whether they were current concluded they were.

Both compose files now pin 1.11, and the header describes what the file
actually does. A test asserts the pin equals the newest released
major.minor rather than a fixed number, so this fails the next time it
falls behind instead of quietly aging for seven minor versions.

Also bumps cryptography to >=50.0.0 for the open Dependabot alert
(high: PKCS#7 EnvelopedData decryption exposes a Bleichenbacher oracle).
CashPilot uses Fernet, not PKCS#7 EnvelopedData, so the vulnerable path
is not one we call — but the constraint allowed the vulnerable range and
there is no reason to keep it.

Verifying this took three attempts, which is worth recording. I first
concluded v1.4 had no token gate at all, from `git show v1.4:... | grep
-c` returning 0 — the tag is v1.4.4, `git show` produced NOTHING, and a
count of zero on empty input reads exactly like a confirmed absence. The
byte counts in the corrected check are there so a later reader can tell
the two apart.
@coderabbitai

coderabbitai Bot commented Aug 4, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@GeiserX, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 43 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 3838447e-9b8e-4ea3-9ee6-ea5c52edc9d2

📥 Commits

Reviewing files that changed from the base of the PR and between 229a686 and 0480757.

⛔ Files ignored due to path filters (1)
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (2)
  • .github/workflows/test.yml
  • tests/test_compose_image_pins.py
📝 Walkthrough

Walkthrough

The Compose files now use CashPilot image series 1.11 and document pinned tags. New tests validate release alignment and header wording. The minimum cryptography version is now 50.0.0 in both dependency declarations.

Changes

Compose release pinning

Layer / File(s) Summary
Update Compose image pins and documentation
docker-compose.yml, docker-compose.fleet.yml
UI and worker image tags changed from 1.4 to 1.11. The main Compose header now documents major/minor pinning and patch updates.
Validate release pins and headers
tests/test_compose_image_pins.py
Tests compare both Compose files with the newest semver major.minor series and check pinned-header wording.

Cryptography version update

Layer / File(s) Summary
Raise cryptography minimum version
pyproject.toml, requirements.txt
The minimum cryptography version changed from 48.0.1 to 50.0.0.

Estimated code review effort: 2 (Simple) | ~10 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately identifies the outdated quickstart image pin and the cryptography security update.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/compose-pin-and-cve

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@pyproject.toml`:
- Line 31: Regenerate uv.lock from the updated cryptography>=50.0.0 requirement
so cashpilot’s locked dependency constraint and cryptography pin resolve to the
new floor. The affected declaration sites are pyproject.toml lines 31-31 and
requirements.txt lines 14-14; do not modify them unless needed for lockfile
generation.

In `@tests/test_compose_image_pins.py`:
- Around line 92-95: Update the pin assertion in the test around the live-image
parsing so it also evaluates the documented remote-worker template in
docker-compose.fleet.yml, rather than removing that commented image declaration.
Preserve the existing checks for active UI and co-located worker images while
ensuring the remote worker image pin is included.
- Around line 75-86: The _newest_series method currently uses pytest.skip when
no semver tags are found, but this is inappropriate in CI environments where git
is available—the issue is a configuration problem, not a missing Git
environment. Update the method to differentiate between two cases: when the git
command itself fails (indicating a non-Git environment, appropriate for
pytest.skip) versus when git succeeds but finds no matching tags (a
configuration issue requiring pytest.fail). Wrap the subprocess.run call in
try-except to catch command execution failures, then replace the current
pytest.skip at the end with pytest.fail to properly fail the test when git is
available but tags are unavailable.
- Around line 75-86: The _newest_series method currently relies on git's
creation date sorting which doesn't guarantee semantic version ordering,
allowing a later-created stale tag to be selected over a backfilled release tag.
Instead of using --sort=-creatordate and returning the first semver match,
collect all tags matching the semver pattern v(\d+)\.(\d+)\.(\d+), extract and
compare the MAJOR.MINOR versions across all matches, then return the maximum
semantic version found. This ensures the truly newest release by version number
is selected rather than by creation date.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 5388ac42-9a19-418f-8ae1-7091f404e107

📥 Commits

Reviewing files that changed from the base of the PR and between 1f58795 and 229a686.

📒 Files selected for processing (5)
  • docker-compose.fleet.yml
  • docker-compose.yml
  • pyproject.toml
  • requirements.txt
  • tests/test_compose_image_pins.py

Comment thread pyproject.toml
Comment thread tests/test_compose_image_pins.py Outdated
Comment thread tests/test_compose_image_pins.py
…ping in CI

All three from CodeRabbit on this PR, all correct.

The cryptography bump was INCOMPLETE. Dependabot's alert names uv.lock
as the manifest, and the lock still declared >=48.0.1 and pinned
cryptography 48.0.1 — inside the vulnerable range — so changing
pyproject.toml and requirements.txt alone would have left the alert open
while looking fixed. Regenerated with `uv lock --upgrade-package
cryptography`: now 50.0.0, and the diff touches nothing else.

The drift test would have SKIPPED in CI. actions/checkout does not fetch
tags, so `git tag` returns nothing there and the test hit its own
pytest.skip — decorative in the one place it is meant to run, which is
the same shape of defect as the stale pin it guards. CI now fetches
tags, and the test FAILS rather than skips when CI has none, so a
regression in the workflow cannot quietly disarm it.

The pin scan now includes commented lines. docker-compose.fleet.yml's
commented remote-worker block is a template users uncomment and run, so
a stale pin there ships an old image just as surely as a live one — and
my first version stripped comments precisely to ignore it.

Verified locally: cryptography 50.0.0 exists and installs cleanly; the
suite ran against 48.0.0 here because this venv has no pip, while CI
installs from requirements.txt and exercises 50.0.0.

Negative control: planting a stale pin in the commented template now
fails the test.
@GeiserX

GeiserX commented Aug 4, 2026

Copy link
Copy Markdown
Owner Author

All three addressed — the first one mattered most.

The CVE fix was incomplete. Dependabot names uv.lock as the manifest, and the lock still declared >=48.0.1 and pinned cryptography 48.0.1 — inside the vulnerable range. Changing pyproject.toml and requirements.txt alone would have left the alert open while looking fixed. Regenerated with uv lock --upgrade-package cryptography; now 50.0.0, and the diff touches nothing else.

The drift test would have skipped in CI. actions/checkout doesn't fetch tags, so git tag returns nothing and the test hit its own pytest.skip — decorative in the one place it's meant to run, which is the same shape of defect as the stale pin it guards. CI now fetches tags, and the test fails rather than skips when CI has none, so a workflow regression can't quietly disarm it.

The commented template is checked now. docker-compose.fleet.yml's commented remote-worker block is something users uncomment and run, so a stale pin there ships an old image just as surely as a live one — and my first version stripped comments specifically to ignore it. Negative control: planting 1.4 there now fails the test.

One thing I'll state plainly rather than imply: this venv has no pip, so my local run exercised 48.0.0. I verified 50.0.0 exists and installs cleanly, and CI installs from requirements.txt, so CI is what actually runs the patched library.

tests/test_beads_batch_11.py is PR #193's work. A broad `git add -A
tests/` swept it onto this branch, where the code it tests does not
exist — so it failed here, and I pushed that.

Scope check after removing it: this branch touches the two compose
files, the cryptography constraint in pyproject/requirements, uv.lock,
and the compose-pin test. Nothing else.
@GeiserX
GeiserX merged commit f0f5a0a into main Aug 4, 2026
8 checks passed
@GeiserX
GeiserX deleted the fix/compose-pin-and-cve branch August 4, 2026 11:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant