diff --git a/zerver/lib/actions.py b/zerver/lib/actions.py index 2eabb32eff..fbabafbd02 100644 --- a/zerver/lib/actions.py +++ b/zerver/lib/actions.py @@ -4957,6 +4957,10 @@ def do_revoke_multi_use_invite(multiuse_invite: MultiuseInvite) -> None: notify_invites_changed(multiuse_invite.referred_by) def do_resend_user_invite_email(prereg_user: PreregistrationUser) -> int: + # These are two structurally for the caller's code path. + assert prereg_user.referred_by is not None + assert prereg_user.realm is not None + check_invite_limit(prereg_user.referred_by.realm, 1) prereg_user.invited_at = timezone_now() diff --git a/zerver/views/invite.py b/zerver/views/invite.py index 03a8fad94b..93ec38db5c 100644 --- a/zerver/views/invite.py +++ b/zerver/views/invite.py @@ -109,7 +109,9 @@ def resend_user_invite_email(request: HttpRequest, user_profile: UserProfile, except PreregistrationUser.DoesNotExist: raise JsonableError(_("No such invitation")) - if (prereg_user.referred_by.realm != user_profile.realm): + # Structurally, any invitation the user can actually access should + # have a referred_by set for the user who created it. + if prereg_user.referred_by is None or prereg_user.referred_by.realm != user_profile.realm: raise JsonableError(_("No such invitation")) timestamp = do_resend_user_invite_email(prereg_user)