18F/identity-idp

View on GitHub
app/models/concerns/backup_code_encrypted_attribute_overrides.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
# frozen_string_literal: true

module BackupCodeEncryptedAttributeOverrides
  extend ActiveSupport::Concern

  # Override ActiveModel::Dirty methods in order to
  # use salted_code_fingerprint_changed? instead of code_changed?
  # This is necessary because code is no longer an ActiveRecord
  # attribute and all the *_changed and *_was magic no longer works.
  def will_save_change_to_code?
    salted_code_fingerprint_changed?
  end

  # Override usual setter method in order to also set fingerprint
  def code=(code)
    code = RandomPhrase.normalize(code)

    if code.present? && code_cost.present? && code_salt.present?
      self.salted_code_fingerprint = BackupCodeConfiguration.scrypt_password_digest(
        password: code,
        salt: code_salt,
        cost: code_cost,
      )
    end
  end
end