diff --git a/homeassistant/components/unifi/diagnostics.py b/homeassistant/components/unifi/diagnostics.py index 29845775409..4f27ff4ff4f 100644 --- a/homeassistant/components/unifi/diagnostics.py +++ b/homeassistant/components/unifi/diagnostics.py @@ -31,24 +31,42 @@ REDACT_WLANS = {"bc_filter_list", "x_passphrase"} @callback -def async_replace_data(data: Mapping, to_replace: dict[str, str]) -> dict[str, Any]: - """Replace sensitive data in a dict.""" - if not isinstance(data, (Mapping, list, set, tuple)): - return to_replace.get(data, data) - +def async_replace_dict_data( + data: Mapping, to_replace: dict[str, str] +) -> dict[str, Any]: + """Redact sensitive data in a dict.""" redacted = {**data} - - for key, value in redacted.items(): + for key, value in data.items(): if isinstance(value, dict): - redacted[key] = async_replace_data(value, to_replace) + redacted[key] = async_replace_dict_data(value, to_replace) elif isinstance(value, (list, set, tuple)): - redacted[key] = [async_replace_data(item, to_replace) for item in value] + redacted[key] = async_replace_list_data(value, to_replace) elif isinstance(value, str): if value in to_replace: redacted[key] = to_replace[value] elif value.count(":") == 5: redacted[key] = REDACTED + return redacted + +@callback +def async_replace_list_data( + data: list | set | tuple, to_replace: dict[str, str] +) -> list[Any]: + """Redact sensitive data in a list.""" + redacted = [] + for item in data: + new_value = None + if isinstance(item, (list, set, tuple)): + new_value = async_replace_list_data(item, to_replace) + elif isinstance(item, Mapping): + new_value = async_replace_dict_data(item, to_replace) + elif isinstance(item, str): + if item in to_replace: + new_value = to_replace[item] + elif item.count(":") == 5: + new_value = REDACTED + redacted.append(new_value or item) return redacted @@ -73,26 +91,28 @@ async def async_get_config_entry_diagnostics( counter += 1 diag["config"] = async_redact_data( - async_replace_data(config_entry.as_dict(), macs_to_redact), REDACT_CONFIG + async_replace_dict_data(config_entry.as_dict(), macs_to_redact), REDACT_CONFIG ) diag["site_role"] = controller.site_role - diag["entities"] = async_replace_data(controller.entities, macs_to_redact) + diag["entities"] = async_replace_dict_data(controller.entities, macs_to_redact) diag["clients"] = { macs_to_redact[k]: async_redact_data( - async_replace_data(v.raw, macs_to_redact), REDACT_CLIENTS + async_replace_dict_data(v.raw, macs_to_redact), REDACT_CLIENTS ) for k, v in controller.api.clients.items() } diag["devices"] = { macs_to_redact[k]: async_redact_data( - async_replace_data(v.raw, macs_to_redact), REDACT_DEVICES + async_replace_dict_data(v.raw, macs_to_redact), REDACT_DEVICES ) for k, v in controller.api.devices.items() } diag["dpi_apps"] = {k: v.raw for k, v in controller.api.dpi_apps.items()} diag["dpi_groups"] = {k: v.raw for k, v in controller.api.dpi_groups.items()} diag["wlans"] = { - k: async_redact_data(async_replace_data(v.raw, macs_to_redact), REDACT_WLANS) + k: async_redact_data( + async_replace_dict_data(v.raw, macs_to_redact), REDACT_WLANS + ) for k, v in controller.api.wlans.items() }