class Conjur::Policy::FlattenResolver

Flattens and sorts all records into a single list, including YAML lists and policy body.

Public Instance Methods

resolve(records) click to toggle source
# File lib/conjur/policy/resolver.rb, line 166
def resolve records
  @result = []
  traverse records, Set.new, method(:resolve_record), method(:on_resolve_policy)

  # Sort record creation before anything else.
  # Sort record creation in dependency order (if A owns B, then A will be created before B).
  # Otherwise, preserve the existing order.

  @stable_index = {}
  @result.each_with_index do |obj, idx|
    @stable_index[obj] = idx
  end
  @referenced_record_index = {}
  @result.each_with_index do |obj, idx|
    @referenced_record_index[obj] = obj.referenced_records.select{|r| r.respond_to?(:roleid)}.map(&:roleid)
  end
  @result.flatten.sort do |a,b|
    score = sort_score(a) - sort_score(b)
    if score == 0
      if a.respond_to?(:roleid) && @referenced_record_index[b].member?(a.roleid) &&
        b.respond_to?(:roleid) && @referenced_record_index[a].member?(b.roleid)
        raise "Dependency cycle encountered between #{a} and #{b}"
      elsif a.respond_to?(:roleid) && @referenced_record_index[b].member?(a.roleid)
        score = -1
      elsif b.respond_to?(:roleid) && @referenced_record_index[a].member?(b.roleid)
        score = 1
      else
        score = @stable_index[a] - @stable_index[b]
      end
    end
    score
  end
end

Protected Instance Methods

on_resolve_policy(policy, visited) click to toggle source

Recurse on the policy body records.

# File lib/conjur/policy/resolver.rb, line 217
def on_resolve_policy policy, visited
  body = policy.body
  policy.remove_instance_variable "@body"
  traverse body, visited, method(:resolve_record), method(:on_resolve_policy)
end
resolve_record(record, visited) click to toggle source

Add the record to the result.

# File lib/conjur/policy/resolver.rb, line 212
def resolve_record record, visited
  @result += Array(record)
end
sort_score(record) click to toggle source

Sort “Create” and “Record” objects to the front.

# File lib/conjur/policy/resolver.rb, line 203
def sort_score record
  if record.is_a?(Types::Create) || record.is_a?(Types::Record)
    -1
  else
    0
  end
end