From 2c41451abc2e4a16da814affc6f0f25342df92cb Mon Sep 17 00:00:00 2001 From: Raman Gupta <7243222+raman325@users.noreply.github.com> Date: Sat, 8 Jun 2024 11:31:05 -0400 Subject: [PATCH] Add new security keys to zwave_js config flow (#115835) --- homeassistant/components/zwave_js/__init__.py | 27 +++- .../components/zwave_js/config_flow.py | 52 +++++++ homeassistant/components/zwave_js/const.py | 7 + tests/components/zwave_js/test_config_flow.py | 145 ++++++++++++++++++ tests/components/zwave_js/test_init.py | 24 +++ 5 files changed, 254 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/zwave_js/__init__.py b/homeassistant/components/zwave_js/__init__.py index 2b6852126424b1..4b0cc4ac7a9fd2 100644 --- a/homeassistant/components/zwave_js/__init__.py +++ b/homeassistant/components/zwave_js/__init__.py @@ -8,6 +8,7 @@ import logging from typing import Any +from awesomeversion import AwesomeVersion from zwave_js_server.client import Client as ZwaveClient from zwave_js_server.const import CommandClass, RemoveNodeReason from zwave_js_server.exceptions import BaseZwaveJSServerError, InvalidServerVersion @@ -78,6 +79,8 @@ ATTR_VALUE, ATTR_VALUE_RAW, CONF_ADDON_DEVICE, + CONF_ADDON_LR_S2_ACCESS_CONTROL_KEY, + CONF_ADDON_LR_S2_AUTHENTICATED_KEY, CONF_ADDON_NETWORK_KEY, CONF_ADDON_S0_LEGACY_KEY, CONF_ADDON_S2_ACCESS_CONTROL_KEY, @@ -85,6 +88,8 @@ CONF_ADDON_S2_UNAUTHENTICATED_KEY, CONF_DATA_COLLECTION_OPTED_IN, CONF_INTEGRATION_CREATED_ADDON, + CONF_LR_S2_ACCESS_CONTROL_KEY, + CONF_LR_S2_AUTHENTICATED_KEY, CONF_NETWORK_KEY, CONF_S0_LEGACY_KEY, CONF_S2_ACCESS_CONTROL_KEY, @@ -97,6 +102,7 @@ EVENT_DEVICE_ADDED_TO_REGISTRY, LIB_LOGGER, LOGGER, + LR_ADDON_VERSION, USER_AGENT, ZWAVE_JS_NOTIFICATION_EVENT, ZWAVE_JS_VALUE_NOTIFICATION_EVENT, @@ -1051,8 +1057,9 @@ async def async_ensure_addon_running(hass: HomeAssistant, entry: ConfigEntry) -> s2_access_control_key: str = entry.data.get(CONF_S2_ACCESS_CONTROL_KEY, "") s2_authenticated_key: str = entry.data.get(CONF_S2_AUTHENTICATED_KEY, "") s2_unauthenticated_key: str = entry.data.get(CONF_S2_UNAUTHENTICATED_KEY, "") + lr_s2_access_control_key: str = entry.data.get(CONF_LR_S2_ACCESS_CONTROL_KEY, "") + lr_s2_authenticated_key: str = entry.data.get(CONF_LR_S2_AUTHENTICATED_KEY, "") addon_state = addon_info.state - addon_config = { CONF_ADDON_DEVICE: usb_path, CONF_ADDON_S0_LEGACY_KEY: s0_legacy_key, @@ -1060,6 +1067,9 @@ async def async_ensure_addon_running(hass: HomeAssistant, entry: ConfigEntry) -> CONF_ADDON_S2_AUTHENTICATED_KEY: s2_authenticated_key, CONF_ADDON_S2_UNAUTHENTICATED_KEY: s2_unauthenticated_key, } + if addon_info.version and AwesomeVersion(addon_info.version) >= LR_ADDON_VERSION: + addon_config[CONF_ADDON_LR_S2_ACCESS_CONTROL_KEY] = lr_s2_access_control_key + addon_config[CONF_ADDON_LR_S2_AUTHENTICATED_KEY] = lr_s2_authenticated_key if addon_state == AddonState.NOT_INSTALLED: addon_manager.async_schedule_install_setup_addon( @@ -1099,6 +1109,21 @@ async def async_ensure_addon_running(hass: HomeAssistant, entry: ConfigEntry) -> updates[CONF_S2_AUTHENTICATED_KEY] = addon_s2_authenticated_key if s2_unauthenticated_key != addon_s2_unauthenticated_key: updates[CONF_S2_UNAUTHENTICATED_KEY] = addon_s2_unauthenticated_key + + if addon_info.version and AwesomeVersion(addon_info.version) >= AwesomeVersion( + LR_ADDON_VERSION + ): + addon_lr_s2_access_control_key = addon_options.get( + CONF_ADDON_LR_S2_ACCESS_CONTROL_KEY, "" + ) + addon_lr_s2_authenticated_key = addon_options.get( + CONF_ADDON_LR_S2_AUTHENTICATED_KEY, "" + ) + if lr_s2_access_control_key != addon_lr_s2_access_control_key: + updates[CONF_LR_S2_ACCESS_CONTROL_KEY] = addon_lr_s2_access_control_key + if lr_s2_authenticated_key != addon_lr_s2_authenticated_key: + updates[CONF_LR_S2_AUTHENTICATED_KEY] = addon_lr_s2_authenticated_key + if updates: hass.config_entries.async_update_entry(entry, data={**entry.data, **updates}) diff --git a/homeassistant/components/zwave_js/config_flow.py b/homeassistant/components/zwave_js/config_flow.py index 069d9f6d003f1b..dff582558b1aef 100644 --- a/homeassistant/components/zwave_js/config_flow.py +++ b/homeassistant/components/zwave_js/config_flow.py @@ -46,12 +46,16 @@ CONF_ADDON_DEVICE, CONF_ADDON_EMULATE_HARDWARE, CONF_ADDON_LOG_LEVEL, + CONF_ADDON_LR_S2_ACCESS_CONTROL_KEY, + CONF_ADDON_LR_S2_AUTHENTICATED_KEY, CONF_ADDON_NETWORK_KEY, CONF_ADDON_S0_LEGACY_KEY, CONF_ADDON_S2_ACCESS_CONTROL_KEY, CONF_ADDON_S2_AUTHENTICATED_KEY, CONF_ADDON_S2_UNAUTHENTICATED_KEY, CONF_INTEGRATION_CREATED_ADDON, + CONF_LR_S2_ACCESS_CONTROL_KEY, + CONF_LR_S2_AUTHENTICATED_KEY, CONF_S0_LEGACY_KEY, CONF_S2_ACCESS_CONTROL_KEY, CONF_S2_AUTHENTICATED_KEY, @@ -86,6 +90,8 @@ CONF_ADDON_S2_ACCESS_CONTROL_KEY: CONF_S2_ACCESS_CONTROL_KEY, CONF_ADDON_S2_AUTHENTICATED_KEY: CONF_S2_AUTHENTICATED_KEY, CONF_ADDON_S2_UNAUTHENTICATED_KEY: CONF_S2_UNAUTHENTICATED_KEY, + CONF_ADDON_LR_S2_ACCESS_CONTROL_KEY: CONF_LR_S2_ACCESS_CONTROL_KEY, + CONF_ADDON_LR_S2_AUTHENTICATED_KEY: CONF_LR_S2_AUTHENTICATED_KEY, CONF_ADDON_LOG_LEVEL: CONF_LOG_LEVEL, CONF_ADDON_EMULATE_HARDWARE: CONF_EMULATE_HARDWARE, } @@ -172,6 +178,8 @@ def __init__(self) -> None: self.s2_access_control_key: str | None = None self.s2_authenticated_key: str | None = None self.s2_unauthenticated_key: str | None = None + self.lr_s2_access_control_key: str | None = None + self.lr_s2_authenticated_key: str | None = None self.usb_path: str | None = None self.ws_address: str | None = None self.restart_addon: bool = False @@ -565,6 +573,12 @@ async def async_step_on_supervisor( self.s2_unauthenticated_key = addon_config.get( CONF_ADDON_S2_UNAUTHENTICATED_KEY, "" ) + self.lr_s2_access_control_key = addon_config.get( + CONF_ADDON_LR_S2_ACCESS_CONTROL_KEY, "" + ) + self.lr_s2_authenticated_key = addon_config.get( + CONF_ADDON_LR_S2_AUTHENTICATED_KEY, "" + ) return await self.async_step_finish_addon_setup() if addon_info.state == AddonState.NOT_RUNNING: @@ -584,6 +598,8 @@ async def async_step_configure_addon( self.s2_access_control_key = user_input[CONF_S2_ACCESS_CONTROL_KEY] self.s2_authenticated_key = user_input[CONF_S2_AUTHENTICATED_KEY] self.s2_unauthenticated_key = user_input[CONF_S2_UNAUTHENTICATED_KEY] + self.lr_s2_access_control_key = user_input[CONF_LR_S2_ACCESS_CONTROL_KEY] + self.lr_s2_authenticated_key = user_input[CONF_LR_S2_AUTHENTICATED_KEY] if not self._usb_discovery: self.usb_path = user_input[CONF_USB_PATH] @@ -594,6 +610,8 @@ async def async_step_configure_addon( CONF_ADDON_S2_ACCESS_CONTROL_KEY: self.s2_access_control_key, CONF_ADDON_S2_AUTHENTICATED_KEY: self.s2_authenticated_key, CONF_ADDON_S2_UNAUTHENTICATED_KEY: self.s2_unauthenticated_key, + CONF_ADDON_LR_S2_ACCESS_CONTROL_KEY: self.lr_s2_access_control_key, + CONF_ADDON_LR_S2_AUTHENTICATED_KEY: self.lr_s2_authenticated_key, } if new_addon_config != addon_config: @@ -614,6 +632,12 @@ async def async_step_configure_addon( s2_unauthenticated_key = addon_config.get( CONF_ADDON_S2_UNAUTHENTICATED_KEY, self.s2_unauthenticated_key or "" ) + lr_s2_access_control_key = addon_config.get( + CONF_ADDON_LR_S2_ACCESS_CONTROL_KEY, self.lr_s2_access_control_key or "" + ) + lr_s2_authenticated_key = addon_config.get( + CONF_ADDON_LR_S2_AUTHENTICATED_KEY, self.lr_s2_authenticated_key or "" + ) schema = { vol.Optional(CONF_S0_LEGACY_KEY, default=s0_legacy_key): str, @@ -624,6 +648,12 @@ async def async_step_configure_addon( vol.Optional( CONF_S2_UNAUTHENTICATED_KEY, default=s2_unauthenticated_key ): str, + vol.Optional( + CONF_LR_S2_ACCESS_CONTROL_KEY, default=lr_s2_access_control_key + ): str, + vol.Optional( + CONF_LR_S2_AUTHENTICATED_KEY, default=lr_s2_authenticated_key + ): str, } if not self._usb_discovery: @@ -670,6 +700,8 @@ async def async_step_finish_addon_setup( CONF_S2_ACCESS_CONTROL_KEY: self.s2_access_control_key, CONF_S2_AUTHENTICATED_KEY: self.s2_authenticated_key, CONF_S2_UNAUTHENTICATED_KEY: self.s2_unauthenticated_key, + CONF_LR_S2_ACCESS_CONTROL_KEY: self.lr_s2_access_control_key, + CONF_LR_S2_AUTHENTICATED_KEY: self.lr_s2_authenticated_key, } ) return self._async_create_entry_from_vars() @@ -690,6 +722,8 @@ def _async_create_entry_from_vars(self) -> ConfigFlowResult: CONF_S2_ACCESS_CONTROL_KEY: self.s2_access_control_key, CONF_S2_AUTHENTICATED_KEY: self.s2_authenticated_key, CONF_S2_UNAUTHENTICATED_KEY: self.s2_unauthenticated_key, + CONF_LR_S2_ACCESS_CONTROL_KEY: self.lr_s2_access_control_key, + CONF_LR_S2_AUTHENTICATED_KEY: self.lr_s2_authenticated_key, CONF_USE_ADDON: self.use_addon, CONF_INTEGRATION_CREATED_ADDON: self.integration_created_addon, }, @@ -801,6 +835,8 @@ async def async_step_configure_addon( self.s2_access_control_key = user_input[CONF_S2_ACCESS_CONTROL_KEY] self.s2_authenticated_key = user_input[CONF_S2_AUTHENTICATED_KEY] self.s2_unauthenticated_key = user_input[CONF_S2_UNAUTHENTICATED_KEY] + self.lr_s2_access_control_key = user_input[CONF_LR_S2_ACCESS_CONTROL_KEY] + self.lr_s2_authenticated_key = user_input[CONF_LR_S2_AUTHENTICATED_KEY] self.usb_path = user_input[CONF_USB_PATH] new_addon_config = { @@ -810,6 +846,8 @@ async def async_step_configure_addon( CONF_ADDON_S2_ACCESS_CONTROL_KEY: self.s2_access_control_key, CONF_ADDON_S2_AUTHENTICATED_KEY: self.s2_authenticated_key, CONF_ADDON_S2_UNAUTHENTICATED_KEY: self.s2_unauthenticated_key, + CONF_ADDON_LR_S2_ACCESS_CONTROL_KEY: self.lr_s2_access_control_key, + CONF_ADDON_LR_S2_AUTHENTICATED_KEY: self.lr_s2_authenticated_key, CONF_ADDON_LOG_LEVEL: user_input[CONF_LOG_LEVEL], CONF_ADDON_EMULATE_HARDWARE: user_input.get( CONF_EMULATE_HARDWARE, False @@ -850,6 +888,12 @@ async def async_step_configure_addon( s2_unauthenticated_key = addon_config.get( CONF_ADDON_S2_UNAUTHENTICATED_KEY, self.s2_unauthenticated_key or "" ) + lr_s2_access_control_key = addon_config.get( + CONF_ADDON_LR_S2_ACCESS_CONTROL_KEY, self.lr_s2_access_control_key or "" + ) + lr_s2_authenticated_key = addon_config.get( + CONF_ADDON_LR_S2_AUTHENTICATED_KEY, self.lr_s2_authenticated_key or "" + ) log_level = addon_config.get(CONF_ADDON_LOG_LEVEL, "info") emulate_hardware = addon_config.get(CONF_ADDON_EMULATE_HARDWARE, False) @@ -868,6 +912,12 @@ async def async_step_configure_addon( vol.Optional( CONF_S2_UNAUTHENTICATED_KEY, default=s2_unauthenticated_key ): str, + vol.Optional( + CONF_LR_S2_ACCESS_CONTROL_KEY, default=lr_s2_access_control_key + ): str, + vol.Optional( + CONF_LR_S2_AUTHENTICATED_KEY, default=lr_s2_authenticated_key + ): str, vol.Optional(CONF_LOG_LEVEL, default=log_level): vol.In( ADDON_LOG_LEVELS ), @@ -921,6 +971,8 @@ async def async_step_finish_addon_setup( CONF_S2_ACCESS_CONTROL_KEY: self.s2_access_control_key, CONF_S2_AUTHENTICATED_KEY: self.s2_authenticated_key, CONF_S2_UNAUTHENTICATED_KEY: self.s2_unauthenticated_key, + CONF_LR_S2_ACCESS_CONTROL_KEY: self.lr_s2_access_control_key, + CONF_LR_S2_AUTHENTICATED_KEY: self.lr_s2_authenticated_key, CONF_USE_ADDON: True, CONF_INTEGRATION_CREATED_ADDON: self.integration_created_addon, } diff --git a/homeassistant/components/zwave_js/const.py b/homeassistant/components/zwave_js/const.py index f022cd42d201f9..a04f9247548b70 100644 --- a/homeassistant/components/zwave_js/const.py +++ b/homeassistant/components/zwave_js/const.py @@ -4,12 +4,15 @@ import logging +from awesomeversion import AwesomeVersion from zwave_js_server.const.command_class.window_covering import ( WindowCoveringPropertyKey, ) from homeassistant.const import APPLICATION_NAME, __version__ as HA_VERSION +LR_ADDON_VERSION = AwesomeVersion("0.5.0") + USER_AGENT = {APPLICATION_NAME: HA_VERSION} CONF_ADDON_DEVICE = "device" @@ -20,12 +23,16 @@ CONF_ADDON_S2_ACCESS_CONTROL_KEY = "s2_access_control_key" CONF_ADDON_S2_AUTHENTICATED_KEY = "s2_authenticated_key" CONF_ADDON_S2_UNAUTHENTICATED_KEY = "s2_unauthenticated_key" +CONF_ADDON_LR_S2_ACCESS_CONTROL_KEY = "lr_s2_access_control_key" +CONF_ADDON_LR_S2_AUTHENTICATED_KEY = "lr_s2_authenticated_key" CONF_INTEGRATION_CREATED_ADDON = "integration_created_addon" CONF_NETWORK_KEY = "network_key" CONF_S0_LEGACY_KEY = "s0_legacy_key" CONF_S2_ACCESS_CONTROL_KEY = "s2_access_control_key" CONF_S2_AUTHENTICATED_KEY = "s2_authenticated_key" CONF_S2_UNAUTHENTICATED_KEY = "s2_unauthenticated_key" +CONF_LR_S2_ACCESS_CONTROL_KEY = "lr_s2_access_control_key" +CONF_LR_S2_AUTHENTICATED_KEY = "lr_s2_authenticated_key" CONF_USB_PATH = "usb_path" CONF_USE_ADDON = "use_addon" CONF_DATA_COLLECTION_OPTED_IN = "data_collection_opted_in" diff --git a/tests/components/zwave_js/test_config_flow.py b/tests/components/zwave_js/test_config_flow.py index 3fa59b22305cf7..10fd5edfabb4a9 100644 --- a/tests/components/zwave_js/test_config_flow.py +++ b/tests/components/zwave_js/test_config_flow.py @@ -222,6 +222,8 @@ async def test_manual(hass: HomeAssistant) -> None: "s2_access_control_key": None, "s2_authenticated_key": None, "s2_unauthenticated_key": None, + "lr_s2_access_control_key": None, + "lr_s2_authenticated_key": None, "use_addon": False, "integration_created_addon": False, } @@ -343,6 +345,8 @@ async def test_supervisor_discovery( addon_options["s2_access_control_key"] = "new456" addon_options["s2_authenticated_key"] = "new789" addon_options["s2_unauthenticated_key"] = "new987" + addon_options["lr_s2_access_control_key"] = "new654" + addon_options["lr_s2_authenticated_key"] = "new321" result = await hass.config_entries.flow.async_init( DOMAIN, @@ -376,6 +380,8 @@ async def test_supervisor_discovery( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", "use_addon": True, "integration_created_addon": False, } @@ -422,6 +428,8 @@ async def test_clean_discovery_on_user_create( addon_options["s2_access_control_key"] = "new456" addon_options["s2_authenticated_key"] = "new789" addon_options["s2_unauthenticated_key"] = "new987" + addon_options["lr_s2_access_control_key"] = "new654" + addon_options["lr_s2_authenticated_key"] = "new321" result = await hass.config_entries.flow.async_init( DOMAIN, @@ -477,6 +485,8 @@ async def test_clean_discovery_on_user_create( "s2_access_control_key": None, "s2_authenticated_key": None, "s2_unauthenticated_key": None, + "lr_s2_access_control_key": None, + "lr_s2_authenticated_key": None, "use_addon": False, "integration_created_addon": False, } @@ -606,6 +616,8 @@ async def test_usb_discovery( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", }, ) @@ -619,6 +631,8 @@ async def test_usb_discovery( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", } }, ) @@ -650,6 +664,8 @@ async def test_usb_discovery( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", "use_addon": True, "integration_created_addon": True, } @@ -690,6 +706,8 @@ async def test_usb_discovery_addon_not_running( "s2_access_control_key": "", "s2_authenticated_key": "", "s2_unauthenticated_key": "", + "lr_s2_access_control_key": "", + "lr_s2_authenticated_key": "", } result = await hass.config_entries.flow.async_configure( @@ -699,6 +717,8 @@ async def test_usb_discovery_addon_not_running( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", }, ) @@ -712,6 +732,8 @@ async def test_usb_discovery_addon_not_running( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", } }, ) @@ -743,6 +765,8 @@ async def test_usb_discovery_addon_not_running( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", "use_addon": True, "integration_created_addon": False, } @@ -788,6 +812,8 @@ async def test_discovery_addon_not_running( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", }, ) @@ -801,6 +827,8 @@ async def test_discovery_addon_not_running( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", } }, ) @@ -832,6 +860,8 @@ async def test_discovery_addon_not_running( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", "use_addon": True, "integration_created_addon": False, } @@ -885,6 +915,8 @@ async def test_discovery_addon_not_installed( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", }, ) @@ -898,6 +930,8 @@ async def test_discovery_addon_not_installed( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", } }, ) @@ -929,6 +963,8 @@ async def test_discovery_addon_not_installed( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", "use_addon": True, "integration_created_addon": True, } @@ -1068,6 +1104,8 @@ async def test_not_addon(hass: HomeAssistant, supervisor) -> None: "s2_access_control_key": None, "s2_authenticated_key": None, "s2_unauthenticated_key": None, + "lr_s2_access_control_key": None, + "lr_s2_authenticated_key": None, "use_addon": False, "integration_created_addon": False, } @@ -1089,6 +1127,8 @@ async def test_addon_running( addon_options["s2_access_control_key"] = "new456" addon_options["s2_authenticated_key"] = "new789" addon_options["s2_unauthenticated_key"] = "new987" + addon_options["lr_s2_access_control_key"] = "new654" + addon_options["lr_s2_authenticated_key"] = "new321" result = await hass.config_entries.flow.async_init( DOMAIN, context={"source": config_entries.SOURCE_USER} @@ -1120,6 +1160,8 @@ async def test_addon_running( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", "use_addon": True, "integration_created_addon": False, } @@ -1207,6 +1249,9 @@ async def test_addon_running_already_configured( addon_options["s2_access_control_key"] = "new456" addon_options["s2_authenticated_key"] = "new789" addon_options["s2_unauthenticated_key"] = "new987" + addon_options["lr_s2_access_control_key"] = "new654" + addon_options["lr_s2_authenticated_key"] = "new321" + entry = MockConfigEntry( domain=DOMAIN, data={ @@ -1217,6 +1262,8 @@ async def test_addon_running_already_configured( "s2_access_control_key": "old456", "s2_authenticated_key": "old789", "s2_unauthenticated_key": "old987", + "lr_s2_access_control_key": "old654", + "lr_s2_authenticated_key": "old321", }, title=TITLE, unique_id=1234, # Unique ID is purposely set to int to test migration logic @@ -1243,6 +1290,8 @@ async def test_addon_running_already_configured( assert entry.data["s2_access_control_key"] == "new456" assert entry.data["s2_authenticated_key"] == "new789" assert entry.data["s2_unauthenticated_key"] == "new987" + assert entry.data["lr_s2_access_control_key"] == "new654" + assert entry.data["lr_s2_authenticated_key"] == "new321" @pytest.mark.parametrize("discovery_info", [{"config": ADDON_DISCOVERY_INFO}]) @@ -1279,6 +1328,8 @@ async def test_addon_installed( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", }, ) @@ -1292,6 +1343,8 @@ async def test_addon_installed( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", } }, ) @@ -1323,6 +1376,8 @@ async def test_addon_installed( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", "use_addon": True, "integration_created_addon": False, } @@ -1367,6 +1422,8 @@ async def test_addon_installed_start_failure( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", }, ) @@ -1380,6 +1437,8 @@ async def test_addon_installed_start_failure( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", } }, ) @@ -1442,6 +1501,8 @@ async def test_addon_installed_failures( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", }, ) @@ -1455,6 +1516,8 @@ async def test_addon_installed_failures( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", } }, ) @@ -1508,6 +1571,8 @@ async def test_addon_installed_set_options_failure( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", }, ) @@ -1521,6 +1586,8 @@ async def test_addon_installed_set_options_failure( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", } }, ) @@ -1552,6 +1619,8 @@ async def test_addon_installed_already_configured( "s2_access_control_key": "old456", "s2_authenticated_key": "old789", "s2_unauthenticated_key": "old987", + "lr_s2_access_control_key": "old654", + "lr_s2_authenticated_key": "old321", }, title=TITLE, unique_id="1234", @@ -1580,6 +1649,8 @@ async def test_addon_installed_already_configured( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", }, ) @@ -1593,6 +1664,8 @@ async def test_addon_installed_already_configured( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", } }, ) @@ -1613,6 +1686,8 @@ async def test_addon_installed_already_configured( assert entry.data["s2_access_control_key"] == "new456" assert entry.data["s2_authenticated_key"] == "new789" assert entry.data["s2_unauthenticated_key"] == "new987" + assert entry.data["lr_s2_access_control_key"] == "new654" + assert entry.data["lr_s2_authenticated_key"] == "new321" @pytest.mark.parametrize("discovery_info", [{"config": ADDON_DISCOVERY_INFO}]) @@ -1659,6 +1734,8 @@ async def test_addon_not_installed( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", }, ) @@ -1672,6 +1749,8 @@ async def test_addon_not_installed( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", } }, ) @@ -1703,6 +1782,8 @@ async def test_addon_not_installed( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", "use_addon": True, "integration_created_addon": True, } @@ -1844,6 +1925,8 @@ async def test_options_not_addon( "s2_access_control_key": "old456", "s2_authenticated_key": "old789", "s2_unauthenticated_key": "old987", + "lr_s2_access_control_key": "old654", + "lr_s2_authenticated_key": "old321", }, { "usb_path": "/new", @@ -1851,6 +1934,8 @@ async def test_options_not_addon( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", "log_level": "info", "emulate_hardware": False, }, @@ -1866,6 +1951,8 @@ async def test_options_not_addon( "s2_access_control_key": "old456", "s2_authenticated_key": "old789", "s2_unauthenticated_key": "old987", + "lr_s2_access_control_key": "old654", + "lr_s2_authenticated_key": "old321", }, { "usb_path": "/new", @@ -1873,6 +1960,8 @@ async def test_options_not_addon( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", "log_level": "info", "emulate_hardware": False, }, @@ -1956,6 +2045,14 @@ async def test_options_addon_running( entry.data["s2_unauthenticated_key"] == new_addon_options["s2_unauthenticated_key"] ) + assert ( + entry.data["lr_s2_access_control_key"] + == new_addon_options["lr_s2_access_control_key"] + ) + assert ( + entry.data["lr_s2_authenticated_key"] + == new_addon_options["lr_s2_authenticated_key"] + ) assert entry.data["use_addon"] is True assert entry.data["integration_created_addon"] is False assert client.connect.call_count == 2 @@ -1975,6 +2072,8 @@ async def test_options_addon_running( "s2_access_control_key": "old456", "s2_authenticated_key": "old789", "s2_unauthenticated_key": "old987", + "lr_s2_access_control_key": "old654", + "lr_s2_authenticated_key": "old321", "log_level": "info", "emulate_hardware": False, }, @@ -1984,6 +2083,8 @@ async def test_options_addon_running( "s2_access_control_key": "old456", "s2_authenticated_key": "old789", "s2_unauthenticated_key": "old987", + "lr_s2_access_control_key": "old654", + "lr_s2_authenticated_key": "old321", "log_level": "info", "emulate_hardware": False, }, @@ -2053,6 +2154,14 @@ async def test_options_addon_running_no_changes( entry.data["s2_unauthenticated_key"] == new_addon_options["s2_unauthenticated_key"] ) + assert ( + entry.data["lr_s2_access_control_key"] + == new_addon_options["lr_s2_access_control_key"] + ) + assert ( + entry.data["lr_s2_authenticated_key"] + == new_addon_options["lr_s2_authenticated_key"] + ) assert entry.data["use_addon"] is True assert entry.data["integration_created_addon"] is False assert client.connect.call_count == 2 @@ -2090,6 +2199,8 @@ async def different_device_server_version(*args): "s2_access_control_key": "old456", "s2_authenticated_key": "old789", "s2_unauthenticated_key": "old987", + "lr_s2_access_control_key": "old654", + "lr_s2_authenticated_key": "old321", "log_level": "info", "emulate_hardware": False, }, @@ -2099,6 +2210,8 @@ async def different_device_server_version(*args): "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", "log_level": "info", "emulate_hardware": False, }, @@ -2115,6 +2228,8 @@ async def different_device_server_version(*args): "s2_access_control_key": "old456", "s2_authenticated_key": "old789", "s2_unauthenticated_key": "old987", + "lr_s2_access_control_key": "old654", + "lr_s2_authenticated_key": "old321", "log_level": "info", }, { @@ -2123,6 +2238,8 @@ async def different_device_server_version(*args): "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", "log_level": "info", "emulate_hardware": False, }, @@ -2244,6 +2361,8 @@ async def test_options_different_device( "s2_access_control_key": "old456", "s2_authenticated_key": "old789", "s2_unauthenticated_key": "old987", + "lr_s2_access_control_key": "old654", + "lr_s2_authenticated_key": "old321", "log_level": "info", "emulate_hardware": False, }, @@ -2253,6 +2372,8 @@ async def test_options_different_device( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", "log_level": "info", "emulate_hardware": False, }, @@ -2269,6 +2390,8 @@ async def test_options_different_device( "s2_access_control_key": "old456", "s2_authenticated_key": "old789", "s2_unauthenticated_key": "old987", + "lr_s2_access_control_key": "old654", + "lr_s2_authenticated_key": "old321", "log_level": "info", "emulate_hardware": False, }, @@ -2278,6 +2401,8 @@ async def test_options_different_device( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", "log_level": "info", "emulate_hardware": False, }, @@ -2399,6 +2524,8 @@ async def test_options_addon_restart_failed( "s2_access_control_key": "old456", "s2_authenticated_key": "old789", "s2_unauthenticated_key": "old987", + "lr_s2_access_control_key": "old654", + "lr_s2_authenticated_key": "old321", "log_level": "info", "emulate_hardware": False, }, @@ -2408,6 +2535,8 @@ async def test_options_addon_restart_failed( "s2_access_control_key": "old456", "s2_authenticated_key": "old789", "s2_unauthenticated_key": "old987", + "lr_s2_access_control_key": "old654", + "lr_s2_authenticated_key": "old321", "log_level": "info", "emulate_hardware": False, }, @@ -2488,6 +2617,8 @@ async def test_options_addon_running_server_info_failure( "s2_access_control_key": "old456", "s2_authenticated_key": "old789", "s2_unauthenticated_key": "old987", + "lr_s2_access_control_key": "old654", + "lr_s2_authenticated_key": "old321", }, { "usb_path": "/new", @@ -2495,6 +2626,8 @@ async def test_options_addon_running_server_info_failure( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", "log_level": "info", "emulate_hardware": False, }, @@ -2510,6 +2643,8 @@ async def test_options_addon_running_server_info_failure( "s2_access_control_key": "old456", "s2_authenticated_key": "old789", "s2_unauthenticated_key": "old987", + "lr_s2_access_control_key": "old654", + "lr_s2_authenticated_key": "old321", }, { "usb_path": "/new", @@ -2517,6 +2652,8 @@ async def test_options_addon_running_server_info_failure( "s2_access_control_key": "new456", "s2_authenticated_key": "new789", "s2_unauthenticated_key": "new987", + "lr_s2_access_control_key": "new654", + "lr_s2_authenticated_key": "new321", "log_level": "info", "emulate_hardware": False, }, @@ -2647,6 +2784,8 @@ async def test_import_addon_installed( "s2_access_control_key": "", "s2_authenticated_key": "", "s2_unauthenticated_key": "", + "lr_s2_access_control_key": "", + "lr_s2_authenticated_key": "", } result = await hass.config_entries.flow.async_configure( @@ -2663,6 +2802,8 @@ async def test_import_addon_installed( "s2_access_control_key": "", "s2_authenticated_key": "", "s2_unauthenticated_key": "", + "lr_s2_access_control_key": "", + "lr_s2_authenticated_key": "", } }, ) @@ -2694,6 +2835,8 @@ async def test_import_addon_installed( "s2_access_control_key": "", "s2_authenticated_key": "", "s2_unauthenticated_key": "", + "lr_s2_access_control_key": "", + "lr_s2_authenticated_key": "", "use_addon": True, "integration_created_addon": False, } @@ -2742,6 +2885,8 @@ async def test_zeroconf(hass: HomeAssistant) -> None: "s2_access_control_key": None, "s2_authenticated_key": None, "s2_unauthenticated_key": None, + "lr_s2_access_control_key": None, + "lr_s2_authenticated_key": None, "use_addon": False, "integration_created_addon": False, } diff --git a/tests/components/zwave_js/test_init.py b/tests/components/zwave_js/test_init.py index d26cc438d04c50..8c9c05a124ead4 100644 --- a/tests/components/zwave_js/test_init.py +++ b/tests/components/zwave_js/test_init.py @@ -519,12 +519,16 @@ async def test_start_addon( s2_access_control_key = "s2_access_control" s2_authenticated_key = "s2_authenticated" s2_unauthenticated_key = "s2_unauthenticated" + lr_s2_access_control_key = "lr_s2_access_control" + lr_s2_authenticated_key = "lr_s2_authenticated" addon_options = { "device": device, "s0_legacy_key": s0_legacy_key, "s2_access_control_key": s2_access_control_key, "s2_authenticated_key": s2_authenticated_key, "s2_unauthenticated_key": s2_unauthenticated_key, + "lr_s2_access_control_key": lr_s2_access_control_key, + "lr_s2_authenticated_key": lr_s2_authenticated_key, } entry = MockConfigEntry( domain=DOMAIN, @@ -536,6 +540,8 @@ async def test_start_addon( "s2_access_control_key": s2_access_control_key, "s2_authenticated_key": s2_authenticated_key, "s2_unauthenticated_key": s2_unauthenticated_key, + "lr_s2_access_control_key": lr_s2_access_control_key, + "lr_s2_authenticated_key": lr_s2_authenticated_key, }, ) entry.add_to_hass(hass) @@ -641,6 +647,10 @@ async def test_addon_info_failure( "new_s2_authenticated_key", "old_s2_unauthenticated_key", "new_s2_unauthenticated_key", + "old_lr_s2_access_control_key", + "new_lr_s2_access_control_key", + "old_lr_s2_authenticated_key", + "new_lr_s2_authenticated_key", ), [ ( @@ -654,6 +664,10 @@ async def test_addon_info_failure( "new789", "old987", "new987", + "old654", + "new654", + "old321", + "new321", ) ], ) @@ -675,6 +689,10 @@ async def test_addon_options_changed( new_s2_authenticated_key, old_s2_unauthenticated_key, new_s2_unauthenticated_key, + old_lr_s2_access_control_key, + new_lr_s2_access_control_key, + old_lr_s2_authenticated_key, + new_lr_s2_authenticated_key, ) -> None: """Test update config entry data on entry setup if add-on options changed.""" addon_options["device"] = new_device @@ -682,6 +700,8 @@ async def test_addon_options_changed( addon_options["s2_access_control_key"] = new_s2_access_control_key addon_options["s2_authenticated_key"] = new_s2_authenticated_key addon_options["s2_unauthenticated_key"] = new_s2_unauthenticated_key + addon_options["lr_s2_access_control_key"] = new_lr_s2_access_control_key + addon_options["lr_s2_authenticated_key"] = new_lr_s2_authenticated_key entry = MockConfigEntry( domain=DOMAIN, title="Z-Wave JS", @@ -693,6 +713,8 @@ async def test_addon_options_changed( "s2_access_control_key": old_s2_access_control_key, "s2_authenticated_key": old_s2_authenticated_key, "s2_unauthenticated_key": old_s2_unauthenticated_key, + "lr_s2_access_control_key": old_lr_s2_access_control_key, + "lr_s2_authenticated_key": old_lr_s2_authenticated_key, }, ) entry.add_to_hass(hass) @@ -706,6 +728,8 @@ async def test_addon_options_changed( assert entry.data["s2_access_control_key"] == new_s2_access_control_key assert entry.data["s2_authenticated_key"] == new_s2_authenticated_key assert entry.data["s2_unauthenticated_key"] == new_s2_unauthenticated_key + assert entry.data["lr_s2_access_control_key"] == new_lr_s2_access_control_key + assert entry.data["lr_s2_authenticated_key"] == new_lr_s2_authenticated_key assert install_addon.call_count == 0 assert start_addon.call_count == 0