Skip to content
This repository has been archived by the owner on Oct 21, 2022. It is now read-only.

Commit

Permalink
Browse files Browse the repository at this point in the history
Removed assumptions about incomplete UPnP devices
  • Loading branch information
wolph committed Oct 21, 2018
1 parent 3550051 commit e101a83
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 4 deletions.
23 changes: 19 additions & 4 deletions homeassistant/components/upnp/config_flow.py
@@ -1,4 +1,5 @@
"""Config flow for UPNP."""
import logging
from collections import OrderedDict

import voluptuous as vol
Expand All @@ -13,6 +14,9 @@
from .const import DOMAIN


_LOGGER = logging.getLogger(__name__)


def ensure_domain_data(hass):
"""Ensure hass.data is filled properly."""
hass.data[DOMAIN] = hass.data.get(DOMAIN, {})
Expand Down Expand Up @@ -66,14 +70,25 @@ async def async_step_discovery(self, discovery_info):
"""
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?
Expand Down
1 change: 1 addition & 0 deletions homeassistant/components/upnp/strings.json
Expand Up @@ -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"
}
Expand Down
21 changes: 21 additions & 0 deletions tests/components/upnp/test_config_flow.py
Expand Up @@ -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()
Expand Down

0 comments on commit e101a83

Please sign in to comment.