Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix circular imports during loader registration #911

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion dissect/target/loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,6 @@ def register(module_name: str, class_name: str, internal: bool = True) -> None:
module = ".".join([MODULE_PATH, module_name])
else:
module = module_name

loader = getattr(import_lazy(module), class_name)
Horofic marked this conversation as resolved.
Show resolved Hide resolved
LOADERS.append(loader)
LOADERS_BY_SCHEME[module_name] = loader
Expand Down
9 changes: 7 additions & 2 deletions dissect/target/loaders/ab.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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

Check warning on line 28 in dissect/target/loaders/ab.py

View check run for this annotation

Codecov / codecov/patch

dissect/target/loaders/ab.py#L28

Added line #L28 was not covered by tests
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
from dissect.target import Target
from dissect.target.target import Target

I'd make it the full import everywhere.



DIRECTORY_MAPPING = {
"a": "/data/app/{id}",
Expand Down
2 changes: 1 addition & 1 deletion dissect/target/loaders/cb.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Check warning on line 33 in dissect/target/loaders/cb.py

View check run for this annotation

Codecov / codecov/patch

dissect/target/loaders/cb.py#L33

Added line #L33 was not covered by tests


class CbLoader(Loader):
Expand Down
7 changes: 6 additions & 1 deletion dissect/target/loaders/cyber.py
Original file line number Diff line number Diff line change
@@ -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

Check warning on line 14 in dissect/target/loaders/cyber.py

View check run for this annotation

Codecov / codecov/patch

dissect/target/loaders/cyber.py#L14

Added line #L14 was not covered by tests

HEADER = r"""
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ _______ ______ ______ _____ ┃
Expand Down
25 changes: 16 additions & 9 deletions dissect/target/loaders/local.py
Original file line number Diff line number Diff line change
@@ -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

Check warning on line 21 in dissect/target/loaders/local.py

View check run for this annotation

Codecov / codecov/patch

dissect/target/loaders/local.py#L21

Added line #L21 was not covered by tests

SOLARIS_DEV_DIR = Path("/dev/dsk")
SOLARIS_DRIVE_REGEX = re.compile(r".+d\d+$")

Expand All @@ -33,11 +40,11 @@
"""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
Expand Down Expand Up @@ -68,7 +75,7 @@
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).
Expand All @@ -92,7 +99,7 @@
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).
Expand All @@ -103,7 +110,7 @@
_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).
Expand All @@ -114,7 +121,7 @@
_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.
Expand Down Expand Up @@ -175,15 +182,15 @@
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)

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)
Expand Down
6 changes: 4 additions & 2 deletions dissect/target/loaders/log.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Check warning on line 12 in dissect/target/loaders/log.py

View check run for this annotation

Codecov / codecov/patch

dissect/target/loaders/log.py#L12

Added line #L12 was not covered by tests


@arg("--log-hint", dest="hint", help="hint for file type")
class LogLoader(Loader):
Expand Down
6 changes: 4 additions & 2 deletions dissect/target/loaders/mqtt.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

Check warning on line 30 in dissect/target/loaders/mqtt.py

View check run for this annotation

Codecov / codecov/patch

dissect/target/loaders/mqtt.py#L30

Added line #L30 was not covered by tests

log = logging.getLogger(__name__)

Expand Down
7 changes: 6 additions & 1 deletion dissect/target/loaders/multiraw.py
Original file line number Diff line number Diff line change
@@ -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

Check warning on line 11 in dissect/target/loaders/multiraw.py

View check run for this annotation

Codecov / codecov/patch

dissect/target/loaders/multiraw.py#L11

Added line #L11 was not covered by tests


class MultiRawLoader(Loader):
Expand Down
8 changes: 7 additions & 1 deletion dissect/target/loaders/overlay.py
Original file line number Diff line number Diff line change
@@ -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

Check warning on line 10 in dissect/target/loaders/overlay.py

