class GraphQL::Guard

Constants

ANY_FIELD_NAME
DEFAULT_NOT_AUTHORIZED
MASKING_FILTER
NotAuthorizedError
VERSION

Attributes

not_authorized[R]
policy_object[R]

Public Class Methods

new(policy_object: nil, not_authorized: DEFAULT_NOT_AUTHORIZED) click to toggle source
# File lib/graphql/guard.rb, line 23
def initialize(policy_object: nil, not_authorized: DEFAULT_NOT_AUTHORIZED)
  @policy_object = policy_object
  @not_authorized = not_authorized
end

Private Class Methods

default_filter() click to toggle source
# File lib/graphql/guard.rb, line 59
def self.default_filter
  GraphQL::Filter.new(except: default_mask).merge(only: MASKING_FILTER)
end

Public Instance Methods

find_guard_proc(type, field) click to toggle source
# File lib/graphql/guard.rb, line 46
def find_guard_proc(type, field)
  return unless type.respond_to?(:type_class)

  inline_guard(field) ||
    policy_object_guard(type.type_class, field.name.to_sym) ||
    inline_guard(type) ||
    policy_object_guard(type.type_class, ANY_FIELD_NAME)
end
trace(event, trace_data) { || ... } click to toggle source
# File lib/graphql/guard.rb, line 38
def trace(event, trace_data)
  if event == 'execute_field'
    ensure_guarded(trace_data) { yield }
  else
    yield
  end
end
use(schema_definition) click to toggle source
# File lib/graphql/guard.rb, line 28
def use(schema_definition)
  if schema_definition.interpreter?
    schema_definition.tracer(self)
  else
    raise "Please use the graphql gem version >= 1.10 with GraphQL::Execution::Interpreter"
  end

  add_schema_masking!(schema_definition)
end

Private Instance Methods

add_schema_masking!(schema_definition) click to toggle source
# File lib/graphql/guard.rb, line 57
def add_schema_masking!(schema_definition)
  schema_definition.class_eval do
    def self.default_filter
      GraphQL::Filter.new(except: default_mask).merge(only: MASKING_FILTER)
    end
  end
end
args(trace_data) click to toggle source
# File lib/graphql/guard.rb, line 77
def args(trace_data)
  if trace_data[:arguments].key?(:input) && !trace_data[:arguments][:input].is_a?(Hash)
    return trace_data[:arguments][:input] # Relay mutation input
  end

  trace_data[:arguments]
end
ensure_guarded(trace_data) { || ... } click to toggle source
# File lib/graphql/guard.rb, line 65
def ensure_guarded(trace_data)
  field = trace_data[:field]
  guard_proc = find_guard_proc(field.owner, field)
  return yield unless guard_proc

  if guard_proc.call(trace_data[:object], args(trace_data), trace_data[:query].context)
    yield
  else
    not_authorized.call(field.owner.graphql_definition, field.name.to_sym)
  end
end
inline_guard(type_or_field) click to toggle source
# File lib/graphql/guard.rb, line 89
def inline_guard(type_or_field)
  type_or_field.graphql_definition.metadata[:guard]
end
policy_object_guard(type, field_name) click to toggle source
# File lib/graphql/guard.rb, line 85
def policy_object_guard(type, field_name)
  @policy_object && @policy_object.guard(type, field_name)
end