From a1480582d9486d2b18e144b63f5abdc961a2bd37 Mon Sep 17 00:00:00 2001 From: Robbie Trencheny Date: Fri, 6 May 2016 22:11:35 -0700 Subject: [PATCH] Add /api/discovery_info (#1791) * Allow /api/ and /api/config to be accessed without auth. If config is accessed without auth, only show minimal information. Also improves comments * Re-enable auth on /api/ since a lot of tests get broken if it does not require auth * Move the discovery info from /api/config to /api/discovery_info * Flake8 fixes --- homeassistant/components/api.py | 43 +++++++++++++++++++++++---------- homeassistant/const.py | 1 + 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/homeassistant/components/api.py b/homeassistant/components/api.py index 00426e24894..3b2972a702c 100644 --- a/homeassistant/components/api.py +++ b/homeassistant/components/api.py @@ -16,9 +16,10 @@ from homeassistant.const import ( CONTENT_TYPE_TEXT_PLAIN, EVENT_HOMEASSISTANT_STOP, EVENT_TIME_CHANGED, HTTP_BAD_REQUEST, HTTP_CREATED, HTTP_HEADER_CONTENT_TYPE, HTTP_NOT_FOUND, HTTP_OK, HTTP_UNPROCESSABLE_ENTITY, MATCH_ALL, URL_API, URL_API_COMPONENTS, - URL_API_CONFIG, URL_API_ERROR_LOG, URL_API_EVENT_FORWARD, URL_API_EVENTS, - URL_API_LOG_OUT, URL_API_SERVICES, URL_API_STATES, URL_API_STATES_ENTITY, - URL_API_STREAM, URL_API_TEMPLATE) + URL_API_CONFIG, URL_API_DISCOVERY_INFO, URL_API_ERROR_LOG, + URL_API_EVENT_FORWARD, URL_API_EVENTS, URL_API_LOG_OUT, URL_API_SERVICES, + URL_API_STATES, URL_API_STATES_ENTITY, URL_API_STREAM, URL_API_TEMPLATE, + __version__) from homeassistant.exceptions import TemplateError from homeassistant.helpers.state import TrackStates from homeassistant.helpers import template @@ -37,13 +38,18 @@ def setup(hass, config): # /api - for validation purposes hass.http.register_path('GET', URL_API, _handle_get_api) - # /api/stream - hass.http.register_path('GET', URL_API_STREAM, _handle_get_api_stream) - # /api/config hass.http.register_path('GET', URL_API_CONFIG, _handle_get_api_config) - # /states + # /api/discovery_info + hass.http.register_path('GET', URL_API_DISCOVERY_INFO, + _handle_get_api_discovery_info, + require_auth=False) + + # /api/stream + hass.http.register_path('GET', URL_API_STREAM, _handle_get_api_stream) + + # /api/states hass.http.register_path('GET', URL_API_STATES, _handle_get_api_states) hass.http.register_path( 'GET', re.compile(r'/api/states/(?P[a-zA-Z\._0-9]+)'), @@ -58,13 +64,13 @@ def setup(hass, config): 'DELETE', re.compile(r'/api/states/(?P[a-zA-Z\._0-9]+)'), _handle_delete_state_entity) - # /events + # /api/events hass.http.register_path('GET', URL_API_EVENTS, _handle_get_api_events) hass.http.register_path( 'POST', re.compile(r'/api/events/(?P[a-zA-Z\._0-9]+)'), _handle_api_post_events_event) - # /services + # /api/services hass.http.register_path('GET', URL_API_SERVICES, _handle_get_api_services) hass.http.register_path( 'POST', @@ -73,23 +79,23 @@ def setup(hass, config): r'(?P[a-zA-Z\._0-9]+)')), _handle_post_api_services_domain_service) - # /event_forwarding + # /api/event_forwarding hass.http.register_path( 'POST', URL_API_EVENT_FORWARD, _handle_post_api_event_forward) hass.http.register_path( 'DELETE', URL_API_EVENT_FORWARD, _handle_delete_api_event_forward) - # /components + # /api/components hass.http.register_path( 'GET', URL_API_COMPONENTS, _handle_get_api_components) - # /error_log + # /api/error_log hass.http.register_path('GET', URL_API_ERROR_LOG, _handle_get_api_error_log) hass.http.register_path('POST', URL_API_LOG_OUT, _handle_post_api_log_out) - # /template + # /api/template hass.http.register_path('POST', URL_API_TEMPLATE, _handle_post_api_template) @@ -176,6 +182,17 @@ def _handle_get_api_config(handler, path_match, data): handler.write_json(handler.server.hass.config.as_dict()) +def _handle_get_api_discovery_info(handler, path_match, data): + needs_auth = (handler.server.hass.config.api.api_password is not None) + params = { + 'base_url': handler.server.hass.config.api.base_url, + 'location_name': handler.server.hass.config.location_name, + 'requires_api_password': needs_auth, + 'version': __version__ + } + handler.write_json(params) + + def _handle_get_api_states(handler, path_match, data): """Return a dict containing all entity ids and their state.""" handler.write_json(handler.server.hass.states.all()) diff --git a/homeassistant/const.py b/homeassistant/const.py index 2676abbb5bf..e0ca1fcfb1c 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -198,6 +198,7 @@ URL_ROOT = "/" URL_API = "/api/" URL_API_STREAM = "/api/stream" URL_API_CONFIG = "/api/config" +URL_API_DISCOVERY_INFO = "/api/discovery_info" URL_API_STATES = "/api/states" URL_API_STATES_ENTITY = "/api/states/{}" URL_API_EVENTS = "/api/events"