View check run for this annotation

Codecov / codecov/patch

dissect/target/loaders/overlay.py#L10

Added line #L10 was not covered by tests


class Overlay2Loader(Loader):
Expand Down
7 changes: 6 additions & 1 deletion dissect/target/loaders/ovf.py
Original file line number Diff line number Diff line change
@@ -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

Check warning on line 12 in dissect/target/loaders/ovf.py

View check run for this annotation

Codecov / codecov/patch

dissect/target/loaders/ovf.py#L12

Added line #L12 was not covered by tests


class OvfLoader(Loader):
Expand Down
7 changes: 6 additions & 1 deletion dissect/target/loaders/raw.py
Original file line number Diff line number Diff line change
@@ -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

Check warning on line 11 in dissect/target/loaders/raw.py

View check run for this annotation

Codecov / codecov/patch

dissect/target/loaders/raw.py#L11

Added line #L11 was not covered by tests


class RawLoader(Loader):
Expand Down
6 changes: 4 additions & 2 deletions dissect/target/loaders/remote.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,17 @@
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

from dissect.target.containers.raw import RawContainer
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

Check warning on line 21 in dissect/target/loaders/remote.py

View check run for this annotation

Codecov / codecov/patch

dissect/target/loaders/remote.py#L21

Added line #L21 was not covered by tests

log = logging.getLogger(__name__)

Expand Down
3 changes: 2 additions & 1 deletion dissect/target/loaders/smb.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -30,6 +29,8 @@
if TYPE_CHECKING:
from impacket.dcerpc.v5.srvs import SHARE_INFO_1

from dissect.target import Target

Check warning on line 32 in dissect/target/loaders/smb.py

View check run for this annotation

Codecov / codecov/patch

dissect/target/loaders/smb.py#L32

Added line #L32 was not covered by tests


class SmbLoader(Loader):
"""Use remote SMB servers as targets.
Expand Down
4 changes: 3 additions & 1 deletion dissect/target/loaders/target.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from __future__ import annotations

from pathlib import Path
from typing import TYPE_CHECKING

Expand All @@ -10,7 +12,7 @@
from dissect.target.loader import Loader

if TYPE_CHECKING:
from dissect.target.target import Target
from dissect.target import Target

Check warning on line 15 in dissect/target/loaders/target.py

View check run for this annotation

Codecov / codecov/patch

dissect/target/loaders/target.py#L15

Added line #L15 was not covered by tests


class TargetLoader(Loader):
Expand Down
7 changes: 6 additions & 1 deletion dissect/target/loaders/utm.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
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

Check warning on line 12 in dissect/target/loaders/utm.py

View check run for this annotation

Codecov / codecov/patch

dissect/target/loaders/utm.py#L11-L12

Added lines #L11 - L12 were not covered by tests

class UtmLoader(Loader):
"""Load UTM virtual machine files."""
Expand Down
7 changes: 5 additions & 2 deletions dissect/target/plugins/general/users.py
Original file line number Diff line number Diff line change
@@ -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]


Expand Down
6 changes: 4 additions & 2 deletions dissect/target/plugins/os/unix/_os.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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

Check warning on line 18 in dissect/target/plugins/os/unix/_os.py

View check run for this annotation

Codecov / codecov/patch

dissect/target/plugins/os/unix/_os.py#L18

Added line #L18 was not covered by tests

log = logging.getLogger(__name__)

Expand Down
6 changes: 4 additions & 2 deletions dissect/target/plugins/os/unix/bsd/_os.py
Original file line number Diff line number Diff line change
@@ -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

Check warning on line 10 in dissect/target/plugins/os/unix/bsd/_os.py

View check run for this annotation

Codecov / codecov/patch

dissect/target/plugins/os/unix/bsd/_os.py#L10

Added line #L10 was not covered by tests


class BsdPlugin(UnixPlugin):
Expand Down
Loading
Loading