diff --git a/homeassistant/components/pushover/manifest.json b/homeassistant/components/pushover/manifest.json index 30dd35720de..1cdbb4ff48b 100644 --- a/homeassistant/components/pushover/manifest.json +++ b/homeassistant/components/pushover/manifest.json @@ -3,7 +3,7 @@ "name": "Pushover", "documentation": "https://www.home-assistant.io/components/pushover", "requirements": [ - "python-pushover==0.3" + "python-pushover==0.4" ], "dependencies": [], "codeowners": [] diff --git a/homeassistant/components/pushover/notify.py b/homeassistant/components/pushover/notify.py index d9be3428d59..b30cfa23044 100644 --- a/homeassistant/components/pushover/notify.py +++ b/homeassistant/components/pushover/notify.py @@ -12,6 +12,7 @@ from homeassistant.components.notify import ( _LOGGER = logging.getLogger(__name__) +ATTR_ATTACHMENT = 'attachment' CONF_USER_KEY = 'user_key' @@ -24,10 +25,9 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ def get_service(hass, config, discovery_info=None): """Get the Pushover notification service.""" from pushover import InitError - try: return PushoverNotificationService( - config[CONF_USER_KEY], config[CONF_API_KEY]) + hass, config[CONF_USER_KEY], config[CONF_API_KEY]) except InitError: _LOGGER.error("Wrong API key supplied") return None @@ -36,9 +36,10 @@ def get_service(hass, config, discovery_info=None): class PushoverNotificationService(BaseNotificationService): """Implement the notification service for Pushover.""" - def __init__(self, user_key, api_token): + def __init__(self, hass, user_key, api_token): """Initialize the service.""" from pushover import Client + self._hass = hass self._user_key = user_key self._api_token = api_token self.pushover = Client( @@ -53,6 +54,44 @@ class PushoverNotificationService(BaseNotificationService): data['title'] = kwargs.get(ATTR_TITLE, ATTR_TITLE_DEFAULT) + # Check for attachment. + if ATTR_ATTACHMENT in data: + # If attachment is a URL, use requests to open it as a stream. + if data[ATTR_ATTACHMENT].startswith('http'): + try: + import requests + response = requests.get( + data[ATTR_ATTACHMENT], + stream=True, + timeout=5) + if response.status_code == 200: + # Replace the attachment identifier with file object. + data[ATTR_ATTACHMENT] = response.content + else: + _LOGGER.error('Image not found') + # Remove attachment key to send without attachment. + del data[ATTR_ATTACHMENT] + except requests.exceptions.RequestException as ex_val: + _LOGGER.error(ex_val) + # Remove attachment key to try sending without attachment + del data[ATTR_ATTACHMENT] + else: + # Not a URL, check valid path first + if self._hass.config.is_allowed_path(data[ATTR_ATTACHMENT]): + # try to open it as a normal file. + try: + file_handle = open(data[ATTR_ATTACHMENT], 'rb') + # Replace the attachment identifier with file object. + data[ATTR_ATTACHMENT] = file_handle + except OSError as ex_val: + _LOGGER.error(ex_val) + # Remove attachment key to send without attachment. + del data[ATTR_ATTACHMENT] + else: + _LOGGER.error('Path is not whitelisted') + # Remove attachment key to send without attachment. + del data[ATTR_ATTACHMENT] + targets = kwargs.get(ATTR_TARGET) if not isinstance(targets, list): @@ -65,6 +104,6 @@ class PushoverNotificationService(BaseNotificationService): try: self.pushover.send_message(message, **data) except ValueError as val_err: - _LOGGER.error(str(val_err)) + _LOGGER.error(val_err) except RequestError: _LOGGER.exception("Could not send pushover notification") diff --git a/requirements_all.txt b/requirements_all.txt index 48f337b8afa..aab63a43a0b 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1454,7 +1454,7 @@ python-nest==4.1.0 python-nmap==0.6.1 # homeassistant.components.pushover -python-pushover==0.3 +python-pushover==0.4 # homeassistant.components.qbittorrent python-qbittorrent==0.3.1