mashirozx/mastodon

View on GitHub
app/models/system_key.rb

Summary

Maintainability
A
0 mins
Test Coverage
# 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