Add ability to send attachments in pushover notifications (#24806)

* Added ability to send attachments in pushover notifications

* Added full name for exception to satisfy static check

* Fixed hanging indent lint problem

* Added path checking, removed import re, changed url check method to use
startswith.

* Removed argument from logging statement.

* Changed IOError to OSError, fixed logging, added logging statement.
This commit is contained in:
kreegahbundolo 2019-07-02 17:56:12 +02:00 committed by Pascal Vizeli
parent 8dca73d08e
commit 61c88db8a1
3 changed files with 45 additions and 6 deletions

View file

@ -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": []

View file

@ -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")

View file

@ -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