FIX: Approves user when redeeming an invite for invites only sites (#16984)

When a site has `SiteSetting.invite_only` enabled, we create a
`ReviewableUser`record when activating a user if the user is not
approved. Therefore, we need to approve the user when redeeming an
invite.

There are some uncertainties surrounding why a `ReviewableRecord` is
created for a user in an invites only site but this commit does not seek
to address that.

Follow-up to 7c4e2d33fa
This commit is contained in:
Alan Guo Xiang Tan 2022-06-03 11:43:52 +08:00 committed by GitHub
parent f94682e2c4
commit 0fa0094531
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 2 deletions

View File

@ -40,7 +40,9 @@ InviteRedeemer = Struct.new(:invite, :email, :username, :name, :password, :user_
registration_ip_address: ip_address
}
if SiteSetting.must_approve_users? && EmailValidator.can_auto_approve_user?(user.email)
if (!SiteSetting.must_approve_users && SiteSetting.invite_only) ||
(SiteSetting.must_approve_users? && EmailValidator.can_auto_approve_user?(user.email))
ReviewableUser.set_approved_fields!(user, Discourse.system_user)
end
@ -79,7 +81,6 @@ InviteRedeemer = Struct.new(:invite, :email, :username, :name, :password, :user_
authenticator.finish
if invite.emailed_status != Invite.emailed_status_types[:not_required] && email == invite.email && invite.email_token.present? && email_token == invite.email_token
user.email_tokens.create!(email: user.email, scope: EmailToken.scopes[:signup])
user.activate
end

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true
describe InviteRedeemer do
fab!(:admin) { Fabricate(:admin) }
describe '.create_user_from_invite' do
it "should be created correctly" do
@ -83,6 +84,32 @@ describe InviteRedeemer do
expect(user.approved).to eq(false)
expect(user.active).to eq(false)
end
it "approves and actives user when redeeming an invite with email token and SiteSetting.invite_only is enabled" do
SiteSetting.invite_only = true
Jobs.run_immediately!
invite = Fabricate(:invite,
invited_by: admin,
email: 'walter.white@email.com',
emailed_status: Invite.emailed_status_types[:sent],
)
user = InviteRedeemer.create_user_from_invite(
invite: invite,
email: invite.email,
email_token: invite.email_token,
username: 'walter',
name: 'Walter White'
)
expect(user.name).to eq("Walter White")
expect(user.username).to eq("walter")
expect(user.email).to eq("walter.white@email.com")
expect(user.approved).to eq(true)
expect(user.active).to eq(true)
expect(ReviewableUser.count).to eq(0)
end
end
describe "#redeem" do