From eab2eb1d82902a1051e2c9762326345e146455b8 Mon Sep 17 00:00:00 2001 From: r888888888 Date: Tue, 21 May 2013 17:52:03 -0700 Subject: [PATCH] fixes #1651 --- .../user/email_changes_controller.rb | 18 ++++++++ app/logical/user_email_change.rb | 18 ++++++++ .../user/email_changes/new.html.erb | 19 +++++++++ app/views/users/edit.html.erb | 16 ++++++- config/routes.rb | 1 + .../user/email_changes_controller_test.rb | 42 +++++++++++++++++++ 6 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 app/controllers/maintenance/user/email_changes_controller.rb create mode 100644 app/logical/user_email_change.rb create mode 100644 app/views/maintenance/user/email_changes/new.html.erb create mode 100644 test/functional/maintenance/user/email_changes_controller_test.rb diff --git a/app/controllers/maintenance/user/email_changes_controller.rb b/app/controllers/maintenance/user/email_changes_controller.rb new file mode 100644 index 000000000..161f4bd10 --- /dev/null +++ b/app/controllers/maintenance/user/email_changes_controller.rb @@ -0,0 +1,18 @@ +module Maintenance + module User + class EmailChangesController < ApplicationController + def new + end + + def create + email_change = UserEmailChange.new(CurrentUser.user, params[:email_change][:email], params[:email_change][:password]) + if email_change.process + redirect_to(edit_user_path(CurrentUser.user.id), :notice => "Email was updated") + else + flash[:notice] = "Password was incorrect" + render :action => "new" + end + end + end + end +end diff --git a/app/logical/user_email_change.rb b/app/logical/user_email_change.rb new file mode 100644 index 000000000..432ad2b37 --- /dev/null +++ b/app/logical/user_email_change.rb @@ -0,0 +1,18 @@ +class UserEmailChange + attr_reader :user, :password, :new_email + + def initialize(user, new_email, password) + @user = user + @new_email = new_email + @password = password + end + + def process + if User.authenticate(user.name, password).nil? + false + else + user.email = new_email + user.save + end + end +end diff --git a/app/views/maintenance/user/email_changes/new.html.erb b/app/views/maintenance/user/email_changes/new.html.erb new file mode 100644 index 000000000..095c431cb --- /dev/null +++ b/app/views/maintenance/user/email_changes/new.html.erb @@ -0,0 +1,19 @@ +

Change Email

+ +

You must confirm your password in order to change your email address.

+ +<%= form_tag(maintenance_user_email_change_path, :class => "simple_form") do %> +
+ + <%= email_field :email_change, :email %> +
+ +
+ + <%= password_field :email_change, :password %> +
+ +
+ <%= submit_tag "Submit" %> +
+<% end %> \ No newline at end of file diff --git a/app/views/users/edit.html.erb b/app/views/users/edit.html.erb index 3ce8a35ac..3635bfbbb 100644 --- a/app/views/users/edit.html.erb +++ b/app/views/users/edit.html.erb @@ -15,7 +15,19 @@

You must <%= link_to "upgrade your account", upgrade_information_users_path %> to request a name change

<% end %> - <%= f.input :email, :required => Danbooru.config.enable_email_verification?, :hint => "Used for messages and for password resets", :as => :email %> + +
+ +

+ <% if CurrentUser.user.email.present? %> + <%= CurrentUser.user.email %> + <% else %> + blank + <% end %> + – + <%= link_to "Change your email", new_maintenance_user_email_change_path %>

+
+ <%= f.input :time_zone, :include_blank => false %> <%= f.input :receive_email_notifications, :as => :select, :include_blank => false %> <%= f.input :comment_threshold, :hint => "Comments below this score will be hidden by default" %> @@ -52,7 +64,7 @@
Delete Account
-

<%= link_to "Click here to delete your account", maintenance_user_deletion_path %>

+

<%= link_to "Delete your account", maintenance_user_deletion_path %>

diff --git a/config/routes.rb b/config/routes.rb index f132fd5ed..f59b353f3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -48,6 +48,7 @@ Danbooru::Application.routes.draw do resource :password_reset, :only => [:new, :create, :edit, :update] resource :login_reminder, :only => [:new, :create] resource :deletion, :only => [:show, :destroy] + resource :email_change, :only => [:new, :create] end end diff --git a/test/functional/maintenance/user/email_changes_controller_test.rb b/test/functional/maintenance/user/email_changes_controller_test.rb new file mode 100644 index 000000000..bb5f6c0b6 --- /dev/null +++ b/test/functional/maintenance/user/email_changes_controller_test.rb @@ -0,0 +1,42 @@ +require "test_helper" + +module Maintenance + module User + class EmailChangesControllerTest < ActionController::TestCase + context "in all cases" do + setup do + @user = FactoryGirl.create(:user, :email => "bob@ogres.net") + CurrentUser.user = @user + CurrentUser.ip_addr = "127.0.0.1" + end + + context "#new" do + should "render" do + get :new, {}, {:user_id => @user.id} + assert_response :success + end + end + + context "#create" do + context "with the correct password" do + should "work" do + post :create, {:email_change => {:password => "password", :email => "abc@ogres.net"}}, {:user_id => @user.id} + assert_redirected_to(edit_user_path(@user)) + @user.reload + assert_equal("abc@ogres.net", @user.email) + end + end + + context "with the incorrect password" do + should "not work" do + post :create, {:email_change => {:password => "passwordx", :email => "abc@ogres.net"}}, {:user_id => @user.id} + assert_response :success + @user.reload + assert_equal("bob@ogres.net", @user.email) + end + end + end + end + end + end +end \ No newline at end of file