Prevent nesting sections in data entry flows (#124645)

This commit is contained in:
Erik Montnemery 2024-08-28 15:42:15 +02:00 committed by GitHub
parent e39b3796f3
commit 174f22aa2f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 35 additions and 1 deletions

View file

@ -1090,6 +1090,11 @@ def key_dependency[_KT: Hashable, _VT](
def custom_serializer(schema: Any) -> Any:
"""Serialize additional types for voluptuous_serialize."""
return _custom_serializer(schema, allow_section=True)
def _custom_serializer(schema: Any, *, allow_section: bool) -> Any:
"""Serialize additional types for voluptuous_serialize."""
from .. import data_entry_flow # pylint: disable=import-outside-toplevel
from . import selector # pylint: disable=import-outside-toplevel
@ -1104,10 +1109,15 @@ def custom_serializer(schema: Any) -> Any:
return {"type": "boolean"}
if isinstance(schema, data_entry_flow.section):
if not allow_section:
raise ValueError("Nesting expandable sections is not supported")
return {
"type": "expandable",
"schema": voluptuous_serialize.convert(
schema.schema, custom_serializer=custom_serializer
schema.schema,
custom_serializer=functools.partial(
_custom_serializer, allow_section=False
),
),
"expanded": not schema.options["collapsed"],
}

View file

@ -1098,3 +1098,27 @@ def test_section_in_serializer() -> None:
],
"type": "expandable",
}
def test_nested_section_in_serializer() -> None:
"""Test section with custom_serializer."""
with pytest.raises(
ValueError, match="Nesting expandable sections is not supported"
):
cv.custom_serializer(
data_entry_flow.section(
vol.Schema(
{
vol.Required("section_1"): data_entry_flow.section(
vol.Schema(
{
vol.Optional("option_1", default=False): bool,
vol.Required("option_2"): int,
}
)
)
}
),
{"collapsed": False},
)
)