From 945477a4825a3ebb4ab2e727fd0e8767ed3e02bd Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 7 Jan 2022 08:47:14 -1000 Subject: [PATCH] Fix KeyError during call to homekit.unpair (#63627) --- homeassistant/components/homekit/__init__.py | 7 ++++++- tests/components/homekit/test_homekit.py | 5 +++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/homekit/__init__.py b/homeassistant/components/homekit/__init__.py index 075215c449c..23b65d0ff5f 100644 --- a/homeassistant/components/homekit/__init__.py +++ b/homeassistant/components/homekit/__init__.py @@ -708,7 +708,12 @@ class HomeKit: """Remove all pairings for an accessory so it can be repaired.""" state = self.driver.state for client_uuid in list(state.paired_clients): - state.remove_paired_client(client_uuid) + # We need to check again since removing a single client + # can result in removing all the clients that the client + # granted access to if it was an admin, otherwise + # remove_paired_client can generate a KeyError + if client_uuid in state.paired_clients: + state.remove_paired_client(client_uuid) self.driver.async_persist() self.driver.async_update_advertisement() self._async_show_setup_message() diff --git a/tests/components/homekit/test_homekit.py b/tests/components/homekit/test_homekit.py index 0ffb4440671..cb5a354bc66 100644 --- a/tests/components/homekit/test_homekit.py +++ b/tests/components/homekit/test_homekit.py @@ -679,6 +679,11 @@ async def test_homekit_unpair(hass, device_reg, mock_async_zeroconf): state = homekit.driver.state state.add_paired_client("client1", "any", b"1") + state.add_paired_client("client2", "any", b"0") + state.add_paired_client("client3", "any", b"1") + state.add_paired_client("client4", "any", b"0") + state.add_paired_client("client5", "any", b"0") + formatted_mac = device_registry.format_mac(state.mac) hk_bridge_dev = device_reg.async_get_device( {}, {(device_registry.CONNECTION_NETWORK_MAC, formatted_mac)}