module Devise::RegistrationsControllerExtensions

Public Class Methods

prepended(base) click to toggle source
# File lib/rose_quartz/devise/controllers/registrations_controller_extensions.rb, line 7
def self.prepended(base)
  base.class_eval do
    helper_method :two_factor_authentication_enabled?,
                  :two_factor_authentication_backup_code,
                  :two_factor_authentication_qr_code_uri,
                  :two_factor_authentication_secret
  end
end

Public Instance Methods

update_resource(resource, _params) click to toggle source
Calls superclass method
# File lib/rose_quartz/devise/controllers/registrations_controller_extensions.rb, line 16
def update_resource(resource, _params)
  result = super
  edit_two_factor_authentication(resource) if result
  result
end

Protected Instance Methods

two_factor_authentication_backup_code() click to toggle source
# File lib/rose_quartz/devise/controllers/registrations_controller_extensions.rb, line 30
def two_factor_authentication_backup_code
  authenticator(resource).backup_code
end
two_factor_authentication_enabled?(user = resource) click to toggle source

View helpers

# File lib/rose_quartz/devise/controllers/registrations_controller_extensions.rb, line 26
def two_factor_authentication_enabled?(user = resource)
  RoseQuartz::UserAuthenticator.exists? user_id: user.id
end
two_factor_authentication_qr_code_uri(size:) click to toggle source
# File lib/rose_quartz/devise/controllers/registrations_controller_extensions.rb, line 34
def two_factor_authentication_qr_code_uri(size:)
  uri = authenticator.provisioning_uri
  qr = RQRCode::QRCode.new(uri)
  qr.as_png(size: size).to_data_url
end
two_factor_authentication_secret() click to toggle source
# File lib/rose_quartz/devise/controllers/registrations_controller_extensions.rb, line 40
def two_factor_authentication_secret
  authenticator.secret
end

Private Instance Methods

authenticator(existing_user = nil) click to toggle source
# File lib/rose_quartz/devise/controllers/registrations_controller_extensions.rb, line 81
def authenticator(existing_user = nil)
  @authenticator ||= if existing_user
    RoseQuartz::UserAuthenticator.find_by(user_id: resource.id)
  else
    RoseQuartz::UserAuthenticator.new(user: resource)
  end
end
disable_two_factor_authentication!(resource) click to toggle source
# File lib/rose_quartz/devise/controllers/registrations_controller_extensions.rb, line 57
def disable_two_factor_authentication!(resource)
  authenticator(resource).disable!
end
edit_two_factor_authentication(resource) click to toggle source

Internal logic

# File lib/rose_quartz/devise/controllers/registrations_controller_extensions.rb, line 48
def edit_two_factor_authentication(resource)
  if two_factor_authentication_enabled?
    disable_two_factor_authentication!(resource) if form_params[:disable] == '1'
    reset_two_factor_authentication_backup_code!(resource) if form_params[:reset_backup_code] == '1'
  else
    enable_two_factor_authentication!(resource)
  end
end
enable_two_factor_authentication!(resource) click to toggle source
# File lib/rose_quartz/devise/controllers/registrations_controller_extensions.rb, line 65
def enable_two_factor_authentication!(resource)
  secret, token = form_params.values_at(:secret, :token)
  authenticator = RoseQuartz::UserAuthenticator.new(user: resource, secret: secret)
  token_valid = authenticator.authenticate_otp!(token) rescue false
  if token_valid
    authenticator.save
    flash[:alert] = I18n.t('rose_quartz.tfa_enabled')
  else
    resource.errors.add(:base, I18n.t('rose_quartz.invalid_token_when_enabling_tfa'))
  end
end
form_params() click to toggle source
# File lib/rose_quartz/devise/controllers/registrations_controller_extensions.rb, line 77
def form_params
  params.require(:two_factor_authentication).permit(:secret, :token, :disable, :reset_backup_code)
end
reset_two_factor_authentication_backup_code!(resource) click to toggle source
# File lib/rose_quartz/devise/controllers/registrations_controller_extensions.rb, line 61
def reset_two_factor_authentication_backup_code!(resource)
  authenticator(resource).reset_backup_code!
end