diff options
| author | Douwe Maan <douwe@gitlab.com> | 2015-10-02 14:37:07 +0000 |
|---|---|---|
| committer | Douwe Maan <douwe@gitlab.com> | 2015-10-02 14:37:07 +0000 |
| commit | 93522e59eccd8fd5801f313b34fec6a4f6394d9a (patch) | |
| tree | bb7bceb68b7b0159ddf6926f240ace561bb13062 /spec | |
| parent | c867c225095319684ad6ff396e4194bb1b5920d5 (diff) | |
| parent | d40dd5cfe331c5e465b77c8eecae9697c873a67a (diff) | |
| download | gitlab-ce-93522e59eccd8fd5801f313b34fec6a4f6394d9a.tar.gz | |
Merge branch 'rs-throttle-reset' into 'master'
Throttle "Forgot your password?" emails
Addresses internal https://dev.gitlab.org/gitlab/gitlabhq/issues/2611
See merge request !1476
Diffstat (limited to 'spec')
| -rw-r--r-- | spec/features/login_spec.rb | 2 | ||||
| -rw-r--r-- | spec/features/password_reset_spec.rb | 54 | ||||
| -rw-r--r-- | spec/models/user_spec.rb | 20 |
3 files changed, 43 insertions, 33 deletions
diff --git a/spec/features/login_spec.rb b/spec/features/login_spec.rb index cef432e512b..922c76285d1 100644 --- a/spec/features/login_spec.rb +++ b/spec/features/login_spec.rb @@ -95,7 +95,7 @@ feature 'Login', feature: true do user = create(:user, password: 'not-the-default') login_with(user) - expect(page).to have_content('Invalid email or password.') + expect(page).to have_content('Invalid login or password.') end end end diff --git a/spec/features/password_reset_spec.rb b/spec/features/password_reset_spec.rb index abf66f2356d..85e70b4d47f 100644 --- a/spec/features/password_reset_spec.rb +++ b/spec/features/password_reset_spec.rb @@ -1,53 +1,43 @@ require 'spec_helper' feature 'Password reset', feature: true do - describe 'with two-factor authentication' do - let(:user) { create(:user, :two_factor) } - - it 'requires login after password reset' do + describe 'throttling' do + it 'sends reset instructions when not previously sent' do visit root_path + forgot_password(create(:user)) - forgot_password - reset_password - - expect(page).to have_content("Your password was changed successfully.") - expect(page).not_to have_content("You are now signed in.") + expect(page).to have_content(I18n.t('devise.passwords.send_instructions')) expect(current_path).to eq new_user_session_path end - end - describe 'without two-factor authentication' do - let(:user) { create(:user) } + it 'sends reset instructions when previously sent more than a minute ago' do + user = create(:user) + user.send_reset_password_instructions + user.update_attribute(:reset_password_sent_at, 5.minutes.ago) - it 'requires login after password reset' do visit root_path + forgot_password(user) - forgot_password - reset_password - - expect(page).to have_content("Your password was changed successfully.") + expect(page).to have_content(I18n.t('devise.passwords.send_instructions')) expect(current_path).to eq new_user_session_path end + + it "throttles multiple resets in a short timespan" do + user = create(:user) + user.send_reset_password_instructions + + visit root_path + forgot_password(user) + + expect(page).to have_content(I18n.t('devise.passwords.recently_reset')) + expect(current_path).to eq new_user_password_path + end end - def forgot_password + def forgot_password(user) click_on 'Forgot your password?' fill_in 'Email', with: user.email click_button 'Reset password' user.reload end - - def get_reset_token - mail = ActionMailer::Base.deliveries.last - body = mail.body.encoded - body.scan(/reset_password_token=(.+)\"/).flatten.first - end - - def reset_password(password = 'password') - visit edit_user_password_path(reset_password_token: get_reset_token) - - fill_in 'New password', with: password - fill_in 'Confirm new password', with: password - click_button 'Change your password' - end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index b7b525bfca2..c71cfb3ebe3 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -228,6 +228,26 @@ describe User do end end + describe '#recently_sent_password_reset?' do + it 'is false when reset_password_sent_at is nil' do + user = build_stubbed(:user, reset_password_sent_at: nil) + + expect(user.recently_sent_password_reset?).to eq false + end + + it 'is false when sent more than one minute ago' do + user = build_stubbed(:user, reset_password_sent_at: 5.minutes.ago) + + expect(user.recently_sent_password_reset?).to eq false + end + + it 'is true when sent less than one minute ago' do + user = build_stubbed(:user, reset_password_sent_at: Time.now) + + expect(user.recently_sent_password_reset?).to eq true + end + end + describe '#disable_two_factor!' do it 'clears all 2FA-related fields' do user = create(:user, :two_factor) |
