Commit c31513a2c8af0e6d339f7ac92ee0508ced052b3d
1 parent
63ca9209
Exists in
master
and in
29 other branches
forgot_password: allow password recovery with email OR login
Also provides infra to any other field in the future. (ActionItem2857)
Showing
4 changed files
with
58 additions
and
10 deletions
Show diff stats
app/models/change_password.rb
@@ -18,6 +18,13 @@ class ChangePassword < Task | @@ -18,6 +18,13 @@ class ChangePassword < Task | ||
18 | end | 18 | end |
19 | end | 19 | end |
20 | 20 | ||
21 | + def self.fields_choice | ||
22 | + [ | ||
23 | + [_('Username'), 'login'], | ||
24 | + [_('Email'), 'email'], | ||
25 | + ] | ||
26 | + end | ||
27 | + | ||
21 | ################################################### | 28 | ################################################### |
22 | # validations for creating a ChangePassword task | 29 | # validations for creating a ChangePassword task |
23 | 30 |
app/views/account/forgot_password.rhtml
@@ -4,10 +4,9 @@ | @@ -4,10 +4,9 @@ | ||
4 | 4 | ||
5 | <% labelled_form_for :change_password, @change_password, :url => { :action => 'forgot_password' } do |f| %> | 5 | <% labelled_form_for :change_password, @change_password, :url => { :action => 'forgot_password' } do |f| %> |
6 | 6 | ||
7 | - <%= f.text_field :login, | ||
8 | - :onchange => 'this.value = convToValidUsername( this.value )' %> | 7 | + <%= labelled_form_field(_('Field'), f.select(:field, ChangePassword.fields_choice)) %> |
9 | 8 | ||
10 | - <%= f.text_field :email %> | 9 | + <%= f.text_field :value %> |
11 | 10 | ||
12 | <%= f.hidden_field :environment_id, :value => environment.id %> | 11 | <%= f.hidden_field :environment_id, :value => environment.id %> |
13 | 12 |
test/functional/account_controller_test.rb
@@ -215,12 +215,21 @@ class AccountControllerTest < ActionController::TestCase | @@ -215,12 +215,21 @@ class AccountControllerTest < ActionController::TestCase | ||
215 | assert_response :success | 215 | assert_response :success |
216 | end | 216 | end |
217 | 217 | ||
218 | - should 'respond to forgotten password change request' do | 218 | + should 'respond to forgotten password change request with login' do |
219 | change = ChangePassword.new | 219 | change = ChangePassword.new |
220 | - ChangePassword.expects(:new).with('login' => 'test', 'email' => 'test@localhost.localdomain').returns(change) | 220 | + ChangePassword.expects(:new).with('field' => 'login', 'value' => 'test').returns(change) |
221 | change.expects(:save!).returns(true) | 221 | change.expects(:save!).returns(true) |
222 | 222 | ||
223 | - post :forgot_password, :change_password => { :login => 'test', :email => 'test@localhost.localdomain' } | 223 | + post :forgot_password, :change_password => { :field => 'login', :value => 'test' } |
224 | + assert_template 'password_recovery_sent' | ||
225 | + end | ||
226 | + | ||
227 | + should 'respond to forgotten password change request with email' do | ||
228 | + change = ChangePassword.new | ||
229 | + ChangePassword.expects(:new).with('field' => 'email', 'value' => 'test@localhost.localdomain').returns(change) | ||
230 | + change.expects(:save!).returns(true) | ||
231 | + | ||
232 | + post :forgot_password, :change_password => { :field => 'email', :value => 'test@localhost.localdomain' } | ||
224 | assert_template 'password_recovery_sent' | 233 | assert_template 'password_recovery_sent' |
225 | end | 234 | end |
226 | 235 | ||
@@ -267,7 +276,7 @@ class AccountControllerTest < ActionController::TestCase | @@ -267,7 +276,7 @@ class AccountControllerTest < ActionController::TestCase | ||
267 | 276 | ||
268 | should 'require password confirmation correctly to enter new pasword' do | 277 | should 'require password confirmation correctly to enter new pasword' do |
269 | user = create_user('testuser', :email => 'testuser@example.com', :password => 'test', :password_confirmation => 'test') | 278 | user = create_user('testuser', :email => 'testuser@example.com', :password => 'test', :password_confirmation => 'test') |
270 | - change = ChangePassword.create!(:login => 'testuser', :email => 'testuser@example.com', :environment_id => Environment.default.id) | 279 | + change = ChangePassword.create!(:field => 'login', :value => 'testuser', :environment_id => Environment.default.id) |
271 | 280 | ||
272 | post :new_password, :code => change.code, :change_password => { :password => 'onepass', :password_confirmation => 'another_pass' } | 281 | post :new_password, :code => change.code, :change_password => { :password => 'onepass', :password_confirmation => 'another_pass' } |
273 | assert_response :success | 282 | assert_response :success |
@@ -853,7 +862,7 @@ class AccountControllerTest < ActionController::TestCase | @@ -853,7 +862,7 @@ class AccountControllerTest < ActionController::TestCase | ||
853 | assert_response :redirect | 862 | assert_response :redirect |
854 | 863 | ||
855 | #Redirect on post action | 864 | #Redirect on post action |
856 | - post :forgot_password, :change_password => { :login => 'test', :email => 'test@localhost.localdomain' } | 865 | + post :forgot_password, :change_password => { :field => 'login', :value => 'test' } |
857 | assert_response :redirect | 866 | assert_response :redirect |
858 | end | 867 | end |
859 | 868 |
test/integration/forgot_password_test.rb
@@ -6,7 +6,7 @@ class ForgotPasswordTest < ActionController::IntegrationTest | @@ -6,7 +6,7 @@ class ForgotPasswordTest < ActionController::IntegrationTest | ||
6 | ActionController::Integration::Session.any_instance.stubs(:https?).returns(true) | 6 | ActionController::Integration::Session.any_instance.stubs(:https?).returns(true) |
7 | end | 7 | end |
8 | 8 | ||
9 | - def test_forgot_password | 9 | + def test_forgot_password_with_login |
10 | 10 | ||
11 | User.destroy_all | 11 | User.destroy_all |
12 | Profile.destroy_all | 12 | Profile.destroy_all |
@@ -19,7 +19,40 @@ class ForgotPasswordTest < ActionController::IntegrationTest | @@ -19,7 +19,40 @@ class ForgotPasswordTest < ActionController::IntegrationTest | ||
19 | assert_response :success | 19 | assert_response :success |
20 | assert_tag :tag => 'form', :attributes => { :action => '/account/forgot_password', :method => 'post' } | 20 | assert_tag :tag => 'form', :attributes => { :action => '/account/forgot_password', :method => 'post' } |
21 | 21 | ||
22 | - post '/account/forgot_password', :change_password => { :login => 'forgotten', :email => 'forgotten@localhost.localdomain', :environment_id => Environment.default.id } | 22 | + post '/account/forgot_password', :change_password => { :field => 'login', :value => 'forgotten', :environment_id => Environment.default.id } |
23 | + | ||
24 | + assert_response :success | ||
25 | + assert_template 'password_recovery_sent' | ||
26 | + | ||
27 | + assert_equal 1, ChangePassword.count | ||
28 | + code = ChangePassword.find(:first).code | ||
29 | + | ||
30 | + get "/account/new_password/#{code}" | ||
31 | + assert_response :success | ||
32 | + assert_tag :tag => 'form', :attributes => { :action => "/account/new_password/#{code}" } | ||
33 | + | ||
34 | + post "/account/new_password/#{code}", :change_password => { :password => 'newpass', :password_confirmation => 'newpass'} | ||
35 | + assert_response :success | ||
36 | + assert_template 'new_password_ok' | ||
37 | + assert_tag :tag => 'a', :attributes => { :href => "/account/login" } | ||
38 | + | ||
39 | + login('forgotten', 'newpass') | ||
40 | + end | ||
41 | + | ||
42 | + def test_forgot_password_with_email | ||
43 | + | ||
44 | + User.destroy_all | ||
45 | + Profile.destroy_all | ||
46 | + ChangePassword.destroy_all | ||
47 | + | ||
48 | + create_user('forgotten', :password => 'test', :password_confirmation => 'test', :email => 'forgotten@localhost.localdomain').activate | ||
49 | + | ||
50 | + get '/account/forgot_password' | ||
51 | + | ||
52 | + assert_response :success | ||
53 | + assert_tag :tag => 'form', :attributes => { :action => '/account/forgot_password', :method => 'post' } | ||
54 | + | ||
55 | + post '/account/forgot_password', :change_password => { :field => 'email', :value => 'forgotten@localhost.localdomain', :environment_id => Environment.default.id } | ||
23 | 56 | ||
24 | assert_response :success | 57 | assert_response :success |
25 | assert_template 'password_recovery_sent' | 58 | assert_template 'password_recovery_sent' |