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