Fix addon slug validation (#100070)

* Fix addon slug validation

* Don't redefine compile
This commit is contained in:
Mike Degatano 2023-09-12 09:59:12 -04:00 committed by Paulus Schoutsen
parent 55a4346460
commit 2cb84274ec
2 changed files with 39 additions and 1 deletions

View File

@ -6,6 +6,7 @@ from contextlib import suppress
from datetime import datetime, timedelta from datetime import datetime, timedelta
import logging import logging
import os import os
import re
from typing import Any, NamedTuple from typing import Any, NamedTuple
import voluptuous as vol import voluptuous as vol
@ -149,10 +150,12 @@ SERVICE_BACKUP_PARTIAL = "backup_partial"
SERVICE_RESTORE_FULL = "restore_full" SERVICE_RESTORE_FULL = "restore_full"
SERVICE_RESTORE_PARTIAL = "restore_partial" SERVICE_RESTORE_PARTIAL = "restore_partial"
VALID_ADDON_SLUG = vol.Match(re.compile(r"^[-_.A-Za-z0-9]+$"))
def valid_addon(value: Any) -> str: def valid_addon(value: Any) -> str:
"""Validate value is a valid addon slug.""" """Validate value is a valid addon slug."""
value = cv.slug(value) value = VALID_ADDON_SLUG(value)
hass: HomeAssistant | None = None hass: HomeAssistant | None = None
with suppress(HomeAssistantError): with suppress(HomeAssistantError):

View File

@ -633,6 +633,41 @@ async def test_invalid_service_calls(
) )
async def test_addon_service_call_with_complex_slug(
hass: HomeAssistant,
aioclient_mock: AiohttpClientMocker,
) -> None:
"""Addon slugs can have ., - and _, confirm that passes validation."""
supervisor_mock_data = {
"version_latest": "1.0.0",
"version": "1.0.0",
"auto_update": True,
"addons": [
{
"name": "test.a_1-2",
"slug": "test.a_1-2",
"state": "stopped",
"update_available": False,
"version": "1.0.0",
"version_latest": "1.0.0",
"repository": "core",
"icon": False,
},
],
}
with patch.dict(os.environ, MOCK_ENVIRON), patch(
"homeassistant.components.hassio.HassIO.is_connected",
return_value=None,
), patch(
"homeassistant.components.hassio.HassIO.get_supervisor_info",
return_value=supervisor_mock_data,
):
assert await async_setup_component(hass, "hassio", {})
await hass.async_block_till_done()
await hass.services.async_call("hassio", "addon_start", {"addon": "test.a_1-2"})
async def test_service_calls_core( async def test_service_calls_core(
hassio_env, hass: HomeAssistant, aioclient_mock: AiohttpClientMocker hassio_env, hass: HomeAssistant, aioclient_mock: AiohttpClientMocker
) -> None: ) -> None: