mirror of
https://github.com/mvt-project/mvt.git
synced 2026-02-16 18:32:46 +00:00
Compare commits
6 Commits
feature/an
...
fix/tombst
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
612eb50ff2 | ||
|
|
9c84afb4b0 | ||
|
|
80fc8bd879 | ||
|
|
ca41f7f106 | ||
|
|
55ddd86ad5 | ||
|
|
b184eeedf4 |
1
.github/workflows/update-ios-data.yml
vendored
1
.github/workflows/update-ios-data.yml
vendored
@@ -21,6 +21,7 @@ jobs:
|
|||||||
title: '[auto] Update iOS releases and versions'
|
title: '[auto] Update iOS releases and versions'
|
||||||
commit-message: Add new iOS versions and build numbers
|
commit-message: Add new iOS versions and build numbers
|
||||||
branch: auto/add-new-ios-releases
|
branch: auto/add-new-ios-releases
|
||||||
|
draft: true
|
||||||
body: |
|
body: |
|
||||||
This is an automated pull request to update the iOS releases and version numbers.
|
This is an automated pull request to update the iOS releases and version numbers.
|
||||||
add-paths: |
|
add-paths: |
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ from .artifact import AndroidArtifact
|
|||||||
|
|
||||||
|
|
||||||
class DumpsysADBArtifact(AndroidArtifact):
|
class DumpsysADBArtifact(AndroidArtifact):
|
||||||
multiline_fields = ["user_keys"]
|
multiline_fields = ["user_keys", "keystore"]
|
||||||
|
|
||||||
def indented_dump_parser(self, dump_data):
|
def indented_dump_parser(self, dump_data):
|
||||||
"""
|
"""
|
||||||
@@ -67,9 +67,28 @@ class DumpsysADBArtifact(AndroidArtifact):
|
|||||||
|
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
def parse_xml(self, xml_data):
|
||||||
|
"""
|
||||||
|
Parse XML data from dumpsys ADB output
|
||||||
|
"""
|
||||||
|
import xml.etree.ElementTree as ET
|
||||||
|
|
||||||
|
keystore = []
|
||||||
|
keystore_root = ET.fromstring(xml_data)
|
||||||
|
for adb_key in keystore_root.findall("adbKey"):
|
||||||
|
key_info = self.calculate_key_info(adb_key.get("key").encode("utf-8"))
|
||||||
|
key_info["last_connected"] = adb_key.get("lastConnection")
|
||||||
|
keystore.append(key_info)
|
||||||
|
|
||||||
|
return keystore
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def calculate_key_info(user_key: bytes) -> str:
|
def calculate_key_info(user_key: bytes) -> str:
|
||||||
key_base64, user = user_key.split(b" ", 1)
|
if b" " in user_key:
|
||||||
|
key_base64, user = user_key.split(b" ", 1)
|
||||||
|
else:
|
||||||
|
key_base64, user = user_key, b""
|
||||||
|
|
||||||
key_raw = base64.b64decode(key_base64)
|
key_raw = base64.b64decode(key_base64)
|
||||||
key_fingerprint = hashlib.md5(key_raw).hexdigest().upper()
|
key_fingerprint = hashlib.md5(key_raw).hexdigest().upper()
|
||||||
key_fingerprint_colon = ":".join(
|
key_fingerprint_colon = ":".join(
|
||||||
@@ -115,8 +134,24 @@ class DumpsysADBArtifact(AndroidArtifact):
|
|||||||
if parsed.get("debugging_manager") is None:
|
if parsed.get("debugging_manager") is None:
|
||||||
self.log.error("Unable to find expected ADB entries in dumpsys output") # noqa
|
self.log.error("Unable to find expected ADB entries in dumpsys output") # noqa
|
||||||
return
|
return
|
||||||
|
|
||||||
|
# Keystore can be in different levels, as the basic parser
|
||||||
|
# is not always consistent due to different dumpsys formats.
|
||||||
|
if parsed.get("keystore"):
|
||||||
|
keystore_data = b"\n".join(parsed["keystore"])
|
||||||
|
elif parsed["debugging_manager"].get("keystore"):
|
||||||
|
keystore_data = b"\n".join(parsed["debugging_manager"]["keystore"])
|
||||||
else:
|
else:
|
||||||
parsed = parsed["debugging_manager"]
|
keystore_data = None
|
||||||
|
|
||||||
|
# Keystore is in XML format on some devices and we need to parse it
|
||||||
|
if keystore_data and keystore_data.startswith(b"<?xml"):
|
||||||
|
parsed["debugging_manager"]["keystore"] = self.parse_xml(keystore_data)
|
||||||
|
else:
|
||||||
|
# Keystore is not XML format
|
||||||
|
parsed["debugging_manager"]["keystore"] = keystore_data
|
||||||
|
|
||||||
|
parsed = parsed["debugging_manager"]
|
||||||
|
|
||||||
# Calculate key fingerprints for better readability
|
# Calculate key fingerprints for better readability
|
||||||
key_info = []
|
key_info = []
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ class TombstoneCrashResult(pydantic.BaseModel):
|
|||||||
process_name: Optional[str] = None
|
process_name: Optional[str] = None
|
||||||
binary_path: Optional[str] = None
|
binary_path: Optional[str] = None
|
||||||
selinux_label: Optional[str] = None
|
selinux_label: Optional[str] = None
|
||||||
uid: Optional[int] = None
|
uid: int
|
||||||
signal_info: SignalInfo
|
signal_info: SignalInfo
|
||||||
cause: Optional[str] = None
|
cause: Optional[str] = None
|
||||||
extra: Optional[str] = None
|
extra: Optional[str] = None
|
||||||
@@ -124,7 +124,9 @@ class TombstoneCrashArtifact(AndroidArtifact):
|
|||||||
Parse Android tombstone crash files from a protobuf object.
|
Parse Android tombstone crash files from a protobuf object.
|
||||||
"""
|
"""
|
||||||
tombstone_pb = Tombstone().parse(data)
|
tombstone_pb = Tombstone().parse(data)
|
||||||
tombstone_dict = tombstone_pb.to_dict(betterproto.Casing.SNAKE)
|
tombstone_dict = tombstone_pb.to_dict(
|
||||||
|
betterproto.Casing.SNAKE, include_default_values=True
|
||||||
|
)
|
||||||
|
|
||||||
# Add some extra metadata
|
# Add some extra metadata
|
||||||
tombstone_dict["timestamp"] = self._parse_timestamp_string(
|
tombstone_dict["timestamp"] = self._parse_timestamp_string(
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ def check_updates() -> None:
|
|||||||
if latest_version:
|
if latest_version:
|
||||||
rich_print(
|
rich_print(
|
||||||
f"\t\t[bold]Version {latest_version} is available! "
|
f"\t\t[bold]Version {latest_version} is available! "
|
||||||
"Upgrade mvt with `pip3 install -U mvt`[/bold]"
|
"Upgrade mvt with `pip3 install -U mvt` or with `pipx upgrade mvt`[/bold]"
|
||||||
)
|
)
|
||||||
|
|
||||||
# Then we check for indicators files updates.
|
# Then we check for indicators files updates.
|
||||||
|
|||||||
@@ -1103,5 +1103,9 @@
|
|||||||
{
|
{
|
||||||
"version": "18.3",
|
"version": "18.3",
|
||||||
"build": "22D63"
|
"build": "22D63"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "18.3.1",
|
||||||
|
"build": "22D72"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -29,3 +29,28 @@ class TestDumpsysADBArtifact:
|
|||||||
user_key["fingerprint"] == "F0:A1:3D:8C:B3:F4:7B:09:9F:EE:8B:D8:38:2E:BD:C6"
|
user_key["fingerprint"] == "F0:A1:3D:8C:B3:F4:7B:09:9F:EE:8B:D8:38:2E:BD:C6"
|
||||||
)
|
)
|
||||||
assert user_key["user"] == "user@linux"
|
assert user_key["user"] == "user@linux"
|
||||||
|
|
||||||
|
def test_parsing_adb_xml(self):
|
||||||
|
da_adb = DumpsysADBArtifact()
|
||||||
|
file = get_artifact("android_data/dumpsys_adb_xml.txt")
|
||||||
|
with open(file, "rb") as f:
|
||||||
|
data = f.read()
|
||||||
|
|
||||||
|
da_adb.parse(data)
|
||||||
|
|
||||||
|
assert len(da_adb.results) == 1
|
||||||
|
|
||||||
|
adb_data = da_adb.results[0]
|
||||||
|
assert "user_keys" in adb_data
|
||||||
|
assert len(adb_data["user_keys"]) == 1
|
||||||
|
|
||||||
|
# Check key and fingerprint parsed successfully.
|
||||||
|
expected_fingerprint = "F0:0B:27:08:E3:68:7B:FA:4C:79:A2:B4:BF:0E:CF:70"
|
||||||
|
user_key = adb_data["user_keys"][0]
|
||||||
|
user_key["fingerprint"] == expected_fingerprint
|
||||||
|
assert user_key["user"] == "user@laptop"
|
||||||
|
|
||||||
|
key_store_entry = adb_data["keystore"][0]
|
||||||
|
assert key_store_entry["user"] == "user@laptop"
|
||||||
|
assert key_store_entry["fingerprint"] == expected_fingerprint
|
||||||
|
assert key_store_entry["last_connected"] == "1628501829898"
|
||||||
|
|||||||
16
tests/artifacts/android_data/dumpsys_adb_xml.txt
Normal file
16
tests/artifacts/android_data/dumpsys_adb_xml.txt
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
-------------------------------------------------------------------------------
|
||||||
|
DUMP OF SERVICE adb:
|
||||||
|
ADB MANAGER STATE (dumpsys adb):
|
||||||
|
{
|
||||||
|
debugging_manager={
|
||||||
|
connected_to_adb=true
|
||||||
|
user_keys=QAAAAAcgbytJst31DsaSP7hn8QcBXKR9NPVPK9MZssFVSNIP user@laptop
|
||||||
|
|
||||||
|
keystore=<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
|
||||||
|
<keyStore version="1">
|
||||||
|
<adbKey key="QAAAAAcgbytJst31DsaSP7hn8QcBXKR9NPVPK9MZssFVSNIP user@laptop" lastConnection="1628501829898" />
|
||||||
|
</keyStore>
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
--------- 0.012s was the duration of dumpsys adb, ending at: 2025-02-04 20:25:58
|
||||||
Reference in New Issue
Block a user