Using Union type hints in order to support older versions of Python

This commit is contained in:
Nex
2022-08-12 16:29:43 +02:00
parent 63ff5fd334
commit 661d0a8669
40 changed files with 90 additions and 51 deletions
+2 -1
View File
@@ -6,6 +6,7 @@
import logging
import os
import sqlite3
from typing import Union
from mvt.common.utils import (convert_chrometime_to_unix,
convert_timestamp_to_iso)
@@ -26,7 +27,7 @@ class ChromeHistory(AndroidExtraction):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
return {
"timestamp": record["isodate"],
"module": self.__class__.__name__,
+2 -1
View File
@@ -4,6 +4,7 @@
# https://license.mvt.re/1.1/
import logging
from typing import Union
from mvt.android.parsers.dumpsys import parse_dumpsys_appops
@@ -23,7 +24,7 @@ class DumpsysAppOps(AndroidExtraction):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
records = []
for perm in record["permissions"]:
if "entries" not in perm:
@@ -4,6 +4,7 @@
# https://license.mvt.re/1.1/
import logging
from typing import Union
from mvt.android.parsers import parse_dumpsys_battery_daily
@@ -21,7 +22,7 @@ class DumpsysBatteryDaily(AndroidExtraction):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
return {
"timestamp": record["from"],
"module": self.__class__.__name__,
+2 -1
View File
@@ -7,6 +7,7 @@ import datetime
import logging
import os
import stat
from typing import Union
from mvt.common.utils import convert_timestamp_to_iso
@@ -34,7 +35,7 @@ class Files(AndroidExtraction):
log=log, results=results)
self.full_find = False
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
if "modified_time" in record:
return {
"timestamp": record["modified_time"],
+2 -1
View File
@@ -4,6 +4,7 @@
# https://license.mvt.re/1.1/
import logging
from typing import Union
from rich.console import Console
from rich.progress import track
@@ -78,7 +79,7 @@ class Packages(AndroidExtraction):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
records = []
timestamps = [
+2 -1
View File
@@ -6,6 +6,7 @@
import logging
import os
import sqlite3
from typing import Union
from mvt.android.parsers.backup import (AndroidBackupParsingError,
parse_tar_for_sms)
@@ -54,7 +55,7 @@ class SMS(AndroidExtraction):
self.sms_db_type = 0
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
body = record["body"].replace("\n", "\\n")
return {
"timestamp": record["isodate"],
+2 -1
View File
@@ -7,6 +7,7 @@ import base64
import logging
import os
import sqlite3
from typing import Union
from mvt.common.utils import check_for_links, convert_timestamp_to_iso
@@ -26,7 +27,7 @@ class Whatsapp(AndroidExtraction):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
text = record["data"].replace("\n", "\\n")
return {
"timestamp": record["isodate"],
+2 -1
View File
@@ -4,6 +4,7 @@
# https://license.mvt.re/1.1/
import logging
from typing import Union
from mvt.android.parsers import parse_dumpsys_appops
@@ -21,7 +22,7 @@ class Appops(BugReportModule):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
records = []
for perm in record["permissions"]:
if "entries" not in perm:
@@ -4,6 +4,7 @@
# https://license.mvt.re/1.1/
import logging
from typing import Union
from mvt.android.parsers import parse_dumpsys_battery_daily
@@ -21,7 +22,7 @@ class BatteryDaily(BugReportModule):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
return {
"timestamp": record["from"],
"module": self.__class__.__name__,
+2 -1
View File
@@ -5,6 +5,7 @@
import logging
import re
from typing import Union
from mvt.android.modules.adb.packages import (DANGEROUS_PERMISSIONS,
DANGEROUS_PERMISSIONS_THRESHOLD,
@@ -24,7 +25,7 @@ class Packages(BugReportModule):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
records = []
timestamps = [
+12 -11
View File
@@ -6,6 +6,7 @@
import json
import logging
import os
from typing import Union
from appdirs import user_data_dir
@@ -198,7 +199,7 @@ class Indicators:
self._check_stix2_env_variable()
self.log.info("Loaded a total of %d unique indicators", self.total_ioc_count)
def get_iocs(self, ioc_type: str) -> dict | None:
def get_iocs(self, ioc_type: str) -> Union[dict, None]:
for ioc_collection in self.ioc_collections:
for ioc in ioc_collection.get(ioc_type, []):
yield {
@@ -208,7 +209,7 @@ class Indicators:
"stix2_file_name": ioc_collection["stix2_file_name"],
}
def check_domain(self, url: str) -> dict | None:
def check_domain(self, url: str) -> Union[dict, None]:
"""Check if a given URL matches any of the provided domain indicators.
:param url: URL to match against domain indicators
@@ -282,7 +283,7 @@ class Indicators:
return None
def check_domains(self, urls: list) -> dict | None:
def check_domains(self, urls: list) -> Union[dict, None]:
"""Check a list of URLs against the provided list of domain indicators.
:param urls: List of URLs to check against domain indicators
@@ -300,7 +301,7 @@ class Indicators:
return None
def check_process(self, process: str) -> dict | None:
def check_process(self, process: str) -> Union[dict, None]:
"""Check the provided process name against the list of process
indicators.
@@ -327,7 +328,7 @@ class Indicators:
return None
def check_processes(self, processes: list) -> dict | None:
def check_processes(self, processes: list) -> Union[dict, None]:
"""Check the provided list of processes against the list of
process indicators.
@@ -346,7 +347,7 @@ class Indicators:
return None
def check_email(self, email: str) -> dict | None:
def check_email(self, email: str) -> Union[dict, None]:
"""Check the provided email against the list of email indicators.
:param email: Email address to check against email indicators
@@ -365,7 +366,7 @@ class Indicators:
return None
def check_file_name(self, file_name: str) -> dict | None:
def check_file_name(self, file_name: str) -> Union[dict, None]:
"""Check the provided file name against the list of file indicators.
:param file_name: File name to check against file
@@ -385,7 +386,7 @@ class Indicators:
return None
def check_file_path(self, file_path: str) -> dict | None:
def check_file_path(self, file_path: str) -> Union[dict, None]:
"""Check the provided file path against the list of file indicators (both path and name).
:param file_path: File path or file name to check against file
@@ -410,7 +411,7 @@ class Indicators:
return None
def check_profile(self, profile_uuid: str) -> dict | None:
def check_profile(self, profile_uuid: str) -> Union[dict, None]:
"""Check the provided configuration profile UUID against the list of indicators.
:param profile_uuid: Profile UUID to check against configuration profile indicators
@@ -429,7 +430,7 @@ class Indicators:
return None
def check_file_hash(self, file_hash: str) -> dict | None:
def check_file_hash(self, file_hash: str) -> Union[dict, None]:
"""Check the provided SHA256 file hash against the list of indicators.
:param file_hash: SHA256 hash to check
@@ -448,7 +449,7 @@ class Indicators:
return None
def check_app_id(self, app_id: str) -> dict | None:
def check_app_id(self, app_id: str) -> Union[dict, None]:
"""Check the provided app identifier (typically an Android package name)
against the list of indicators.
+2 -2
View File
@@ -7,7 +7,7 @@ import csv
import logging
import os
import re
from typing import Callable
from typing import Callable, Union
import simplejson as json
@@ -106,7 +106,7 @@ class MVTModule:
with open(detected_json_path, "w", encoding="utf-8") as handle:
json.dump(self.detected, handle, indent=4, default=str)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
raise NotImplementedError
@staticmethod
@@ -7,6 +7,7 @@ import logging
import os
import plistlib
from base64 import b64encode
from typing import Union
from mvt.common.utils import convert_timestamp_to_iso
@@ -26,7 +27,7 @@ class ConfigurationProfiles(IOSExtraction):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
if not record["install_date"]:
return {}
+2 -1
View File
@@ -5,6 +5,7 @@
import logging
import plistlib
from typing import Union
from mvt.common.utils import convert_timestamp_to_iso
@@ -27,7 +28,7 @@ class ProfileEvents(IOSExtraction):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
return {
"timestamp": record.get("timestamp"),
"module": self.__class__.__name__,
+2 -1
View File
@@ -6,6 +6,7 @@
import logging
import plistlib
import sqlite3
from typing import Union
from mvt.common.utils import convert_mactime_to_unix, convert_timestamp_to_iso
@@ -27,7 +28,7 @@ class Analytics(IOSExtraction):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
return {
"timestamp": record["isodate"],
"module": self.__class__.__name__,
+2 -1
View File
@@ -5,6 +5,7 @@
import logging
from datetime import datetime
from typing import Union
from mvt.ios.versions import find_version_by_build
@@ -25,7 +26,7 @@ class AnalyticsIOSVersions(IOSExtraction):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
return {
"timestamp": record["isodate"],
"module": self.__class__.__name__,
+2 -1
View File
@@ -6,6 +6,7 @@
import logging
import os
import sqlite3
from typing import Union
from ..base import IOSExtraction
@@ -20,7 +21,7 @@ class CacheFiles(IOSExtraction):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
records = []
for item in self.results[record]:
records.append({
+2 -1
View File
@@ -6,6 +6,7 @@
import datetime
import logging
import os
from typing import Union
from mvt.common.utils import convert_timestamp_to_iso
@@ -27,7 +28,7 @@ class Filesystem(IOSExtraction):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
return {
"timestamp": record["modified"],
"module": self.__class__.__name__,
+2 -1
View File
@@ -5,6 +5,7 @@
import logging
import sqlite3
from typing import Union
from mvt.common.utils import convert_mactime_to_unix, convert_timestamp_to_iso
@@ -27,7 +28,7 @@ class SafariFavicon(IOSExtraction):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
return {
"timestamp": record["isodate"],
"module": self.__class__.__name__,
+2 -1
View File
@@ -4,6 +4,7 @@
# https://license.mvt.re/1.1/
import logging
from typing import Union
from mvt.common.utils import convert_mactime_to_unix, convert_timestamp_to_iso
@@ -25,7 +26,7 @@ class ShutdownLog(IOSExtraction):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
return {
"timestamp": record["isodate"],
"module": self.__class__.__name__,
+2 -1
View File
@@ -6,6 +6,7 @@
import datetime
import json
import logging
from typing import Union
from mvt.common.utils import convert_timestamp_to_iso
@@ -27,7 +28,7 @@ class IOSVersionHistory(IOSExtraction):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
return {
"timestamp": record["isodate"],
"module": self.__class__.__name__,
+2 -1
View File
@@ -4,6 +4,7 @@
# https://license.mvt.re/1.1/
import logging
from typing import Union
from .webkit_base import WebkitBase
@@ -29,7 +30,7 @@ class WebkitIndexedDB(WebkitBase):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
return {
"timestamp": record["isodate"],
"module": self.__class__.__name__,
+2 -1
View File
@@ -4,6 +4,7 @@
# https://license.mvt.re/1.1/
import logging
from typing import Union
from .webkit_base import WebkitBase
@@ -27,7 +28,7 @@ class WebkitLocalStorage(WebkitBase):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
return {
"timestamp": record["isodate"],
"module": self.__class__.__name__,
+2 -1
View File
@@ -5,6 +5,7 @@
import logging
import sqlite3
from typing import Union
from mvt.common.utils import convert_mactime_to_unix, convert_timestamp_to_iso
@@ -29,7 +30,7 @@ class Calls(IOSExtraction):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
return {
"timestamp": record["isodate"],
"module": self.__class__.__name__,
+2 -1
View File
@@ -5,6 +5,7 @@
import logging
import sqlite3
from typing import Union
from mvt.common.utils import (convert_chrometime_to_unix,
convert_timestamp_to_iso)
@@ -32,7 +33,7 @@ class ChromeFavicon(IOSExtraction):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
return {
"timestamp": record["isodate"],
"module": self.__class__.__name__,
+2 -1
View File
@@ -5,6 +5,7 @@
import logging
import sqlite3
from typing import Union
from mvt.common.utils import (convert_chrometime_to_unix,
convert_timestamp_to_iso)
@@ -31,7 +32,7 @@ class ChromeHistory(IOSExtraction):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
return {
"timestamp": record["isodate"],
"module": self.__class__.__name__,
+2 -1
View File
@@ -6,6 +6,7 @@
import logging
import sqlite3
from datetime import datetime
from typing import Union
from mvt.common.utils import convert_timestamp_to_iso
@@ -30,7 +31,7 @@ class FirefoxFavicon(IOSExtraction):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
return {
"timestamp": record["isodate"],
"module": self.__class__.__name__,
+2 -1
View File
@@ -6,6 +6,7 @@
import logging
import sqlite3
from datetime import datetime
from typing import Union
from mvt.common.utils import convert_timestamp_to_iso
@@ -34,7 +35,7 @@ class FirefoxHistory(IOSExtraction):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
return {
"timestamp": record["isodate"],
"module": self.__class__.__name__,
+2 -1
View File
@@ -6,6 +6,7 @@
import collections
import logging
import plistlib
from typing import Union
from mvt.common.utils import convert_mactime_to_unix, convert_timestamp_to_iso
@@ -31,7 +32,7 @@ class IDStatusCache(IOSExtraction):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
return {
"timestamp": record["isodate"],
"module": self.__class__.__name__,
+2 -1
View File
@@ -5,6 +5,7 @@
import logging
import sqlite3
from typing import Union
from mvt.common.utils import convert_mactime_to_unix, convert_timestamp_to_iso
@@ -42,7 +43,7 @@ class InteractionC(IOSExtraction):
"last_outgoing_recipient_date",
]
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
records = []
processed = []
for timestamp in self.timestamps:
+2 -1
View File
@@ -5,6 +5,7 @@
import logging
import plistlib
from typing import Union
from mvt.common.utils import convert_mactime_to_unix, convert_timestamp_to_iso
@@ -42,7 +43,7 @@ class LocationdClients(IOSExtraction):
"BeaconRegionTimeStopped",
]
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
records = []
for timestamp in self.timestamps:
if timestamp in record.keys():
+2 -1
View File
@@ -5,6 +5,7 @@
import logging
import plistlib
from typing import Union
from mvt.common.utils import convert_timestamp_to_iso
@@ -29,7 +30,7 @@ class OSAnalyticsADDaily(IOSExtraction):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
record_data = f"{record['package']} WIFI IN: {record['wifi_in']}, WIFI OUT: {record['wifi_out']} - " \
f"WWAN IN: {record['wwan_in']}, WWAN OUT: {record['wwan_out']}"
return {
+2 -1
View File
@@ -8,6 +8,7 @@ import logging
import os
import plistlib
import sqlite3
from typing import Union
from mvt.common.utils import (convert_mactime_to_unix,
convert_timestamp_to_iso, keys_bytes_to_string)
@@ -34,7 +35,7 @@ class SafariBrowserState(IOSExtraction):
self._session_history_count = 0
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
return {
"timestamp": record["last_viewed_timestamp"],
"module": self.__class__.__name__,
+2 -1
View File
@@ -6,6 +6,7 @@
import logging
import os
import sqlite3
from typing import Union
from mvt.common.url import URL
from mvt.common.utils import convert_mactime_to_unix, convert_timestamp_to_iso
@@ -34,7 +35,7 @@ class SafariHistory(IOSExtraction):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
return {
"timestamp": record["isodate"],
"module": self.__class__.__name__,
+2 -1
View File
@@ -8,6 +8,7 @@ import itertools
import logging
import plistlib
import sqlite3
from typing import Union
from mvt.common.utils import (check_for_links, convert_mactime_to_unix,
convert_timestamp_to_iso)
@@ -33,7 +34,7 @@ class Shortcuts(IOSExtraction):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
found_urls = ""
if record["action_urls"]:
found_urls = f"- URLs in actions: {', '.join(record['action_urls'])}"
+2 -1
View File
@@ -6,6 +6,7 @@
import logging
import sqlite3
from base64 import b64encode
from typing import Union
from mvt.common.utils import (check_for_links, convert_mactime_to_unix,
convert_timestamp_to_iso)
@@ -31,7 +32,7 @@ class SMS(IOSExtraction):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
text = record["text"].replace("\n", "\\n")
return {
"timestamp": record["isodate"],
+2 -1
View File
@@ -6,6 +6,7 @@
import logging
import sqlite3
from base64 import b64encode
from typing import Union
from mvt.common.utils import convert_mactime_to_unix, convert_timestamp_to_iso
@@ -30,7 +31,7 @@ class SMSAttachments(IOSExtraction):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
return {
"timestamp": record["isodate"],
"module": self.__class__.__name__,
+2 -1
View File
@@ -6,6 +6,7 @@
import logging
import sqlite3
from datetime import datetime
from typing import Union
from mvt.common.utils import convert_timestamp_to_iso
@@ -56,7 +57,7 @@ class TCC(IOSExtraction):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
if "last_modified" in record:
if "allowed_value" in record:
msg = f"Access to {record['service']} by {record['client']} {record['allowed_value']}"
+2 -1
View File
@@ -5,6 +5,7 @@
import logging
import sqlite3
from typing import Union
from mvt.common.utils import (check_for_links, convert_mactime_to_unix,
convert_timestamp_to_iso)
@@ -30,7 +31,7 @@ class Whatsapp(IOSExtraction):
results_path=results_path, fast_mode=fast_mode,
log=log, results=results)
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
text = record.get("ZTEXT", "").replace("\n", "\\n")
links_text = ""
if record["links"]:
+2 -1
View File
@@ -7,6 +7,7 @@ import logging
import operator
import sqlite3
from pathlib import Path
from typing import Union
from mvt.common.utils import convert_mactime_to_unix, convert_timestamp_to_iso
@@ -81,7 +82,7 @@ class NetBase(IOSExtraction):
self.log.info("Extracted information on %d processes", len(self.results))
def serialize(self, record: dict) -> dict | list:
def serialize(self, record: dict) -> Union[dict, list]:
record_data = f"{record['proc_name']} (Bundle ID: {record['bundle_id']}, ID: {record['proc_id']})"
record_data_usage = record_data + f" WIFI IN: {record['wifi_in']}, WIFI OUT: {record['wifi_out']} - " \
f"WWAN IN: {record['wwan_in']}, WWAN OUT: {record['wwan_out']}"