Removed username/password auth and moved to new save/load json (#10277)

This commit is contained in:
William Scanlon 2017-11-01 16:58:46 -04:00 committed by Pascal Vizeli
parent f463f4d8c6
commit d9805160bc

View File

@ -12,7 +12,6 @@ import os
from datetime import timedelta from datetime import timedelta
import voluptuous as vol import voluptuous as vol
import requests
from homeassistant.core import callback from homeassistant.core import callback
from homeassistant.components.http import HomeAssistantView from homeassistant.components.http import HomeAssistantView
@ -27,6 +26,7 @@ from homeassistant.helpers.entity import Entity
from homeassistant.helpers.entity_component import EntityComponent from homeassistant.helpers.entity_component import EntityComponent
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.config import load_yaml_config_file from homeassistant.config import load_yaml_config_file
from homeassistant.util.json import load_json, save_json
REQUIREMENTS = ['python-wink==1.7.0', 'pubnubsub-handler==1.0.2'] REQUIREMENTS = ['python-wink==1.7.0', 'pubnubsub-handler==1.0.2']
@ -41,9 +41,7 @@ CONF_CLIENT_SECRET = 'client_secret'
CONF_USER_AGENT = 'user_agent' CONF_USER_AGENT = 'user_agent'
CONF_OAUTH = 'oauth' CONF_OAUTH = 'oauth'
CONF_LOCAL_CONTROL = 'local_control' CONF_LOCAL_CONTROL = 'local_control'
CONF_APPSPOT = 'appspot'
CONF_MISSING_OAUTH_MSG = 'Missing oauth2 credentials.' CONF_MISSING_OAUTH_MSG = 'Missing oauth2 credentials.'
CONF_TOKEN_URL = "https://winkbearertoken.appspot.com/token"
ATTR_ACCESS_TOKEN = 'access_token' ATTR_ACCESS_TOKEN = 'access_token'
ATTR_REFRESH_TOKEN = 'refresh_token' ATTR_REFRESH_TOKEN = 'refresh_token'
@ -92,9 +90,9 @@ AUTO_SHUTOFF_TIMES = [None, -1, 30, 60, 120]
CONFIG_SCHEMA = vol.Schema({ CONFIG_SCHEMA = vol.Schema({
DOMAIN: vol.Schema({ DOMAIN: vol.Schema({
vol.Inclusive(CONF_EMAIL, CONF_APPSPOT, vol.Inclusive(CONF_EMAIL, CONF_OAUTH,
msg=CONF_MISSING_OAUTH_MSG): cv.string, msg=CONF_MISSING_OAUTH_MSG): cv.string,
vol.Inclusive(CONF_PASSWORD, CONF_APPSPOT, vol.Inclusive(CONF_PASSWORD, CONF_OAUTH,
msg=CONF_MISSING_OAUTH_MSG): cv.string, msg=CONF_MISSING_OAUTH_MSG): cv.string,
vol.Inclusive(CONF_CLIENT_ID, CONF_OAUTH, vol.Inclusive(CONF_CLIENT_ID, CONF_OAUTH,
msg=CONF_MISSING_OAUTH_MSG): cv.string, msg=CONF_MISSING_OAUTH_MSG): cv.string,
@ -157,25 +155,6 @@ WINK_COMPONENTS = [
WINK_HUBS = [] WINK_HUBS = []
def _write_config_file(file_path, config):
try:
with open(file_path, 'w') as conf_file:
conf_file.write(json.dumps(config, sort_keys=True, indent=4))
except IOError as error:
_LOGGER.error("Saving config file failed: %s", error)
raise IOError("Saving Wink config file failed")
return config
def _read_config_file(file_path):
try:
with open(file_path, 'r') as conf_file:
return json.loads(conf_file.read())
except IOError as error:
_LOGGER.error("Reading config file failed: %s", error)
raise IOError("Reading Wink config file failed")
def _request_app_setup(hass, config): def _request_app_setup(hass, config):
"""Assist user with configuring the Wink dev application.""" """Assist user with configuring the Wink dev application."""
hass.data[DOMAIN]['configurator'] = True hass.data[DOMAIN]['configurator'] = True
@ -192,7 +171,7 @@ def _request_app_setup(hass, config):
client_id = callback_data.get('client_id') client_id = callback_data.get('client_id')
client_secret = callback_data.get('client_secret') client_secret = callback_data.get('client_secret')
if None not in (client_id, client_secret): if None not in (client_id, client_secret):
_write_config_file(_config_path, save_json(_config_path,
{ATTR_CLIENT_ID: client_id, {ATTR_CLIENT_ID: client_id,
ATTR_CLIENT_SECRET: client_secret}) ATTR_CLIENT_SECRET: client_secret})
setup(hass, config) setup(hass, config)
@ -267,19 +246,6 @@ def setup(hass, config):
'configurator': False 'configurator': False
} }
def _get_wink_token_from_web():
_email = hass.data[DOMAIN]["oauth"]["email"]
_password = hass.data[DOMAIN]["oauth"]["password"]
payload = {'username': _email, 'password': _password}
token_response = requests.post(CONF_TOKEN_URL, data=payload)
try:
token = token_response.text.split(':')[1].split()[0].rstrip('<br')
except IndexError:
_LOGGER.error("Error getting token. Please check email/password.")
return False
pywink.set_bearer_token(token)
if config.get(DOMAIN) is not None: if config.get(DOMAIN) is not None:
client_id = config[DOMAIN].get(ATTR_CLIENT_ID) client_id = config[DOMAIN].get(ATTR_CLIENT_ID)
client_secret = config[DOMAIN].get(ATTR_CLIENT_SECRET) client_secret = config[DOMAIN].get(ATTR_CLIENT_SECRET)
@ -303,25 +269,19 @@ def setup(hass, config):
hass.data[DOMAIN]["oauth"]["password"] = password hass.data[DOMAIN]["oauth"]["password"] = password
pywink.legacy_set_wink_credentials(email, password, pywink.legacy_set_wink_credentials(email, password,
client_id, client_secret) client_id, client_secret)
elif None not in [email, password]:
_LOGGER.info("Using web form authentication")
pywink.disable_local_control()
hass.data[DOMAIN]["oauth"]["email"] = email
hass.data[DOMAIN]["oauth"]["password"] = password
_get_wink_token_from_web()
else: else:
_LOGGER.info("Using new oauth authentication") _LOGGER.info("Using oauth authentication")
if not local_control: if not local_control:
pywink.disable_local_control() pywink.disable_local_control()
config_path = hass.config.path(WINK_CONFIG_FILE) config_path = hass.config.path(WINK_CONFIG_FILE)
if os.path.isfile(config_path): if os.path.isfile(config_path):
config_file = _read_config_file(config_path) config_file = load_json(config_path)
if config_file == DEFAULT_CONFIG: if config_file == DEFAULT_CONFIG:
_request_app_setup(hass, config) _request_app_setup(hass, config)
return True return True
# else move on because the user modified the file # else move on because the user modified the file
else: else:
_write_config_file(config_path, DEFAULT_CONFIG) save_json(config_path, DEFAULT_CONFIG)
_request_app_setup(hass, config) _request_app_setup(hass, config)
return True return True
@ -402,7 +362,7 @@ def setup(hass, config):
if hass.data[DOMAIN]["oauth"].get("email") is None: if hass.data[DOMAIN]["oauth"].get("email") is None:
config_path = hass.config.path(WINK_CONFIG_FILE) config_path = hass.config.path(WINK_CONFIG_FILE)
_config = pywink.get_current_oauth_credentials() _config = pywink.get_current_oauth_credentials()
_write_config_file(config_path, _config) save_json(config_path, _config)
hass.bus.listen(EVENT_HOMEASSISTANT_STOP, save_credentials) hass.bus.listen(EVENT_HOMEASSISTANT_STOP, save_credentials)
@ -629,7 +589,7 @@ class WinkAuthCallbackView(HomeAssistantView):
ATTR_CLIENT_ID: self.config_file["client_id"], ATTR_CLIENT_ID: self.config_file["client_id"],
ATTR_CLIENT_SECRET: self.config_file["client_secret"] ATTR_CLIENT_SECRET: self.config_file["client_secret"]
} }
_write_config_file(hass.config.path(WINK_CONFIG_FILE), save_json(hass.config.path(WINK_CONFIG_FILE),
config_contents) config_contents)
hass.async_add_job(setup, hass, self.config) hass.async_add_job(setup, hass, self.config)