Commit f85eeef51f67b9dd970753cdd270c94a0e931046
1 parent
ac4035d7
Exists in
master
and in
28 other branches
ActionItem78: implementing forgot my password feature.
git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@625 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
7 changed files
with
140 additions
and
0 deletions
Show diff stats
app/controllers/public/account_controller.rb
| ... | ... | @@ -70,6 +70,19 @@ class AccountController < PublicController |
| 70 | 70 | end |
| 71 | 71 | end |
| 72 | 72 | |
| 73 | + # posts back | |
| 74 | + def forgot_password | |
| 75 | + @change_password = ChangePasswordData.new(params[:change_password]) | |
| 76 | + if request.post? | |
| 77 | + begin | |
| 78 | + @change_password.confirm! | |
| 79 | + render :action => 'password_recovery_sent' | |
| 80 | + rescue Exception => e | |
| 81 | + nil # just pass and render at the end of the action | |
| 82 | + end | |
| 83 | + end | |
| 84 | + end | |
| 85 | + | |
| 73 | 86 | protected |
| 74 | 87 | |
| 75 | 88 | before_filter :load_profile_for_user | ... | ... |
| ... | ... | @@ -0,0 +1,34 @@ |
| 1 | +class ChangePasswordData < Validator | |
| 2 | + | |
| 3 | + attr_accessor :login, :email | |
| 4 | + | |
| 5 | + validates_presence_of :login, :email | |
| 6 | + validates_format_of :email, :with => Noosfero::Constants::EMAIL_FORMAT, :if => (lambda { |obj| !obj.email.blank? }) | |
| 7 | + | |
| 8 | + # | |
| 9 | + validates_each :login do |data,attr,value| | |
| 10 | + unless data.login.blank? | |
| 11 | + user = User.find_by_login(data.login) | |
| 12 | + if user.nil? | |
| 13 | + data.errors.add(:login, _('%{fn} is not a valid username.')) | |
| 14 | + else | |
| 15 | + if user.email != data.email | |
| 16 | + data.errors.add(:email, _('%{fn} is invalid.')) | |
| 17 | + end | |
| 18 | + end | |
| 19 | + end | |
| 20 | + end | |
| 21 | + | |
| 22 | + def initialize(hash = nil) | |
| 23 | + hash ||= {} | |
| 24 | + self.login = hash[:login] || hash['login'] | |
| 25 | + self.email = hash[:email] || hash['email'] | |
| 26 | + end | |
| 27 | + | |
| 28 | + def confirm! | |
| 29 | + raise ActiveRecord::RecordInvalid unless self.valid? | |
| 30 | + user = User.find_by_login(self.login) | |
| 31 | + #ChangePassword.create!(:user_id => user.id) | |
| 32 | + end | |
| 33 | + | |
| 34 | +end | ... | ... |
| ... | ... | @@ -0,0 +1,15 @@ |
| 1 | +<h1><%= _('Password recovery') %></h1> | |
| 2 | + | |
| 3 | +<%= error_messages_for :change_password %> | |
| 4 | + | |
| 5 | +<%= help(_('To change your password, please fill the form on this screen using yout username and your e-mail. You will receive a message at that e-mail address with a web address you can access to create a new password.')) %> | |
| 6 | + | |
| 7 | +<% form_for :change_password, @change_password, :url => { :action => 'forgot_password' } do |f| %> | |
| 8 | + <%= labelled_form_field(_('Username'), (f.text_field :login)) %> | |
| 9 | + <%= labelled_form_field(_('E-mail'), (f.text_field :email)) %> | |
| 10 | +<div> | |
| 11 | + <%= submit_tag _('Send change password procedure by e-mail') %> | |
| 12 | +</div> | |
| 13 | + | |
| 14 | +<% end %> | |
| 15 | + | ... | ... |
app/views/account/login.rhtml
test/functional/account_controller_test.rb
| ... | ... | @@ -170,6 +170,18 @@ class AccountControllerTest < Test::Unit::TestCase |
| 170 | 170 | assert_equal users(:ze), @controller.send(:current_user) |
| 171 | 171 | end |
| 172 | 172 | |
| 173 | + should 'provide a "I forget my password" link at the login page' do | |
| 174 | + get :login | |
| 175 | + assert_tag :tag => 'a', :attributes => { | |
| 176 | + :href => '/account/forgot_password' | |
| 177 | + } | |
| 178 | + end | |
| 179 | + | |
| 180 | + should 'provide a "forgot my password" form' do | |
| 181 | + get :forgot_password | |
| 182 | + assert_response :success | |
| 183 | + end | |
| 184 | + | |
| 173 | 185 | protected |
| 174 | 186 | def create_user(options = {}) |
| 175 | 187 | post :signup, :user => { :login => 'quire', :email => 'quire@example.com', | ... | ... |
| ... | ... | @@ -0,0 +1,55 @@ |
| 1 | +require File.dirname(__FILE__) + '/../test_helper' | |
| 2 | + | |
| 3 | +class ChangePasswordDataTest < Test::Unit::TestCase | |
| 4 | + | |
| 5 | + should 'validate' do | |
| 6 | + data = ChangePasswordData.new | |
| 7 | + assert !data.valid? | |
| 8 | + end | |
| 9 | + | |
| 10 | + should 'refuse invalid username' do | |
| 11 | + User.destroy_all | |
| 12 | + | |
| 13 | + data = ChangePasswordData.new | |
| 14 | + data.login = 'unexisting' | |
| 15 | + data.valid? | |
| 16 | + assert data.errors.invalid?(:login) | |
| 17 | + end | |
| 18 | + | |
| 19 | + should 'require a valid username' do | |
| 20 | + User.destroy_all | |
| 21 | + User.create!(:login => 'testuser', :password => 'test', :password_confirmation => 'test', :email => 'test@example.com') | |
| 22 | + | |
| 23 | + data = ChangePasswordData.new | |
| 24 | + data.login = 'testuser' | |
| 25 | + data.valid? | |
| 26 | + assert !data.errors.invalid?(:login) | |
| 27 | + end | |
| 28 | + | |
| 29 | + should 'refuse incorrect e-mail address' do | |
| 30 | + User.destroy_all | |
| 31 | + User.create!(:login => 'testuser', :password => 'test', :password_confirmation => 'test', :email => 'test@example.com') | |
| 32 | + | |
| 33 | + data = ChangePasswordData.new | |
| 34 | + data.login = 'testuser' | |
| 35 | + data.email = 'wrong@example.com' | |
| 36 | + | |
| 37 | + data.valid? | |
| 38 | + assert !data.errors.invalid?(:login) | |
| 39 | + assert data.errors.invalid?(:email) | |
| 40 | + end | |
| 41 | + | |
| 42 | + should 'require the correct e-mail address' do | |
| 43 | + User.destroy_all | |
| 44 | + User.create!(:login => 'testuser', :password => 'test', :password_confirmation => 'test', :email => 'test@example.com') | |
| 45 | + | |
| 46 | + data = ChangePasswordData.new | |
| 47 | + data.login = 'testuser' | |
| 48 | + data.email = 'test@example.com' | |
| 49 | + | |
| 50 | + data.valid? | |
| 51 | + assert !data.errors.invalid?(:login) | |
| 52 | + assert !data.errors.invalid?(:email) | |
| 53 | + end | |
| 54 | + | |
| 55 | +end | ... | ... |