Home Assistant Unofficial Reference 2024.12.1
data_redaction.py
Go to the documentation of this file.
1 """Helpers to redact Google Assistant data when logging."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from functools import partial
7 from typing import Any
8 
9 from homeassistant.core import callback
10 from homeassistant.helpers.redact import REDACTED, async_redact_data, partial_redact
11 
12 GOOGLE_MSG_TO_REDACT: dict[str, Callable[[str], str]] = {
13  "agentUserId": partial_redact,
14  "uuid": partial_redact,
15  "webhookId": partial_redact,
16 }
17 
18 MDNS_TXT_TO_REDACT = [
19  "location_name",
20  "uuid",
21  "external_url",
22  "internal_url",
23  "base_url",
24 ]
25 
26 
27 def partial_redact_list_item(x: list[str], to_redact: list[str]) -> list[str]:
28  """Redact only specified string in a list of strings."""
29  if not isinstance(x, list):
30  return x
31  result = []
32  for itm in x:
33  if not isinstance(itm, str):
34  result.append(itm)
35  continue
36  for pattern in to_redact:
37  if itm.startswith(pattern):
38  result.append(f"{pattern}={REDACTED}")
39  break
40  else:
41  result.append(itm)
42  return result
43 
44 
45 def partial_redact_txt_list(x: list[str]) -> list[str]:
46  """Redact strings from home-assistant mDNS txt records."""
47  return partial_redact_list_item(x, MDNS_TXT_TO_REDACT)
48 
49 
50 def partial_redact_txt_dict(x: dict[str, str]) -> dict[str, str]:
51  """Redact strings from home-assistant mDNS txt records."""
52  if not isinstance(x, dict):
53  return x
54  result = {}
55  for k, v in x.items():
56  result[k] = REDACTED if k in MDNS_TXT_TO_REDACT else v
57  return result
58 
59 
60 def partial_redact_string(x: str, to_redact: str) -> str:
61  """Redact only a specified string."""
62  if x == to_redact:
63  return partial_redact(x)
64  return x
65 
66 
67 @callback
68 def async_redact_msg(msg: dict[str, Any], agent_user_id: str) -> dict[str, Any]:
69  """Mask sensitive data in message."""
70  return async_redact_data(
71  msg,
72  GOOGLE_MSG_TO_REDACT
73  | {
74  "data": partial_redact_txt_list,
75  "id": partial(partial_redact_string, to_redact=agent_user_id),
76  "texts": partial_redact_txt_list,
77  "txt": partial_redact_txt_dict,
78  },
79  )
dict async_redact_data(Mapping data, Iterable[Any] to_redact)
Definition: util.py:14
list[str] partial_redact_list_item(list[str] x, list[str] to_redact)
dict[str, Any] async_redact_msg(dict[str, Any] msg, str agent_user_id)
dict[str, str] partial_redact_txt_dict(dict[str, str] x)
str partial_redact(str|Any x, int unmasked_prefix=4, int unmasked_suffix=4)
Definition: redact.py:15