diff --git a/app/controllers/public/account_controller.rb b/app/controllers/public/account_controller.rb index c2712e0..0ed7420 100644 --- a/app/controllers/public/account_controller.rb +++ b/app/controllers/public/account_controller.rb @@ -70,6 +70,19 @@ class AccountController < PublicController end end + # posts back + def forgot_password + @change_password = ChangePasswordData.new(params[:change_password]) + if request.post? + begin + @change_password.confirm! + render :action => 'password_recovery_sent' + rescue Exception => e + nil # just pass and render at the end of the action + end + end + end + protected before_filter :load_profile_for_user diff --git a/app/models/change_password_data.rb b/app/models/change_password_data.rb new file mode 100644 index 0000000..f05196d --- /dev/null +++ b/app/models/change_password_data.rb @@ -0,0 +1,34 @@ +class ChangePasswordData < Validator + + attr_accessor :login, :email + + validates_presence_of :login, :email + validates_format_of :email, :with => Noosfero::Constants::EMAIL_FORMAT, :if => (lambda { |obj| !obj.email.blank? }) + + # + validates_each :login do |data,attr,value| + unless data.login.blank? + user = User.find_by_login(data.login) + if user.nil? + data.errors.add(:login, _('%{fn} is not a valid username.')) + else + if user.email != data.email + data.errors.add(:email, _('%{fn} is invalid.')) + end + end + end + end + + def initialize(hash = nil) + hash ||= {} + self.login = hash[:login] || hash['login'] + self.email = hash[:email] || hash['email'] + end + + def confirm! + raise ActiveRecord::RecordInvalid unless self.valid? + user = User.find_by_login(self.login) + #ChangePassword.create!(:user_id => user.id) + end + +end diff --git a/app/models/validator.rb b/app/models/validator.rb new file mode 100644 index 0000000..efb4c8f --- /dev/null +++ b/app/models/validator.rb @@ -0,0 +1,6 @@ +class Validator + include ActiveRecord::Validations + def new_record? + true + end +end diff --git a/app/views/account/forgot_password.rhtml b/app/views/account/forgot_password.rhtml new file mode 100644 index 0000000..c50d356 --- /dev/null +++ b/app/views/account/forgot_password.rhtml @@ -0,0 +1,15 @@ +
<%= submit_tag 'Log in' %>
<% end -%> + + ++<%= link_to _("I forgot my password"), :action => 'forgot_password' %> +
diff --git a/test/functional/account_controller_test.rb b/test/functional/account_controller_test.rb index a451a34..22ad595 100644 --- a/test/functional/account_controller_test.rb +++ b/test/functional/account_controller_test.rb @@ -170,6 +170,18 @@ class AccountControllerTest < Test::Unit::TestCase assert_equal users(:ze), @controller.send(:current_user) end + should 'provide a "I forget my password" link at the login page' do + get :login + assert_tag :tag => 'a', :attributes => { + :href => '/account/forgot_password' + } + end + + should 'provide a "forgot my password" form' do + get :forgot_password + assert_response :success + end + protected def create_user(options = {}) post :signup, :user => { :login => 'quire', :email => 'quire@example.com', diff --git a/test/unit/change_password_data_test.rb b/test/unit/change_password_data_test.rb new file mode 100644 index 0000000..d3a0884 --- /dev/null +++ b/test/unit/change_password_data_test.rb @@ -0,0 +1,55 @@ +require File.dirname(__FILE__) + '/../test_helper' + +class ChangePasswordDataTest < Test::Unit::TestCase + + should 'validate' do + data = ChangePasswordData.new + assert !data.valid? + end + + should 'refuse invalid username' do + User.destroy_all + + data = ChangePasswordData.new + data.login = 'unexisting' + data.valid? + assert data.errors.invalid?(:login) + end + + should 'require a valid username' do + User.destroy_all + User.create!(:login => 'testuser', :password => 'test', :password_confirmation => 'test', :email => 'test@example.com') + + data = ChangePasswordData.new + data.login = 'testuser' + data.valid? + assert !data.errors.invalid?(:login) + end + + should 'refuse incorrect e-mail address' do + User.destroy_all + User.create!(:login => 'testuser', :password => 'test', :password_confirmation => 'test', :email => 'test@example.com') + + data = ChangePasswordData.new + data.login = 'testuser' + data.email = 'wrong@example.com' + + data.valid? + assert !data.errors.invalid?(:login) + assert data.errors.invalid?(:email) + end + + should 'require the correct e-mail address' do + User.destroy_all + User.create!(:login => 'testuser', :password => 'test', :password_confirmation => 'test', :email => 'test@example.com') + + data = ChangePasswordData.new + data.login = 'testuser' + data.email = 'test@example.com' + + data.valid? + assert !data.errors.invalid?(:login) + assert !data.errors.invalid?(:email) + end + +end -- libgit2 0.21.2