From 70e125850c595b70215d099ddbeac022204e140e Mon Sep 17 00:00:00 2001 From: Dave T <17680170+davet2001@users.noreply.github.com> Date: Fri, 22 Apr 2022 06:39:51 +0100 Subject: [PATCH] Limit autogenerated entity_id string length (#69739) --- homeassistant/helpers/entity_registry.py | 10 ++++----- tests/helpers/test_entity_registry.py | 28 +++++++++--------------- 2 files changed, 14 insertions(+), 24 deletions(-) diff --git a/homeassistant/helpers/entity_registry.py b/homeassistant/helpers/entity_registry.py index af3b0a10559..b4dd0820d8c 100644 --- a/homeassistant/helpers/entity_registry.py +++ b/homeassistant/helpers/entity_registry.py @@ -290,7 +290,7 @@ class EntityRegistry: if len(domain) > MAX_LENGTH_STATE_DOMAIN: raise MaxLengthExceeded(domain, "domain", MAX_LENGTH_STATE_DOMAIN) - test_string = preferred_string + test_string = preferred_string[:MAX_LENGTH_STATE_ENTITY_ID] if not known_object_ids: known_object_ids = {} @@ -301,11 +301,9 @@ class EntityRegistry: or not self.hass.states.async_available(test_string) ): tries += 1 - test_string = f"{preferred_string}_{tries}" - - if len(test_string) > MAX_LENGTH_STATE_ENTITY_ID: - raise MaxLengthExceeded( - test_string, "generated_entity_id", MAX_LENGTH_STATE_ENTITY_ID + len_suffix = len(str(tries)) + 1 + test_string = ( + f"{preferred_string[:MAX_LENGTH_STATE_ENTITY_ID-len_suffix]}_{tries}" ) return test_string diff --git a/tests/helpers/test_entity_registry.py b/tests/helpers/test_entity_registry.py index 076e89d64dd..41ac7412d9c 100644 --- a/tests/helpers/test_entity_registry.py +++ b/tests/helpers/test_entity_registry.py @@ -1119,22 +1119,13 @@ async def test_disabled_entities_excluded_from_entity_list(hass, registry): async def test_entity_max_length_exceeded(hass, registry): """Test that an exception is raised when the max character length is exceeded.""" - long_entity_id_name = ( + long_domain_name = ( "1234567890123456789012345678901234567890123456789012345678901234567890" "1234567890123456789012345678901234567890123456789012345678901234567890" "1234567890123456789012345678901234567890123456789012345678901234567890" "1234567890123456789012345678901234567890123456789012345678901234567890" ) - with pytest.raises(MaxLengthExceeded) as exc_info: - registry.async_generate_entity_id("sensor", long_entity_id_name) - - assert exc_info.value.property_name == "generated_entity_id" - assert exc_info.value.max_length == 255 - assert exc_info.value.value == f"sensor.{long_entity_id_name}" - - # Try again but against the domain - long_domain_name = long_entity_id_name with pytest.raises(MaxLengthExceeded) as exc_info: registry.async_generate_entity_id(long_domain_name, "sensor") @@ -1150,14 +1141,15 @@ async def test_entity_max_length_exceeded(hass, registry): "1234567890123456789012345678901234567" ) - with pytest.raises(MaxLengthExceeded) as exc_info: - registry.async_generate_entity_id( - "sensor", long_entity_id_name, [f"sensor.{long_entity_id_name}"] - ) - - assert exc_info.value.property_name == "generated_entity_id" - assert exc_info.value.max_length == 255 - assert exc_info.value.value == f"sensor.{long_entity_id_name}_2" + known = [] + new_id = registry.async_generate_entity_id("sensor", long_entity_id_name, known) + assert new_id == "sensor." + long_entity_id_name[: 255 - 7] + known.append(new_id) + new_id = registry.async_generate_entity_id("sensor", long_entity_id_name, known) + assert new_id == "sensor." + long_entity_id_name[: 255 - 7 - 2] + "_2" + known.append(new_id) + new_id = registry.async_generate_entity_id("sensor", long_entity_id_name, known) + assert new_id == "sensor." + long_entity_id_name[: 255 - 7 - 2] + "_3" async def test_resolve_entity_ids(hass, registry):