From be04ebf9ed92a328b091004ed3c2c5541955dc91 Mon Sep 17 00:00:00 2001 From: Dan Smith Date: Mon, 29 Feb 2016 17:37:41 -0800 Subject: [PATCH] Give mFi options to control TLS usage The default configuration of the mFi controller generates self-signed certificates which are valid for short periods of time, and which are regnerated on start or as needed. This makes requests mad. Since most people will be using the self-signed certificates anyway, add options to let them choose non-TLS, or unverified connections if they want/need. This bumps the mficlient requirement to 0.3.0 for proper handling of verify=False. --- homeassistant/components/sensor/mfi.py | 12 +++++++++--- homeassistant/components/switch/mfi.py | 12 +++++++++--- requirements_all.txt | 2 +- tests/components/sensor/test_mfi.py | 19 +++++++++++++++++-- 4 files changed, 36 insertions(+), 9 deletions(-) diff --git a/homeassistant/components/sensor/mfi.py b/homeassistant/components/sensor/mfi.py index 37f1e73c607..828af5d3e39 100644 --- a/homeassistant/components/sensor/mfi.py +++ b/homeassistant/components/sensor/mfi.py @@ -13,7 +13,7 @@ from homeassistant.const import CONF_PASSWORD, CONF_USERNAME, TEMP_CELCIUS from homeassistant.helpers import validate_config from homeassistant.helpers.entity import Entity -REQUIREMENTS = ['mficlient==0.2.2'] +REQUIREMENTS = ['mficlient==0.3.0'] _LOGGER = logging.getLogger(__name__) @@ -32,6 +32,8 @@ SENSOR_MODELS = [ 'Input Analog', 'Input Digital', ] +CONF_TLS = 'use_tls' +CONF_VERIFY_TLS = 'verify_tls' # pylint: disable=unused-variable @@ -46,14 +48,18 @@ def setup_platform(hass, config, add_devices, discovery_info=None): return False host = config.get('host') - port = int(config.get('port', 6443)) username = config.get(CONF_USERNAME) password = config.get(CONF_PASSWORD) + use_tls = bool(config.get(CONF_TLS, True)) + verify_tls = bool(config.get(CONF_VERIFY_TLS, True)) + default_port = use_tls and 6443 or 6080 + port = int(config.get('port', default_port)) from mficlient.client import FailedToLogin, MFiClient try: - client = MFiClient(host, username, password, port=port) + client = MFiClient(host, username, password, port=port, + use_tls=use_tls, verify=verify_tls) except (FailedToLogin, requests.exceptions.ConnectionError) as ex: _LOGGER.error('Unable to connect to mFi: %s', str(ex)) return False diff --git a/homeassistant/components/switch/mfi.py b/homeassistant/components/switch/mfi.py index 77346d224bd..51fc9b0e789 100644 --- a/homeassistant/components/switch/mfi.py +++ b/homeassistant/components/switch/mfi.py @@ -14,7 +14,7 @@ from homeassistant.components.switch import DOMAIN, SwitchDevice from homeassistant.const import CONF_PASSWORD, CONF_USERNAME from homeassistant.helpers import validate_config -REQUIREMENTS = ['mficlient==0.2.2'] +REQUIREMENTS = ['mficlient==0.3.0'] _LOGGER = logging.getLogger(__name__) @@ -24,6 +24,8 @@ SWITCH_MODELS = [ 'Output 12v', 'Output 24v', ] +CONF_TLS = 'use_tls' +CONF_VERIFY_TLS = 'verify_tls' # pylint: disable=unused-variable @@ -39,14 +41,18 @@ def setup_platform(hass, config, add_devices, discovery_info=None): return False host = config.get('host') - port = int(config.get('port', 6443)) username = config.get('username') password = config.get('password') + use_tls = bool(config.get(CONF_TLS, True)) + verify_tls = bool(config.get(CONF_VERIFY_TLS, True)) + default_port = use_tls and 6443 or 6080 + port = int(config.get('port', default_port)) from mficlient.client import FailedToLogin, MFiClient try: - client = MFiClient(host, username, password, port=port) + client = MFiClient(host, username, password, port=port, + use_tls=use_tls, verify=verify_tls) except (FailedToLogin, requests.exceptions.ConnectionError) as ex: _LOGGER.error('Unable to connect to mFi: %s', str(ex)) return False diff --git a/requirements_all.txt b/requirements_all.txt index 6bf1ab28c3d..e2087f79a76 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -113,7 +113,7 @@ limitlessled==1.0.0 # homeassistant.components.sensor.mfi # homeassistant.components.switch.mfi -mficlient==0.2.2 +mficlient==0.3.0 # homeassistant.components.discovery netdisco==0.5.3 diff --git a/tests/components/sensor/test_mfi.py b/tests/components/sensor/test_mfi.py index 987466853b6..229e18b5f6a 100644 --- a/tests/components/sensor/test_mfi.py +++ b/tests/components/sensor/test_mfi.py @@ -27,6 +27,8 @@ class TestMfiSensorSetup(unittest.TestCase): 'port': 6123, 'username': 'user', 'password': 'pass', + 'use_tls': True, + 'verify_tls': True, } } @@ -71,7 +73,8 @@ class TestMfiSensorSetup(unittest.TestCase): del config[self.THING]['port'] assert self.COMPONENT.setup(self.hass, config) mock_client.assert_called_once_with('foo', 'user', 'pass', - port=6443) + port=6443, use_tls=True, + verify=True) @mock.patch('mficlient.client.MFiClient') def test_setup_with_port(self, mock_client): @@ -79,7 +82,19 @@ class TestMfiSensorSetup(unittest.TestCase): config[self.THING]['port'] = 6123 assert self.COMPONENT.setup(self.hass, config) mock_client.assert_called_once_with('foo', 'user', 'pass', - port=6123) + port=6123, use_tls=True, + verify=True) + + @mock.patch('mficlient.client.MFiClient') + def test_setup_with_tls_disabled(self, mock_client): + config = dict(self.GOOD_CONFIG) + del config[self.THING]['port'] + config[self.THING]['use_tls'] = False + config[self.THING]['verify_tls'] = False + assert self.COMPONENT.setup(self.hass, config) + mock_client.assert_called_once_with('foo', 'user', 'pass', + port=6080, use_tls=False, + verify=False) @mock.patch('mficlient.client.MFiClient') @mock.patch('homeassistant.components.sensor.mfi.MfiSensor')