"""Config flow for OwnTracks.""" from homeassistant import config_entries from homeassistant.const import CONF_WEBHOOK_ID from homeassistant.auth.util import generate_secret CONF_SECRET = 'secret' CONF_CLOUDHOOK = 'cloudhook' def supports_encryption(): """Test if we support encryption.""" try: import nacl # noqa pylint: disable=unused-import return True except OSError: return False @config_entries.HANDLERS.register('owntracks') class OwnTracksFlow(config_entries.ConfigFlow): """Set up OwnTracks.""" VERSION = 1 async def async_step_user(self, user_input=None): """Handle a user initiated set up flow to create OwnTracks webhook.""" if self._async_current_entries(): return self.async_abort(reason='one_instance_allowed') if user_input is None: return self.async_show_form( step_id='user', ) webhook_id, webhook_url, cloudhook = await self._get_webhook_id() secret = generate_secret(16) if supports_encryption(): secret_desc = ( "The encryption key is {} " "(on Android under preferences -> advanced)".format(secret)) else: secret_desc = ( "Encryption is not supported because libsodium is not " "installed.") return self.async_create_entry( title="OwnTracks", data={ CONF_WEBHOOK_ID: webhook_id, CONF_SECRET: secret, CONF_CLOUDHOOK: cloudhook, }, description_placeholders={ 'secret': secret_desc, 'webhook_url': webhook_url, 'android_url': 'https://play.google.com/store/apps/details?' 'id=org.owntracks.android', 'ios_url': 'https://itunes.apple.com/us/app/owntracks/id692424691?mt=8', 'docs_url': 'https://www.home-assistant.io/components/owntracks/' } ) async def async_step_import(self, user_input): """Import a config flow from configuration.""" webhook_id, _webhook_url, cloudhook = await self._get_webhook_id() secret = generate_secret(16) return self.async_create_entry( title="OwnTracks", data={ CONF_WEBHOOK_ID: webhook_id, CONF_SECRET: secret, CONF_CLOUDHOOK: cloudhook, } ) async def _get_webhook_id(self): """Generate webhook ID.""" webhook_id = self.hass.components.webhook.async_generate_id() if self.hass.components.cloud.async_active_subscription(): webhook_url = \ await self.hass.components.cloud.async_create_cloudhook( webhook_id ) cloudhook = True else: webhook_url = \ self.hass.components.webhook.async_generate_url(webhook_id) cloudhook = False return webhook_id, webhook_url, cloudhook