From 64ecd02f0b74d2251e30fc1c97fdf1aa60f53e90 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Wed, 13 Aug 2008 11:39:33 +0000 Subject: [PATCH] Allow users to change their email address. Closes #546. --- app/controllers/user_controller.rb | 48 +++++++++++++++---- app/models/notifier.rb | 11 +++++ .../notifier/email_confirm.text.html.rhtml | 8 ++++ .../notifier/email_confirm.text.plain.rhtml | 8 ++++ app/views/user/account.rhtml | 2 +- app/views/user/confirm_email.rhtml | 8 ++++ db/migrate/014_add_new_email.rb | 9 ++++ 7 files changed, 83 insertions(+), 11 deletions(-) create mode 100644 app/views/notifier/email_confirm.text.html.rhtml create mode 100644 app/views/notifier/email_confirm.text.plain.rhtml create mode 100644 app/views/user/confirm_email.rhtml create mode 100644 db/migrate/014_add_new_email.rb diff --git a/app/controllers/user_controller.rb b/app/controllers/user_controller.rb index 35b88b65a..26c56132c 100644 --- a/app/controllers/user_controller.rb +++ b/app/controllers/user_controller.rb @@ -17,9 +17,8 @@ class UserController < ApplicationController @user.description = "" if @user.description.nil? if @user.save - token = @user.tokens.create flash[:notice] = "User was successfully created. Check your email for a confirmation note, and you\'ll be mapping in no time :-)
Please note that you won't be able to login until you've received and confirmed your email address." - Notifier::deliver_signup_confirm(@user, token) + Notifier.deliver_signup_confirm(@user, @user.tokens.create) redirect_to :action => 'login' else render :action => 'new' @@ -29,19 +28,28 @@ class UserController < ApplicationController def account @title = 'edit account' if params[:user] and params[:user][:display_name] and params[:user][:description] - home_lat = params[:user][:home_lat] - home_lon = params[:user][:home_lon] + if params[:user][:email] != @user.email + @user.new_email = params[:user][:email] + end @user.display_name = params[:user][:display_name] + if params[:user][:pass_crypt].length > 0 or params[:user][:pass_crypt_confirmation].length > 0 @user.pass_crypt = params[:user][:pass_crypt] @user.pass_crypt_confirmation = params[:user][:pass_crypt_confirmation] end + @user.description = params[:user][:description] - @user.home_lat = home_lat - @user.home_lon = home_lon + @user.home_lat = params[:user][:home_lat] + @user.home_lon = params[:user][:home_lon] + if @user.save - flash[:notice] = "User information updated successfully." + if params[:user][:email] == @user.new_email + flash[:notice] = "User information updated successfully. Check your email for a note to confirm your new email address." + Notifier.deliver_email_confirm(@user, @user.tokens.create) + else + flash[:notice] = "User information updated successfully." + end else flash.delete(:notice) end @@ -72,7 +80,7 @@ class UserController < ApplicationController user = User.find_by_email(params[:user][:email]) if user token = user.tokens.create - Notifier::deliver_lost_password(user, token) + Notifier.deliver_lost_password(user, token) flash[:notice] = "Sorry you lost it :-( but an email is on its way so you can reset it soon." else flash[:notice] = "Couldn't find that email address, sorry." @@ -95,7 +103,7 @@ class UserController < ApplicationController user.email_valid = true user.save! token.destroy - Notifier::deliver_reset_password(user, pass) + Notifier.deliver_reset_password(user, pass) flash[:notice] = "Your password has been changed and is on its way to your mailbox :-)" else flash[:notice] = "Didn't find that token, check the URL maybe?" @@ -164,6 +172,26 @@ class UserController < ApplicationController end end + def confirm_email + if params[:confirm_action] + token = UserToken.find_by_token(params[:confirm_string]) + if token and token.user.new_email? + @user = token.user + @user.email = @user.new_email + @user.new_email = nil + @user.active = true + @user.email_valid = true + @user.save! + token.destroy + flash[:notice] = 'Confirmed your email address, thanks for signing up!' + session[:user] = @user.id + redirect_to :action => 'account', :display_name => @user.display_name + else + flash[:notice] = 'Something went wrong confirming that email address.' + end + end + end + def upload_image @user.image = params[:user][:image] @user.save! @@ -209,7 +237,7 @@ class UserController < ApplicationController unless @user.is_friends_with?(new_friend) if friend.save flash[:notice] = "#{name} is now your friend." - Notifier::deliver_friend_notification(friend) + Notifier.deliver_friend_notification(friend) else friend.add_error("Sorry, failed to add #{name} as a friend.") end diff --git a/app/models/notifier.rb b/app/models/notifier.rb index ebf5af641..3cc0f4cab 100644 --- a/app/models/notifier.rb +++ b/app/models/notifier.rb @@ -9,6 +9,17 @@ class Notifier < ActionMailer::Base :confirm_string => token.token) end + def email_confirm(user, token) + recipients user.new_email + from "webmaster@openstreetmap.org" + subject "[OpenStreetMap] Confirm your email address" + headers "Auto-Submitted" => "auto-generated" + body :address => user.new_email, + :url => url_for(:host => SERVER_URL, + :controller => "user", :action => "confirm_email", + :confirm_string => token.token) + end + def lost_password(user, token) recipients user.email from "webmaster@openstreetmap.org" diff --git a/app/views/notifier/email_confirm.text.html.rhtml b/app/views/notifier/email_confirm.text.html.rhtml new file mode 100644 index 000000000..271a35028 --- /dev/null +++ b/app/views/notifier/email_confirm.text.html.rhtml @@ -0,0 +1,8 @@ +

Hi,

+ +

Someone (hopefully you) would like to change their email address over at + <%= SERVER_URL %> to <%= @address %>.

+ +

If this is you, please click the link below to confirm the change.

+ +

<%= @url %>

diff --git a/app/views/notifier/email_confirm.text.plain.rhtml b/app/views/notifier/email_confirm.text.plain.rhtml new file mode 100644 index 000000000..28589dfbc --- /dev/null +++ b/app/views/notifier/email_confirm.text.plain.rhtml @@ -0,0 +1,8 @@ +Hi, + +Someone (hopefully you) would like to change their email address over at +<%= SERVER_URL %> to <%= @address %>. + +If this is you, please click the link below to confirm the change. + +<%= @url %> diff --git a/app/views/user/account.rhtml b/app/views/user/account.rhtml index d8afa4999..501af7494 100644 --- a/app/views/user/account.rhtml +++ b/app/views/user/account.rhtml @@ -2,7 +2,7 @@ <%= error_messages_for 'user' %> <% form_for :user, @user do |f| %> - + diff --git a/app/views/user/confirm_email.rhtml b/app/views/user/confirm_email.rhtml new file mode 100644 index 000000000..785297ec6 --- /dev/null +++ b/app/views/user/confirm_email.rhtml @@ -0,0 +1,8 @@ +

Confirm a change of email address

+ +

Press the confirm button below to confirm your new email address.

+ + + + + diff --git a/db/migrate/014_add_new_email.rb b/db/migrate/014_add_new_email.rb new file mode 100644 index 000000000..4077b7ca3 --- /dev/null +++ b/db/migrate/014_add_new_email.rb @@ -0,0 +1,9 @@ +class AddNewEmail < ActiveRecord::Migration + def self.up + add_column "users", "new_email", :string + end + + def self.down + remove_column "users", "new_email" + end +end -- 2.43.2
Email<%= @user.email %>
Email<%= f.text_field :email %>
Mapper since<%= @user.creation_time %> (<%= time_ago_in_words(@user.creation_time) %> ago)
Display Name<%= f.text_field :display_name %>
Password<%= f.password_field :pass_crypt, {:value => '', :size => 50, :maxlength => 255} %>