lib/google/ads/google_ads/interceptors/logging_interceptor.rb in google-ads-googleads-8.0.0 vs lib/google/ads/google_ads/interceptors/logging_interceptor.rb in google-ads-googleads-8.1.0
- old
+ new
@@ -32,11 +32,11 @@
emailAddress
inviterUserEmailAddress
userEmail
]
SEARCH_REQUEST_MASK =
- /customer_user_access.email_address|change_event.user_email/
+ /customer_user_access.email_address|change_event.user_email|feed.places_location_feed_data.email_address/
MASK_REPLACEMENT = "REDACTED"
def initialize(logger)
# Don't propagate args, parens are necessary
@@ -170,16 +170,20 @@
metadata[header] = MASK_REPLACEMENT
end
metadata
end
+ def clone_to_json(message)
+ JSON.parse(message.to_json)
+ end
+
def sanitize_message(message)
message_class = message.class.to_s.split("::").last
if %w[SearchGoogleAdsStreamResponse SearchGoogleAdsResponse].include?(
message_class)
# Sanitize all known sensitive fields across all search responses.
- message = JSON.parse(message.to_json)
+ message = clone_to_json(message)
message["fieldMask"].split(",").each do |path|
if SEARCH_RESPONSE_FIELDS_TO_MASK.include?(path.split(".").last)
message["results"].each do |result|
sanitize_field(result, path)
end
@@ -187,26 +191,45 @@
end
message
elsif %w[SearchGoogleAdsRequest SearchGoogleAdsStreamRequest].include?(
message_class)
if SEARCH_REQUEST_MASK === message.query
- message = JSON.parse(message.to_json)
+ message = clone_to_json(message)
message["query"] = MASK_REPLACEMENT
end
message
elsif "CustomerUserAccess" == message_class
# Sanitize sensitive fields specific to CustomerUserAccess get requests.
- message = JSON.parse(message.to_json)
+ message = clone_to_json(message)
sanitize_customer_user_access(message)
elsif "MutateCustomerUserAccessRequest" == message_class
# Sanitize sensitive fields when mutating a CustomerUserAccess.
- message = JSON.parse(message.to_json)
+ message = clone_to_json(message)
if message.include?("operation") && message["operation"].include?("update")
message["operation"]["update"] =
sanitize_customer_user_access(message["operation"]["update"])
end
message
+ elsif "Feed" == message_class
+ # Sanitize sensitive fields specific to Feed get requests.
+ message = clone_to_json(message)
+ if message.include?("placesLocationFeedData") &&
+ message["placesLocationFeedData"].include?("emailAddress")
+ message["placesLocationFeedData"]["emailAddress"] = MASK_REPLACEMENT
+ end
+ message
+ elsif "MutateFeedsRequest" == message_class
+ # Sanitize sensitive fields when mutating a Feed.
+ message = clone_to_json(message)
+ sanitize_feeds_request(message)
+ elsif "CreateCustomerClientRequest" == message_class
+ # Sanitize sensitive fields when creating a CustomerClient.
+ message = clone_to_json(message)
+ if message.include?("emailAddress")
+ message["emailAddress"] = MASK_REPLACEMENT
+ end
+ message
else
message
end
end
@@ -214,9 +237,29 @@
if message.include?("emailAddress")
message["emailAddress"] = MASK_REPLACEMENT
end
if message.include?("inviterUserEmailAddress")
message["inviterUserEmailAddress"] = MASK_REPLACEMENT
+ end
+ message
+ end
+
+ def sanitize_feeds_request(message)
+ if message.include?("operations")
+ message["operations"].each do |operation|
+ if operation.include?("create")
+ operation = operation["create"]
+ elsif operation.include?("update")
+ operation = operation["update"]
+ else
+ # Only create and update can contain sensitive fields.
+ next
+ end
+ if operation.include?("placesLocationFeedData") &&
+ operation["placesLocationFeedData"].include?("emailAddress")
+ operation["placesLocationFeedData"]["emailAddress"] = MASK_REPLACEMENT
+ end
+ end
end
message
end
def sanitize_field(object, path)