|
|
- # frozen_string_literal: true
-
- # == Schema Information
- #
- # Table name: system_keys
- #
- # id :bigint(8) not null, primary key
- # key :binary
- # created_at :datetime not null
- # updated_at :datetime not null
- #
- class SystemKey < ApplicationRecord
- ROTATION_PERIOD = 1.week.freeze
-
- before_validation :set_key
-
- scope :expired, ->(now = Time.now.utc) { where(arel_table[:created_at].lt(now - ROTATION_PERIOD * 3)) }
-
- class << self
- def current_key
- previous_key = order(id: :asc).last
-
- if previous_key && previous_key.created_at >= ROTATION_PERIOD.ago
- previous_key.key
- else
- create.key
- end
- end
- end
-
- private
-
- def set_key
- return if key.present?
-
- cipher = OpenSSL::Cipher.new('AES-256-GCM')
- cipher.encrypt
-
- self.key = cipher.random_key
- end
- end
|