forked from External/greenlight
Added recaptcha to reset password if enabled (#2475)
This commit is contained in:
parent
b8575bd512
commit
6ee92c839b
|
@ -23,22 +23,22 @@ class PasswordResetsController < ApplicationController
|
|||
before_action :find_user, only: [:edit, :update]
|
||||
before_action :check_expiration, only: [:edit, :update]
|
||||
|
||||
# POST /password_resets/new
|
||||
# GET /password_resets/new
|
||||
def new
|
||||
end
|
||||
|
||||
# POST /password_resets
|
||||
def create
|
||||
begin
|
||||
# Check if user exists and throw an error if he doesn't
|
||||
@user = User.find_by!(email: params[:password_reset][:email].downcase, provider: @user_domain)
|
||||
return redirect_to new_password_reset_path, flash: { alert: I18n.t("reset_password.captcha") } unless valid_captcha
|
||||
|
||||
send_password_reset_email(@user, @user.create_reset_digest)
|
||||
redirect_to root_path
|
||||
rescue
|
||||
# User doesn't exist
|
||||
redirect_to root_path, flash: { success: I18n.t("email_sent", email_type: t("reset_password.subtitle")) }
|
||||
end
|
||||
# Check if user exists and throw an error if he doesn't
|
||||
@user = User.find_by!(email: params[:password_reset][:email].downcase, provider: @user_domain)
|
||||
|
||||
send_password_reset_email(@user, @user.create_reset_digest)
|
||||
redirect_to root_path
|
||||
rescue
|
||||
# User doesn't exist
|
||||
redirect_to root_path, flash: { success: I18n.t("email_sent", email_type: t("reset_password.subtitle")) }
|
||||
end
|
||||
|
||||
# GET /password_resets/:id/edit
|
||||
|
@ -84,4 +84,10 @@ class PasswordResetsController < ApplicationController
|
|||
def disable_password_reset
|
||||
redirect_to '/404'
|
||||
end
|
||||
|
||||
# Checks that the captcha passed is valid
|
||||
def valid_captcha
|
||||
return true unless Rails.configuration.recaptcha_enabled
|
||||
verify_recaptcha
|
||||
end
|
||||
end
|
||||
|
|
|
@ -26,6 +26,12 @@
|
|||
<%= f.email_field :email, class: "form-control" %>
|
||||
<br>
|
||||
|
||||
<% if recaptcha_enabled? %>
|
||||
<div class="form-group">
|
||||
<%= recaptcha_tags %>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<%= f.submit t("forgot_password.submit"), class: "btn btn-primary" %>
|
||||
<% end %>
|
||||
</div>
|
||||
|
|
|
@ -526,6 +526,7 @@ en:
|
|||
remove: Remove
|
||||
rename: Rename
|
||||
reset_password:
|
||||
captcha: reCAPTCHA verification failed, please try again.
|
||||
invalid_token: Password reset token is invalid. Please try resetting your password again.
|
||||
subtitle: Reset Password
|
||||
password: New Password
|
||||
|
|
|
@ -71,6 +71,43 @@ describe PasswordResetsController, type: :controller do
|
|||
expect(response).to redirect_to("/404")
|
||||
end
|
||||
end
|
||||
|
||||
context "reCAPTCHA enabled" do
|
||||
before do
|
||||
allow(Rails.configuration).to receive(:enable_email_verification).and_return(true)
|
||||
allow(Rails.configuration).to receive(:recaptcha_enabled).and_return(true)
|
||||
end
|
||||
|
||||
it "sends a reset email if the recaptcha was passed" do
|
||||
allow(controller).to receive(:valid_captcha).and_return(true)
|
||||
|
||||
user = create(:user, provider: "greenlight")
|
||||
|
||||
params = {
|
||||
password_reset: {
|
||||
email: user.email,
|
||||
},
|
||||
}
|
||||
|
||||
expect { post :create, params: params }.to change { ActionMailer::Base.deliveries.count }.by(1)
|
||||
end
|
||||
|
||||
it "doesn't send an email if the recaptcha was failed" do
|
||||
allow(controller).to receive(:valid_captcha).and_return(false)
|
||||
|
||||
user = create(:user)
|
||||
|
||||
params = {
|
||||
password_reset: {
|
||||
email: user.email,
|
||||
},
|
||||
}
|
||||
|
||||
post :create, params: params
|
||||
expect(response).to redirect_to(new_password_reset_path)
|
||||
expect(flash[:alert]).to be_present
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "PATCH #update" do
|
||||
|
|
Loading…
Reference in New Issue