login: provide specific error messages for certain failures - merged with i18n

This commit is contained in:
Carl Chenet 2017-05-23 14:33:59 +02:00
parent 44774bae6d
commit ecc97fb30a
3 changed files with 32 additions and 13 deletions

View file

@ -1,3 +1,8 @@
class LoginBannedError < StandardError; end
class LoginDeletedError < StandardError; end
class LoginTOTPFailedError < StandardError; end
class LoginFailedError < StandardError; end
class LoginController < ApplicationController class LoginController < ApplicationController
before_filter :authenticate_user before_filter :authenticate_user
@ -22,9 +27,11 @@ class LoginController < ApplicationController
user = User.where(:username => params[:email]).first user = User.where(:username => params[:email]).first
end end
fail_reason = nil
begin begin
if !user if !user
raise "no user" raise LoginFailedError
end end
if !user.authenticate(params[:password].to_s) if !user.authenticate(params[:password].to_s)
@ -36,18 +43,16 @@ class LoginController < ApplicationController
params[:password] = m[1] params[:password] = m[1]
params[:totp] = m[2] params[:totp] = m[2]
else else
raise "authentication failed" raise LoginFailedError
end end
end end
if user.is_banned? if user.is_banned?
raise "user is banned" raise LoginBannedError
end end
if !user.is_active? if !user.is_active?
user.undelete! raise LoginDeletedError
flash[:success] = "Your account has been reactivated and your " <<
"unmoderated comments have been undeleted."
end end
if !user.password_digest.to_s.match(/^\$2a\$#{BCrypt::Engine::DEFAULT_COST}\$/) if !user.password_digest.to_s.match(/^\$2a\$#{BCrypt::Engine::DEFAULT_COST}\$/)
@ -60,7 +65,7 @@ class LoginController < ApplicationController
if user.authenticate_totp(params[:totp]) if user.authenticate_totp(params[:totp])
# ok, fall through # ok, fall through
else else
raise "invalid TOTP code" raise LoginTOTPFailedError
end end
else else
return respond_to do |format| return respond_to do |format|
@ -100,18 +105,24 @@ class LoginController < ApplicationController
render :json => { :status => 1, :username => user.username } render :json => { :status => 1, :username => user.username }
} }
end end
rescue rescue LoginBannedError
fail_reason = I18n.t 'controllers.login_controller.bannedaccount'
rescue LoginDeletedError
fail_reason = I18n.t 'controllers.login_controller.deletedaccount'
rescue LoginTOTPFailedError
fail_reason = I18n.t 'controllers.login_controller.totpinvalid'
rescue LoginFailedError
fail_reason = I18n.t 'controllers.login_controller.flashlogininvalid'
end end
respond_to do |format| respond_to do |format|
format.html { format.html {
flash.now[:error] = I18n.t 'controllers.login_controller.flashlogininvalid' flash.now[:error] = fail_reason
@referer = params[:referer] @referer = params[:referer]
index index
} }
format.json { format.json {
render :json => { :status => 0, render :json => { :status => 0, :error => fail_reason }
:error => "invalid 'email' and/or 'password' parameter" }
} }
end end
end end
@ -171,7 +182,7 @@ class LoginController < ApplicationController
end end
end end
else else
flash[:error] = t(.invalidresettoken') flash[:error] = t('.invalidresettoken')
return redirect_to forgot_password_path return redirect_to forgot_password_path
end end
end end

View file

@ -62,7 +62,6 @@ en:
messageslink: "Messages" messageslink: "Messages"
loginlink: "Login" loginlink: "Login"
logoutlink: "Logout" logoutlink: "Logout"
confirmlogoutlink: "Are you sure you want to logout?"
moderationloglink: "Moderation Log" moderationloglink: "Moderation Log"
invitationqueuelink: "Invitation Queue" invitationqueuelink: "Invitation Queue"
chatlink: "Chat" chatlink: "Chat"
@ -286,6 +285,7 @@ en:
verifypasswordflash: "Your password could not be verified." verifypasswordflash: "Your password could not be verified."
index: index:
logoutlink: "Logout" logoutlink: "Logout"
confirmlogoutlink: "Are you sure you want to logout?"
viewprofile: "View Profile" viewprofile: "View Profile"
accountsettings: "Account Settings" accountsettings: "Account Settings"
username: "Username:" username: "Username:"
@ -517,6 +517,9 @@ en:
flashsuccessdeleteinvit: "Successfully deleted invitation request from %{name}" flashsuccessdeleteinvit: "Successfully deleted invitation request from %{name}"
login_controller: login_controller:
flashlogininvalid: "Invalid e-mail address and/or password." flashlogininvalid: "Invalid e-mail address and/or password."
totpinvalid: "Your TOTP code was invalid."
deletedaccount: "Your account has been deleted."
bannedaccount: "Your account has been banned."
messages_controller: messages_controller:
messagestitle: "Messages" messagestitle: "Messages"
messagessenttitle: "Messages Sent" messagessenttitle: "Messages Sent"

View file

@ -296,6 +296,7 @@ fr:
verifypasswordflash: "Votre mot de passe n'a pas pu être vérifié." verifypasswordflash: "Votre mot de passe n'a pas pu être vérifié."
index: index:
logoutlink: "Se déconnecter" logoutlink: "Se déconnecter"
confirmlogoutlink: "Êtes-vous sûr de vouloir vous déconnecter?"
viewprofile: "Voir le profil" viewprofile: "Voir le profil"
accountsettings: "Paramètres du compte" accountsettings: "Paramètres du compte"
username: "Utilisateur :" username: "Utilisateur :"
@ -527,6 +528,10 @@ fr:
flashsuccessdeleteinvit: "Demande d'invitation de %{name} supprimée avec succès" flashsuccessdeleteinvit: "Demande d'invitation de %{name} supprimée avec succès"
login_controller: login_controller:
flashlogininvalid: "Adresse e-mail et/ou mot de passe invalide." flashlogininvalid: "Adresse e-mail et/ou mot de passe invalide."
flashlogininvalid: "Adresse e-mail et/ou mot de passe invalide."
totpinvalid: "Votre code TOTP est invalide."
deletedaccount: "Votre compte a été supprimé."
bannedaccount: "Votre compte a été banni."
messages_controller: messages_controller:
messagestitle: "Messages" messagestitle: "Messages"
messagessenttitle: "Messages envoyés" messagessenttitle: "Messages envoyés"