Sha256: 53d0225ab048a9396e89740d897273f0f993d840a9dc12a48917f99e982cf2bf

Contents?: true

Size: 1.16 KB

Versions: 5

Compression:

Stored size: 1.16 KB

Contents

# frozen_string_literal: true

module Masks
  module Rails
    class Key < ApplicationRecord
      include Masks::Scoped

      self.table_name = "keys"

      class << self
        def sha(secret)
          Digest::SHA512.hexdigest(secret)
        end
      end

      scope :latest, -> { order(created_at: :desc) }

      attribute :session
      attribute :secret

      serialize :scopes, coder: JSON

      belongs_to :actor, class_name: Masks.configuration.models[:actor]

      after_initialize :generate_hash

      validates :name, presence: true, length: { maximum: 32 }
      validates :sha, presence: true, uniqueness: true

      def nickname
        [name.parameterize, sha.slice(0...32)].join("-")
      end

      alias slug nickname

      def scopes
        value = self[:scopes]

        return [] unless value

        value & (actor&.scopes || [])
      end

      def roles_for(_record, **_opts)
        []
      end

      private

      def generate_secret
        self.secret ||= SecureRandom.uuid
      end

      def generate_hash
        self.secret ||= SecureRandom.uuid

        self.sha = self.class.sha(secret) if self.secret
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
masks-0.4.0 app/models/masks/rails/key.rb
masks-0.3.2 app/models/masks/rails/key.rb
masks-0.3.1 app/models/masks/rails/key.rb
masks-0.3.0 app/models/masks/rails/key.rb
masks-0.2.0 app/models/masks/rails/key.rb