1234567891011121314151617181920212223242526272829303132333435363738394041 |
- # 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
|