Removed assumptions about provided upnp data (#17604)

* Removed assumptions about incomplete UPnP devices

* Removed assumptions about incomplete UPnP devices
This commit is contained in:
Rick van Hattem 2018-11-01 22:59:42 +01:00 committed by Martin Hjelmare
parent 9b47af68ae
commit 82edea6077
3 changed files with 41 additions and 4 deletions

View file

@ -1,4 +1,5 @@
"""Config flow for UPNP."""
import logging
from collections import OrderedDict
import voluptuous as vol
@ -14,6 +15,9 @@ from .const import (
from .const import DOMAIN
_LOGGER = logging.getLogger(__name__)
async def async_ensure_domain_data(hass):
"""Ensure hass.data is filled properly."""
hass.data[DOMAIN] = hass.data.get(DOMAIN, {})
@ -70,14 +74,25 @@ class UpnpFlowHandler(data_entry_flow.FlowHandler):
"""
await async_ensure_domain_data(self.hass)
if not discovery_info.get('udn') or not discovery_info.get('host'):
# Silently ignore incomplete/broken devices to prevent constant
# errors/warnings
_LOGGER.debug('UPnP device is missing the udn. Provided info: %r',
discovery_info)
return self.async_abort(reason='incomplete_device')
# store discovered device
discovery_info['friendly_name'] = \
'{} ({})'.format(discovery_info['host'], discovery_info['name'])
discovery_info['friendly_name'] = discovery_info.get('host', '')
# add name if available
if discovery_info.get('name'):
discovery_info['friendly_name'] += ' ({name})'.format(
**discovery_info)
self._store_discovery_info(discovery_info)
# ensure not already discovered/configured
udn = discovery_info['udn']
if udn in self._configured_upnp_igds:
if discovery_info.get('udn') in self._configured_upnp_igds:
return self.async_abort(reason='already_configured')
# auto config?

View file

@ -16,6 +16,7 @@
},
"abort": {
"no_devices_discovered": "No UPnP/IGDs discovered",
"incomplete_device": "Ignoring incomplete UPnP device",
"already_configured": "UPnP/IGD is already configured",
"no_sensors_or_port_mapping": "Enable at least sensors or port mapping"
}

View file

@ -176,6 +176,27 @@ async def test_config_entry_created(hass):
assert result['title'] == 'Test device 1'
async def test_flow_discovery_no_data(hass):
"""Test creation of device with auto_config."""
flow = upnp_config_flow.UpnpFlowHandler()
flow.hass = hass
# auto_config active
hass.data[upnp.DOMAIN] = {
'auto_config': {
'active': True,
'enable_port_mapping': False,
'enable_sensors': True,
},
}
# discovered device
result = await flow.async_step_discovery({})
assert result['type'] == 'abort'
assert result['reason'] == 'incomplete_device'
async def test_flow_discovery_auto_config_sensors(hass):
"""Test creation of device with auto_config."""
flow = upnp_config_flow.UpnpFlowHandler()