mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-07-08 17:56:33 +00:00
Make IPv4 and IPv6 parse errors raise an API error (#5282)
* Make IPv4 and IPv6 parse errors raise an API error Currently, IP address parsing errors lead to an execption which is not handled by the `api_validate()` call. By using concrete IPv4 and IPv6 types and `vol.Coerce()` parsing errors are properly handled. * ruff format * ruff check
This commit is contained in:
parent
c0e35376f3
commit
00d217b5f7
@ -3,7 +3,7 @@
|
||||
import asyncio
|
||||
from collections.abc import Awaitable
|
||||
from dataclasses import replace
|
||||
from ipaddress import ip_address, ip_interface
|
||||
from ipaddress import IPv4Address, IPv4Interface, IPv6Address, IPv6Interface
|
||||
from typing import Any
|
||||
|
||||
from aiohttp import web
|
||||
@ -56,12 +56,21 @@ from ..host.configuration import (
|
||||
from ..host.const import AuthMethod, InterfaceType, WifiMode
|
||||
from .utils import api_process, api_validate
|
||||
|
||||
_SCHEMA_IP_CONFIG = vol.Schema(
|
||||
_SCHEMA_IPV4_CONFIG = vol.Schema(
|
||||
{
|
||||
vol.Optional(ATTR_ADDRESS): [vol.Coerce(ip_interface)],
|
||||
vol.Optional(ATTR_ADDRESS): [vol.Coerce(IPv4Interface)],
|
||||
vol.Optional(ATTR_METHOD): vol.Coerce(InterfaceMethod),
|
||||
vol.Optional(ATTR_GATEWAY): vol.Coerce(ip_address),
|
||||
vol.Optional(ATTR_NAMESERVERS): [vol.Coerce(ip_address)],
|
||||
vol.Optional(ATTR_GATEWAY): vol.Coerce(IPv4Address),
|
||||
vol.Optional(ATTR_NAMESERVERS): [vol.Coerce(IPv4Address)],
|
||||
}
|
||||
)
|
||||
|
||||
_SCHEMA_IPV6_CONFIG = vol.Schema(
|
||||
{
|
||||
vol.Optional(ATTR_ADDRESS): [vol.Coerce(IPv6Interface)],
|
||||
vol.Optional(ATTR_METHOD): vol.Coerce(InterfaceMethod),
|
||||
vol.Optional(ATTR_GATEWAY): vol.Coerce(IPv6Address),
|
||||
vol.Optional(ATTR_NAMESERVERS): [vol.Coerce(IPv6Address)],
|
||||
}
|
||||
)
|
||||
|
||||
@ -78,8 +87,8 @@ _SCHEMA_WIFI_CONFIG = vol.Schema(
|
||||
# pylint: disable=no-value-for-parameter
|
||||
SCHEMA_UPDATE = vol.Schema(
|
||||
{
|
||||
vol.Optional(ATTR_IPV4): _SCHEMA_IP_CONFIG,
|
||||
vol.Optional(ATTR_IPV6): _SCHEMA_IP_CONFIG,
|
||||
vol.Optional(ATTR_IPV4): _SCHEMA_IPV4_CONFIG,
|
||||
vol.Optional(ATTR_IPV6): _SCHEMA_IPV6_CONFIG,
|
||||
vol.Optional(ATTR_WIFI): _SCHEMA_WIFI_CONFIG,
|
||||
vol.Optional(ATTR_ENABLED): vol.Boolean(),
|
||||
}
|
||||
|
@ -292,6 +292,26 @@ async def test_api_network_interface_update_invalid(api_client: TestClient):
|
||||
== "expected a list for dictionary value @ data['ipv4']['nameservers']. Got '1.1.1.1'"
|
||||
)
|
||||
|
||||
resp = await api_client.post(
|
||||
f"/network/interface/{TEST_INTERFACE_ETH_NAME}/update",
|
||||
json={"ipv4": {"gateway": "invalid"}},
|
||||
)
|
||||
result = await resp.json()
|
||||
assert (
|
||||
result["message"]
|
||||
== "expected IPv4Address for dictionary value @ data['ipv4']['gateway']. Got 'invalid'"
|
||||
)
|
||||
|
||||
resp = await api_client.post(
|
||||
f"/network/interface/{TEST_INTERFACE_ETH_NAME}/update",
|
||||
json={"ipv6": {"gateway": "invalid"}},
|
||||
)
|
||||
result = await resp.json()
|
||||
assert (
|
||||
result["message"]
|
||||
== "expected IPv6Address for dictionary value @ data['ipv6']['gateway']. Got 'invalid'"
|
||||
)
|
||||
|
||||
|
||||
async def test_api_network_wireless_scan(api_client: TestClient):
|
||||
"""Test network manager api."""
|
||||
|
Loading…
x
Reference in New Issue
Block a user