From 235961d630e36a067660f439af4be660dcd121a7 Mon Sep 17 00:00:00 2001 From: topsworld Date: Fri, 10 Jan 2025 17:28:25 +0800 Subject: [PATCH] feat: simplify oauth logic --- custom_components/xiaomi_home/config_flow.py | 23 +++++++------------ .../xiaomi_home/miot/miot_cloud.py | 10 ++++++-- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/custom_components/xiaomi_home/config_flow.py b/custom_components/xiaomi_home/config_flow.py index 8e48849..1c3f12c 100644 --- a/custom_components/xiaomi_home/config_flow.py +++ b/custom_components/xiaomi_home/config_flow.py @@ -426,14 +426,12 @@ class XiaomiMihomeConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): cloud_server=self._cloud_server, uuid=self._uuid, loop=self._main_loop) - state = hashlib.sha1( - f'd=ha.{self._uuid}'.encode('utf-8')).hexdigest() - self.hass.data[DOMAIN][self._virtual_did]['oauth_state'] = state self._cc_oauth_auth_url = miot_oauth.gen_auth_url( - redirect_url=self._oauth_redirect_url_full, state=state) + redirect_url=self._oauth_redirect_url_full) + self.hass.data[DOMAIN][self._virtual_did]['oauth_state'] = ( + miot_oauth.state) _LOGGER.info( - 'async_step_oauth, oauth_url: %s', - self._cc_oauth_auth_url) + 'async_step_oauth, oauth_url: %s', self._cc_oauth_auth_url) webhook_async_unregister( self.hass, webhook_id=self._virtual_did) webhook_async_register( @@ -1150,17 +1148,12 @@ class OptionsFlowHandler(config_entries.OptionsFlow): async def async_step_oauth(self, user_input=None): try: if self._cc_task_oauth is None: - state = hashlib.sha1( - f'd=ha.{self._entry_data["uuid"]}'.encode('utf-8') - ).hexdigest() - self.hass.data[DOMAIN][self._virtual_did]['oauth_state'] = state - self._miot_oauth.set_redirect_url( - redirect_url=self._oauth_redirect_url_full) self._cc_oauth_auth_url = self._miot_oauth.gen_auth_url( - redirect_url=self._oauth_redirect_url_full, state=state) + redirect_url=self._oauth_redirect_url_full) + self.hass.data[DOMAIN][self._virtual_did]['oauth_state'] = ( + self._miot_oauth.state) _LOGGER.info( - 'async_step_oauth, oauth_url: %s', - self._cc_oauth_auth_url) + 'async_step_oauth, oauth_url: %s', self._cc_oauth_auth_url) webhook_async_unregister( self.hass, webhook_id=self._virtual_did) webhook_async_register( diff --git a/custom_components/xiaomi_home/miot/miot_cloud.py b/custom_components/xiaomi_home/miot/miot_cloud.py index b24f8f2..e70930f 100644 --- a/custom_components/xiaomi_home/miot/miot_cloud.py +++ b/custom_components/xiaomi_home/miot/miot_cloud.py @@ -77,6 +77,7 @@ class MIoTOauthClient: _client_id: int _redirect_url: str _device_id: str + _state: str def __init__( self, client_id: str, redirect_url: str, cloud_server: str, @@ -99,8 +100,14 @@ class MIoTOauthClient: else: self._oauth_host = f'{cloud_server}.{DEFAULT_OAUTH2_API_HOST}' self._device_id = f'ha.{uuid}' + self._state = hashlib.sha1( + f'd={self._device_id}'.encode('utf-8')).hexdigest() self._session = aiohttp.ClientSession(loop=self._main_loop) + @property + def state(self) -> str: + return self.state + async def deinit_async(self) -> None: if self._session and not self._session.closed: await self._session.close() @@ -138,8 +145,7 @@ class MIoTOauthClient: 'client_id': self._client_id, 'response_type': 'code', 'device_id': self._device_id, - 'state': hashlib.sha1( - f'd={self._device_id}'.encode('utf-8')).hexdigest() + 'state': self._state } if state: params['state'] = state