From 2df6aabbf3e0cef483d48e6d6e1c57b66a266f68 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Tue, 30 May 2017 06:55:06 +0200 Subject: [PATCH] Cleanup telegram / Add url to webhook (#7824) * Cleanup telegram / Add url to webhook * fix lint * Fix lint --- .../components/telegram_bot/__init__.py | 56 ++++++++----------- .../components/telegram_bot/polling.py | 5 +- .../components/telegram_bot/webhooks.py | 33 +++++++++-- 3 files changed, 56 insertions(+), 38 deletions(-) diff --git a/homeassistant/components/telegram_bot/__init__.py b/homeassistant/components/telegram_bot/__init__.py index 127caba34a0..e5b57558989 100644 --- a/homeassistant/components/telegram_bot/__init__.py +++ b/homeassistant/components/telegram_bot/__init__.py @@ -7,7 +7,6 @@ https://home-assistant.io/components/telegram_bot/ import asyncio import io from functools import partial -from ipaddress import ip_network import logging import os @@ -60,10 +59,18 @@ ATTR_USER_ID = 'user_id' ATTR_USERNAME = 'username' CONF_ALLOWED_CHAT_IDS = 'allowed_chat_ids' -CONF_TRUSTED_NETWORKS = 'trusted_networks' DOMAIN = 'telegram_bot' +SERVICE_SEND_MESSAGE = 'send_message' +SERVICE_SEND_PHOTO = 'send_photo' +SERVICE_SEND_DOCUMENT = 'send_document' +SERVICE_SEND_LOCATION = 'send_location' +SERVICE_EDIT_MESSAGE = 'edit_message' +SERVICE_EDIT_CAPTION = 'edit_caption' +SERVICE_EDIT_REPLYMARKUP = 'edit_replymarkup' +SERVICE_ANSWER_CALLBACK_QUERY = 'answer_callback_query' + EVENT_TELEGRAM_CALLBACK = 'telegram_callback' EVENT_TELEGRAM_COMMAND = 'telegram_command' EVENT_TELEGRAM_TEXT = 'telegram_text' @@ -71,26 +78,13 @@ EVENT_TELEGRAM_TEXT = 'telegram_text' PARSER_HTML = 'html' PARSER_MD = 'markdown' -DEFAULT_TRUSTED_NETWORKS = [ - ip_network('149.154.167.197/32'), - ip_network('149.154.167.198/31'), - ip_network('149.154.167.200/29'), - ip_network('149.154.167.208/28'), - ip_network('149.154.167.224/29'), - ip_network('149.154.167.232/31') -] - -CONFIG_SCHEMA = vol.Schema({ - DOMAIN: vol.Schema({ - vol.Required(CONF_PLATFORM): cv.string, - vol.Required(CONF_API_KEY): cv.string, - vol.Required(CONF_ALLOWED_CHAT_IDS): - vol.All(cv.ensure_list, [vol.Coerce(int)]), - vol.Optional(ATTR_PARSER, default=PARSER_MD): cv.string, - vol.Optional(CONF_TRUSTED_NETWORKS, default=DEFAULT_TRUSTED_NETWORKS): - vol.All(cv.ensure_list, [ip_network]) - }), -}, extra=vol.ALLOW_EXTRA) +PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend({ + vol.Required(CONF_PLATFORM): cv.string, + vol.Required(CONF_API_KEY): cv.string, + vol.Required(CONF_ALLOWED_CHAT_IDS): + vol.All(cv.ensure_list, [vol.Coerce(int)]), + vol.Optional(ATTR_PARSER, default=PARSER_MD): cv.string, +}) BASE_SERVICE_SCHEMA = vol.Schema({ vol.Optional(ATTR_TARGET): vol.All(cv.ensure_list, [vol.Coerce(int)]), @@ -100,13 +94,12 @@ BASE_SERVICE_SCHEMA = vol.Schema({ vol.Optional(ATTR_KEYBOARD): vol.All(cv.ensure_list, [cv.string]), vol.Optional(ATTR_KEYBOARD_INLINE): cv.ensure_list, }, extra=vol.ALLOW_EXTRA) -SERVICE_SEND_MESSAGE = 'send_message' + SERVICE_SCHEMA_SEND_MESSAGE = BASE_SERVICE_SCHEMA.extend({ vol.Required(ATTR_MESSAGE): cv.template, vol.Optional(ATTR_TITLE): cv.template, }) -SERVICE_SEND_PHOTO = 'send_photo' -SERVICE_SEND_DOCUMENT = 'send_document' + SERVICE_SCHEMA_SEND_FILE = BASE_SERVICE_SCHEMA.extend({ vol.Optional(ATTR_URL): cv.template, vol.Optional(ATTR_FILE): cv.template, @@ -115,30 +108,30 @@ SERVICE_SCHEMA_SEND_FILE = BASE_SERVICE_SCHEMA.extend({ vol.Optional(ATTR_PASSWORD): cv.string, vol.Optional(ATTR_AUTHENTICATION): cv.string, }) -SERVICE_SEND_LOCATION = 'send_location' + SERVICE_SCHEMA_SEND_LOCATION = BASE_SERVICE_SCHEMA.extend({ vol.Required(ATTR_LONGITUDE): cv.template, vol.Required(ATTR_LATITUDE): cv.template, }) -SERVICE_EDIT_MESSAGE = 'edit_message' + SERVICE_SCHEMA_EDIT_MESSAGE = SERVICE_SCHEMA_SEND_MESSAGE.extend({ vol.Required(ATTR_MESSAGEID): vol.Any(cv.positive_int, cv.string), vol.Required(ATTR_CHAT_ID): vol.Coerce(int), }) -SERVICE_EDIT_CAPTION = 'edit_caption' + SERVICE_SCHEMA_EDIT_CAPTION = vol.Schema({ vol.Required(ATTR_MESSAGEID): vol.Any(cv.positive_int, cv.string), vol.Required(ATTR_CHAT_ID): vol.Coerce(int), vol.Required(ATTR_CAPTION): cv.template, vol.Optional(ATTR_KEYBOARD_INLINE): cv.ensure_list, }, extra=vol.ALLOW_EXTRA) -SERVICE_EDIT_REPLYMARKUP = 'edit_replymarkup' + SERVICE_SCHEMA_EDIT_REPLYMARKUP = vol.Schema({ vol.Required(ATTR_MESSAGEID): vol.Any(cv.positive_int, cv.string), vol.Required(ATTR_CHAT_ID): vol.Coerce(int), vol.Required(ATTR_KEYBOARD_INLINE): cv.ensure_list, }, extra=vol.ALLOW_EXTRA) -SERVICE_ANSWER_CALLBACK_QUERY = 'answer_callback_query' + SERVICE_SCHEMA_ANSWER_CALLBACK_QUERY = vol.Schema({ vol.Required(ATTR_MESSAGE): cv.template, vol.Required(ATTR_CALLBACK_QUERY_ID): vol.Coerce(int), @@ -157,8 +150,7 @@ SERVICE_MAP = { } -def load_data(url=None, filepath=None, - username=None, password=None, +def load_data(url=None, filepath=None, username=None, password=None, authentication=None, num_retries=5): """Load photo/document into ByteIO/File container from a source.""" try: diff --git a/homeassistant/components/telegram_bot/polling.py b/homeassistant/components/telegram_bot/polling.py index 161c4e356a2..ff89806b292 100644 --- a/homeassistant/components/telegram_bot/polling.py +++ b/homeassistant/components/telegram_bot/polling.py @@ -12,7 +12,8 @@ import async_timeout from aiohttp.client_exceptions import ClientError from homeassistant.components.telegram_bot import ( - CONF_ALLOWED_CHAT_IDS, BaseTelegramBotEntity) + CONF_ALLOWED_CHAT_IDS, BaseTelegramBotEntity, + PLATFORM_SCHEMA as TELEGRAM_PLATFORM_SCHEMA) from homeassistant.const import ( EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP, CONF_API_KEY) from homeassistant.core import callback @@ -20,6 +21,8 @@ from homeassistant.helpers.aiohttp_client import async_get_clientsession _LOGGER = logging.getLogger(__name__) +PLATFORM_SCHEMA = TELEGRAM_PLATFORM_SCHEMA + @asyncio.coroutine def async_setup_platform(hass, config, async_add_devices, discovery_info=None): diff --git a/homeassistant/components/telegram_bot/webhooks.py b/homeassistant/components/telegram_bot/webhooks.py index 928f40b4ffc..b5378a01991 100644 --- a/homeassistant/components/telegram_bot/webhooks.py +++ b/homeassistant/components/telegram_bot/webhooks.py @@ -6,15 +6,19 @@ https://home-assistant.io/components/telegram_bot.webhooks/ """ import asyncio import datetime as dt +from ipaddress import ip_network import logging +import voluptuous as vol + from homeassistant.components.http import HomeAssistantView from homeassistant.components.http.util import get_real_ip from homeassistant.components.telegram_bot import ( - CONF_ALLOWED_CHAT_IDS, CONF_TRUSTED_NETWORKS, BaseTelegramBotEntity) + CONF_ALLOWED_CHAT_IDS, BaseTelegramBotEntity, PLATFORM_SCHEMA) from homeassistant.const import ( - CONF_API_KEY, EVENT_HOMEASSISTANT_STOP, - HTTP_BAD_REQUEST, HTTP_UNAUTHORIZED) + CONF_API_KEY, EVENT_HOMEASSISTANT_STOP, HTTP_BAD_REQUEST, + HTTP_UNAUTHORIZED, CONF_URL) +import homeassistant.helpers.config_validation as cv DEPENDENCIES = ['http'] @@ -23,6 +27,24 @@ _LOGGER = logging.getLogger(__name__) TELEGRAM_HANDLER_URL = '/api/telegram_webhooks' REMOVE_HANDLER_URL = '' +CONF_TRUSTED_NETWORKS = 'trusted_networks' + +DEFAULT_TRUSTED_NETWORKS = [ + ip_network('149.154.167.197/32'), + ip_network('149.154.167.198/31'), + ip_network('149.154.167.200/29'), + ip_network('149.154.167.208/28'), + ip_network('149.154.167.224/29'), + ip_network('149.154.167.232/31') +] + +# pylint: disable=no-value-for-parameter +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Optional(CONF_URL): vol.Url(), + vol.Optional(CONF_TRUSTED_NETWORKS, default=DEFAULT_TRUSTED_NETWORKS): + vol.All(cv.ensure_list, [ip_network]) +}) + @asyncio.coroutine def async_setup_platform(hass, config, async_add_devices, discovery_info=None): @@ -31,6 +53,7 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): bot = telegram.Bot(config[CONF_API_KEY]) current_status = yield from hass.async_add_job(bot.getWebhookInfo) + base_url = config.get(CONF_URL, hass.config.api.base_url) # Some logging of Bot current status: last_error_date = getattr(current_status, 'last_error_date', None) @@ -40,8 +63,8 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): last_error_date, current_status) else: _LOGGER.debug("telegram webhook Status: %s", current_status) - handler_url = '{0}{1}'.format(hass.config.api.base_url, - TELEGRAM_HANDLER_URL) + + handler_url = "{0}{1}".format(base_url, TELEGRAM_HANDLER_URL) if not handler_url.startswith('https'): _LOGGER.error("Invalid telegram webhook %s must be https", handler_url) return False