Skip to content

Commit 4ddfce0

Browse files
authored
fix: bug where the map requested from the app confuses our system (#469)
1 parent 97f8ee3 commit 4ddfce0

File tree

3 files changed

+19
-18
lines changed

3 files changed

+19
-18
lines changed

roborock/protocols/v1_protocol.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -157,19 +157,18 @@ class MapResponse:
157157
"""The map data, decrypted and decompressed."""
158158

159159

160-
def create_map_response_decoder(security_data: SecurityData) -> Callable[[RoborockMessage], MapResponse]:
160+
def create_map_response_decoder(security_data: SecurityData) -> Callable[[RoborockMessage], MapResponse | None]:
161161
"""Create a decoder for V1 map response messages."""
162162

163-
def _decode_map_response(message: RoborockMessage) -> MapResponse:
163+
def _decode_map_response(message: RoborockMessage) -> MapResponse | None:
164164
"""Decode a V1 map response message."""
165165
if not message.payload or len(message.payload) < 24:
166166
raise RoborockException("Invalid V1 map response format: missing payload")
167167
header, body = message.payload[:24], message.payload[24:]
168168
[endpoint, _, request_id, _] = struct.unpack("<8s8sH6s", header)
169169
if not endpoint.decode().startswith(security_data.endpoint):
170-
raise RoborockException(
171-
f"Invalid V1 map response endpoint: {endpoint!r}, expected {security_data.endpoint!r}"
172-
)
170+
_LOGGER.debug("Received map response requested not made by this device, ignoring.")
171+
return None
173172
try:
174173
decrypted = Utils.decrypt_cbc(body, security_data.nonce)
175174
except ValueError as err:

roborock/version_1_apis/roborock_client_v1.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ class RoborockClientV1(RoborockClient, ABC):
150150
"""Roborock client base class for version 1 devices."""
151151

152152
_listeners: dict[str, ListenerModel] = {}
153-
_map_response_decoder: Callable[[RoborockMessage], MapResponse] | None = None
153+
_map_response_decoder: Callable[[RoborockMessage], MapResponse | None] | None = None
154154

155155
def __init__(self, device_info: DeviceData, security_data: SecurityData | None) -> None:
156156
"""Initializes the Roborock client."""
@@ -439,13 +439,14 @@ def on_message_received(self, messages: list[RoborockMessage]) -> None:
439439
elif data.payload and protocol == RoborockMessageProtocol.MAP_RESPONSE:
440440
if self._map_response_decoder is not None:
441441
map_response = self._map_response_decoder(data)
442-
queue = self._waiting_queue.get(map_response.request_id)
443-
if queue:
444-
queue.set_result(map_response.data)
445-
else:
446-
self._logger.debug(
447-
"Received unsolicited map response for request_id %s", map_response.request_id
448-
)
442+
if map_response is not None:
443+
queue = self._waiting_queue.get(map_response.request_id)
444+
if queue:
445+
queue.set_result(map_response.data)
446+
else:
447+
self._logger.debug(
448+
"Received unsolicited map response for request_id %s", map_response.request_id
449+
)
449450
else:
450451
queue = self._waiting_queue.get(data.seq)
451452
if queue:

tests/protocols/test_v1_protocol.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""Tests for the v1 protocol message encoding and decoding."""
22

33
import json
4+
import logging
45
import pathlib
56
from collections.abc import Generator
67
from unittest.mock import patch
@@ -183,13 +184,14 @@ def test_create_map_response_decoder():
183184

184185
decoder = create_map_response_decoder(SECURITY_DATA)
185186
result = decoder(message)
186-
187+
assert result is not None
187188
assert result.request_id == 44508
188189
assert result.data == test_data
189190

190191

191-
def test_create_map_response_decoder_invalid_endpoint():
192+
def test_create_map_response_decoder_invalid_endpoint(caplog: pytest.LogCaptureFixture):
192193
"""Test map response decoder with invalid endpoint."""
194+
caplog.set_level(logging.DEBUG)
193195
# Create header with wrong endpoint
194196
header = b"wrongend" + b"\x00" * 8 + b"\xdc\xad" + b"\x00" * 6
195197
payload = header + b"encrypted_data"
@@ -204,9 +206,8 @@ def test_create_map_response_decoder_invalid_endpoint():
204206
)
205207

206208
decoder = create_map_response_decoder(SECURITY_DATA)
207-
208-
with pytest.raises(RoborockException, match="Invalid V1 map response endpoint"):
209-
decoder(message)
209+
assert decoder(message) is None
210+
assert "Received map response requested not made by this device, ignoring." in caplog.text
210211

211212

212213
def test_create_map_response_decoder_invalid_payload():

0 commit comments

Comments
 (0)