From 55f6a4ae54e6115e0aa2d5b5790bed2aeb653bd0 Mon Sep 17 00:00:00 2001 From: tek Date: Tue, 21 Feb 2023 15:18:36 -0500 Subject: [PATCH] Fixes mypy typing issues --- mvt/android/cmd_check_backup.py | 14 +++++++++----- mvt/android/cmd_check_bugreport.py | 14 +++++++++----- mvt/android/modules/adb/packages.py | 4 ++-- mvt/android/modules/androidqf/base.py | 4 ++-- .../modules/androidqf/dumpsys_packages.py | 4 ++-- .../modules/androidqf/dumpsys_receivers.py | 4 ++-- mvt/android/modules/backup/base.py | 6 +++--- mvt/android/modules/bugreport/base.py | 14 +++++++------- mvt/android/parsers/dumpsys.py | 17 +++++++++-------- mvt/common/command.py | 4 ++-- mvt/common/module.py | 4 ++-- setup.cfg | 3 +++ 12 files changed, 52 insertions(+), 40 deletions(-) diff --git a/mvt/android/cmd_check_backup.py b/mvt/android/cmd_check_backup.py index cf27c46..3df1fe6 100644 --- a/mvt/android/cmd_check_backup.py +++ b/mvt/android/cmd_check_backup.py @@ -9,7 +9,7 @@ import os import sys import tarfile from pathlib import Path -from typing import Callable, Optional +from typing import Callable, Optional, List from rich.prompt import Prompt @@ -17,6 +17,7 @@ from mvt.android.parsers.backup import (AndroidBackupParsingError, InvalidBackupPassword, parse_ab_header, parse_backup_file) from mvt.common.command import Command +from mvt.android.modules.backup.base import BackupExtraction from .modules.backup import BACKUP_MODULES @@ -43,11 +44,14 @@ class CmdAndroidCheckBackup(Command): self.name = "check-backup" self.modules = BACKUP_MODULES - self.backup_type = None - self.backup_archive = None - self.backup_files = [] + self.backup_type: str = "" + self.backup_archive: Optional[tarfile.TarFile] = None + self.backup_files: List[str] = [] def init(self) -> None: + if not self.target_path: + return + if os.path.isfile(self.target_path): self.backup_type = "ab" with open(self.target_path, "rb") as handle: @@ -88,7 +92,7 @@ class CmdAndroidCheckBackup(Command): "Android Backup (.ab) file") sys.exit(1) - def module_init(self, module: Callable) -> None: + def module_init(self, module: BackupExtraction) -> None: # type: ignore[override] if self.backup_type == "folder": module.from_folder(self.target_path, self.backup_files) else: diff --git a/mvt/android/cmd_check_bugreport.py b/mvt/android/cmd_check_bugreport.py index a86b5ea..b92e6c3 100644 --- a/mvt/android/cmd_check_bugreport.py +++ b/mvt/android/cmd_check_bugreport.py @@ -6,10 +6,11 @@ import logging import os from pathlib import Path -from typing import Callable, Optional +from typing import Callable, Optional, List from zipfile import ZipFile from mvt.common.command import Command +from mvt.android.modules.bugreport.base import BugReportModule from .modules.bugreport import BUGREPORT_MODULES @@ -36,11 +37,14 @@ class CmdAndroidCheckBugreport(Command): self.name = "check-bugreport" self.modules = BUGREPORT_MODULES - self.bugreport_format = None - self.bugreport_archive = None - self.bugreport_files = [] + self.bugreport_format: str = "" + self.bugreport_archive: Optional[ZipFile] = None + self.bugreport_files: List[str] = [] def init(self) -> None: + if not self.target_path: + return + if os.path.isfile(self.target_path): self.bugreport_format = "zip" self.bugreport_archive = ZipFile(self.target_path) @@ -55,7 +59,7 @@ class CmdAndroidCheckBugreport(Command): parent_path) self.bugreport_files.append(file_path) - def module_init(self, module: Callable) -> None: + def module_init(self, module: BugReportModule) -> None: # type: ignore[override] if self.bugreport_format == "zip": module.from_zip(self.bugreport_archive, self.bugreport_files) else: diff --git a/mvt/android/modules/adb/packages.py b/mvt/android/modules/adb/packages.py index 5012f43..5d4aaa5 100644 --- a/mvt/android/modules/adb/packages.py +++ b/mvt/android/modules/adb/packages.py @@ -4,7 +4,7 @@ # https://license.mvt.re/1.1/ import logging -from typing import Optional, Union +from typing import Optional, Union, List from rich.console import Console from rich.progress import track @@ -39,7 +39,7 @@ DANGEROUS_PERMISSIONS = [ "android.permission.USE_SIP", "com.android.browser.permission.READ_HISTORY_BOOKMARKS", ] -ROOT_PACKAGES = [ +ROOT_PACKAGES: List[str] = [ "com.noshufou.android.su", "com.noshufou.android.su.elite", "eu.chainfire.supersu", diff --git a/mvt/android/modules/androidqf/base.py b/mvt/android/modules/androidqf/base.py index 13f65c4..ab06110 100644 --- a/mvt/android/modules/androidqf/base.py +++ b/mvt/android/modules/androidqf/base.py @@ -6,7 +6,7 @@ import fnmatch import logging import os -from typing import Optional +from typing import Union, List, Dict, Any, Optional from mvt.common.module import MVTModule @@ -21,7 +21,7 @@ class AndroidQFModule(MVTModule): results_path: Optional[str] = None, fast_mode: Optional[bool] = False, log: logging.Logger = logging.getLogger(__name__), - results: Optional[list] = None + results: Union[List[Dict[str, Any]], Dict[str, Any], None] = None ) -> None: super().__init__(file_path=file_path, target_path=target_path, results_path=results_path, fast_mode=fast_mode, diff --git a/mvt/android/modules/androidqf/dumpsys_packages.py b/mvt/android/modules/androidqf/dumpsys_packages.py index 4aa092f..dc83b41 100644 --- a/mvt/android/modules/androidqf/dumpsys_packages.py +++ b/mvt/android/modules/androidqf/dumpsys_packages.py @@ -5,7 +5,7 @@ import logging from datetime import datetime -from typing import Optional, Union +from typing import Optional, Union, List, Any, Dict from mvt.android.modules.adb.packages import (DANGEROUS_PERMISSIONS, DANGEROUS_PERMISSIONS_THRESHOLD, @@ -26,7 +26,7 @@ class DumpsysPackages(AndroidQFModule): results_path: Optional[str] = None, fast_mode: Optional[bool] = False, log: logging.Logger = logging.getLogger(__name__), - results: Optional[list] = None + results: Optional[List[Dict[str, Any]]] = None ) -> None: super().__init__(file_path=file_path, target_path=target_path, results_path=results_path, fast_mode=fast_mode, diff --git a/mvt/android/modules/androidqf/dumpsys_receivers.py b/mvt/android/modules/androidqf/dumpsys_receivers.py index 05001ee..0399511 100644 --- a/mvt/android/modules/androidqf/dumpsys_receivers.py +++ b/mvt/android/modules/androidqf/dumpsys_receivers.py @@ -4,7 +4,7 @@ # https://license.mvt.re/1.1/ import logging -from typing import Optional +from typing import Optional, List, Dict, Union, Any from mvt.android.modules.adb.dumpsys_receivers import ( INTENT_DATA_SMS_RECEIVED, INTENT_NEW_OUTGOING_CALL, @@ -24,7 +24,7 @@ class DumpsysReceivers(AndroidQFModule): results_path: Optional[str] = None, fast_mode: Optional[bool] = False, log: logging.Logger = logging.getLogger(__name__), - results: Optional[list] = None + results: Union[List[Any], Dict[str, Any], None] = None ) -> None: super().__init__(file_path=file_path, target_path=target_path, results_path=results_path, fast_mode=fast_mode, diff --git a/mvt/android/modules/backup/base.py b/mvt/android/modules/backup/base.py index da7ab61..39b1e7d 100644 --- a/mvt/android/modules/backup/base.py +++ b/mvt/android/modules/backup/base.py @@ -7,7 +7,7 @@ import fnmatch import logging import os from tarfile import TarFile -from typing import Optional +from typing import Optional, List from mvt.common.module import MVTModule @@ -32,14 +32,14 @@ class BackupExtraction(MVTModule): self.tar = None self.files = [] - def from_folder(self, backup_path: str, files: list) -> None: + def from_folder(self, backup_path: Optional[str], files: List[str]) -> None: """ Get all the files and list them """ self.backup_path = backup_path self.files = files - def from_ab(self, file_path: str, tar: TarFile, files: list) -> None: + def from_ab(self, file_path: Optional[str], tar: Optional[TarFile], files: List[str]) -> None: """ Extract the files """ diff --git a/mvt/android/modules/bugreport/base.py b/mvt/android/modules/bugreport/base.py index 221dd99..00c063b 100644 --- a/mvt/android/modules/bugreport/base.py +++ b/mvt/android/modules/bugreport/base.py @@ -6,7 +6,7 @@ import fnmatch import logging import os -from typing import Optional +from typing import Optional, List from zipfile import ZipFile from mvt.common.module import MVTModule @@ -28,16 +28,16 @@ class BugReportModule(MVTModule): results_path=results_path, fast_mode=fast_mode, log=log, results=results) - self.zip_archive = None - self.extract_path = None - self.extract_files = [] - self.zip_files = [] + self.zip_archive: Optional[ZipFile] = None + self.extract_path: Optional[str] = None + self.extract_files: List[str] = [] + self.zip_files: List[str] = [] - def from_folder(self, extract_path: str, extract_files: str) -> None: + def from_folder(self, extract_path: Optional[str], extract_files: List[str]) -> None: self.extract_path = extract_path self.extract_files = extract_files - def from_zip(self, zip_archive: ZipFile, zip_files: list) -> None: + def from_zip(self, zip_archive: Optional[ZipFile], zip_files: List[str]) -> None: self.zip_archive = zip_archive self.zip_files = zip_files diff --git a/mvt/android/parsers/dumpsys.py b/mvt/android/parsers/dumpsys.py index 3968ed3..f10a2cf 100644 --- a/mvt/android/parsers/dumpsys.py +++ b/mvt/android/parsers/dumpsys.py @@ -4,12 +4,13 @@ # https://license.mvt.re/1.1/ import re +from typing import List, Dict, Any from datetime import datetime from mvt.common.utils import convert_datetime_to_iso -def parse_dumpsys_accessibility(output: str) -> list: +def parse_dumpsys_accessibility(output: str) -> List[Dict[str, str]]: results = [] in_services = False @@ -34,7 +35,7 @@ def parse_dumpsys_accessibility(output: str) -> list: return results -def parse_dumpsys_activity_resolver_table(output: str) -> dict: +def parse_dumpsys_activity_resolver_table(output: str) -> Dict[str, Any]: results = {} in_activity_resolver_table = False @@ -138,7 +139,7 @@ def parse_dumpsys_battery_daily(output: str) -> list: return results -def parse_dumpsys_battery_history(output: str) -> list: +def parse_dumpsys_battery_history(output: str) -> List[Dict[str, Any]]: results = [] for line in output.splitlines(): @@ -194,7 +195,7 @@ def parse_dumpsys_battery_history(output: str) -> list: return results -def parse_dumpsys_dbinfo(output: str) -> list: +def parse_dumpsys_dbinfo(output: str) -> List[Dict[str, Any]]: results = [] rxp = re.compile(r'.*\[([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3})\].*\[Pid:\((\d+)\)\](\w+).*sql\=\"(.+?)\"') # pylint: disable=line-too-long @@ -247,7 +248,7 @@ def parse_dumpsys_dbinfo(output: str) -> list: return results -def parse_dumpsys_receiver_resolver_table(output: str) -> dict: +def parse_dumpsys_receiver_resolver_table(output: str) -> Dict[str, Any]: results = {} in_receiver_resolver_table = False @@ -304,7 +305,7 @@ def parse_dumpsys_receiver_resolver_table(output: str) -> dict: return results -def parse_dumpsys_appops(output: str) -> list: +def parse_dumpsys_appops(output: str) -> List[Dict[str, Any]]: results = [] perm = {} package = {} @@ -389,7 +390,7 @@ def parse_dumpsys_appops(output: str) -> list: return results -def parse_dumpsys_package_for_details(output: str) -> dict: +def parse_dumpsys_package_for_details(output: str) -> Dict[str, Any]: """ Parse one entry of a dumpsys package information """ @@ -480,7 +481,7 @@ def parse_dumpsys_package_for_details(output: str) -> dict: return details -def parse_dumpsys_packages(output: str) -> list: +def parse_dumpsys_packages(output: str) -> List[Dict[str, Any]]: """ Parse the dumpsys package service data """ diff --git a/mvt/common/command.py b/mvt/common/command.py index 1ed0d52..20516c0 100644 --- a/mvt/common/command.py +++ b/mvt/common/command.py @@ -12,7 +12,7 @@ from datetime import datetime from typing import Callable, Optional from mvt.common.indicators import Indicators -from mvt.common.module import run_module, save_timeline +from mvt.common.module import run_module, save_timeline, MVTModule from mvt.common.utils import convert_datetime_to_iso, generate_hashes_from_path, get_sha256_from_file_path from mvt.common.version import MVT_VERSION @@ -142,7 +142,7 @@ class Command: def init(self) -> None: raise NotImplementedError - def module_init(self, module: Callable) -> None: + def module_init(self, module: MVTModule) -> None: raise NotImplementedError def finish(self) -> None: diff --git a/mvt/common/module.py b/mvt/common/module.py index 46bcc00..a92e874 100644 --- a/mvt/common/module.py +++ b/mvt/common/module.py @@ -7,7 +7,7 @@ import csv import logging import os import re -from typing import Callable, Optional, Union +from typing import Callable, Optional, Union, List, Any, Dict import simplejson as json @@ -37,7 +37,7 @@ class MVTModule: results_path: Optional[str] = None, fast_mode: Optional[bool] = False, log: logging.Logger = logging.getLogger(__name__), - results: Optional[list] = None + results: Union[List[Dict[str, Any]], Dict[str, Any], None] = None ) -> None: """Initialize module. diff --git a/setup.cfg b/setup.cfg index d1e0960..e3181fc 100644 --- a/setup.cfg +++ b/setup.cfg @@ -83,3 +83,6 @@ disable = missing-function-docstring, #duplicate-code, #line-too-long, + +[mypy] +ignore_missing_imports = True