Skip to content

Commit 3272819

Browse files
committed
Also filter field results and objects
1 parent dc91193 commit 3272819

2 files changed

Lines changed: 39 additions & 20 deletions

File tree

lib/graphql/tracing/perfetto_trace.rb

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -270,9 +270,9 @@ def end_execute_field(field, object, arguments, query, app_result)
270270
if @create_debug_annotations
271271
start_field.track_event = dup_with(start_field.track_event,{
272272
debug_annotations: [
273-
payload_to_debug(nil, object.object, iid: DA_OBJECT_IID, intern_value: true),
274-
payload_to_debug(nil, filter_arguments(arguments), iid: DA_ARGUMENTS_IID),
275-
payload_to_debug(nil, app_result, iid: DA_RESULT_IID, intern_value: true)
273+
payload_to_debug(nil, filter_if_hash(object.object), iid: DA_OBJECT_IID, intern_value: true),
274+
payload_to_debug(nil, filter_if_hash(arguments), iid: DA_ARGUMENTS_IID),
275+
payload_to_debug(nil, filter_if_hash(app_result), iid: DA_RESULT_IID, intern_value: true)
276276
]
277277
})
278278
end
@@ -606,8 +606,12 @@ def fid
606606
Fiber.current.object_id
607607
end
608608

609-
def filter_arguments(args)
610-
@arguments_filter.filter(args)
609+
def filter_if_hash(args)
610+
if args.is_a?(Hash)
611+
@arguments_filter.filter(args)
612+
else
613+
args
614+
end
611615
end
612616

613617
class ActiveSupportArgumentsFilter

spec/graphql/tracing/perfetto_trace_spec.rb

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@
66
describe GraphQL::Tracing::PerfettoTrace do
77
include PerfettoSnapshot
88

9+
def trace_includes?(json_str, test_str)
10+
json_str.include?(Base64.encode64(test_str).strip) ||
11+
json_str.include?(test_str)
12+
end
13+
914
class PerfettoSchema < GraphQL::Schema
1015
class BaseObject < GraphQL::Schema::Object
1116
end
@@ -110,14 +115,21 @@ class SecretInput < GraphQL::Schema::InputObject
110115
argument :password, String
111116
end
112117

113-
field :secret_field, String do
118+
class SecretThing < GraphQL::Schema::Object
119+
field :greeting, String
120+
end
121+
field :secret_field, SecretThing do
114122
argument :cipher, String, required: false
115123
argument :password, String, required: false
116124
argument :input, [[SecretInput]], required: false
117125
end
118126

119127
def secret_field(cipher: nil, password: nil, input: nil)
120-
cipher || password || input[0][0][:password]
128+
{
129+
greeting: "Hello!",
130+
cipher: cipher || "FALLBACK_CIPHER",
131+
password: password || (input ? input[0][0][:password] : "FALLBACK_PASSWORD"),
132+
}
121133
end
122134
end
123135

@@ -174,40 +186,43 @@ def self.detailed_trace?(q)
174186
end
175187

176188
it "filters params with ActiveSupport" do
177-
query_str = 'query getStuff { secretField(cipher: "abcdef") }'
189+
query_str = 'query getStuff { secretField(cipher: "abcdef") { greeting } }'
178190
res = PerfettoSchema.execute(query_str, validate: false)
179191
json = res.context.query.current_trace.write(file: nil, debug_json: true)
180-
assert_includes json, "abcdef"
181-
refute_includes json, "FILTERED"
192+
assert trace_includes?(json, "abcdef")
193+
refute trace_includes?(json, "FILTERED")
182194

183195
prev_fp = ActiveSupport.filter_parameters
184196
ActiveSupport.filter_parameters = ["cipher"]
185197
res = PerfettoSchema.execute(query_str)
186198
json = res.context.query.current_trace.write(file: nil, debug_json: true)
187-
refute_includes json, "abcdef"
188-
assert_includes json, "[FILTERED]"
199+
refute trace_includes?(json, "abcdef")
200+
assert trace_includes?(json, "[FILTERED]")
189201

190202
ActiveSupport.filter_parameters = ["password"]
191-
res = PerfettoSchema.execute('query getStuff { secretField(input: [[{ password: "jklmn" }]]) }')
203+
res = PerfettoSchema.execute('query getStuff { secretField(input: [[{ password: "jklmn" }]]) { greeting } }')
192204
json = res.context.query.current_trace.write(file: nil, debug_json: true)
193-
refute json.include?("jklmn"), "Value is removed"
205+
assert trace_includes?(json, "password"), "Name is retained"
206+
refute trace_includes?(json, "jklmn"), "Value is removed"
194207
assert_includes json, "[FILTERED]"
195208
ensure
196209
ActiveSupport.filter_parameters = prev_fp
197210
end
198211

199212
it "filters params without ActiveSupport" do
200-
query_str = 'query getStuff { secretField(password: "qrstuv") }'
213+
query_str = 'query getStuff { secretField(password: "qrstuv") { greeting } }'
201214
res = PerfettoSchema.execute(query_str, context: { detailed_trace_filter: GraphQL::Tracing::PerfettoTrace::ArgumentsFilter.new })
202215
json = res.context.query.current_trace.write(file: nil, debug_json: true)
203-
assert_includes json, "[FILTERED]"
204-
refute_includes json, "qrstuv"
216+
assert trace_includes?(json, "FILTERED"), "The replacement string is present"
217+
assert trace_includes?(json, "FALLBACK_CIPHER"), "Unfiltered values are present"
218+
refute trace_includes?(json, "qrstuv"), "The password is obscured"
205219

206-
query_str = 'query getStuff { secretField(input: [[{ password: "lmnop" }]]) }'
220+
query_str = 'query getStuff { secretField(input: [[{ password: "lmnop" }]]) { greeting } }'
207221
res = PerfettoSchema.execute(query_str, context: { detailed_trace_filter: GraphQL::Tracing::PerfettoTrace::ArgumentsFilter.new })
208222
json = res.context.query.current_trace.write(file: nil, debug_json: true)
209-
refute json.include?("lmnop"), "The password is obscured"
210-
assert json.include?("[FILTERED]"), "The replacement string is present"
223+
assert trace_includes?(json, "password"), "Name is retained"
224+
refute trace_includes?(json, "lmnop"), "The password is obscured"
225+
assert trace_includes?(json, "[FILTERED]"), "The replacement string is present"
211226
end
212227

213228
it "provides an error when google-protobuf isn't available" do

0 commit comments

Comments
 (0)