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 GitHub
parent 1e2b0b65af
commit 2b62285eee
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
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: