Add optional hCaptcha support

Fixes #1649

This requires setting `HCAPTCHA_SECRET_KEY` and `HCAPTCHA_SITE_KEY`, then
enabling the admin setting at
`/admin/settings/edit#form_admin_settings_captcha_enabled`

Subsequently, a hCaptcha widget will be displayed on `/about` and
`/auth/sign_up` unless:
- the user is already signed-up already
- the user has used an invite link
- the user has already solved the captcha (and registration failed for another
  reason)

The Content-Security-Policy headers are altered automatically to allow the
third-party hCaptcha scripts on `/about` and `/auth/sign_up` following the same
rules as above.
This commit is contained in:
Claire
2022-01-24 19:06:19 +01:00
parent e58e0eb9aa
commit 1b493c9fee
15 changed files with 121 additions and 2 deletions

View File

@@ -2,6 +2,7 @@
class Auth::RegistrationsController < Devise::RegistrationsController
include RegistrationSpamConcern
include CaptchaConcern
layout :determine_layout
@@ -15,6 +16,8 @@ class Auth::RegistrationsController < Devise::RegistrationsController
before_action :require_not_suspended!, only: [:update]
before_action :set_cache_headers, only: [:edit, :update]
before_action :set_registration_form_time, only: :new
before_action :extend_csp_for_captcha!, only: [:new, :create]
before_action :check_captcha!, only: :create
skip_before_action :require_functional!, only: [:edit, :update]
@@ -135,4 +138,18 @@ class Auth::RegistrationsController < Devise::RegistrationsController
def set_cache_headers
response.headers['Cache-Control'] = 'no-cache, no-store, max-age=0, must-revalidate'
end
def sign_up(resource_name, resource)
clear_captcha!
super
end
def check_captcha!
super do |error|
build_resource(sign_up_params)
resource.validate
resource.errors.add(:base, error)
respond_with resource
end
end
end