module Fences::Fortified

Constants

VERSION

Public Class Methods

included(base) click to toggle source
# File lib/fences/fortified.rb, line 7
def self.included(base)
  base.extend(ClassMethods).fencable
end

Public Instance Methods

allowed_to_in_relationships?(args) click to toggle source
# File lib/fences/fortified.rb, line 31
def allowed_to_in_relationships?(args)
  # Collect all of the has_many and belongs_to relationships
  # for the object to iterate over them and look for
  # the permission there
  allowed = false
  associations = self.class.reflect_on_all_associations(:has_many).map(&:name)
  associations += self.class.reflect_on_all_associations(:belongs_to).map(&:name)
  associations -=
    self.class.reject_permissions_from if self.class.respond_to?(:reject_permissions_from)
  associations.each do |assoc|
    relations = self.send(assoc)
    if relations.is_a?(Array)
      relations.each do |relation|
        relation_permissions = relation.permissions rescue nil
        if relation_permissions && relation_permissions.any?
          allowed = relation_permissions.where("name in (?)", args).any?
          return true if allowed
        end
      end
    else
      assoc_permissions = relations.permissions rescue nil
      if assoc_permissions && assoc_permissions.any?
        allowed = assoc_permissions.where("name in (?)", args).any?
        return true if allowed
      end
    end
  end
  false
end
is_allowed_to?(*args) click to toggle source
# File lib/fences/fortified.rb, line 11
def is_allowed_to?(*args)
  return true if resolve_implications(args)
  args = args.map(&:to_s)
  return true if self.permissions && self.permissions.where("name in (?)", args).any?
  allowed_to_in_relationships?(args)
end
method_missing(method_name, *args) click to toggle source
Calls superclass method
# File lib/fences/fortified.rb, line 18
def method_missing(method_name, *args)
  if method_name.to_s.match /(\w+)_implies/
    self.class.class_eval do
      define_method(method_name) do
        nil
      end
    end
    send(method_name)
  else
    super
  end
end
resolve_implications(args) click to toggle source
# File lib/fences/fortified.rb, line 61
def resolve_implications(args)
  # Add permission names that are implied by
  # each of the permissions passed in
  return true if args.include?(:all)
  return false if args.empty?
  args.each do |arg|
    args << self.send(arg.to_s + "_implies") if arg.is_a?(Symbol)
  end
  args.compact!
  false
end