Uh oh!
There was an error while loading. Please reload this page.
fix(security): decrypt gradebook-create + profile-settings responses (#126 #18, #19) - #227
Conversation
…126#18, #19) Two response-boundary leaks where an encrypted column was returned to the authenticated owner as ciphertext: - gradebook create_assignment returned inserted[0] (the stored ciphertext for points_possible/points_earned/notes) with no decrypt. Decrypt the inserted row before returning, matching get_course's read path. - profile PATCH /settings returned a raw _SETTINGS_COLS select with no decrypt, unlike GET — bio/location came back as ciphertext. Return through the decrypting _get_or_create_settings helper. Both are owner-only correctness gaps (not cross-user). Tests assert the response carries decrypted plaintext; both fail pre-fix (ciphertext).
Warning Review limit reached
More reviews will be available in 41 minutes and 22 seconds. Learn how PR review limits work. Your organization has run out of usage credits. Purchase more credits in the billing tab to continue. ⌛ How to resolve this issue?After more reviews become available, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available. Please see our Fair Usage Limits Policy for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (3)
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
Deploying with |
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs | frontend | dae4179 | Commit Preview URL Branch Preview URL | Jun 13 2026, 05:16 AM |
Uh oh!
There was an error while loading. Please reload this page.
Part of #126 (findings #18 & #19, both LOW). Second of the two #126 PRs (the HIGH plaintext-write is #226).
Two response-boundary leaks (owner-only, not cross-user)
gradebook.create_assignmentreturnedinserted[0], i.e. the stored ciphertext forpoints_possible/points_earned/notes, with no decrypt. (Masked today only becauseCourse.tsxreloads and discards the response.)profilePATCH/settingsreturned a raw_SETTINGS_COLSselect with no decrypt, unlike GET — sobio/locationcame back as ciphertext.Fixes
get_course's read path (decrypt_numeric/decrypt_if_present, already imported)._get_or_create_settings(user_id)helper instead of a raw select.Tests
tests/test_response_decrypt_boundary.py: both assert the response carries plaintext, not the stored ciphertext. Both fail on pre-fix code (ciphertext returned). Full gradebook + profile route suites pass (51 tests).