Fix: Prevent an invitation from being re-used after it has been accepted. #15638
  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.
  
    
  
    
Title
Move invitation acceptance tracking to claim endpoint and implement atomic update to prevent reuse
Relevant issues
Fixes #13906 - Invite link allows password reset multiple times, leading to security vulnerability
Pre-Submission checklist
Please complete all items before asking a LiteLLM maintainer to review your PR
tests/litellm/directory, Adding at least 1 test is a hard requirement - see detailsmake test-unitType
✅ Test
🐛 Bug Fix
🔒 Security
🧹 Refactoring
Changes
Summary
Fixes a security vulnerability where invitation links could be used multiple times to reset passwords. Moved the
is_acceptedflag update from the GET endpoint to the POST endpoint and implemented atomic database operations to prevent race conditions.What Changed
1. Moved
is_acceptedupdate from GET to POST endpointis_acceptedwas set toTruein/onboarding/get_token(GET endpoint) when the JWT token was generatedis_acceptedis set toTruein/onboarding/claim_token(POST endpoint) when the password is actually setis_acceptedstatus and reject already-used invitations early2. Implemented atomic
is_acceptedupdate in POST endpointupdate_manywith compound WHERE clause:WHERE id = ? AND is_accepted = Falseupdate_result == 0, raises 401 error indicating the link has already been used3. Added early validation check in POST endpoint
is_acceptedcheck before attempting atomic update4. Added comprehensive test coverage
Security Impact
Technical Details
Flow Changes
Before (Vulnerable):
/onboarding/get_token:is_accepted = True)/onboarding/claim_token:is_acceptedbecause it was already set in GETAfter (Secure):
/onboarding/get_token:is_acceptedto reject already-used invitations/onboarding/claim_token:Atomic Update Implementation