Redact location names in proximity diagnostics (#109600)

This commit is contained in:
Michael 2024-02-04 15:12:08 +01:00 committed by GitHub
parent 8ef2bece59
commit ac8a4f4b05
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 64 additions and 14 deletions

View File

@ -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

View File

@ -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

View File

@ -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',
}),

View File

@ -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,