add mail+pass change option

This commit is contained in:
jomo
2014-05-03 02:40:15 +02:00
parent b5b9a9316f
commit e79afbf990
9 changed files with 150 additions and 11 deletions

View File

@@ -1,6 +1,7 @@
class UsersController < ApplicationController class UsersController < ApplicationController
require 'open-uri' require 'open-uri'
include MailerHelper
def index def index
if params[:role] if params[:role]
@@ -42,8 +43,8 @@ class UsersController < ApplicationController
if !confirmed? if !confirmed?
@user.confirmed = true @user.confirmed = true
if @user.save if @user.save
flash[:notice] = "Registration mail confirmed." flash[:notice] = "Your email has been confirmed."
redirect_to edit_user_path(@user) redirect_to @user
return return
else else
flash[:alert] = "Something went wrong, please contact us ingame." flash[:alert] = "Something went wrong, please contact us ingame."
@@ -103,7 +104,7 @@ class UsersController < ApplicationController
RedstonerMailer.register_info_mail(@user, is_idiot).deliver RedstonerMailer.register_info_mail(@user, is_idiot).deliver
rescue => e rescue => e
Rails.logger.error "---" Rails.logger.error "---"
Rails.logger.error "WARNING: registration mail failed for user #{@user.name}, #{@user.email}" Rails.logger.error "WARNING: registration mail failed for user #{@user.try(:name)}, #{@user.try(:email)}"
Rails.logger.error e.message Rails.logger.error e.message
Rails.logger.error "---" Rails.logger.error "---"
flash[:alert] = "Registration mail failed. Please contact us in-game." flash[:alert] = "Registration mail failed. Please contact us in-game."
@@ -201,6 +202,59 @@ class UsersController < ApplicationController
end end
end end
def edit_login
@user = User.find(params[:id])
unless @user.is?(current_user) || admin? && current_user.role > @user.role || superadmin?
flash[:alert] = "You are not allowed to edit this user's login details!"
redirect_to @user
end
end
def update_login
@user = User.find(params[:id])
if @user.is?(current_user) || admin? && current_user.role > @user.role || superadmin?
authenticated = !@user.is?(current_user) || @user.authenticate(params[:current_password])
if params[:user][:password].present?
@user.password = params[:user][:password]
@user.password_confirmation = params[:user][:password_confirmation]
end
@user.email = params[:user][:email] if params[:user][:email].present?
mail_changed = @user.email_changed?
@user.email_token = SecureRandom.hex(16) if mail_changed
@user.confirmed = !mail_changed
# checking here for password so we can send back changes to the view
if authenticated
if @user.save
flash[:notice] = "Login details updated!"
if mail_changed
begin
background_mailer([RedstonerMailer.email_change_confirm_mail(@user)])
flash[:notice] += " Please check your inbox."
rescue
Rails.logger.error "---"
Rails.logger.error "WARNING: email change confirmation mail (view) failed for user #{@user.try(:name)}, #{@user.try(:email)}"
Rails.logger.error e.message
Rails.logger.error "---"
flash[:alert] = "We're having problems with your confirmation mail, please contact us!"
end
end
redirect_to @user
else
flash[:alert] = "Error while updating your login details!"
render action: "edit_login"
end
else
flash[:alert] = "Wrong password!"
render action: "edit_login"
end
else
flash[:alert] = "You are not allowed to edit this user's login details!"
redirect_to @user
end
end
private private

View File

@@ -7,11 +7,16 @@ module MailerHelper
mail.deliver mail.deliver
rescue => e rescue => e
Rails.logger.error "---" Rails.logger.error "---"
Rails.logger.error "WARNING: '#{mail.try(:subject)}' failed for user #{@user.name}, #{@user.email}" Rails.logger.error "WARNING: '#{mail.try(:subject)}' failed for user #{@user.try(:name)}, #{@user.try(:email)}"
Rails.logger.error e.message Rails.logger.error e.message
Rails.logger.error "---" Rails.logger.error "---"
end end
end end
rescue => e
Rails.logger.error "---"
Rails.logger.error "WARNING: Problem while processing mails:"
Rails.logger.error e.message
Rails.logger.error "---"
ensure ensure
# threads open their own DB connection # threads open their own DB connection
ActiveRecord::Base.connection.close ActiveRecord::Base.connection.close

