mirror of
https://github.com/home-assistant/core.git
synced 2025-07-24 21:57:51 +00:00
Validate matcher field case in usb.async_is_plugged_in
(#81514)
* Support case-insensitive matching * Revert "Support case-insensitive matching" This reverts commit 0fdb2aa6bc6165d9adae39ecbe7f6698e7b94715. * Explicitly check the case of matcher fields in `async_is_plugged_in`
This commit is contained in:
parent
43745dbc6c
commit
3788a950e6
@ -64,6 +64,24 @@ def async_register_scan_request_callback(
|
|||||||
@hass_callback
|
@hass_callback
|
||||||
def async_is_plugged_in(hass: HomeAssistant, matcher: USBCallbackMatcher) -> bool:
|
def async_is_plugged_in(hass: HomeAssistant, matcher: USBCallbackMatcher) -> bool:
|
||||||
"""Return True is a USB device is present."""
|
"""Return True is a USB device is present."""
|
||||||
|
|
||||||
|
vid = matcher.get("vid", "")
|
||||||
|
pid = matcher.get("pid", "")
|
||||||
|
serial_number = matcher.get("serial_number", "")
|
||||||
|
manufacturer = matcher.get("manufacturer", "")
|
||||||
|
description = matcher.get("description", "")
|
||||||
|
|
||||||
|
if (
|
||||||
|
vid != vid.upper()
|
||||||
|
or pid != pid.upper()
|
||||||
|
or serial_number != serial_number.lower()
|
||||||
|
or manufacturer != manufacturer.lower()
|
||||||
|
or description != description.lower()
|
||||||
|
):
|
||||||
|
raise ValueError(
|
||||||
|
f"vid and pid must be uppercase, the rest lowercase in matcher {matcher!r}"
|
||||||
|
)
|
||||||
|
|
||||||
usb_discovery: USBDiscovery = hass.data[DOMAIN]
|
usb_discovery: USBDiscovery = hass.data[DOMAIN]
|
||||||
return any(
|
return any(
|
||||||
_is_matching(USBDevice(*device_tuple), matcher)
|
_is_matching(USBDevice(*device_tuple), matcher)
|
||||||
|
@ -877,6 +877,35 @@ async def test_async_is_plugged_in(hass, hass_ws_client):
|
|||||||
assert usb.async_is_plugged_in(hass, matcher)
|
assert usb.async_is_plugged_in(hass, matcher)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"matcher",
|
||||||
|
[
|
||||||
|
{"vid": "abcd"},
|
||||||
|
{"pid": "123a"},
|
||||||
|
{"serial_number": "1234ABCD"},
|
||||||
|
{"manufacturer": "Some Manufacturer"},
|
||||||
|
{"description": "A description"},
|
||||||
|
],
|
||||||
|
)
|
||||||
|
async def test_async_is_plugged_in_case_enforcement(hass, matcher):
|
||||||
|
"""Test `async_is_plugged_in` throws an error when incorrect cases are used."""
|
||||||
|
|
||||||
|
new_usb = [{"domain": "test1", "vid": "ABCD"}]
|
||||||
|
|
||||||
|
with patch("pyudev.Context", side_effect=ImportError), patch(
|
||||||
|
"homeassistant.components.usb.async_get_usb", return_value=new_usb
|
||||||
|
), patch("homeassistant.components.usb.comports", return_value=[]), patch.object(
|
||||||
|
hass.config_entries.flow, "async_init"
|
||||||
|
):
|
||||||
|
assert await async_setup_component(hass, "usb", {"usb": {}})
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
hass.bus.async_fire(EVENT_HOMEASSISTANT_STARTED)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
with pytest.raises(ValueError):
|
||||||
|
usb.async_is_plugged_in(hass, matcher)
|
||||||
|
|
||||||
|
|
||||||
async def test_web_socket_triggers_discovery_request_callbacks(hass, hass_ws_client):
|
async def test_web_socket_triggers_discovery_request_callbacks(hass, hass_ws_client):
|
||||||
"""Test the websocket call triggers a discovery request callback."""
|
"""Test the websocket call triggers a discovery request callback."""
|
||||||
mock_callback = Mock()
|
mock_callback = Mock()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user