From 0c66ccebd1d506c849323ba6e49f1a5292faa19d Mon Sep 17 00:00:00 2001 From: Haim Gelfenbeyn Date: Tue, 27 Jun 2023 07:34:07 -0400 Subject: [PATCH] Verify that the MAC address that Fully Kiosk reported is usable (#94887) --- homeassistant/components/fully_kiosk/entity.py | 16 +++++++++++++++- tests/components/fully_kiosk/test_init.py | 9 +++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/fully_kiosk/entity.py b/homeassistant/components/fully_kiosk/entity.py index 0e4329a5917..d1f98c5afff 100644 --- a/homeassistant/components/fully_kiosk/entity.py +++ b/homeassistant/components/fully_kiosk/entity.py @@ -9,6 +9,18 @@ from .const import DOMAIN from .coordinator import FullyKioskDataUpdateCoordinator +def valid_global_mac_address(mac: str | None) -> bool: + """Check if a MAC address is valid, non-locally administered address.""" + if not isinstance(mac, str): + return False + try: + first_octet = int(mac.split(":")[0], 16) + # If the second least-significant bit is set, it's a locally administered address, should not be used as an ID + return not bool(first_octet & 0x2) + except ValueError: + return False + + class FullyKioskEntity(CoordinatorEntity[FullyKioskDataUpdateCoordinator], Entity): """Defines a Fully Kiosk Browser entity.""" @@ -25,7 +37,9 @@ class FullyKioskEntity(CoordinatorEntity[FullyKioskDataUpdateCoordinator], Entit sw_version=coordinator.data["appVersionName"], configuration_url=f"http://{coordinator.data['ip4']}:2323", ) - if "Mac" in coordinator.data and coordinator.data["Mac"]: + if "Mac" in coordinator.data and valid_global_mac_address( + coordinator.data["Mac"] + ): device_info["connections"] = { (CONNECTION_NETWORK_MAC, coordinator.data["Mac"]) } diff --git a/tests/components/fully_kiosk/test_init.py b/tests/components/fully_kiosk/test_init.py index 956de050e56..c53e4168733 100644 --- a/tests/components/fully_kiosk/test_init.py +++ b/tests/components/fully_kiosk/test_init.py @@ -7,6 +7,7 @@ from fullykiosk import FullyKioskError import pytest from homeassistant.components.fully_kiosk.const import DOMAIN +from homeassistant.components.fully_kiosk.entity import valid_global_mac_address from homeassistant.config_entries import ConfigEntryState from homeassistant.const import CONF_HOST, CONF_MAC, CONF_PASSWORD from homeassistant.core import HomeAssistant @@ -134,3 +135,11 @@ async def test_multiple_kiosk_with_empty_mac( assert device2 assert device1 != device2 + + +async def test_valid_global_mac_address() -> None: + """Test valid_global_mac_address function.""" + assert valid_global_mac_address("a1:bb:cc:dd:ee:ff") + assert not valid_global_mac_address("02:00:00:00:00:00") + assert not valid_global_mac_address(None) + assert not valid_global_mac_address("foobar")