View File

@@ -7,18 +7,23 @@ class RedstonerMailer < ActionMailer::Base
def register_mail(user, uses_mc_pass) def register_mail(user, uses_mc_pass)
@user = user @user = user
@mcpw = uses_mc_pass @mcpw = uses_mc_pass
mail(to: @user.email, subject: "Registration on Redstoner.com", from: "info@redstoner.com", reply_to: "redstonerserver+website@gmail.com") mail(to: @user.email, subject: "Registration on Redstoner.com")
end end
def register_info_mail(user, uses_mc_pass) def register_info_mail(user, uses_mc_pass)
@user = user @user = user
@mcpw = uses_mc_pass @mcpw = uses_mc_pass
mail(to: "redstonerserver@gmail.com", subject: "#{@user.name} registered on Redstoner.com", from: "info@redstoner.com", reply_to: "redstonerserver+website@gmail.com") mail(to: "redstonerserver@gmail.com", subject: "#{@user.name} registered on Redstoner")
end end
def thread_reply_mail(user, reply) def thread_reply_mail(user, reply)
@user = user @user = user
@reply = reply @reply = reply
mail(to: @user.email, subject: "#{reply.author.name} replied to '#{reply.thread.title}' on Redstoner", from: "info@redstoner", reply_to: "redstonerserver+website@gmail") mail(to: @user.email, subject: "#{reply.author.name} replied to '#{reply.thread.title}' on Redstoner")
end
def email_change_confirm_mail(user)
@user = user
mail(to: @user.email, subject: "Email change on Redstoner.com")
end end
end end

View File

@@ -10,10 +10,10 @@ class User < ActiveRecord::Base
before_validation :strip_whitespaces, :set_uuid, :set_name, :set_email_token, :set_role before_validation :strip_whitespaces, :set_uuid, :set_name, :set_email_token, :set_role
validates_presence_of :password, :password_confirmation, :email_token, :on => :create validates_presence_of :password, :password_confirmation, :email_token, on: :create
validates_presence_of :name, :email, :ign validates_presence_of :name, :email, :ign
validates_length_of :password, in: 8..256, :on => :create validates_length_of :password, in: 8..256, on: [:create, :update], allow_nil: true
validates_length_of :name, in: 2..30 validates_length_of :name, in: 2..30
validates_length_of :about, maximum: 5000 validates_length_of :about, maximum: 5000
validates_length_of :ign, minimum: 1, maximum: 16 validates_length_of :ign, minimum: 1, maximum: 16

View File

@@ -0,0 +1,31 @@
<div style="font-family: 'Oswald','Calibri','Arial','DejaVu Sans','Open Sans','Lucida Sans','Lucida Grande','Lucida Sans Unicode',sans-serif; background: #F2F2F2">
<div style="color: rgb(63, 63, 63); width: 600px; max-width: 100%; padding: 2em; margin: auto">
Hi <%= @user.name %>!
<p>You changed your email on Redstoner.com!</p>
<p>Please <%= link_to "confirm", confirm_user_url(@user, code: @user.email_token), style: "text-decoration: none; color: #4096EE;" %> your new email address (<b><%= @user.email %></b>).</p>
<div>
<p>Please click this link to confirm your new email:
</p>
<div width="100%" style="background-color: #ddd; padding: 1em; margin: 0; text-align: center;">
<%= link_to "confirm email change", confirm_user_url(@user, code: @user.email_token), style: "text-decoration: none; color: #f2f2f2; padding: 0.5em 2em; background-color: #4096EE; border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px; display: inline-block; text-transform: uppercase;" %>
</div>
<p></p>
<p>If you have any questions or problems, just ask one of our <%= link_to "Staff", users_url(role: "staff"), style: "text-decoration: none; color: #4096EE;" %> in-game.</p>
<p>Your Redstoner team</p>
</div>
</div>
<div style="background: none repeat scroll 0% 0% rgb(68, 68, 68); width: 100%; padding: 2em; color: rgb(255, 255, 255); margin:auto; text-align: center;">
<p><i>If you did not change your mail on redstoner.com please ignore this email!</i>
</p>
<p>You can contact us via:
<%= link_to "Website", root_url, style: "text-decoration: none; color: #4096EE;" %> |
<%= link_to "Twitter", "https://twitter.com/RedstonerServer", style: "text-decoration: none; color: #4096EE;" %> |
<%= link_to "Google+", "https://google.com/+Redstoner", style: "text-decoration: none; color: #4096EE;" %> |
<%= link_to "Email", "mailto:redstonerserver+website@gmail.com", style: "text-decoration: none; color: #4096EE;" %>
</p>
</div>
</div>

