test: add miot cloud test case (#620)

* test: add miot cloud test case

* feat: improve miot cloud logic

* feat: simplify oauth logic

* test: improve miot cloud test case

* fix: fix pylint error

* feat: use random value replace uuid, random_did

* fix: import error
This commit is contained in:
Paul Shawn
2025-01-13 09:38:44 +08:00
committed by GitHub
parent 9ceca34b28
commit 5903c9a5a8
4 changed files with 541 additions and 16 deletions

View File

@ -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(

View File

@ -47,6 +47,7 @@ MIoT http client.
"""
import asyncio
import base64
import hashlib
import json
import logging
import re
@ -76,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,
@ -98,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()
@ -136,7 +144,8 @@ class MIoTOauthClient:
'redirect_uri': redirect_url or self._redirect_url,
'client_id': self._client_id,
'response_type': 'code',
'device_id': self._device_id
'device_id': self._device_id,
'state': self._state
}
if state:
params['state'] = state