Sha256: 8c3c73e49679bb16228d7dc1209fbe0b72debb492e841241399ab6d807d38771

Contents?: true

Size: 1.29 KB

Versions: 4

Compression:

Stored size: 1.29 KB

Contents

# frozen_string_literal: true

module RailsBase::Mfa::Totp
  class ValidateTemporaryCode < RailsBase::ServiceBase
    include Helper

    delegate :user, to: :context
    delegate :otp_code, to: :context

    def call
      valid_code = ValidateCode.(user: user, otp_code: otp_code, otp_secret: current_secret)
      if valid_code.failure?
        log(level: :debug, msg: "#{lgp} Code Validation failed. Will not persist temporary token")
        context.fail!(message: valid_code.message)
      end

      log(level: :info, msg: "#{lgp} correctly validated authenticator code. Persisting")
      user.persist_otp_metadata!
      if user.otp_backup_codes.empty?
        backup_codes = user.generate_otp_backup_codes!
        log(level: :info, msg: "#{lgp} first authenticator added. Generating Backup Codes. Will also return backup codes to user")
        context.backup_codes = backup_codes
      else
        log(level: :warn, msg: "#{lgp} added additional Authenticator. Will NOT provide backup codes")
      end
    end

    def current_secret
      @current_secret ||= user.reload.otp_metadata(safe: true, use_existing_temp: true)[:secret]
    end

    def validate!
      raise "Expected user to be a User. " unless User === user
      raise "Expected otp_code to be present" if otp_code.nil?
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
rails_base-0.82.0 app/services/rails_base/mfa/totp/validate_temporary_code.rb
rails_base-0.81.1 app/services/rails_base/mfa/totp/validate_temporary_code.rb
rails_base-0.81.0 app/services/rails_base/mfa/totp/validate_temporary_code.rb
rails_base-0.80.0 app/services/rails_base/mfa/totp/validate_temporary_code.rb