diff --git a/dissect/target/loaders/ab.py b/dissect/target/loaders/ab.py index 003ae101e..4e7a2ea04 100644 --- a/dissect/target/loaders/ab.py +++ b/dissect/target/loaders/ab.py @@ -1,10 +1,12 @@ +from __future__ import annotations + import hashlib import io import posixpath import shutil import struct from pathlib import Path -from typing import BinaryIO +from typing import TYPE_CHECKING, BinaryIO try: from Crypto.Cipher import AES @@ -21,7 +23,10 @@ from dissect.target.helpers import keychain from dissect.target.loader import Loader from dissect.target.plugins.os.unix.linux.android._os import AndroidPlugin -from dissect.target.target import Target + +if TYPE_CHECKING: + from dissect.target import Target + DIRECTORY_MAPPING = { "a": "/data/app/{id}", diff --git a/dissect/target/loaders/cb.py b/dissect/target/loaders/cb.py index 574b63a32..8c0d28e29 100644 --- a/dissect/target/loaders/cb.py +++ b/dissect/target/loaders/cb.py @@ -30,7 +30,7 @@ from dissect.target.plugins.os.windows.registry import RegistryPlugin if TYPE_CHECKING: - from dissect.target.target import Target + from dissect.target import Target class CbLoader(Loader): diff --git a/dissect/target/loaders/cyber.py b/dissect/target/loaders/cyber.py index d1222c4d0..5506235a6 100644 --- a/dissect/target/loaders/cyber.py +++ b/dissect/target/loaders/cyber.py @@ -1,13 +1,18 @@ +from __future__ import annotations + import os import textwrap from pathlib import Path +from typing import TYPE_CHECKING -from dissect.target import Target from dissect.target.helpers.cyber import cyber from dissect.target.loader import Loader from dissect.target.loader import open as loader_open from dissect.target.loaders.raw import RawLoader +if TYPE_CHECKING: + from dissect.target import Target + HEADER = r""" ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ _______ ______ ______ _____ ┃ diff --git a/dissect/target/loaders/local.py b/dissect/target/loaders/local.py index f5e3e0a83..e56b58b56 100644 --- a/dissect/target/loaders/local.py +++ b/dissect/target/loaders/local.py @@ -1,18 +1,25 @@ +from __future__ import annotations + import ctypes import platform import re from functools import cache +from logging import Logger from pathlib import Path +from typing import TYPE_CHECKING, Iterator from dissect.util.stream import BufferedStream -from dissect.target import Target, filesystem, volume +from dissect.target import filesystem, volume from dissect.target.containers.raw import RawContainer from dissect.target.exceptions import LoaderError from dissect.target.filesystems.dir import DirectoryFilesystem from dissect.target.helpers.utils import parse_path_uri from dissect.target.loader import Loader +if TYPE_CHECKING: + from dissect.target import Target + SOLARIS_DEV_DIR = Path("/dev/dsk") SOLARIS_DRIVE_REGEX = re.compile(r".+d\d+$") @@ -33,11 +40,11 @@ class LocalLoader(Loader): """Load local filesystem.""" @staticmethod - def detect(path): + def detect(path: Path) -> bool: _, path_part, _ = parse_path_uri(path) return path_part == "local" - def map(self, target): + def map(self, target: Target) -> None: os_name = _get_os_name() force_dirfs = "force-directory-fs" in target.path_query @@ -68,7 +75,7 @@ def map(self, target): raise LoaderError(f"Unsupported OS for local target: {os_name}") -def map_linux_drives(target: Target): +def map_linux_drives(target: Target) -> None: """Map Linux raw disks and /proc and /sys. Iterate through /dev and match raw device names (not partitions). @@ -92,7 +99,7 @@ def map_linux_drives(target: Target): target.fs.mount(str(volatile_path), volatile_fs) -def map_solaris_drives(target): +def map_solaris_drives(target: Target) -> None: """Map Solaris raw disks. Iterate through /dev/dsk and match raw device names (not slices or partitions). @@ -103,7 +110,7 @@ def map_solaris_drives(target): _add_disk_as_raw_container_to_target(drive, target) -def map_esxi_drives(target): +def map_esxi_drives(target: Target) -> None: """Map ESXi raw disks. Get all devices from /vmfs/devices/disks/* (not partitions). @@ -114,7 +121,7 @@ def map_esxi_drives(target): _add_disk_as_raw_container_to_target(drive, target) -def map_windows_drives(target): +def map_windows_drives(target: Target) -> None: """Map Windows drives by iterating physical drives. For each physical drive, load the partition table and volumes. @@ -175,7 +182,7 @@ def _add_disk_as_raw_container_to_target(drive: Path, target: Target) -> None: target.log.warning(f"Unable to open drive: {drive}, skipped", exc_info=e) -def _read_drive_letters(): +def _read_drive_letters() -> bytes: # Get all logical drive letters drives_buf = ctypes.c_buffer(256) ctypes.windll.kernel32.GetLogicalDriveStringsA(256, drives_buf) @@ -183,7 +190,7 @@ def _read_drive_letters(): return drives_buf.raw.rstrip(b"\x00").split(b"\x00") -def _get_windows_drive_volumes(log): +def _get_windows_drive_volumes(log: Logger) -> Iterator[tuple[volume.Volume, bool, RawContainer | None, int | None]]: # Get the sysvol drive letter windir_buf = ctypes.c_buffer(256) ctypes.windll.kernel32.GetWindowsDirectoryA(windir_buf, 256) diff --git a/dissect/target/loaders/log.py b/dissect/target/loaders/log.py index e330c4fde..adb6cb203 100644 --- a/dissect/target/loaders/log.py +++ b/dissect/target/loaders/log.py @@ -2,13 +2,15 @@ import urllib from pathlib import Path -from typing import Union +from typing import TYPE_CHECKING, Union -from dissect.target import Target from dissect.target.filesystem import VirtualFilesystem from dissect.target.loader import Loader from dissect.target.plugin import arg +if TYPE_CHECKING: + from dissect.target import Target + @arg("--log-hint", dest="hint", help="hint for file type") class LogLoader(Loader): diff --git a/dissect/target/loaders/mqtt.py b/dissect/target/loaders/mqtt.py index ad9a9220e..832b4c956 100644 --- a/dissect/target/loaders/mqtt.py +++ b/dissect/target/loaders/mqtt.py @@ -16,7 +16,7 @@ from pathlib import Path from struct import pack, unpack_from from threading import Thread -from typing import Any, Callable, Iterator, Optional, Union +from typing import TYPE_CHECKING, Any, Callable, Iterator, Optional, Union import paho.mqtt.client as mqtt from dissect.util.stream import AlignedStream @@ -25,7 +25,9 @@ from dissect.target.exceptions import LoaderError from dissect.target.loader import Loader from dissect.target.plugin import arg -from dissect.target.target import Target + +if TYPE_CHECKING: + from dissect.target import Target log = logging.getLogger(__name__) diff --git a/dissect/target/loaders/multiraw.py b/dissect/target/loaders/multiraw.py index 7bc71c485..eb33ff014 100644 --- a/dissect/target/loaders/multiraw.py +++ b/dissect/target/loaders/multiraw.py @@ -1,9 +1,14 @@ +from __future__ import annotations + from pathlib import Path +from typing import TYPE_CHECKING from dissect.target import container from dissect.target.helpers.fsutil import TargetPath from dissect.target.loader import Loader -from dissect.target.target import Target + +if TYPE_CHECKING: + from dissect.target import Target class MultiRawLoader(Loader): diff --git a/dissect/target/loaders/overlay.py b/dissect/target/loaders/overlay.py index 23ae700d9..6cd618a4a 100644 --- a/dissect/target/loaders/overlay.py +++ b/dissect/target/loaders/overlay.py @@ -1,7 +1,13 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + from dissect.target.filesystems.overlay import Overlay2Filesystem from dissect.target.helpers.fsutil import TargetPath from dissect.target.loader import Loader -from dissect.target.target import Target + +if TYPE_CHECKING: + from dissect.target import Target class Overlay2Loader(Loader): diff --git a/dissect/target/loaders/ovf.py b/dissect/target/loaders/ovf.py index a4b63233b..caf236413 100644 --- a/dissect/target/loaders/ovf.py +++ b/dissect/target/loaders/ovf.py @@ -1,10 +1,15 @@ +from __future__ import annotations + from pathlib import Path +from typing import TYPE_CHECKING from dissect.hypervisor import ovf from dissect.target import container from dissect.target.loader import Loader -from dissect.target.target import Target + +if TYPE_CHECKING: + from dissect.target import Target class OvfLoader(Loader): diff --git a/dissect/target/loaders/raw.py b/dissect/target/loaders/raw.py index c4c851e01..e66c2d4a2 100644 --- a/dissect/target/loaders/raw.py +++ b/dissect/target/loaders/raw.py @@ -1,9 +1,14 @@ +from __future__ import annotations + from pathlib import Path +from typing import TYPE_CHECKING from dissect.target import container from dissect.target.exceptions import TargetPathNotFoundError from dissect.target.loader import Loader -from dissect.target.target import Target + +if TYPE_CHECKING: + from dissect.target import Target class RawLoader(Loader): diff --git a/dissect/target/loaders/remote.py b/dissect/target/loaders/remote.py index ca9a4cf92..2c9f42e0e 100644 --- a/dissect/target/loaders/remote.py +++ b/dissect/target/loaders/remote.py @@ -8,7 +8,7 @@ from io import DEFAULT_BUFFER_SIZE from pathlib import Path from struct import pack, unpack -from typing import Optional, Union +from typing import TYPE_CHECKING, Optional, Union from dissect.util.stream import AlignedStream @@ -16,7 +16,9 @@ from dissect.target.exceptions import LoaderError from dissect.target.loader import Loader from dissect.target.plugin import arg -from dissect.target.target import Target + +if TYPE_CHECKING: + from dissect.target import Target log = logging.getLogger(__name__) diff --git a/dissect/target/loaders/smb.py b/dissect/target/loaders/smb.py index a40386136..ff5b84a30 100644 --- a/dissect/target/loaders/smb.py +++ b/dissect/target/loaders/smb.py @@ -14,7 +14,6 @@ from impacket.dcerpc.v5.rpcrt import DCERPCException from impacket.smbconnection import SessionError, SMBConnection -from dissect.target import Target from dissect.target.exceptions import ( LoaderError, RegistryKeyNotFoundError, @@ -30,6 +29,8 @@ if TYPE_CHECKING: from impacket.dcerpc.v5.srvs import SHARE_INFO_1 + from dissect.target import Target + class SmbLoader(Loader): """Use remote SMB servers as targets. diff --git a/dissect/target/loaders/target.py b/dissect/target/loaders/target.py index 644373118..b95c93180 100644 --- a/dissect/target/loaders/target.py +++ b/dissect/target/loaders/target.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from pathlib import Path from typing import TYPE_CHECKING @@ -10,7 +12,7 @@ from dissect.target.loader import Loader if TYPE_CHECKING: - from dissect.target.target import Target + from dissect.target import Target class TargetLoader(Loader): diff --git a/dissect/target/loaders/utm.py b/dissect/target/loaders/utm.py index 01d40d932..1cd8e1e09 100644 --- a/dissect/target/loaders/utm.py +++ b/dissect/target/loaders/utm.py @@ -1,9 +1,14 @@ +from __future__ import annotations + import plistlib from pathlib import Path +from typing import TYPE_CHECKING from dissect.target import container from dissect.target.loader import Loader -from dissect.target.target import Target + +if TYPE_CHECKING: + from dissect.target import Target class UtmLoader(Loader): diff --git a/dissect/target/plugins/general/users.py b/dissect/target/plugins/general/users.py index b57d5003c..a71a79509 100644 --- a/dissect/target/plugins/general/users.py +++ b/dissect/target/plugins/general/users.py @@ -1,14 +1,17 @@ from __future__ import annotations from functools import lru_cache -from typing import Iterator, NamedTuple, Union +from typing import TYPE_CHECKING, Iterator, NamedTuple, Union -from dissect.target import Target from dissect.target.exceptions import UnsupportedPluginError from dissect.target.helpers.fsutil import TargetPath from dissect.target.helpers.record import UnixUserRecord, WindowsUserRecord from dissect.target.plugin import InternalPlugin +if TYPE_CHECKING: + from dissect.target import Target + + UserRecord = Union[UnixUserRecord, WindowsUserRecord] diff --git a/dissect/target/plugins/os/unix/_os.py b/dissect/target/plugins/os/unix/_os.py index 8b82b0ff1..69c3cc198 100644 --- a/dissect/target/plugins/os/unix/_os.py +++ b/dissect/target/plugins/os/unix/_os.py @@ -4,7 +4,7 @@ import re import uuid from struct import unpack -from typing import Iterator +from typing import TYPE_CHECKING, Iterator from flow.record.fieldtypes import posix_path @@ -13,7 +13,9 @@ from dissect.target.helpers.record import UnixUserRecord from dissect.target.helpers.utils import parse_options_string from dissect.target.plugin import OperatingSystem, OSPlugin, arg, export -from dissect.target.target import Target + +if TYPE_CHECKING: + from dissect.target import Target log = logging.getLogger(__name__) diff --git a/dissect/target/plugins/os/unix/bsd/_os.py b/dissect/target/plugins/os/unix/bsd/_os.py index 1a391f36b..5d222c466 100644 --- a/dissect/target/plugins/os/unix/bsd/_os.py +++ b/dissect/target/plugins/os/unix/bsd/_os.py @@ -1,11 +1,13 @@ from __future__ import annotations -from typing import List, Optional +from typing import TYPE_CHECKING, List, Optional from dissect.target.filesystem import Filesystem from dissect.target.plugin import OperatingSystem, export from dissect.target.plugins.os.unix._os import UnixPlugin -from dissect.target.target import Target + +if TYPE_CHECKING: + from dissect.target import Target class BsdPlugin(UnixPlugin): diff --git a/dissect/target/plugins/os/unix/bsd/osx/_os.py b/dissect/target/plugins/os/unix/bsd/osx/_os.py index 4b08afad6..411d4f866 100644 --- a/dissect/target/plugins/os/unix/bsd/osx/_os.py +++ b/dissect/target/plugins/os/unix/bsd/osx/_os.py @@ -1,7 +1,7 @@ from __future__ import annotations import plistlib -from typing import Iterator, Optional +from typing import TYPE_CHECKING, Iterator, Optional from flow.record.fieldtypes import posix_path @@ -9,7 +9,9 @@ from dissect.target.helpers.record import UnixUserRecord from dissect.target.plugin import OperatingSystem, export from dissect.target.plugins.os.unix.bsd._os import BsdPlugin -from dissect.target.target import Target + +if TYPE_CHECKING: + from dissect.target import Target class MacPlugin(BsdPlugin): diff --git a/dissect/target/plugins/os/unix/linux/_os.py b/dissect/target/plugins/os/unix/linux/_os.py index cd8d5d594..6289d5f46 100644 --- a/dissect/target/plugins/os/unix/linux/_os.py +++ b/dissect/target/plugins/os/unix/linux/_os.py @@ -1,6 +1,7 @@ from __future__ import annotations import logging +from typing import TYPE_CHECKING from dissect.target.filesystem import Filesystem from dissect.target.plugin import OperatingSystem, export @@ -11,7 +12,9 @@ parse_unix_dhcp_log_messages, ) from dissect.target.plugins.os.windows._os import WindowsPlugin -from dissect.target.target import Target + +if TYPE_CHECKING: + from dissect.target import Target log = logging.getLogger(__name__) diff --git a/dissect/target/plugins/os/unix/linux/android/_os.py b/dissect/target/plugins/os/unix/linux/android/_os.py index 62c7dc61e..b91520e89 100644 --- a/dissect/target/plugins/os/unix/linux/android/_os.py +++ b/dissect/target/plugins/os/unix/linux/android/_os.py @@ -1,13 +1,15 @@ from __future__ import annotations -from typing import Iterator, Optional +from typing import TYPE_CHECKING, Iterator, Optional from dissect.target.filesystem import Filesystem from dissect.target.helpers import configutil from dissect.target.helpers.record import EmptyRecord from dissect.target.plugin import OperatingSystem, export from dissect.target.plugins.os.unix.linux._os import LinuxPlugin -from dissect.target.target import Target + +if TYPE_CHECKING: + from dissect.target import Target class AndroidPlugin(LinuxPlugin): diff --git a/dissect/target/plugins/os/windows/_os.py b/dissect/target/plugins/os/windows/_os.py index 97197d4b2..a3cc7dca3 100644 --- a/dissect/target/plugins/os/windows/_os.py +++ b/dissect/target/plugins/os/windows/_os.py @@ -2,7 +2,7 @@ import operator import struct -from typing import Any, Iterator +from typing import TYPE_CHECKING, Any, Iterator from flow.record.fieldtypes import windows_path @@ -10,7 +10,9 @@ from dissect.target.filesystem import Filesystem from dissect.target.helpers.record import WindowsUserRecord from dissect.target.plugin import OperatingSystem, OSPlugin, export -from dissect.target.target import Target + +if TYPE_CHECKING: + from dissect.target import Target class WindowsPlugin(OSPlugin): diff --git a/dissect/target/plugins/os/windows/registry.py b/dissect/target/plugins/os/windows/registry.py index a401b2517..558a2049e 100644 --- a/dissect/target/plugins/os/windows/registry.py +++ b/dissect/target/plugins/os/windows/registry.py @@ -1,9 +1,11 @@ +from __future__ import annotations + import logging import re import warnings from collections import defaultdict from functools import lru_cache -from typing import Iterator, Optional, Union +from typing import TYPE_CHECKING, Iterator, Optional, Union from dissect.target.exceptions import ( HiveUnavailableError, @@ -25,7 +27,9 @@ ) from dissect.target.plugin import Plugin, internal from dissect.target.plugins.general.users import UserDetails -from dissect.target.target import Target + +if TYPE_CHECKING: + from dissect.target import Target CONTROLSET_REGEX = re.compile("CurrentControlSet", flags=re.IGNORECASE)