Ensure diagnostics redaction can handle lists of lists

This commit is contained in:
Aaron Bach
2022-01-28 22:14:15 -07:00
parent 5e62ff95b9
commit 74c9ed7450

View File

@@ -2,6 +2,7 @@
from __future__ import annotations from __future__ import annotations
from collections.abc import Iterable, Mapping from collections.abc import Iterable, Mapping
from copy import deepcopy
from typing import Any from typing import Any
from homeassistant.core import callback from homeassistant.core import callback
@@ -10,19 +11,23 @@ from .const import REDACTED
@callback @callback
def async_redact_data(data: Mapping, to_redact: Iterable[Any]) -> dict[str, Any]: def async_redact_data(data: Mapping, to_redact: Iterable[Any]) -> Mapping[Any, Any]:
"""Redact sensitive data in a dict.""" """Redact sensitive data in a dict."""
if not isinstance(data, (Mapping, list)): if not isinstance(data, (Mapping, list)):
return data return data
redacted = {**data} redacted = deepcopy(data)
for key, value in redacted.items(): if isinstance(redacted, dict):
if key in to_redact: for key, value in redacted.items():
redacted[key] = REDACTED if key in to_redact:
elif isinstance(value, dict): redacted[key] = REDACTED
redacted[key] = async_redact_data(value, to_redact) elif isinstance(value, dict):
elif isinstance(value, list): redacted[key] = async_redact_data(value, to_redact)
redacted[key] = [async_redact_data(item, to_redact) for item in value] elif isinstance(value, list):
redacted[key] = [async_redact_data(item, to_redact) for item in value]
elif isinstance(redacted, list):
for idx, value in enumerate(redacted):
redacted[idx] = async_redact_data(value, to_redact)
return redacted return redacted