Skip to content

Commit 41d971a

Browse files
authored
Fix parsing of multi-byte key prefix values (#71)
* Fix parsing of multi-byte key prefix values * whitespace
1 parent 39c849d commit 41d971a

File tree

2 files changed

+29
-4
lines changed

2 files changed

+29
-4
lines changed

dfindexeddb/indexeddb/chromium/record.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,9 @@ def FromDecoder(
7474
"""
7575
offset, raw_prefix = decoder.ReadBytes(1)
7676

77-
database_id_length = (raw_prefix[0] & 0xE0 >> 5) + 1
78-
object_store_id_length = (raw_prefix[0] & 0x1C >> 2) + 1
77+
database_id_length = ((raw_prefix[0] & 0xE0) >> 5) + 1
78+
object_store_id_length = ((raw_prefix[0] & 0x1C) >> 2) + 1
7979
index_id_length = (raw_prefix[0] & 0x03) + 1
80-
8180
if database_id_length < 1 or database_id_length > 8:
8281
raise errors.ParserError("Invalid database ID length")
8382

@@ -90,7 +89,6 @@ def FromDecoder(
9089
_, database_id = decoder.DecodeInt(database_id_length, signed=False)
9190
_, object_store_id = decoder.DecodeInt(object_store_id_length, signed=False)
9291
_, index_id = decoder.DecodeInt(index_id_length, signed=False)
93-
9492
return cls(
9593
offset=base_offset + offset,
9694
database_id=database_id,

tests/dfindexeddb/indexeddb/chromium/record.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,33 @@ def test_parse_key_prefix(self):
3131
parsed_key_prefix = record.KeyPrefix.FromBytes(key_bytes)
3232
self.assertEqual(parsed_key_prefix, expected_key_prefix)
3333

34+
def test_parse_key_prefix_multi_byte_database_id(self):
35+
"""Tests the KeyPrefix class with multi-byte database id."""
36+
expected_key_prefix = record.KeyPrefix(
37+
offset=0, database_id=257, object_store_id=2, index_id=3
38+
)
39+
key_bytes = bytes.fromhex("2001010203")
40+
parsed_key_prefix = record.KeyPrefix.FromBytes(key_bytes)
41+
self.assertEqual(parsed_key_prefix, expected_key_prefix)
42+
43+
def test_parse_key_prefix_multi_byte_object_store_id(self):
44+
"""Tests the KeyPrefix class with multi-byte object store id."""
45+
expected_key_prefix = record.KeyPrefix(
46+
offset=0, database_id=0, object_store_id=257, index_id=3
47+
)
48+
key_bytes = bytes.fromhex("0400010103")
49+
parsed_key_prefix = record.KeyPrefix.FromBytes(key_bytes)
50+
self.assertEqual(parsed_key_prefix, expected_key_prefix)
51+
52+
def test_parse_key_prefix_multi_byte_index_id(self):
53+
"""Tests the KeyPrefix class with multi-byte index id."""
54+
expected_key_prefix = record.KeyPrefix(
55+
offset=0, database_id=1, object_store_id=2, index_id=257
56+
)
57+
key_bytes = bytes.fromhex("0101020101")
58+
parsed_key_prefix = record.KeyPrefix.FromBytes(key_bytes)
59+
self.assertEqual(parsed_key_prefix, expected_key_prefix)
60+
3461
def test_parse_idbkey(self):
3562
"""Tests the IDBKey class."""
3663
expected_idbkey = record.IDBKey(

0 commit comments

Comments
 (0)