View File

@@ -4,7 +4,7 @@
end end
%> %>
<%= link_to (@user.is?(current_user) ? "Your profile" : @user.name), current_user %> → Edit <%= link_to @user.name, current_user %> → Edit
<h1>Edit profile</h1> <h1>Edit profile</h1>
<%= form_for @user do |f| %> <%= form_for @user do |f| %>
@@ -60,7 +60,9 @@
</tbody> </tbody>
</table> </table>
<p><%= f.submit "Save profile", class: "btn blue", disabled: (!@user.confirmed? && @user.is?(current_user)) %></p> <p><%= f.submit "Save profile", class: "btn blue left", disabled: (!@user.confirmed? && @user.is?(current_user)) %></p>
<p><%= link_to "Edit login details", edit_login_user_path(@user), class: "btn blue right" %></p>
<div class="clear"></div>
<% if !@user.confirmed? %> <% if !@user.confirmed? %>
<% if @user.is?(current_user) %> <% if @user.is?(current_user) %>

View File

@@ -0,0 +1,36 @@
<%= link_to @user.name, @user %> → Edit Login credentials
<h1>Edit Login credentials</h1>
<%= form_for @user, url: update_login_user_path(@user), method: :put do |f| %>
<table>
<tbody>
<tr>
<td>New email</td>
<td>
<%= f.text_field :email %>
</td>
</tr>
<tr>
<td>New password</td>
<td>
<%= f.password_field :password %>
</td>
</tr>
<tr>
<td>Repeat new password</td>
<td>
<%= f.password_field :password_confirmation %>
</td>
</tr>
<tr>
<td>Current password</td>
<td>
<%= password_field_tag :current_password, nil, disabled: !@user.is?(current_user) %>
</td>
</tr>
</tbody>
</table>
<p><%= f.submit "Save changes", class: "btn blue left" %></p>
<div class="clear"></div>
<% end %>

View File

@@ -16,6 +16,8 @@ Redstoner::Application.routes.draw do
resources :users do resources :users do
member do member do
get 'confirm' get 'confirm'
get 'edit_login'
put 'update_login'
end end
end end

View File

@@ -23,4 +23,8 @@ class RegistrationPreview < ActionMailer::Preview
reply = Threadreply.new(id: 312, user_author: @@user, content: "# Markdown!\n\n`incline code`\n\n<b>html?</b>\n\n[yt:abcd1234]\n\n[link](/forums)", forumthread: thread) reply = Threadreply.new(id: 312, user_author: @@user, content: "# Markdown!\n\n`incline code`\n\n<b>html?</b>\n\n[yt:abcd1234]\n\n[link](/forums)", forumthread: thread)
RedstonerMailer.thread_reply_mail(@@user, reply) RedstonerMailer.thread_reply_mail(@@user, reply)
end end
def email_change_confirm_mail
RedstonerMailer.email_change_confirm_mail(@@user)
end
end end