5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-11-26 09:36:21 +00:00

Merge branch 'issue-17722' into production.panel.sutty.nl

This commit is contained in:
f 2024-10-31 11:22:26 -03:00
commit 018ba9eabe
No known key found for this signature in database
2 changed files with 65 additions and 3 deletions

View file

@ -7,14 +7,57 @@ class RegistrationsController < Devise::RegistrationsController
class SpambotError < StandardError; end
prepend_before_action :anti_spambot_traps, only: %i[create]
prepend_after_action :lock_spambots, only: %i[create]
private
# Detecta spambots simples
# Condiciones bajo las que consideramos que un registro viene de unx
# spambot
#
# @return [Bool]
def spambot?
@spambot ||= params.dig(:usuarie, :name).present?
end
# Bloquea las cuentas de spam dentro de un minuto, para hacerles creer
# que la cuenta se creó correctamente.
def lock_spambots
return unless spambot?
return unless current_usuarie
LockUsuarieJob.set(wait: 1.minute).perform_later(usuarie: current_usuarie)
end
# Detecta e informa spambots muy simples
#
# @return [nil]
def anti_spambot_traps
raise SpambotError if params.dig(:usuarie, :name).blank?
raise SpambotError if spambot?
rescue SpambotError => e
ExceptionNotifier.notify_exception(e, data: { params: params })
ExceptionNotifier.notify_exception(e, data: { params: anonymized_params })
nil
end
# Devuelve parámetros anonimizados para prevenir filtrar la contraseña
# de falsos positivos.
#
# @return [Hash]
def anonymized_params
params.except(:authenticity_token).permit!.to_h.tap do |p|
p['usuarie'].delete 'password'
p['usuarie'].delete 'password_confirmation'
end
end
# Si le usuarie es considerade spambot, no enviamos el correo de
# confirmación al crear la cuenta.
def sign_up_params
if spambot?
params[:usuarie][:confirmed_at] = Time.now.utc
devise_parameter_sanitizer.permit(:sign_up, keys: %i[confirmed_at])
end
super
end
end

View file

@ -0,0 +1,19 @@
# frozen_string_literal: true
# Bloquea el acceso a une usuarie
class LockUsuarieJob < ApplicationJob
# Cambiamos la contraseña, aplicamos un bloqueo y cerramos la sesión
# para que no pueda volver a entrar hasta que siga las instrucciones
# de desbloqueo.
#
# @param :usuarie [Usuarie]
# @return [nil]
def perform(usuarie:)
password = SecureRandom.base36
usuarie.skip_password_change_notification!
usuarie.update(password: password, password_confirmation: password, remember_created_at: nil, locked_at: Time.utc.now)
nil
end
end