Skip to content

Commit 87eb61c

Browse files
authored
Fix decompress_7z_base64_data (#765)
1 parent 6eab513 commit 87eb61c

6 files changed

Lines changed: 20 additions & 16 deletions

File tree

deebot_client/commands/json/map.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ def _handle_body_data_dict(
275275
# This command is used by new and old bots
276276
if data.get("compress", 0) == 1:
277277
# Newer bot's return coordinates as base64 decoded string
278-
coordinates = decompress_7z_base64_data(data["value"])
278+
coordinates = decompress_7z_base64_data(data["value"]).decode()
279279
else:
280280
# Older bot's return coordinates direct as comma/semicolon separated list
281281
coordinates = data["value"]
@@ -305,7 +305,7 @@ def _get_subset_ids(
305305
) -> list[int] | None:
306306
"""Return subset ids."""
307307
# subset is based64 7z compressed
308-
subsets = json.loads(decompress_7z_base64_data(data["subsets"]))
308+
subsets = json.loads(decompress_7z_base64_data(data["subsets"]).decode())
309309

310310
match data["type"]:
311311
case MapSetType.ROOMS:

deebot_client/map.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ async def on_map_subset(event: MapSubsetEvent) -> None:
395395

396396
def _update_trace_points(self, data: str) -> None:
397397
_LOGGER.debug("[_update_trace_points] Begin")
398-
trace_points = decompress_7z_base64_data(data).encode()
398+
trace_points = decompress_7z_base64_data(data)
399399

400400
for i in range(0, len(trace_points), 5):
401401
position_x, position_y = struct.unpack("<hh", trace_points[i : i + 4])
@@ -622,7 +622,7 @@ def image(self) -> Image.Image:
622622

623623
def update_points(self, base64_data: str) -> None:
624624
"""Add map piece points."""
625-
decoded = decompress_7z_base64_data(base64_data).encode()
625+
decoded = decompress_7z_base64_data(base64_data)
626626
old_crc32 = self._crc32
627627
self._crc32 = zlib.crc32(decoded)
628628

deebot_client/rs.pyi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
def decompress_7z_base64_data(value: str) -> str:
1+
def decompress_7z_base64_data(value: str) -> bytes:
22
"""Decompress base64 decoded 7z compressed string."""

src/lib.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,20 @@ use base64::{engine::general_purpose, Engine as _};
44
use pyo3::exceptions::PyValueError;
55
use pyo3::prelude::*;
66

7-
fn _decompress_7z_base64_data(value: String) -> Result<String, Box<dyn Error>> {
7+
fn _decompress_7z_base64_data(value: String) -> Result<Vec<u8>, Box<dyn Error>> {
88
let mut bytes = general_purpose::STANDARD.decode(value)?;
99

1010
// Insert required 0 bytes
1111
for _ in 0..=3 {
1212
bytes.insert(8, 0);
1313
}
1414

15-
let decompressed = lzma::decompress(&bytes)?;
16-
Ok(String::from_utf8(decompressed)?)
15+
Ok(lzma::decompress(&bytes)?)
1716
}
1817

1918
/// Decompress base64 decoded 7z compressed string.
2019
#[pyfunction]
21-
fn decompress_7z_base64_data(value: String) -> Result<String, PyErr> {
20+
fn decompress_7z_base64_data(value: String) -> Result<Vec<u8>, PyErr> {
2221
Ok(_decompress_7z_base64_data(value).map_err(|err| PyValueError::new_err(err.to_string()))?)
2322
}
2423

tests/test_map.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ async def on_change() -> None:
159159

160160
@patch(
161161
"deebot_client.map.decompress_7z_base64_data",
162-
Mock(return_value="\x10\x00\x00\x01\x00"),
162+
Mock(return_value=b"\x10\x00\x00\x01\x00"),
163163
)
164164
async def test_Map_svg_traces_path(
165165
execute_mock: AsyncMock, event_bus_mock: Mock

tests/test_rs.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,24 @@
1919
[
2020
(
2121
"XQAABACZAAAAABaOQmW9Bsibxz42rKUpGlV7Rr4D1S/9x9mDa60v4J1BKrEsnk34EAt6X5gKkxwYzfOu3T8GAPpmIy5o4A==",
22-
"-9125,3225;-9025,3225;-8975,3175;-8975,2475;-8925,2425;-8925,2375;-8325,2375;-8275,2425;-8225,2375;-8225,2425;-8174,2475;-8024,2475;-8024,4375;-9125,4375",
22+
b"-9125,3225;-9025,3225;-8975,3175;-8975,2475;-8925,2425;-8925,2375;-8325,2375;-8275,2425;-8225,2375;-8225,2425;-8174,2475;-8024,2475;-8024,4375;-9125,4375",
2323
),
2424
(
2525
"XQAABABBAAAAAC2WwEIwUhHX3vfFDfs1H1PUqtdWgakwVnMBz3Bb3yaoE5OYkdYA",
26-
'[["4","-6217","3919","-6217","231","-2642","231","-2642","3919"]]',
26+
b'[["4","-6217","3919","-6217","231","-2642","231","-2642","3919"]]',
2727
),
2828
(
2929
"XQAABADHAAAAAC2WwEHwYhHX3vWwDK80QCnaQU0mwUd9Vk34ub6OxzOk6kdFfbFvpVp4iIlKisAvp0MznQNYEZ8koxFHnO+iM44GUKgujGQKgzl0bScbQgaon1jI3eyCRikWlkmrbwA=",
30-
'[["0","-5195","-1059","-5195","-37","-5806","-37","-5806","-1059"],["1","-7959","220","-7959","1083","-9254","1083","-9254","220"],["2","-9437","347","-5387","410"],["3","-5667","317","-4888","-56"]]',
30+
b'[["0","-5195","-1059","-5195","-37","-5806","-37","-5806","-1059"],["1","-7959","220","-7959","1083","-9254","1083","-9254","220"],["2","-9437","347","-5387","410"],["3","-5667","317","-4888","-56"]]',
31+
),
32+
(
33+
"XQAABACvAAAAAAAAAEINQkt4BfqEvt9Pow7YU9KWRVBcSBosIDAOtACCicHy+vmfexxcutQUhqkAPQlBawOeXo/VSrOqF7yhdJ1JPICUs3IhIebU62Qego0vdk8oObiLh3VY/PVkqQyvR4dHxUDzMhX7HAguZVn3yC17+cQ18N4kaydN3LfSUtV/zejrBM4=",
34+
b'\x00\x00\x01\x00\x98\xf6\xff\x01\x00\x18\xf9\xff\xf8\xff@\x00\x00\xf1\xff@\x06\x00\xe9\xff@\x0b\x00\xe0\xff@\x15\x00\xe2\xff@\x1f\x00\xe2\xff@(\x00\xde\xff@.\x00\xd6\xff@5\x00\xcd\xff@4\x00\xc3\xff@0\x00\xba\xff@,\x00\xb1\xff@"\x00\xad\xff@\x18\x00\xad\xff@\x0e\x00\xae\xff@\x06\x00\xb4\xff@\x00\x00\xbc\xff@\xfe\xff\xc5\xff@\x00\x00\xd0\xff@\x03\x00\xda\xff@\x0b\x00\xe0\xff@\x15\x00\xe3\xff@\x15\x00\xed\xffH\x0e\x00\xf4\xffH\x05\x00\xf9\xffH\x0c\x00\xf2\xffH\x15\x00\xee\xffH\x1f\x00\xec\xffH)\x00\xec\xffH3\x00\xe8\xffH:\x00\xe1\xffH@\x00\xd9\xff@F\x00\xd1\xff@',
3135
),
3236
],
37+
ids=["1", "2", "3", "4"],
3338
)
34-
def test_decompress_7z_base64_data(input: str, expected: str) -> None:
39+
def test_decompress_7z_base64_data(input: str, expected: bytes) -> None:
3540
"""Test decompress_7z_base64_data function."""
3641
assert _decompress_7z_base64_data_python(input) == expected
3742
assert decompress_7z_base64_data(input) == expected
@@ -58,7 +63,7 @@ def test_decompress_7z_base64_data_errors(
5863
assert decompress_7z_base64_data(input)
5964

6065

61-
def _decompress_7z_base64_data_python(data: str) -> str:
66+
def _decompress_7z_base64_data_python(data: str) -> bytes:
6267
"""Decompress base64 decoded 7z compressed string."""
6368
final_array = bytearray()
6469

@@ -71,4 +76,4 @@ def _decompress_7z_base64_data_python(data: str) -> str:
7176
final_array.append(idx)
7277

7378
dec = lzma.LZMADecompressor(lzma.FORMAT_AUTO, None, None)
74-
return dec.decompress(final_array).decode()
79+
return dec.decompress(final_array)

0 commit comments

Comments
 (0)