mirror of
https://github.com/XiaoMi/ha_xiaomi_home.git
synced 2025-06-21 15:20:00 +08:00
feat: move web page to html (#627)
* move web page to html * move loading into function * make the loading async * fix usage * Fix function naming * fix lint * fix lint * feat: use get_running_loop replace get_event_loop * feat: translate using the i18n module * docs: update zh-Hant translate content --------- Co-authored-by: topsworld <sworldtop@gmail.com>
This commit is contained in:
@ -91,7 +91,8 @@ from .miot.miot_cloud import MIoTHttpClient, MIoTOauthClient
|
||||
from .miot.miot_storage import MIoTStorage, MIoTCert
|
||||
from .miot.miot_mdns import MipsService
|
||||
from .miot.web_pages import oauth_redirect_page
|
||||
from .miot.miot_error import MIoTConfigError, MIoTError, MIoTOauthError
|
||||
from .miot.miot_error import (
|
||||
MIoTConfigError, MIoTError, MIoTErrorCode, MIoTOauthError)
|
||||
from .miot.miot_i18n import MIoTI18n
|
||||
from .miot.miot_network import MIoTNetwork
|
||||
from .miot.miot_client import MIoTClient, get_miot_instance_async
|
||||
@ -430,6 +431,8 @@ class XiaomiMihomeConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
||||
redirect_url=self._oauth_redirect_url_full)
|
||||
self.hass.data[DOMAIN][self._virtual_did]['oauth_state'] = (
|
||||
miot_oauth.state)
|
||||
self.hass.data[DOMAIN][self._virtual_did]['i18n'] = (
|
||||
self._miot_i18n)
|
||||
_LOGGER.info(
|
||||
'async_step_oauth, oauth_url: %s', self._cc_oauth_auth_url)
|
||||
webhook_async_unregister(
|
||||
@ -1152,6 +1155,8 @@ class OptionsFlowHandler(config_entries.OptionsFlow):
|
||||
redirect_url=self._oauth_redirect_url_full)
|
||||
self.hass.data[DOMAIN][self._virtual_did]['oauth_state'] = (
|
||||
self._miot_oauth.state)
|
||||
self.hass.data[DOMAIN][self._virtual_did]['i18n'] = (
|
||||
self._miot_i18n)
|
||||
_LOGGER.info(
|
||||
'async_step_oauth, oauth_url: %s', self._cc_oauth_auth_url)
|
||||
webhook_async_unregister(
|
||||
@ -1967,29 +1972,61 @@ class OptionsFlowHandler(config_entries.OptionsFlow):
|
||||
async def _handle_oauth_webhook(hass, webhook_id, request):
|
||||
"""Webhook to handle oauth2 callback."""
|
||||
# pylint: disable=inconsistent-quotes
|
||||
i18n: MIoTI18n = hass.data[DOMAIN][webhook_id].get('i18n', None)
|
||||
try:
|
||||
data = dict(request.query)
|
||||
if data.get('code', None) is None or data.get('state', None) is None:
|
||||
raise MIoTConfigError('invalid oauth code')
|
||||
raise MIoTConfigError(
|
||||
'invalid oauth code or state',
|
||||
MIoTErrorCode.CODE_CONFIG_INVALID_INPUT)
|
||||
|
||||
if data['state'] != hass.data[DOMAIN][webhook_id]['oauth_state']:
|
||||
raise MIoTConfigError(
|
||||
f'invalid oauth state, '
|
||||
f'{hass.data[DOMAIN][webhook_id]["oauth_state"]}, '
|
||||
f'{data["state"]}')
|
||||
f'inconsistent state, '
|
||||
f'{hass.data[DOMAIN][webhook_id]["oauth_state"]}!='
|
||||
f'{data["state"]}', MIoTErrorCode.CODE_CONFIG_INVALID_STATE)
|
||||
|
||||
fut_oauth_code: asyncio.Future = hass.data[DOMAIN][webhook_id].pop(
|
||||
'fut_oauth_code', None)
|
||||
fut_oauth_code.set_result(data['code'])
|
||||
_LOGGER.info('webhook code: %s', data['code'])
|
||||
|
||||
success_trans: dict = {}
|
||||
if i18n:
|
||||
success_trans = i18n.translate(
|
||||
'oauth2.success') or {} # type: ignore
|
||||
# Delete
|
||||
del hass.data[DOMAIN][webhook_id]['oauth_state']
|
||||
del hass.data[DOMAIN][webhook_id]['i18n']
|
||||
return web.Response(
|
||||
body=oauth_redirect_page(
|
||||
hass.config.language, 'success'), content_type='text/html')
|
||||
body=await oauth_redirect_page(
|
||||
title=success_trans.get('title', 'Success'),
|
||||
content=success_trans.get(
|
||||
'content', (
|
||||
'Please close this page and return to the account '
|
||||
'authentication page to click NEXT')),
|
||||
button=success_trans.get('button', 'Close Page'),
|
||||
success=True,
|
||||
), content_type='text/html')
|
||||
|
||||
except MIoTConfigError:
|
||||
except Exception as err: # pylint: disable=broad-exception-caught
|
||||
fail_trans: dict = {}
|
||||
err_msg: str = str(err)
|
||||
if i18n:
|
||||
if isinstance(err, MIoTConfigError):
|
||||
err_msg = i18n.translate(
|
||||
f'oauth2.error_msg.{err.code.value}'
|
||||
) or err.message # type: ignore
|
||||
fail_trans = i18n.translate('oauth2.fail') or {} # type: ignore
|
||||
return web.Response(
|
||||
body=oauth_redirect_page(hass.config.language, 'fail'),
|
||||
body=await oauth_redirect_page(
|
||||
title=fail_trans.get('title', 'Authentication Failed'),
|
||||
content=str(fail_trans.get('content', (
|
||||
'{error_msg}, Please close this page and return to the '
|
||||
'account authentication page to click the authentication '
|
||||
'link again.'))).replace('{error_msg}', err_msg),
|
||||
button=fail_trans.get('button', 'Close Page'),
|
||||
success=False),
|
||||
content_type='text/html')
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user