graphql-relay-walker 0.0.10 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: f313210bb570cb222d880fe8366826dac2a67dfa
4
- data.tar.gz: 526a75f19efffb79fa3daba6cf232bc4ce198e17
2
+ SHA256:
3
+ metadata.gz: 00cf59d81c662ef188eb65959cc248670a7903f1106bdf8fff03f8bfe1806fb4
4
+ data.tar.gz: cf5fbf3ff44b0021eb52794e79f4344b249652ce27e9b2a70ae4e1405a87a544
5
5
  SHA512:
6
- metadata.gz: d22c84ebd382d999c204f193350899d8c41c96f20c5f001e21470710c098c0183dc7b2113629de97d06eb3d27c603ded7b00aa615a756ec095025e56bd55346e
7
- data.tar.gz: 8e3f30ceeb5280e995eb6dc618148dada50b0a17d5a0d73220e6b220df805fb5258d3f710d650325f584d14bf1fdd6678b224f18f8e74162f1341db9695e54f4
6
+ metadata.gz: 2600d978d68cac1e8c68df7ea99afec158079c01eb6499e8870c02a1deab7b4e5afbe9a615751d5ecc02c3fcfcde6ace04d129e918eeac61e8c31c59da16ad5a
7
+ data.tar.gz: 6df67485eacbb46bfcecda62e8a2314d8a7341961d5eddf63e7ea7fac9e350155567476ba4bdb3b47c3d19ff7d5fe3dec351d3e76ffe0012f60d72655371f926
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'graphql-relay-walker'
3
- s.version = '0.0.10'
3
+ s.version = '0.1.0'
4
4
  s.licenses = ['MIT']
5
5
  s.summary = 'A tool for traversing your GraphQL schema to proactively detect potential data access vulnerabilities.'
6
6
  s.authors = ['Ben Toews']
@@ -58,27 +58,6 @@ module GraphQL::Relay::Walker
58
58
  true
59
59
  end
60
60
 
61
- # Private: Make a AST of the given type.
62
- #
63
- # klass - The GraphQL::Language::Nodes::AbstractNode subclass
64
- # to create.
65
- # needs_selections: - Boolean. Will this AST be invalid if it doesn't have
66
- # any selections?
67
- #
68
- # Returns a GraphQL::Language::Nodes::AbstractNode subclass instance or nil
69
- # if the created AST was invalid for having no selections.
70
- def make(klass, needs_selections: true)
71
- k_ast = klass.new
72
- yield(k_ast) if block_given?
73
- k_ast.selections.compact!
74
-
75
- if k_ast.selections.empty? && needs_selections
76
- nil
77
- else
78
- k_ast
79
- end
80
- end
81
-
82
61
  # Make an inline fragment AST.
83
62
  #
84
63
  # type - The GraphQL::ObjectType instance to make the fragment
@@ -89,21 +68,29 @@ module GraphQL::Relay::Walker
89
68
  # Returns a GraphQL::Language::Nodes::InlineFragment instance or nil if the
90
69
  # created AST was invalid for having no selections.
91
70
  def inline_fragment_ast(type, with_children: true)
92
- make(GraphQL::Language::Nodes::InlineFragment) do |if_ast|
93
- if_ast.type = make_type_name_node(type.name)
94
-
95
- if with_children
96
- type.all_fields.each do |field|
97
- field_type = field.type.unwrap
98
- if node_field?(field) && include?(field_type)
99
- if_ast.selections << node_field_ast(field)
100
- elsif connection_field?(field) && include?(field_type)
101
- if_ast.selections << connection_field_ast(field)
102
- end
71
+ selections = []
72
+ if with_children
73
+ type.all_fields.each do |field|
74
+ field_type = field.type.unwrap
75
+ if node_field?(field) && include?(field_type)
76
+ selections << node_field_ast(field)
77
+ elsif connection_field?(field) && include?(field_type)
78
+ selections << connection_field_ast(field)
103
79
  end
104
- elsif id = type.get_field('id')
105
- if_ast.selections << field_ast(id)
106
80
  end
81
+ elsif id = type.get_field('id')
82
+ selections << field_ast(id)
83
+ end
84
+
85
+ selections.compact!
86
+
87
+ if selections.none?
88
+ nil
89
+ else
90
+ GraphQL::Language::Nodes::InlineFragment.new(
91
+ type: make_type_name_node(type.name),
92
+ selections: selections,
93
+ )
107
94
  end
108
95
  end
109
96
 
@@ -120,20 +107,19 @@ module GraphQL::Relay::Walker
120
107
  type = field.type.unwrap
121
108
 
122
109
  # Bail unless we have the required arguments.
