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 visible?
implementations.
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, SchemaSubset
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(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
. -
#loadable?(type, _ctx) ⇒ Boolean
private
True if this type is used for
loads:
but not in the schema otherwise and not explicitly hidden. -
#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
-
#schema_subset ⇒ 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(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.
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 |
# File 'lib/graphql/schema/warden.rb', line 183 def initialize(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 = read_through { |m| schema.visible?(m, context) } # 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 = @reachable_type_set = @schema_subset = 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.
15 16 17 18 19 20 |
# File 'lib/graphql/schema/warden.rb', line 15 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.
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
# File 'lib/graphql/schema/warden.rb', line 28 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
.
283 284 285 286 287 288 289 290 291 292 293 294 295 |
# File 'lib/graphql/schema/warden.rb', line 283 def arguments(argument_owner, ctx = nil) @visible_arguments ||= read_through { |o| args = o.arguments(@context) if args.any? args = args.values args.select! { |a| visible_argument?(a, @context) } args else EmptyObjects::EMPTY_ARRAY end } @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.
326 327 328 |
# File 'lib/graphql/schema/warden.rb', line 326 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
.
298 299 300 301 302 303 304 305 306 307 |
# File 'lib/graphql/schema/warden.rb', line 298 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
.
276 277 278 279 |
# File 'lib/graphql/schema/warden.rb', line 276 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.
260 261 262 263 |
# File 'lib/graphql/schema/warden.rb', line 260 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.
244 245 246 247 248 249 250 251 252 253 254 255 256 257 |
# File 'lib/graphql/schema/warden.rb', line 244 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
).
219 220 221 222 223 224 225 226 227 228 229 230 |
# File 'lib/graphql/schema/warden.rb', line 219 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.
363 364 365 366 367 368 |
# File 'lib/graphql/schema/warden.rb', line 363 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
.
315 316 317 318 319 320 321 322 323 324 |
# File 'lib/graphql/schema/warden.rb', line 315 def interfaces(obj_type) @visible_interfaces ||= read_through { |t| ints = t.interfaces(@context) if ints.any? ints.select! { |i| visible_type?(i) } end ints } @visible_interfaces[obj_type] end |
#loadable?(type, _ctx) ⇒ 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 True if this type is used for loads:
but not in the schema otherwise and not explicitly hidden.
214 215 216 |
# File 'lib/graphql/schema/warden.rb', line 214 def loadable?(type, _ctx) !reachable_type_set.include?(type) && visible_type?(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
.
266 267 268 269 270 271 272 |
# File 'lib/graphql/schema/warden.rb', line 266 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.
238 239 240 241 |
# File 'lib/graphql/schema/warden.rb', line 238 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.
233 234 235 |
# File 'lib/graphql/schema/warden.rb', line 233 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.
330 331 332 333 334 335 336 337 |
# File 'lib/graphql/schema/warden.rb', line 330 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 |
#schema_subset ⇒ 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.
107 108 109 |
# File 'lib/graphql/schema/warden.rb', line 107 def schema_subset @schema_subset ||= SchemaSubset.new(self) 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.
201 202 203 204 205 206 207 208 209 210 211 |
# File 'lib/graphql/schema/warden.rb', line 201 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.
350 351 352 |
# File 'lib/graphql/schema/warden.rb', line 350 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.
309 310 311 312 |
# File 'lib/graphql/schema/warden.rb', line 309 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.
340 341 342 343 344 345 346 347 348 |
# File 'lib/graphql/schema/warden.rb', line 340 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.
354 355 356 357 |
# File 'lib/graphql/schema/warden.rb', line 354 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.
359 360 361 |
# File 'lib/graphql/schema/warden.rb', line 359 def visible_type_membership?(type_membership, _ctx = nil) visible?(type_membership) end |