Class: GraphQL::Schema::Warden Private
- Inherits:
-
Object
- Object
- GraphQL::Schema::Warden
- Defined in:
- lib/graphql/schema/warden.rb
Overview
This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.
Restrict access to a GraphQL::Schema with a user-defined filter.
When validating and executing a query, all access to schema members should go through a warden. If you access the schema directly, you may show a client something that it shouldn't be allowed to see.
Defined Under Namespace
Classes: NullWarden, PassThruWarden
Class Method Summary collapse
- .from_context(context) ⇒ Object private
- .visible_entry?(visibility_method, entry, context, warden = Warden.from_context(context)) ⇒ Object? private
Instance Method Summary collapse
-
#arguments(argument_owner, ctx = nil) ⇒ Array<GraphQL::Argument>
private
Visible arguments on
argument_owner
. - #directives ⇒ Object private
-
#enum_values(enum_defn) ⇒ Array<GraphQL::EnumType::EnumValue>
private
Visible members of
enum_defn
. -
#fields(type_defn) ⇒ Array<GraphQL::Field>
private
Fields on
type_defn
. -
#get_argument(parent_type, argument_name) ⇒ GraphQL::Argument?
private
The argument named
argument_name
onparent_type
, if it exists and is visible. -
#get_field(parent_type, field_name) ⇒ GraphQL::Field?
private
The field named
field_name
onparent_type
, if it exists. -
#get_type(type_name) ⇒ GraphQL::BaseType?
private
The type named
type_name
, if it exists (elsenil
). -
#initialize(filter = nil, context:, schema:) ⇒ Warden
constructor
private
A new instance of Warden.
- #interface_type_memberships(obj_type, _ctx = nil) ⇒ Object private
-
#interfaces(obj_type) ⇒ Array<GraphQL::InterfaceType>
private
Visible interfaces implemented by
obj_type
. -
#possible_types(type_defn) ⇒ Array<GraphQL::BaseType>
private
The types which may be member of
type_defn
. -
#reachable_type?(type_name) ⇒ Boolean
private
Boolean True if the type is visible and reachable in the schema.
-
#reachable_types ⇒ Array<GraphQL::BaseType>
private
Visible and reachable types in the schema.
- #root_type_for_operation(op_name) ⇒ Object private
-
#types ⇒ Hash<String, GraphQL::BaseType>
private
Visible types in the schema.
- #visible_argument?(arg_defn, _ctx = nil) ⇒ Boolean private
- #visible_enum_value?(enum_value, _ctx = nil) ⇒ Boolean private
- #visible_field?(field_defn, _ctx = nil, owner = field_defn.owner) ⇒ Boolean private
- #visible_type?(type_defn, _ctx = nil) ⇒ Boolean private
- #visible_type_membership?(type_membership, _ctx = nil) ⇒ Boolean private
Constructor Details
#initialize(filter = nil, context:, schema:) ⇒ Warden
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns a new instance of Warden.
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
# File 'lib/graphql/schema/warden.rb', line 120 def initialize(filter = nil, context:, schema:) @schema = schema # Cache these to avoid repeated hits to the inheritance chain when one isn't present @query = @schema.query @mutation = @schema.mutation @subscription = @schema.subscription @context = context @visibility_cache = if filter read_through { |m| filter.call(m, context) } else read_through { |m| schema.visible?(m, context) } end @visibility_cache.compare_by_identity # Initialize all ivars to improve object shape consistency: @types = @visible_types = @reachable_types = @visible_parent_fields = @visible_possible_types = @visible_fields = @visible_arguments = @visible_enum_arrays = @visible_enum_values = @visible_interfaces = @type_visibility = @type_memberships = @visible_and_reachable_type = @unions = @unfiltered_interfaces = @references_to = @reachable_type_set = nil end |
Class Method Details
.from_context(context) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
40 41 42 43 44 45 |
# File 'lib/graphql/schema/warden.rb', line 40 def self.from_context(context) context.warden || PassThruWarden rescue NoMethodError # this might be a hash which won't respond to #warden PassThruWarden end |
.visible_entry?(visibility_method, entry, context, warden = Warden.from_context(context)) ⇒ Object?
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/graphql/schema/warden.rb', line 53 def self.visible_entry?(visibility_method, entry, context, warden = Warden.from_context(context)) if entry.is_a?(Array) visible_item = nil entry.each do |item| if warden.public_send(visibility_method, item, context) if visible_item.nil? visible_item = item else raise DuplicateNamesError.new( duplicated_name: item.path, duplicated_definition_1: visible_item.inspect, duplicated_definition_2: item.inspect ) end end end visible_item elsif warden.public_send(visibility_method, entry, context) entry else nil end end |
Instance Method Details
#arguments(argument_owner, ctx = nil) ⇒ Array<GraphQL::Argument>
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns Visible arguments on argument_owner
.
221 222 223 224 |
# File 'lib/graphql/schema/warden.rb', line 221 def arguments(argument_owner, ctx = nil) @visible_arguments ||= read_through { |o| o.arguments(@context).each_value.select { |a| visible_argument?(a, @context) } } @visible_arguments[argument_owner] end |
#directives ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
249 250 251 |
# File 'lib/graphql/schema/warden.rb', line 249 def directives @schema.directives.each_value.select { |d| visible?(d) } end |
#enum_values(enum_defn) ⇒ Array<GraphQL::EnumType::EnumValue>
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns Visible members of enum_defn
.
227 228 229 230 231 232 233 234 235 236 |
# File 'lib/graphql/schema/warden.rb', line 227 def enum_values(enum_defn) @visible_enum_arrays ||= read_through { |e| values = e.enum_values(@context) if values.size == 0 raise GraphQL::Schema::Enum::MissingValuesError.new(e) end values } @visible_enum_arrays[enum_defn] end |
#fields(type_defn) ⇒ Array<GraphQL::Field>
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns Fields on type_defn
.
214 215 216 217 |
# File 'lib/graphql/schema/warden.rb', line 214 def fields(type_defn) @visible_fields ||= read_through { |t| @schema.get_fields(t, @context).values } @visible_fields[type_defn] end |
#get_argument(parent_type, argument_name) ⇒ GraphQL::Argument?
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns The argument named argument_name
on parent_type
, if it exists and is visible.
198 199 200 201 |
# File 'lib/graphql/schema/warden.rb', line 198 def get_argument(parent_type, argument_name) argument = parent_type.get_argument(argument_name, @context) return argument if argument && visible_argument?(argument, @context) end |
#get_field(parent_type, field_name) ⇒ GraphQL::Field?
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns The field named field_name
on parent_type
, if it exists.
182 183 184 185 186 187 188 189 190 191 192 193 194 195 |
# File 'lib/graphql/schema/warden.rb', line 182 def get_field(parent_type, field_name) @visible_parent_fields ||= read_through do |type| read_through do |f_name| field_defn = @schema.get_field(type, f_name, @context) if field_defn && visible_field?(field_defn, nil, type) field_defn else nil end end end @visible_parent_fields[parent_type][field_name] end |
#get_type(type_name) ⇒ GraphQL::BaseType?
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns The type named type_name
, if it exists (else nil
).
157 158 159 160 161 162 163 164 165 166 167 168 |
# File 'lib/graphql/schema/warden.rb', line 157 def get_type(type_name) @visible_types ||= read_through do |name| type_defn = @schema.get_type(name, @context) if type_defn && visible_and_reachable_type?(type_defn) type_defn else nil end end @visible_types[type_name] end |
#interface_type_memberships(obj_type, _ctx = nil) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
286 287 288 289 290 291 |
# File 'lib/graphql/schema/warden.rb', line 286 def interface_type_memberships(obj_type, _ctx = nil) @type_memberships ||= read_through do |obj_t| obj_t.interface_type_memberships end @type_memberships[obj_type] end |
#interfaces(obj_type) ⇒ Array<GraphQL::InterfaceType>
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns Visible interfaces implemented by obj_type
.
244 245 246 247 |
# File 'lib/graphql/schema/warden.rb', line 244 def interfaces(obj_type) @visible_interfaces ||= read_through { |t| t.interfaces(@context).select { |i| visible_type?(i) } } @visible_interfaces[obj_type] end |
#possible_types(type_defn) ⇒ Array<GraphQL::BaseType>
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns The types which may be member of type_defn
.
204 205 206 207 208 209 210 |
# File 'lib/graphql/schema/warden.rb', line 204 def possible_types(type_defn) @visible_possible_types ||= read_through { |type_defn| pt = @schema.possible_types(type_defn, @context) pt.select { |t| visible_and_reachable_type?(t) } } @visible_possible_types[type_defn] end |
#reachable_type?(type_name) ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns Boolean True if the type is visible and reachable in the schema.
176 177 178 179 |
# File 'lib/graphql/schema/warden.rb', line 176 def reachable_type?(type_name) type = get_type(type_name) # rubocop:disable Development/ContextIsPassedCop -- `self` is query-aware type && reachable_type_set.include?(type) end |
#reachable_types ⇒ Array<GraphQL::BaseType>
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns Visible and reachable types in the schema.
171 172 173 |
# File 'lib/graphql/schema/warden.rb', line 171 def reachable_types @reachable_types ||= reachable_type_set.to_a end |
#root_type_for_operation(op_name) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
253 254 255 256 257 258 259 260 |
# File 'lib/graphql/schema/warden.rb', line 253 def root_type_for_operation(op_name) root_type = @schema.root_type_for_operation(op_name) if root_type && visible?(root_type) root_type else nil end end |
#types ⇒ Hash<String, GraphQL::BaseType>
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns Visible types in the schema.
144 145 146 147 148 149 150 151 152 153 154 |
# File 'lib/graphql/schema/warden.rb', line 144 def types @types ||= begin vis_types = {} @schema.types(@context).each do |n, t| if visible_and_reachable_type?(t) vis_types[n] = t end end vis_types end end |
#visible_argument?(arg_defn, _ctx = nil) ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
273 274 275 |
# File 'lib/graphql/schema/warden.rb', line 273 def visible_argument?(arg_defn, _ctx = nil) visible?(arg_defn) && visible_and_reachable_type?(arg_defn.type.unwrap) end |
#visible_enum_value?(enum_value, _ctx = nil) ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
238 239 240 241 |
# File 'lib/graphql/schema/warden.rb', line 238 def visible_enum_value?(enum_value, _ctx = nil) @visible_enum_values ||= read_through { |ev| visible?(ev) } @visible_enum_values[enum_value] end |
#visible_field?(field_defn, _ctx = nil, owner = field_defn.owner) ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
263 264 265 266 267 268 269 270 271 |
# File 'lib/graphql/schema/warden.rb', line 263 def visible_field?(field_defn, _ctx = nil, owner = field_defn.owner) # This field is visible in its own right visible?(field_defn) && # This field's return type is visible visible_and_reachable_type?(field_defn.type.unwrap) && # This field is either defined on this object type, # or the interface it's inherited from is also visible ((field_defn.respond_to?(:owner) && field_defn.owner == owner) || field_on_visible_interface?(field_defn, owner)) end |
#visible_type?(type_defn, _ctx = nil) ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
277 278 279 280 |
# File 'lib/graphql/schema/warden.rb', line 277 def visible_type?(type_defn, _ctx = nil) @type_visibility ||= read_through { |type_defn| visible?(type_defn) } @type_visibility[type_defn] end |
#visible_type_membership?(type_membership, _ctx = nil) ⇒ Boolean
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
282 283 284 |
# File 'lib/graphql/schema/warden.rb', line 282 def visible_type_membership?(type_membership, _ctx = nil) visible?(type_membership) end |