diff --git a/app/models/concerns/user/confirmation.rb b/app/models/concerns/user/confirmation.rb index 646aa0d527..ffc617d51e 100644 --- a/app/models/concerns/user/confirmation.rb +++ b/app/models/concerns/user/confirmation.rb @@ -15,38 +15,4 @@ module User::Confirmation def unconfirmed? !confirmed? end - - def confirm - wrap_email_confirmation do - super - end - end - - # Mark current email as confirmed, bypassing Devise - def mark_email_as_confirmed! - wrap_email_confirmation do - skip_confirmation! - save! - end - end - - private - - def wrap_email_confirmation - new_user = !confirmed? - self.approved = true if grant_approval_on_confirmation? - - yield - - if new_user - # Handle race condition when approving and confirming user at the same time - reload unless approved? - - if approved? - prepare_new_user! - else - notify_staff_about_pending_account! - end - end - end end diff --git a/app/models/user.rb b/app/models/user.rb index 2cc01e8c90..18cc3c0a08 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -188,6 +188,20 @@ class User < ApplicationRecord account_id end + def confirm + wrap_email_confirmation do + super + end + end + + # Mark current email as confirmed, bypassing Devise + def mark_email_as_confirmed! + wrap_email_confirmation do + skip_confirmation! + save! + end + end + def update_sign_in!(new_sign_in: false) old_current = current_sign_in_at new_current = Time.now.utc @@ -401,6 +415,25 @@ class User < ApplicationRecord open_registrations? && !sign_up_from_ip_requires_approval? && !sign_up_email_requires_approval? end + def wrap_email_confirmation + new_user = !confirmed? + self.approved = true if grant_approval_on_confirmation? + + yield + + if new_user + # Avoid extremely unlikely race condition when approving and confirming + # the user at the same time + reload unless approved? + + if approved? + prepare_new_user! + else + notify_staff_about_pending_account! + end + end + end + def sign_up_from_ip_requires_approval? sign_up_ip.present? && IpBlock.severity_sign_up_requires_approval.containing(sign_up_ip.to_s).exists? end