From 8d9a844e847ccd83eb6a17181ca8703789a67a7c Mon Sep 17 00:00:00 2001 From: Michael <35783820+mib1185@users.noreply.github.com> Date: Mon, 2 Nov 2020 14:23:16 +0100 Subject: [PATCH] Add verify_ssl option for connection setup to synology_dsm (#42539) --- .../components/synology_dsm/__init__.py | 8 +++-- .../components/synology_dsm/config_flow.py | 20 ++++++++--- .../components/synology_dsm/const.py | 3 +- .../components/synology_dsm/strings.json | 2 ++ .../synology_dsm/translations/en.json | 8 ++--- .../synology_dsm/test_config_flow.py | 36 +++++++++++++------ 6 files changed, 55 insertions(+), 22 deletions(-) diff --git a/homeassistant/components/synology_dsm/__init__.py b/homeassistant/components/synology_dsm/__init__.py index f5e57934b63..9ad965feaf5 100644 --- a/homeassistant/components/synology_dsm/__init__.py +++ b/homeassistant/components/synology_dsm/__init__.py @@ -27,6 +27,7 @@ from homeassistant.const import ( CONF_SSL, CONF_TIMEOUT, CONF_USERNAME, + CONF_VERIFY_SSL, ) from homeassistant.core import callback from homeassistant.exceptions import ConfigEntryNotReady @@ -43,7 +44,8 @@ from homeassistant.helpers.typing import HomeAssistantType from .const import ( CONF_VOLUMES, DEFAULT_SCAN_INTERVAL, - DEFAULT_SSL, + DEFAULT_USE_SSL, + DEFAULT_VERIFY_SSL, DOMAIN, ENTITY_CLASS, ENTITY_ENABLE, @@ -64,7 +66,8 @@ CONFIG_SCHEMA = vol.Schema( { vol.Required(CONF_HOST): cv.string, vol.Optional(CONF_PORT): cv.port, - vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, + vol.Optional(CONF_SSL, default=DEFAULT_USE_SSL): cv.boolean, + vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, vol.Required(CONF_USERNAME): cv.string, vol.Required(CONF_PASSWORD): cv.string, vol.Optional(CONF_DISKS): cv.ensure_list, @@ -260,6 +263,7 @@ class SynoApi: self._entry.data[CONF_USERNAME], self._entry.data[CONF_PASSWORD], self._entry.data[CONF_SSL], + self._entry.data[CONF_VERIFY_SSL], timeout=self._entry.options.get(CONF_TIMEOUT), ) await self._hass.async_add_executor_job( diff --git a/homeassistant/components/synology_dsm/config_flow.py b/homeassistant/components/synology_dsm/config_flow.py index 314bab54806..da792e3a4d3 100644 --- a/homeassistant/components/synology_dsm/config_flow.py +++ b/homeassistant/components/synology_dsm/config_flow.py @@ -25,6 +25,7 @@ from homeassistant.const import ( CONF_SSL, CONF_TIMEOUT, CONF_USERNAME, + CONF_VERIFY_SSL, ) from homeassistant.core import callback import homeassistant.helpers.config_validation as cv @@ -34,8 +35,9 @@ from .const import ( DEFAULT_PORT, DEFAULT_PORT_SSL, DEFAULT_SCAN_INTERVAL, - DEFAULT_SSL, DEFAULT_TIMEOUT, + DEFAULT_USE_SSL, + DEFAULT_VERIFY_SSL, ) from .const import DOMAIN # pylint: disable=unused-import @@ -62,7 +64,13 @@ def _ordered_shared_schema(schema_input): vol.Required(CONF_USERNAME, default=schema_input.get(CONF_USERNAME, "")): str, vol.Required(CONF_PASSWORD, default=schema_input.get(CONF_PASSWORD, "")): str, vol.Optional(CONF_PORT, default=schema_input.get(CONF_PORT, "")): str, - vol.Optional(CONF_SSL, default=schema_input.get(CONF_SSL, DEFAULT_SSL)): bool, + vol.Optional( + CONF_SSL, default=schema_input.get(CONF_SSL, DEFAULT_USE_SSL) + ): bool, + vol.Optional( + CONF_VERIFY_SSL, + default=schema_input.get(CONF_VERIFY_SSL, DEFAULT_VERIFY_SSL), + ): bool, } @@ -117,7 +125,8 @@ class SynologyDSMFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): port = user_input.get(CONF_PORT) username = user_input[CONF_USERNAME] password = user_input[CONF_PASSWORD] - use_ssl = user_input.get(CONF_SSL, DEFAULT_SSL) + use_ssl = user_input.get(CONF_SSL, DEFAULT_USE_SSL) + verify_ssl = user_input.get(CONF_VERIFY_SSL, DEFAULT_VERIFY_SSL) otp_code = user_input.get(CONF_OTP_CODE) if not port: @@ -126,7 +135,9 @@ class SynologyDSMFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): else: port = DEFAULT_PORT - api = SynologyDSM(host, port, username, password, use_ssl, timeout=30) + api = SynologyDSM( + host, port, username, password, use_ssl, verify_ssl, timeout=30 + ) try: serial = await self.hass.async_add_executor_job( @@ -161,6 +172,7 @@ class SynologyDSMFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): CONF_HOST: host, CONF_PORT: port, CONF_SSL: use_ssl, + CONF_VERIFY_SSL: verify_ssl, CONF_USERNAME: username, CONF_PASSWORD: password, CONF_MAC: api.network.macs, diff --git a/homeassistant/components/synology_dsm/const.py b/homeassistant/components/synology_dsm/const.py index f8b05b25fe0..5e5bdf1c2d7 100644 --- a/homeassistant/components/synology_dsm/const.py +++ b/homeassistant/components/synology_dsm/const.py @@ -27,7 +27,8 @@ UNDO_UPDATE_LISTENER = "undo_update_listener" # Configuration CONF_VOLUMES = "volumes" -DEFAULT_SSL = True +DEFAULT_USE_SSL = True +DEFAULT_VERIFY_SSL = False DEFAULT_PORT = 5000 DEFAULT_PORT_SSL = 5001 # Options diff --git a/homeassistant/components/synology_dsm/strings.json b/homeassistant/components/synology_dsm/strings.json index 9ff0b16f8fb..91933571028 100644 --- a/homeassistant/components/synology_dsm/strings.json +++ b/homeassistant/components/synology_dsm/strings.json @@ -8,6 +8,7 @@ "host": "[%key:common::config_flow::data::host%]", "port": "[%key:common::config_flow::data::port%]", "ssl": "[%key:common::config_flow::data::ssl%]", + "verify_ssl": "[%key:common::config_flow::data::verify_ssl%]", "username": "[%key:common::config_flow::data::username%]", "password": "[%key:common::config_flow::data::password%]" } @@ -23,6 +24,7 @@ "description": "Do you want to setup {name} ({host})?", "data": { "ssl": "[%key:common::config_flow::data::ssl%]", + "verify_ssl": "[%key:common::config_flow::data::verify_ssl%]", "username": "[%key:common::config_flow::data::username%]", "password": "[%key:common::config_flow::data::password%]", "port": "[%key:common::config_flow::data::port%]" diff --git a/homeassistant/components/synology_dsm/translations/en.json b/homeassistant/components/synology_dsm/translations/en.json index 54266f9e8fa..1501aa89485 100644 --- a/homeassistant/components/synology_dsm/translations/en.json +++ b/homeassistant/components/synology_dsm/translations/en.json @@ -5,9 +5,7 @@ }, "error": { "cannot_connect": "Failed to connect", - "connection": "Connection error: please check your host, port & ssl", "invalid_auth": "Invalid authentication", - "login": "Login error: please check your username & password", "missing_data": "Missing data: please retry later or an other configuration", "otp_failed": "Two-step authentication failed, retry with a new pass code", "unknown": "Unexpected error" @@ -25,7 +23,8 @@ "password": "Password", "port": "Port", "ssl": "Uses an SSL certificate", - "username": "Username" + "username": "Username", + "verify_ssl": "Verify SSL certificate" }, "description": "Do you want to setup {name} ({host})?", "title": "Synology DSM" @@ -36,7 +35,8 @@ "password": "Password", "port": "Port", "ssl": "Uses an SSL certificate", - "username": "Username" + "username": "Username", + "verify_ssl": "Verify SSL certificate" }, "title": "Synology DSM" } diff --git a/tests/components/synology_dsm/test_config_flow.py b/tests/components/synology_dsm/test_config_flow.py index fd060ce3529..d4fb84f9053 100644 --- a/tests/components/synology_dsm/test_config_flow.py +++ b/tests/components/synology_dsm/test_config_flow.py @@ -16,8 +16,9 @@ from homeassistant.components.synology_dsm.const import ( DEFAULT_PORT, DEFAULT_PORT_SSL, DEFAULT_SCAN_INTERVAL, - DEFAULT_SSL, DEFAULT_TIMEOUT, + DEFAULT_USE_SSL, + DEFAULT_VERIFY_SSL, DOMAIN, ) from homeassistant.config_entries import SOURCE_IMPORT, SOURCE_SSDP, SOURCE_USER @@ -31,6 +32,7 @@ from homeassistant.const import ( CONF_SSL, CONF_TIMEOUT, CONF_USERNAME, + CONF_VERIFY_SSL, ) from homeassistant.helpers.typing import HomeAssistantType @@ -42,7 +44,8 @@ SERIAL = "mySerial" HOST_2 = "nas.worldwide.me" SERIAL_2 = "mySerial2" PORT = 1234 -SSL = True +USE_SSL = True +VERIFY_SSL = False USERNAME = "Home_Assistant" PASSWORD = "password" DEVICE_TOKEN = "Dév!cè_T0k€ñ" @@ -124,7 +127,8 @@ async def test_user(hass: HomeAssistantType, service: MagicMock): data={ CONF_HOST: HOST, CONF_PORT: PORT, - CONF_SSL: SSL, + CONF_SSL: USE_SSL, + CONF_VERIFY_SSL: VERIFY_SSL, CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD, }, @@ -134,7 +138,8 @@ async def test_user(hass: HomeAssistantType, service: MagicMock): assert result["title"] == HOST assert result["data"][CONF_HOST] == HOST assert result["data"][CONF_PORT] == PORT - assert result["data"][CONF_SSL] == SSL + assert result["data"][CONF_SSL] == USE_SSL + assert result["data"][CONF_VERIFY_SSL] == VERIFY_SSL assert result["data"][CONF_USERNAME] == USERNAME assert result["data"][CONF_PASSWORD] == PASSWORD assert result["data"][CONF_MAC] == MACS @@ -150,6 +155,7 @@ async def test_user(hass: HomeAssistantType, service: MagicMock): data={ CONF_HOST: HOST, CONF_SSL: False, + CONF_VERIFY_SSL: VERIFY_SSL, CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD, }, @@ -160,6 +166,7 @@ async def test_user(hass: HomeAssistantType, service: MagicMock): assert result["data"][CONF_HOST] == HOST assert result["data"][CONF_PORT] == DEFAULT_PORT assert not result["data"][CONF_SSL] + assert result["data"][CONF_VERIFY_SSL] == VERIFY_SSL assert result["data"][CONF_USERNAME] == USERNAME assert result["data"][CONF_PASSWORD] == PASSWORD assert result["data"][CONF_MAC] == MACS @@ -201,7 +208,8 @@ async def test_user_2sa(hass: HomeAssistantType, service_2sa: MagicMock): assert result["title"] == HOST assert result["data"][CONF_HOST] == HOST assert result["data"][CONF_PORT] == DEFAULT_PORT_SSL - assert result["data"][CONF_SSL] == DEFAULT_SSL + assert result["data"][CONF_SSL] == DEFAULT_USE_SSL + assert result["data"][CONF_VERIFY_SSL] == DEFAULT_VERIFY_SSL assert result["data"][CONF_USERNAME] == USERNAME assert result["data"][CONF_PASSWORD] == PASSWORD assert result["data"][CONF_MAC] == MACS @@ -225,7 +233,8 @@ async def test_user_vdsm(hass: HomeAssistantType, service_vdsm: MagicMock): data={ CONF_HOST: HOST, CONF_PORT: PORT, - CONF_SSL: SSL, + CONF_SSL: USE_SSL, + CONF_VERIFY_SSL: VERIFY_SSL, CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD, }, @@ -235,7 +244,8 @@ async def test_user_vdsm(hass: HomeAssistantType, service_vdsm: MagicMock): assert result["title"] == HOST assert result["data"][CONF_HOST] == HOST assert result["data"][CONF_PORT] == PORT - assert result["data"][CONF_SSL] == SSL + assert result["data"][CONF_SSL] == USE_SSL + assert result["data"][CONF_VERIFY_SSL] == VERIFY_SSL assert result["data"][CONF_USERNAME] == USERNAME assert result["data"][CONF_PASSWORD] == PASSWORD assert result["data"][CONF_MAC] == MACS @@ -257,7 +267,8 @@ async def test_import(hass: HomeAssistantType, service: MagicMock): assert result["title"] == HOST assert result["data"][CONF_HOST] == HOST assert result["data"][CONF_PORT] == DEFAULT_PORT_SSL - assert result["data"][CONF_SSL] == DEFAULT_SSL + assert result["data"][CONF_SSL] == DEFAULT_USE_SSL + assert result["data"][CONF_VERIFY_SSL] == DEFAULT_VERIFY_SSL assert result["data"][CONF_USERNAME] == USERNAME assert result["data"][CONF_PASSWORD] == PASSWORD assert result["data"][CONF_MAC] == MACS @@ -273,7 +284,8 @@ async def test_import(hass: HomeAssistantType, service: MagicMock): data={ CONF_HOST: HOST_2, CONF_PORT: PORT, - CONF_SSL: SSL, + CONF_SSL: USE_SSL, + CONF_VERIFY_SSL: VERIFY_SSL, CONF_USERNAME: USERNAME, CONF_PASSWORD: PASSWORD, CONF_DISKS: ["sda", "sdb", "sdc"], @@ -285,7 +297,8 @@ async def test_import(hass: HomeAssistantType, service: MagicMock): assert result["title"] == HOST_2 assert result["data"][CONF_HOST] == HOST_2 assert result["data"][CONF_PORT] == PORT - assert result["data"][CONF_SSL] == SSL + assert result["data"][CONF_SSL] == USE_SSL + assert result["data"][CONF_VERIFY_SSL] == VERIFY_SSL assert result["data"][CONF_USERNAME] == USERNAME assert result["data"][CONF_PASSWORD] == PASSWORD assert result["data"][CONF_MAC] == MACS @@ -434,7 +447,8 @@ async def test_form_ssdp(hass: HomeAssistantType, service: MagicMock): assert result["title"] == "192.168.1.5" assert result["data"][CONF_HOST] == "192.168.1.5" assert result["data"][CONF_PORT] == 5001 - assert result["data"][CONF_SSL] == DEFAULT_SSL + assert result["data"][CONF_SSL] == DEFAULT_USE_SSL + assert result["data"][CONF_VERIFY_SSL] == DEFAULT_VERIFY_SSL assert result["data"][CONF_USERNAME] == USERNAME assert result["data"][CONF_PASSWORD] == PASSWORD assert result["data"][CONF_MAC] == MACS