Handle missing mgt_encryption_schm in discovery (#1318)

This commit is contained in:
Steven B. 2024-11-29 15:23:16 +00:00 committed by GitHub
parent fcb604e435
commit 5ef8f21b4d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 49 additions and 10 deletions

View File

@ -230,10 +230,12 @@ def _echo_discovery_info(discovery_info) -> None:
_conditional_echo("Supports IOT Cloud", dr.is_support_iot_cloud) _conditional_echo("Supports IOT Cloud", dr.is_support_iot_cloud)
_conditional_echo("OBD Src", dr.owner) _conditional_echo("OBD Src", dr.owner)
_conditional_echo("Factory Default", dr.factory_default) _conditional_echo("Factory Default", dr.factory_default)
_conditional_echo("Encrypt Type", dr.mgt_encrypt_schm.encrypt_type)
_conditional_echo("Encrypt Type", dr.encrypt_type) _conditional_echo("Encrypt Type", dr.encrypt_type)
_conditional_echo("Supports HTTPS", dr.mgt_encrypt_schm.is_support_https) if mgt_encrypt_schm := dr.mgt_encrypt_schm:
_conditional_echo("HTTP Port", dr.mgt_encrypt_schm.http_port) _conditional_echo("Encrypt Type", mgt_encrypt_schm.encrypt_type)
_conditional_echo("Supports HTTPS", mgt_encrypt_schm.is_support_https)
_conditional_echo("HTTP Port", mgt_encrypt_schm.http_port)
_conditional_echo("Login version", mgt_encrypt_schm.lv)
_conditional_echo("Encrypt info", pf(dr.encrypt_info) if dr.encrypt_info else None) _conditional_echo("Encrypt info", pf(dr.encrypt_info) if dr.encrypt_info else None)
_conditional_echo("Decrypted", pf(dr.decrypted_data) if dr.decrypted_data else None) _conditional_echo("Decrypted", pf(dr.decrypted_data) if dr.decrypted_data else None)

View File

@ -156,6 +156,9 @@ NEW_DISCOVERY_REDACTORS: dict[str, Callable[[Any], Any] | None] = {
"device_id": lambda x: "REDACTED_" + x[9::], "device_id": lambda x: "REDACTED_" + x[9::],
"owner": lambda x: "REDACTED_" + x[9::], "owner": lambda x: "REDACTED_" + x[9::],
"mac": mask_mac, "mac": mask_mac,
"master_device_id": lambda x: "REDACTED_" + x[9::],
"group_id": lambda x: "REDACTED_" + x[9::],
"group_name": lambda x: "I01BU0tFRF9TU0lEIw==",
} }
@ -643,7 +646,11 @@ class Discover:
"""Find SmartDevice subclass for device described by passed data.""" """Find SmartDevice subclass for device described by passed data."""
if "result" in info: if "result" in info:
discovery_result = DiscoveryResult.from_dict(info["result"]) discovery_result = DiscoveryResult.from_dict(info["result"])
https = discovery_result.mgt_encrypt_schm.is_support_https https = (
discovery_result.mgt_encrypt_schm.is_support_https
if discovery_result.mgt_encrypt_schm
else False
)
dev_class = get_device_class_from_family( dev_class = get_device_class_from_family(
discovery_result.device_type, https=https discovery_result.device_type, https=https
) )
@ -747,7 +754,13 @@ class Discover:
) )
type_ = discovery_result.device_type type_ = discovery_result.device_type
encrypt_schm = discovery_result.mgt_encrypt_schm if (encrypt_schm := discovery_result.mgt_encrypt_schm) is None:
raise UnsupportedDeviceError(
f"Unsupported device {config.host} of type {type_} "
"with no mgt_encrypt_schm",
discovery_result=discovery_result.to_dict(),
host=config.host,
)
try: try:
if not (encrypt_type := encrypt_schm.encrypt_type) and ( if not (encrypt_type := encrypt_schm.encrypt_type) and (
@ -765,13 +778,13 @@ class Discover:
config.connection_type = DeviceConnectionParameters.from_values( config.connection_type = DeviceConnectionParameters.from_values(
type_, type_,
encrypt_type, encrypt_type,
discovery_result.mgt_encrypt_schm.lv, encrypt_schm.lv,
discovery_result.mgt_encrypt_schm.is_support_https, encrypt_schm.is_support_https,
) )
except KasaException as ex: except KasaException as ex:
raise UnsupportedDeviceError( raise UnsupportedDeviceError(
f"Unsupported device {config.host} of type {type_} " f"Unsupported device {config.host} of type {type_} "
+ f"with encrypt_type {discovery_result.mgt_encrypt_schm.encrypt_type}", + f"with encrypt_type {encrypt_schm.encrypt_type}",
discovery_result=discovery_result.to_dict(), discovery_result=discovery_result.to_dict(),
host=config.host, host=config.host,
) from ex ) from ex
@ -854,7 +867,7 @@ class DiscoveryResult(_DiscoveryBaseMixin):
device_id: str device_id: str
ip: str ip: str
mac: str mac: str
mgt_encrypt_schm: EncryptionScheme mgt_encrypt_schm: EncryptionScheme | None = None
device_name: str | None = None device_name: str | None = None
encrypt_info: EncryptionInfo | None = None encrypt_info: EncryptionInfo | None = None
encrypt_type: list[str] | None = None encrypt_type: list[str] | None = None

View File

@ -22,6 +22,29 @@ class DiscoveryResponse(TypedDict):
error_code: int error_code: int
UNSUPPORTED_HOMEWIFISYSTEM = {
"error_code": 0,
"result": {
"channel_2g": "10",
"channel_5g": "44",
"device_id": "REDACTED_51f72a752213a6c45203530",
"device_model": "X20",
"device_type": "HOMEWIFISYSTEM",
"factory_default": False,
"group_id": "REDACTED_07d902da02fa9beab8a64",
"group_name": "I01BU0tFRF9TU0lEIw==", # '#MASKED_SSID#'
"hardware_version": "3.0",
"ip": "192.168.1.192",
"mac": "24:2F:D0:00:00:00",
"master_device_id": "REDACTED_51f72a752213a6c45203530",
"need_account_digest": True,
"owner": "REDACTED_341c020d7e8bda184e56a90",
"role": "master",
"tmp_port": [20001],
},
}
def _make_unsupported( def _make_unsupported(
device_family, device_family,
encrypt_type, encrypt_type,
@ -75,13 +98,14 @@ UNSUPPORTED_DEVICES = {
"unable_to_parse": _make_unsupported( "unable_to_parse": _make_unsupported(
"SMART.TAPOBULB", "SMART.TAPOBULB",
"FOO", "FOO",
omit_keys={"mgt_encrypt_schm": None}, omit_keys={"device_id": None},
), ),
"invalidinstance": _make_unsupported( "invalidinstance": _make_unsupported(
"IOT.SMARTPLUGSWITCH", "IOT.SMARTPLUGSWITCH",
"KLAP", "KLAP",
https=True, https=True,
), ),
"homewifi": UNSUPPORTED_HOMEWIFISYSTEM,
} }