diff --git a/lib/sentry/plug_context.ex b/lib/sentry/plug_context.ex index 2715a88a..58c15bbf 100644 --- a/lib/sentry/plug_context.ex +++ b/lib/sentry/plug_context.ex @@ -171,7 +171,7 @@ defmodule Sentry.PlugContext do end @doc """ - Recursively scrubs a map that may have nested maps + Recursively scrubs a map that may have nested maps or lists Accepts a list of keys to scrub, and a list of options to configure @@ -206,6 +206,9 @@ defmodule Sentry.PlugContext do is_map(value) -> scrub_map(value, scrubbed_keys, opts) + is_list(value) -> + scrub_list(value, scrubbed_keys, opts) + true -> value end @@ -213,4 +216,25 @@ defmodule Sentry.PlugContext do {key, value} end) end + + @spec scrub_list(list(), list(String.t()), keyword()) :: list() + defp scrub_list(list, scrubbed_keys, opts) do + Enum.map(list, fn value -> + cond do + is_map(value) && Map.has_key?(value, :__struct__) -> + value + |> Map.from_struct() + |> scrub_map(scrubbed_keys, opts) + + is_map(value) -> + scrub_map(value, scrubbed_keys, opts) + + is_list(value) -> + scrub_list(value, scrubbed_keys, opts) + + true -> + value + end + end) + end end diff --git a/test/plug_context_test.exs b/test/plug_context_test.exs index 0b29ba60..4d0379b7 100644 --- a/test/plug_context_test.exs +++ b/test/plug_context_test.exs @@ -82,7 +82,10 @@ defmodule Sentry.PlugContextTest do "count" => 334, "cc" => "4197-7215-7810-8280", "another_cc" => "4197721578108280", - "user" => %{"password" => "mypassword"} + "user" => %{"password" => "mypassword"}, + "payments" => [ + %{"yet_another_cc" => "4197-7215-7810-8280"} + ] }) |> put_req_cookie("secret", "secretvalue") |> put_req_cookie("regular", "value") @@ -101,7 +104,10 @@ defmodule Sentry.PlugContextTest do "passwd" => "*********", "password" => "*********", "secret" => "*********", - "user" => %{"password" => "*********"} + "user" => %{"password" => "*********"}, + "payments" => [ + %{"yet_another_cc" => "*********"} + ] } end