123
- return unless field.arguments.reject do |_, arg|
124
- valid_input?(arg.type, nil)
125
- end.all? do |name, _|
126
- arguments.key?(name)
110
+ required_args_are_present = field.arguments.all? do |arg_name, arg|
111
+ arguments.key?(arg_name) || valid_input?(arg.type, nil)
127
112
  end
128
113
 
129
- make(GraphQL::Language::Nodes::Field, needs_selections: !type.kind.scalar?) do |f_ast|
130
- f_ast.name = field.name
131
- f_ast.alias = random_alias unless field.name == 'id'
132
- f_ast.arguments = arguments.map do |name, value|
114
+ if !required_args_are_present
115
+ nil
116
+ else
117
+ f_alias = field.name == 'id' ? nil : random_alias
118
+ f_args = arguments.map do |name, value|
133
119
  GraphQL::Language::Nodes::Argument.new(name: name, value: value)
134
120
  end
135
121
 
136
- yield(f_ast, type) if blk
122
+ GraphQL::Language::Nodes::Field.new(name: field.name, alias: f_alias, arguments: f_args)
137
123
  end
138
124
  end
139
125
 
@@ -143,17 +129,27 @@ module GraphQL::Relay::Walker
143
129
  #
144
130
  # Returns a GraphQL::Language::Nodes::Field instance.
145
131
  def node_field_ast(field)
146
- field_ast(field) do |f_ast, type|
147
- selections = f_ast.selections
148
-
149
- if type.kind.object?
150
- selections << field_ast(type.get_field('id'))
151
- else
152
- possible_node_types(type).each do |if_type|
153
- selections << inline_fragment_ast(if_type, with_children: false)
154
- end
132
+ f_ast = field_ast(field)
133
+ return nil if f_ast.nil?
134
+ type = field.type.unwrap
135
+ selections = f_ast.selections.dup
136
+
137
+ if type.kind.object?
138
+ selections << field_ast(type.get_field('id'))
139
+ else
140
+ possible_node_types(type).each do |if_type|
141
+ selections << inline_fragment_ast(if_type, with_children: false)
155
142
  end
156
143
  end
144
+
145
+ selections.compact!
146
+
147
+ if f_ast.respond_to?(:merge) # GraphQL-Ruby 1.9+
148
+ f_ast = f_ast.merge(selections: selections)
149
+ else
150
+ f_ast.selections = selections
151
+ end
152
+ f_ast
157
153
  end
158
154
 
159
155
  # Make a field AST for an edges field.
@@ -162,8 +158,14 @@ module GraphQL::Relay::Walker
162
158
  #
163
159
  # Returns a GraphQL::Language::Nodes::Field instance.
164
160
  def edges_field_ast(field)
165
- field_ast(field) do |f_ast, type|
166
- f_ast.selections << node_field_ast(type.get_field('node'))
161
+ f_ast = field_ast(field)
162
+ return nil if f_ast.nil?
163
+ node_fields = [node_field_ast(field.type.unwrap.get_field('node'))]
164
+ if f_ast.respond_to?(:merge) # GraphQL-Ruby 1.9+
165
+ f_ast.merge(selections: f_ast.selections + node_fields)
166
+ else
167
+ f_ast.selections.concat(node_fields)
168
+ f_ast
167
169
  end
168
170
  end
169
171
 
@@ -174,8 +176,14 @@ module GraphQL::Relay::Walker
174
176
  # Returns a GraphQL::Language::Nodes::Field instance or nil if the created
175
177
  # AST was invalid for missing required arguments.
176
178
  def connection_field_ast(field)
177
- field_ast(field, connection_arguments) do |f_ast, type|
178
- f_ast.selections << edges_field_ast(type.get_field('edges'))
179
+ f_ast = field_ast(field, connection_arguments)
180
+ return nil if f_ast.nil?
181
+ edges_fields = [edges_field_ast(field.type.unwrap.get_field('edges'))]
182
+ if f_ast.respond_to?(:merge) # GraphQL-Ruby 1.9+
183
+ f_ast.merge(selections: f_ast.selections + edges_fields)
184
+ else
185
+ f_ast.selections.concat(edges_fields)
186
+ f_ast
179
187
  end
180
188
  end
181
189
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphql-relay-walker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.10
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Toews
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-27 00:00:00.000000000 Z
11
+ date: 2018-10-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: graphql
@@ -102,7 +102,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
102
102
  version: '0'
103
103
  requirements: []
104
104
  rubyforge_project:
105
- rubygems_version: 2.6.12
105
+ rubygems_version: 2.7.6
106
106
  signing_key:
107
107
  specification_version: 4
108
108
  summary: A tool for traversing your GraphQL schema to proactively detect potential