Sha256: d5da61849ea103fc2501050d479fc9c9210bfa1946078e41618c023dd4dea284

Contents?: true

Size: 1.15 KB

Versions: 1

Compression:

Stored size: 1.15 KB

Contents

module Aegis
  class Role

    attr_reader :name, :default_permission

    # permissions is a hash like: permissions[:edit_user] = lambda { |user| ... }
    def initialize(name, permissions, options)
      @name = name
      @permissions = permissions
      @default_permission = options[:default_permission] == :allow ? :allow : :deny
      freeze
    end

    def allow_by_default?
      @default_permission == :allow
    end

    def may?(permission, *args)
      # puts "may? #{permission}, #{args}"
      @permissions.may?(self, permission, *args)
    end

    def <=>(other)
      name.to_s <=> other.name.to_s
    end

    def to_s
      name.to_s.humanize
    end

    def id
      name.to_s
    end

    private

    def method_missing(symb, *args)
      method_name = symb.to_s
      if method_name =~ /^may_(.+)(\?|\!)$/
        permission, severity = $1, $2
        permission = Aegis::Normalization.normalize_permission(permission)
        may = may?(permission, *args)
        if severity == '!' && !may
          raise PermissionError, "Access denied: #{permission}"
        else
          may
        end
      else
        super
      end
    end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
Chrononaut-aegis-1.2.0 lib/aegis/role.rb