From ac8a4f4b054c67b73c3dc24eb704a82acc5a5635 Mon Sep 17 00:00:00 2001 From: Michael <35783820+mib1185@users.noreply.github.com> Date: Sun, 4 Feb 2024 15:12:08 +0100 Subject: [PATCH] Redact location names in proximity diagnostics (#109600) --- .../components/proximity/coordinator.py | 17 +++++------ .../components/proximity/diagnostics.py | 28 ++++++++++++++++--- .../proximity/snapshots/test_diagnostics.ambr | 22 +++++++++++++++ .../components/proximity/test_diagnostics.py | 11 ++++++++ 4 files changed, 64 insertions(+), 14 deletions(-) diff --git a/homeassistant/components/proximity/coordinator.py b/homeassistant/components/proximity/coordinator.py index 4ae923276cc..53c1180e832 100644 --- a/homeassistant/components/proximity/coordinator.py +++ b/homeassistant/components/proximity/coordinator.py @@ -56,14 +56,11 @@ class ProximityData: entities: dict[str, dict[str, str | int | None]] -DEFAULT_DATA = ProximityData( - { - ATTR_DIST_TO: DEFAULT_DIST_TO_ZONE, - ATTR_DIR_OF_TRAVEL: DEFAULT_DIR_OF_TRAVEL, - ATTR_NEAREST: DEFAULT_NEAREST, - }, - {}, -) +DEFAULT_PROXIMITY_DATA: dict[str, str | float] = { + ATTR_DIST_TO: DEFAULT_DIST_TO_ZONE, + ATTR_DIR_OF_TRAVEL: DEFAULT_DIR_OF_TRAVEL, + ATTR_NEAREST: DEFAULT_NEAREST, +} class ProximityDataUpdateCoordinator(DataUpdateCoordinator[ProximityData]): @@ -92,7 +89,7 @@ class ProximityDataUpdateCoordinator(DataUpdateCoordinator[ProximityData]): update_interval=None, ) - self.data = DEFAULT_DATA + self.data = ProximityData(DEFAULT_PROXIMITY_DATA, {}) self.state_change_data: StateChangedData | None = None @@ -238,7 +235,7 @@ class ProximityDataUpdateCoordinator(DataUpdateCoordinator[ProximityData]): self.name, self.proximity_zone_id, ) - return DEFAULT_DATA + return ProximityData(DEFAULT_PROXIMITY_DATA, {}) entities_data = self.data.entities diff --git a/homeassistant/components/proximity/diagnostics.py b/homeassistant/components/proximity/diagnostics.py index ba5e1f53722..3ccecbe1f19 100644 --- a/homeassistant/components/proximity/diagnostics.py +++ b/homeassistant/components/proximity/diagnostics.py @@ -4,10 +4,18 @@ from __future__ import annotations from typing import Any from homeassistant.components.device_tracker import ATTR_GPS, ATTR_IP, ATTR_MAC -from homeassistant.components.diagnostics import async_redact_data +from homeassistant.components.diagnostics import REDACTED, async_redact_data from homeassistant.components.person import ATTR_USER_ID +from homeassistant.components.zone import DOMAIN as ZONE_DOMAIN from homeassistant.config_entries import ConfigEntry -from homeassistant.const import ATTR_LATITUDE, ATTR_LONGITUDE +from homeassistant.const import ( + ATTR_LATITUDE, + ATTR_LONGITUDE, + STATE_HOME, + STATE_NOT_HOME, + STATE_UNAVAILABLE, + STATE_UNKNOWN, +) from homeassistant.core import HomeAssistant from .const import DOMAIN @@ -21,6 +29,7 @@ TO_REDACT = { ATTR_MAC, ATTR_USER_ID, "context", + "location_name", } @@ -34,16 +43,27 @@ async def async_get_config_entry_diagnostics( "entry": entry.as_dict(), } + non_sensitiv_states = [ + STATE_HOME, + STATE_NOT_HOME, + STATE_UNAVAILABLE, + STATE_UNKNOWN, + ] + [z.name for z in hass.states.async_all(ZONE_DOMAIN)] + tracked_states: dict[str, dict] = {} for tracked_entity_id in coordinator.tracked_entities: if (state := hass.states.get(tracked_entity_id)) is None: continue - tracked_states[tracked_entity_id] = state.as_dict() + tracked_states[tracked_entity_id] = async_redact_data( + state.as_dict(), TO_REDACT + ) + if state.state not in non_sensitiv_states: + tracked_states[tracked_entity_id]["state"] = REDACTED diag_data["data"] = { "proximity": coordinator.data.proximity, "entities": coordinator.data.entities, "entity_mapping": coordinator.entity_mapping, - "tracked_states": async_redact_data(tracked_states, TO_REDACT), + "tracked_states": tracked_states, } return diag_data diff --git a/tests/components/proximity/snapshots/test_diagnostics.ambr b/tests/components/proximity/snapshots/test_diagnostics.ambr index f8f7d9b014e..a93ff33f443 100644 --- a/tests/components/proximity/snapshots/test_diagnostics.ambr +++ b/tests/components/proximity/snapshots/test_diagnostics.ambr @@ -15,6 +15,12 @@ 'is_in_ignored_zone': False, 'name': 'test2', }), + 'device_tracker.test3': dict({ + 'dir_of_travel': None, + 'dist_to_zone': 4077309, + 'is_in_ignored_zone': False, + 'name': 'test3', + }), }), 'entity_mapping': dict({ 'device_tracker.test1': list([ @@ -29,6 +35,10 @@ 'sensor.home_test3_distance', 'sensor.home_test3_direction_of_travel', ]), + 'device_tracker.test4': list([ + 'sensor.home_test4_distance', + 'sensor.home_test4_direction_of_travel', + ]), }), 'proximity': dict({ 'dir_of_travel': 'unknown', @@ -56,6 +66,17 @@ 'entity_id': 'device_tracker.test2', 'state': 'not_home', }), + 'device_tracker.test3': dict({ + 'attributes': dict({ + 'friendly_name': 'test3', + 'latitude': '**REDACTED**', + 'location_name': '**REDACTED**', + 'longitude': '**REDACTED**', + }), + 'context': '**REDACTED**', + 'entity_id': 'device_tracker.test3', + 'state': '**REDACTED**', + }), }), }), 'entry': dict({ @@ -67,6 +88,7 @@ 'device_tracker.test1', 'device_tracker.test2', 'device_tracker.test3', + 'device_tracker.test4', ]), 'zone': 'zone.home', }), diff --git a/tests/components/proximity/test_diagnostics.py b/tests/components/proximity/test_diagnostics.py index 35ecd152a06..e23d8180672 100644 --- a/tests/components/proximity/test_diagnostics.py +++ b/tests/components/proximity/test_diagnostics.py @@ -35,6 +35,16 @@ async def test_entry_diagnostics( "not_home", {"friendly_name": "test2", "latitude": 150.1, "longitude": 20.1}, ) + hass.states.async_set( + "device_tracker.test3", + "my secret address", + { + "friendly_name": "test3", + "latitude": 150.1, + "longitude": 20.1, + "location_name": "my secret address", + }, + ) mock_entry = MockConfigEntry( domain=DOMAIN, @@ -45,6 +55,7 @@ async def test_entry_diagnostics( "device_tracker.test1", "device_tracker.test2", "device_tracker.test3", + "device_tracker.test4", ], CONF_IGNORED_ZONES: [], CONF_TOLERANCE: 1,