Fix recursion bug (#32009)

* Fix recursion bug

* Remove shield
pull/32031/head
Paulus Schoutsen 2020-02-20 08:51:00 -08:00 committed by GitHub
parent 5c5f839119
commit 1c2bce9292
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 1 deletions

View File

@ -55,6 +55,15 @@ async def async_setup(hass: ha.HomeAssistant, config: dict) -> Awaitable[bool]:
tasks = [] tasks = []
for domain, ent_ids in by_domain: for domain, ent_ids in by_domain:
# This leads to endless loop.
if domain == DOMAIN:
_LOGGER.warning(
"Called service homeassistant.%s with invalid entity IDs %s",
service.service,
", ".join(ent_ids),
)
continue
# We want to block for all calls and only return when all calls # We want to block for all calls and only return when all calls
# have been processed. If a service does not exist it causes a 10 # have been processed. If a service does not exist it causes a 10
# second delay while we're blocking waiting for a response. # second delay while we're blocking waiting for a response.
@ -73,7 +82,8 @@ async def async_setup(hass: ha.HomeAssistant, config: dict) -> Awaitable[bool]:
hass.services.async_call(domain, service.service, data, blocking) hass.services.async_call(domain, service.service, data, blocking)
) )
await asyncio.wait(tasks) if tasks:
await asyncio.gather(*tasks)
service_schema = vol.Schema({ATTR_ENTITY_ID: cv.entity_ids}, extra=vol.ALLOW_EXTRA) service_schema = vol.Schema({ATTR_ENTITY_ID: cv.entity_ids}, extra=vol.ALLOW_EXTRA)

View File

@ -372,3 +372,17 @@ async def test_turn_on_off_toggle_schema(hass, hass_read_only_user):
context=ha.Context(user_id=hass_read_only_user.id), context=ha.Context(user_id=hass_read_only_user.id),
blocking=True, blocking=True,
) )
async def test_not_allowing_recursion(hass, caplog):
"""Test we do not allow recursion."""
await async_setup_component(hass, "homeassistant", {})
for service in SERVICE_TURN_ON, SERVICE_TURN_OFF, SERVICE_TOGGLE:
await hass.services.async_call(
ha.DOMAIN, service, {"entity_id": "homeassistant.light"}, blocking=True,
)
assert (
f"Called service homeassistant.{service} with invalid entity IDs homeassistant.light"
in caplog.text
), service