{"record":{"id":"4fc37d6f1e0bad79","repo":"bitwarden/server","slug":"user-invalid","errorCode":null,"errorMessage":"User invalid.","messagePattern":"User invalid\\.","errorType":"exception","errorClass":"BadRequestException","httpStatus":400,"severity":"error","filePath":"bitwarden_license/src/Commercial.Core/AdminConsole/Services/ProviderService.cs","lineNumber":250,"sourceCode":"            if (providerUser.Status != ProviderUserStatusType.Invited || providerUser.ProviderId != invite.ProviderId)\n            {\n                result.Add(Tuple.Create(providerUser, \"User invalid.\"));\n                continue;\n            }\n\n            await SendInviteAsync(providerUser, provider);\n            result.Add(Tuple.Create(providerUser, \"\"));\n        }\n\n        return result;\n    }\n\n    public async Task<ProviderUser> AcceptUserAsync(Guid providerUserId, User user, string token)\n    {\n        var providerUser = await _providerUserRepository.GetByIdAsync(providerUserId);\n        if (providerUser == null)\n        {\n            throw new BadRequestException(\"User invalid.\");\n        }\n\n        if (providerUser.Status != ProviderUserStatusType.Invited)\n        {\n            throw new BadRequestException(\"Already accepted.\");\n        }\n\n        if (!CoreHelpers.TokenIsValid(\"ProviderUserInvite\", _dataProtector, token, user.Email, providerUser.Id,\n            _globalSettings.OrganizationInviteExpirationHours))\n        {\n            throw new BadRequestException(\"Invalid token.\");\n        }\n\n        if (string.IsNullOrWhiteSpace(providerUser.Email) ||\n            !providerUser.Email.Equals(user.Email, StringComparison.InvariantCultureIgnoreCase))\n        {\n            throw new BadRequestException(\"User email does not match invite.\");\n        }","sourceCodeStart":232,"sourceCodeEnd":268,"githubUrl":"https://github.com/bitwarden/server/blob/e93b962371d80964556f5590c6615f5160a437a1/bitwarden_license/src/Commercial.Core/AdminConsole/Services/ProviderService.cs#L232-L268","documentation":"Thrown inside AcceptUserAsync when _providerUserRepository.GetByIdAsync(providerUserId) returns null — no ProviderUser exists for that Id. The invite acceptance requires a valid ProviderUser record. BadRequestException (HTTP 400).","triggerScenarios":"Accepting an invite with a providerUserId that was deleted, already consumed, or fabricated.","commonSituations":"Invite revoked before acceptance; expired/old invite link; Id mismatch in test data; concurrent revocation.","solutions":["Verify the ProviderUser exists (GetByIdAsync) before accepting.","Re-issue the invite if it was revoked.","Ensure the providerUserId comes from a current invite link, not a stale one."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"var providerUser = await _providerUserRepository.GetByIdAsync(providerUserId);\nif (providerUser == null)\n    throw new InvalidOperationException(\"ProviderUser invite not found or was revoked.\");","typeGuard":null,"tryCatchPattern":"try { await _providerService.AcceptUserAsync(providerUserId, user, token); }\ncatch (BadRequestException ex) when (ex.Message == \"User invalid.\")\n{ /* invite missing — request a new one */ }","preventionTips":["Use the providerUserId from the current invite link.","Re-issue invites that were revoked.","Clean up stale invite references in the client."],"tags":["provider","invite","acceptance","user-lookup","bitwarden"],"backgroundTag":null,"analyzedSha":"e93b962371d80964556f5590c6615f5160a437a1","analyzedAt":"2026-08-13T14:22:19.382Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}