Skip to content
Extraits de code Groupes Projets
Valider 5ec25ff3 rédigé par Patrick Figel's avatar Patrick Figel Validation de Eugen Rochko
Parcourir les fichiers

Fix email confirmation link not updating email (#6187)

A change introduced in #6125 prevents
`Devise::Models::Confirmable#confirm` from being called for existing
users, which in turn leads to `email` not being set to
`unconfirmed_email`, breaking email updates. This also adds a test
that would've caught this issue.
parent 49e296e1
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -126,18 +126,18 @@ class User < ApplicationRecord ...@@ -126,18 +126,18 @@ class User < ApplicationRecord
end end
def confirm def confirm
return if confirmed? new_user = !confirmed?
super super
update_statistics! update_statistics! if new_user
end end
def confirm! def confirm!
return if confirmed? new_user = !confirmed?
skip_confirmation! skip_confirmation!
save! save!
update_statistics! update_statistics! if new_user
end end
def promote! def promote!
......
...@@ -12,20 +12,40 @@ describe Auth::ConfirmationsController, type: :controller do ...@@ -12,20 +12,40 @@ describe Auth::ConfirmationsController, type: :controller do
end end
describe 'GET #show' do describe 'GET #show' do
let!(:user) { Fabricate(:user, confirmation_token: 'foobar', confirmed_at: nil) } context 'when user is unconfirmed' do
let!(:user) { Fabricate(:user, confirmation_token: 'foobar', confirmed_at: nil) }
before do before do
allow(BootstrapTimelineWorker).to receive(:perform_async) allow(BootstrapTimelineWorker).to receive(:perform_async)
@request.env['devise.mapping'] = Devise.mappings[:user] @request.env['devise.mapping'] = Devise.mappings[:user]
get :show, params: { confirmation_token: 'foobar' } get :show, params: { confirmation_token: 'foobar' }
end end
it 'redirects to login' do
expect(response).to redirect_to(new_user_session_path)
end
it 'redirects to login' do it 'queues up bootstrapping of home timeline' do
expect(response).to redirect_to(new_user_session_path) expect(BootstrapTimelineWorker).to have_received(:perform_async).with(user.account_id)
end
end end
it 'queues up bootstrapping of home timeline' do context 'when user is updating email' do
expect(BootstrapTimelineWorker).to have_received(:perform_async).with(user.account_id) let!(:user) { Fabricate(:user, confirmation_token: 'foobar', unconfirmed_email: 'new-email@example.com') }
before do
allow(BootstrapTimelineWorker).to receive(:perform_async)
@request.env['devise.mapping'] = Devise.mappings[:user]
get :show, params: { confirmation_token: 'foobar' }
end
it 'redirects to login' do
expect(response).to redirect_to(new_user_session_path)
end
it 'does not queue up bootstrapping of home timeline' do
expect(BootstrapTimelineWorker).to_not have_received(:perform_async)
end
end end
end end
end end
...@@ -148,6 +148,14 @@ RSpec.describe User, type: :model do ...@@ -148,6 +148,14 @@ RSpec.describe User, type: :model do
end end
end end
describe '#confirm' do
it 'sets email to unconfirmed_email' do
user = Fabricate.build(:user, confirmed_at: Time.now.utc, unconfirmed_email: 'new-email@example.com')
user.confirm
expect(user.email).to eq 'new-email@example.com'
end
end
describe '#disable_two_factor!' do describe '#disable_two_factor!' do
it 'saves false for otp_required_for_login' do it 'saves false for otp_required_for_login' do
user = Fabricate.build(:user, otp_required_for_login: true) user = Fabricate.build(:user, otp_required_for_login: true)
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter