dissect.target 3.18.dev16__tar.gz → 3.19__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (641) hide show
  1. {dissect_target-3.18.dev16/dissect.target.egg-info → dissect_target-3.19}/PKG-INFO +11 -7
  2. {dissect_target-3.18.dev16 → dissect_target-3.19}/README.md +8 -5
  3. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/filesystem.py +44 -25
  4. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/filesystems/config.py +32 -21
  5. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/filesystems/extfs.py +4 -0
  6. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/filesystems/itunes.py +1 -1
  7. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/filesystems/tar.py +1 -1
  8. dissect_target-3.19/dissect/target/filesystems/zip.py +171 -0
  9. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/config.py +22 -7
  10. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/configutil.py +69 -5
  11. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/cyber.py +4 -2
  12. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/fsutil.py +32 -4
  13. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/loaderutil.py +26 -7
  14. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/network_managers.py +22 -7
  15. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/record.py +37 -0
  16. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/record_modifier.py +23 -4
  17. dissect_target-3.19/dissect/target/helpers/shell_application_ids.py +732 -0
  18. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/utils.py +11 -0
  19. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loader.py +1 -0
  20. dissect_target-3.19/dissect/target/loaders/ab.py +285 -0
  21. dissect_target-3.19/dissect/target/loaders/libvirt.py +40 -0
  22. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/mqtt.py +14 -1
  23. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/tar.py +8 -4
  24. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/utm.py +3 -0
  25. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/velociraptor.py +6 -6
  26. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugin.py +60 -3
  27. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/browser/chrome.py +1 -0
  28. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/browser/chromium.py +7 -5
  29. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/browser/edge.py +1 -0
  30. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/browser/firefox.py +82 -36
  31. dissect_target-3.19/dissect/target/plugins/apps/remoteaccess/anydesk.py +111 -0
  32. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/remoteaccess/remoteaccess.py +8 -8
  33. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/remoteaccess/teamviewer.py +46 -31
  34. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/ssh/openssh.py +1 -1
  35. {dissect_target-3.18.dev16/dissect/target/helpers → dissect_target-3.19/dissect/target/plugins/apps/ssh}/ssh.py +128 -30
  36. dissect_target-3.19/dissect/target/plugins/apps/texteditor/texteditor.py +13 -0
  37. dissect_target-3.19/dissect/target/plugins/apps/texteditor/windowsnotepad.py +340 -0
  38. dissect_target-3.19/dissect/target/plugins/child/qemu.py +21 -0
  39. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/filesystem/ntfs/mft.py +132 -45
  40. dissect_target-3.19/dissect/target/plugins/filesystem/unix/capability.py +184 -0
  41. dissect_target-3.19/dissect/target/plugins/filesystem/walkfs.py +81 -0
  42. dissect_target-3.19/dissect/target/plugins/filesystem/yara.py +184 -0
  43. dissect_target-3.19/dissect/target/plugins/general/network.py +82 -0
  44. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/general/users.py +14 -10
  45. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/_os.py +19 -5
  46. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/bsd/freebsd/_os.py +3 -5
  47. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/esxi/_os.py +29 -23
  48. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/etc/etc.py +5 -8
  49. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/history.py +3 -7
  50. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/linux/_os.py +15 -14
  51. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/linux/android/_os.py +15 -24
  52. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/linux/redhat/_os.py +1 -1
  53. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/locale.py +17 -6
  54. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/shadow.py +47 -31
  55. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/_os.py +4 -4
  56. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/adpolicy.py +4 -1
  57. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/catroot.py +1 -11
  58. dissect_target-3.19/dissect/target/plugins/os/windows/credential/lsa.py +174 -0
  59. {dissect_target-3.18.dev16/dissect/target/plugins/os/windows → dissect_target-3.19/dissect/target/plugins/os/windows/credential}/sam.py +5 -2
  60. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/defender.py +6 -3
  61. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/dpapi/blob.py +3 -0
  62. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/dpapi/crypto.py +61 -23
  63. dissect_target-3.19/dissect/target/plugins/os/windows/dpapi/dpapi.py +188 -0
  64. dissect_target-3.19/dissect/target/plugins/os/windows/dpapi/keyprovider/credhist.py +21 -0
  65. dissect_target-3.19/dissect/target/plugins/os/windows/dpapi/keyprovider/empty.py +17 -0
  66. dissect_target-3.19/dissect/target/plugins/os/windows/dpapi/keyprovider/keychain.py +20 -0
  67. dissect_target-3.19/dissect/target/plugins/os/windows/dpapi/keyprovider/keyprovider.py +8 -0
  68. dissect_target-3.19/dissect/target/plugins/os/windows/dpapi/keyprovider/lsa.py +38 -0
  69. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/dpapi/master_key.py +3 -0
  70. dissect_target-3.19/dissect/target/plugins/os/windows/jumplist.py +292 -0
  71. dissect_target-3.19/dissect/target/plugins/os/windows/lnk.py +177 -0
  72. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/regf/shimcache.py +2 -2
  73. dissect_target-3.19/dissect/target/plugins/os/windows/regf/usb.py +226 -0
  74. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/task_helpers/tasks_xml.py +1 -1
  75. dissect_target-3.19/dissect/target/plugins/os/windows/wua_history.py +1073 -0
  76. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/target.py +4 -3
  77. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/tools/fs.py +53 -15
  78. dissect_target-3.19/dissect/target/tools/fsutils.py +243 -0
  79. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/tools/info.py +11 -4
  80. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/tools/query.py +2 -2
  81. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/tools/shell.py +505 -333
  82. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/tools/utils.py +23 -2
  83. dissect_target-3.19/dissect/target/tools/yara.py +65 -0
  84. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/volumes/md.py +2 -2
  85. {dissect_target-3.18.dev16 → dissect_target-3.19/dissect.target.egg-info}/PKG-INFO +11 -7
  86. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect.target.egg-info/SOURCES.txt +40 -5
  87. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect.target.egg-info/entry_points.txt +1 -0
  88. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect.target.egg-info/requires.txt +2 -1
  89. {dissect_target-3.18.dev16 → dissect_target-3.19}/pyproject.toml +3 -2
  90. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/conftest.py +35 -81
  91. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/filesystems/test_config.py +1 -1
  92. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/filesystems/test_zip.py +58 -15
  93. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/helpers/test_configutil.py +47 -1
  94. dissect_target-3.19/tests/helpers/test_loaderutil.py +145 -0
  95. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/helpers/test_modifier.py +2 -0
  96. dissect_target-3.19/tests/loaders/test_ab.py +48 -0
  97. dissect_target-3.19/tests/loaders/test_libvirt.py +40 -0
  98. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/loaders/test_mqtt.py +1 -1
  99. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/apps/browser/test_chrome.py +121 -3
  100. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/apps/browser/test_edge.py +51 -3
  101. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/apps/browser/test_firefox.py +106 -27
  102. dissect_target-3.19/tests/plugins/apps/remoteaccess/test_anydesk.py +84 -0
  103. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/apps/remoteaccess/test_teamviewer.py +11 -11
  104. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/apps/ssh/test_putty.py +4 -3
  105. dissect_target-3.19/tests/plugins/apps/texteditor/test_texteditor.py +190 -0
  106. dissect_target-3.19/tests/plugins/child/test_qemu.py +32 -0
  107. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/filesystem/ntfs/test_mft.py +42 -1
  108. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/filesystem/test_walkfs.py +3 -2
  109. dissect_target-3.19/tests/plugins/filesystem/test_yara.py +89 -0
  110. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/filesystem/unix/test_capability.py +10 -9
  111. dissect_target-3.19/tests/plugins/general/test_network.py +46 -0
  112. dissect_target-3.19/tests/plugins/os/unix/linux/test__os.py +49 -0
  113. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/test__os.py +26 -2
  114. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/test_generic.py +2 -2
  115. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/test_ips.py +77 -12
  116. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/test_shadow.py +23 -1
  117. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/test_users.py +17 -2
  118. dissect_target-3.19/tests/plugins/os/windows/__init__.py +0 -0
  119. dissect_target-3.19/tests/plugins/os/windows/credential/__init__.py +0 -0
  120. {dissect_target-3.18.dev16/tests/plugins/os/windows → dissect_target-3.19/tests/plugins/os/windows/credential}/test_credhist.py +4 -1
  121. dissect_target-3.19/tests/plugins/os/windows/credential/test_lsa.py +145 -0
  122. {dissect_target-3.18.dev16/tests/plugins/os/windows → dissect_target-3.19/tests/plugins/os/windows/credential}/test_sam.py +20 -23
  123. dissect_target-3.19/tests/plugins/os/windows/regf/__init__.py +0 -0
  124. dissect_target-3.19/tests/plugins/os/windows/regf/test_usb.py +90 -0
  125. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/test__os.py +25 -7
  126. dissect_target-3.19/tests/plugins/os/windows/test_dpapi.py +533 -0
  127. dissect_target-3.19/tests/plugins/os/windows/test_jumplist.py +44 -0
  128. dissect_target-3.19/tests/plugins/os/windows/test_lnk.py +50 -0
  129. dissect_target-3.19/tests/plugins/os/windows/test_wua_history.py +52 -0
  130. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/test_filesystem.py +58 -31
  131. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/test_plugin.py +48 -1
  132. dissect_target-3.19/tests/test_tests.py +39 -0
  133. dissect_target-3.19/tests/tools/__init__.py +0 -0
  134. dissect_target-3.19/tests/tools/test_fsutils.py +44 -0
  135. dissect_target-3.19/tests/tools/test_info.py +47 -0
  136. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/tools/test_query.py +1 -0
  137. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/tools/test_shell.py +66 -83
  138. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/tools/test_utils.py +15 -0
  139. dissect_target-3.19/tests/tools/test_yara.py +43 -0
  140. dissect_target-3.19/tests/volumes/__init__.py +0 -0
  141. dissect_target-3.18.dev16/dissect/target/filesystems/zip.py +0 -136
  142. dissect_target-3.18.dev16/dissect/target/plugins/apps/remoteaccess/anydesk.py +0 -91
  143. dissect_target-3.18.dev16/dissect/target/plugins/apps/ssh/ssh.py +0 -98
  144. dissect_target-3.18.dev16/dissect/target/plugins/filesystem/unix/capability.py +0 -169
  145. dissect_target-3.18.dev16/dissect/target/plugins/filesystem/walkfs.py +0 -70
  146. dissect_target-3.18.dev16/dissect/target/plugins/filesystem/yara.py +0 -63
  147. dissect_target-3.18.dev16/dissect/target/plugins/os/windows/dpapi/dpapi.py +0 -194
  148. dissect_target-3.18.dev16/dissect/target/plugins/os/windows/lnk.py +0 -174
  149. dissect_target-3.18.dev16/dissect/target/plugins/os/windows/regf/usb.py +0 -161
  150. dissect_target-3.18.dev16/tests/helpers/test_loaderutil.py +0 -41
  151. dissect_target-3.18.dev16/tests/plugins/apps/remoteaccess/test_anydesk.py +0 -47
  152. dissect_target-3.18.dev16/tests/plugins/filesystem/test_yara.py +0 -38
  153. dissect_target-3.18.dev16/tests/plugins/os/windows/test_dpapi.py +0 -42
  154. dissect_target-3.18.dev16/tests/plugins/os/windows/test_lnk.py +0 -34
  155. {dissect_target-3.18.dev16 → dissect_target-3.19}/COPYRIGHT +0 -0
  156. {dissect_target-3.18.dev16 → dissect_target-3.19}/LICENSE +0 -0
  157. {dissect_target-3.18.dev16 → dissect_target-3.19}/MANIFEST.in +0 -0
  158. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/__init__.py +0 -0
  159. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/container.py +0 -0
  160. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/containers/__init__.py +0 -0
  161. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/containers/asdf.py +0 -0
  162. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/containers/ewf.py +0 -0
  163. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/containers/fortifw.py +0 -0
  164. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/containers/hdd.py +0 -0
  165. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/containers/hds.py +0 -0
  166. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/containers/qcow2.py +0 -0
  167. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/containers/raw.py +0 -0
  168. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/containers/split.py +0 -0
  169. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/containers/vdi.py +0 -0
  170. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/containers/vhd.py +0 -0
  171. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/containers/vhdx.py +0 -0
  172. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/containers/vmdk.py +0 -0
  173. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/data/autocompletion/target_bash_completion.sh +0 -0
  174. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/exceptions.py +0 -0
  175. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/filesystems/__init__.py +0 -0
  176. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/filesystems/ad1.py +0 -0
  177. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/filesystems/btrfs.py +0 -0
  178. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/filesystems/cb.py +0 -0
  179. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/filesystems/cpio.py +0 -0
  180. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/filesystems/dir.py +0 -0
  181. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/filesystems/exfat.py +0 -0
  182. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/filesystems/fat.py +0 -0
  183. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/filesystems/ffs.py +0 -0
  184. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/filesystems/jffs.py +0 -0
  185. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/filesystems/ntfs.py +0 -0
  186. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/filesystems/overlay.py +0 -0
  187. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/filesystems/smb.py +0 -0
  188. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/filesystems/squashfs.py +0 -0
  189. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/filesystems/vmfs.py +0 -0
  190. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/filesystems/vmtar.py +0 -0
  191. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/filesystems/xfs.py +0 -0
  192. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/__init__.py +0 -0
  193. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/cache.py +0 -0
  194. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/compat/__init__.py +0 -0
  195. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/compat/path_310.py +0 -0
  196. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/compat/path_311.py +0 -0
  197. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/compat/path_312.py +0 -0
  198. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/compat/path_39.py +0 -0
  199. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/compat/path_common.py +0 -0
  200. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/data/windowsZones.xml +0 -0
  201. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/descriptor_extensions.py +0 -0
  202. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/docs.py +0 -0
  203. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/hashutil.py +0 -0
  204. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/keychain.py +0 -0
  205. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/lazy.py +0 -0
  206. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/localeutil.py +0 -0
  207. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/mount.py +0 -0
  208. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/mui.py +0 -0
  209. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/polypath.py +0 -0
  210. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/protobuf.py +0 -0
  211. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/regutil.py +0 -0
  212. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/shell_folder_ids.py +0 -0
  213. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/helpers/targetd.py +0 -0
  214. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/__init__.py +0 -0
  215. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/ad1.py +0 -0
  216. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/asdf.py +0 -0
  217. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/cb.py +0 -0
  218. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/cyber.py +0 -0
  219. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/dir.py +0 -0
  220. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/hyperv.py +0 -0
  221. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/itunes.py +0 -0
  222. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/kape.py +0 -0
  223. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/local.py +0 -0
  224. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/log.py +0 -0
  225. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/multiraw.py +0 -0
  226. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/ova.py +0 -0
  227. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/overlay.py +0 -0
  228. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/ovf.py +0 -0
  229. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/phobos.py +0 -0
  230. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/profile.py +0 -0
  231. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/pvm.py +0 -0
  232. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/pvs.py +0 -0
  233. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/raw.py +0 -0
  234. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/remote.py +0 -0
  235. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/res.py +0 -0
  236. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/smb.py +0 -0
  237. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/tanium.py +0 -0
  238. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/target.py +0 -0
  239. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/targetd.py +0 -0
  240. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/vb.py +0 -0
  241. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/vbox.py +0 -0
  242. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/vma.py +0 -0
  243. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/vmwarevm.py +0 -0
  244. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/vmx.py +0 -0
  245. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/loaders/xva.py +0 -0
  246. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/__init__.py +0 -0
  247. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/__init__.py +0 -0
  248. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/av/__init__.py +0 -0
  249. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/av/mcafee.py +0 -0
  250. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/av/sophos.py +0 -0
  251. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/av/symantec.py +0 -0
  252. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/av/trendmicro.py +0 -0
  253. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/browser/__init__.py +0 -0
  254. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/browser/brave.py +0 -0
  255. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/browser/browser.py +0 -0
  256. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/browser/iexplore.py +0 -0
  257. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/container/__init__.py +0 -0
  258. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/container/docker.py +0 -0
  259. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/remoteaccess/__init__.py +0 -0
  260. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/shell/__init__.py +0 -0
  261. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/shell/powershell.py +0 -0
  262. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/ssh/__init__.py +0 -0
  263. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/ssh/opensshd.py +0 -0
  264. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/ssh/putty.py +0 -0
  265. {dissect_target-3.18.dev16/dissect/target/plugins/apps/vpn → dissect_target-3.19/dissect/target/plugins/apps/texteditor}/__init__.py +0 -0
  266. {dissect_target-3.18.dev16/dissect/target/plugins/apps/webhosting → dissect_target-3.19/dissect/target/plugins/apps/vpn}/__init__.py +0 -0
  267. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/vpn/openvpn.py +0 -0
  268. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/vpn/wireguard.py +0 -0
  269. {dissect_target-3.18.dev16/dissect/target/plugins/apps/webserver → dissect_target-3.19/dissect/target/plugins/apps/webhosting}/__init__.py +0 -0
  270. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/webhosting/cpanel.py +0 -0
  271. {dissect_target-3.18.dev16/dissect/target/plugins/child → dissect_target-3.19/dissect/target/plugins/apps/webserver}/__init__.py +0 -0
  272. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/webserver/apache.py +0 -0
  273. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/webserver/caddy.py +0 -0
  274. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/webserver/citrix.py +0 -0
  275. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/webserver/iis.py +0 -0
  276. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/webserver/nginx.py +0 -0
  277. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/apps/webserver/webserver.py +0 -0
  278. {dissect_target-3.18.dev16/dissect/target/plugins/filesystem → dissect_target-3.19/dissect/target/plugins/child}/__init__.py +0 -0
  279. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/child/docker.py +0 -0
  280. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/child/esxi.py +0 -0
  281. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/child/hyperv.py +0 -0
  282. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/child/virtuozzo.py +0 -0
  283. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/child/vmware_workstation.py +0 -0
  284. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/child/wsl.py +0 -0
  285. {dissect_target-3.18.dev16/dissect/target/plugins/filesystem/ntfs → dissect_target-3.19/dissect/target/plugins/filesystem}/__init__.py +0 -0
  286. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/filesystem/acquire_handles.py +0 -0
  287. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/filesystem/acquire_hash.py +0 -0
  288. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/filesystem/icat.py +0 -0
  289. {dissect_target-3.18.dev16/dissect/target/plugins/filesystem/unix → dissect_target-3.19/dissect/target/plugins/filesystem/ntfs}/__init__.py +0 -0
  290. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/filesystem/ntfs/mft_timeline.py +0 -0
  291. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/filesystem/ntfs/usnjrnl.py +0 -0
  292. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/filesystem/ntfs/utils.py +0 -0
  293. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/filesystem/resolver.py +0 -0
  294. {dissect_target-3.18.dev16/dissect/target/plugins/general → dissect_target-3.19/dissect/target/plugins/filesystem/unix}/__init__.py +0 -0
  295. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/filesystem/unix/suid.py +0 -0
  296. {dissect_target-3.18.dev16/dissect/target/plugins/os → dissect_target-3.19/dissect/target/plugins/general}/__init__.py +0 -0
  297. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/general/config.py +0 -0
  298. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/general/default.py +0 -0
  299. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/general/example.py +0 -0
  300. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/general/loaders.py +0 -0
  301. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/general/osinfo.py +0 -0
  302. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/general/plugins.py +0 -0
  303. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/general/scrape.py +0 -0
  304. {dissect_target-3.18.dev16/dissect/target/plugins/os/unix → dissect_target-3.19/dissect/target/plugins/os}/__init__.py +0 -0
  305. {dissect_target-3.18.dev16/dissect/target/plugins/os/unix/bsd → dissect_target-3.19/dissect/target/plugins/os/unix}/__init__.py +0 -0
  306. {dissect_target-3.18.dev16/dissect/target/plugins/os/unix/bsd/citrix → dissect_target-3.19/dissect/target/plugins/os/unix/bsd}/__init__.py +0 -0
  307. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/bsd/_os.py +0 -0
  308. {dissect_target-3.18.dev16/dissect/target/plugins/os/unix/bsd/freebsd → dissect_target-3.19/dissect/target/plugins/os/unix/bsd/citrix}/__init__.py +0 -0
  309. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/bsd/citrix/_os.py +0 -0
  310. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/bsd/citrix/history.py +0 -0
  311. {dissect_target-3.18.dev16/dissect/target/plugins/os/unix/bsd/ios → dissect_target-3.19/dissect/target/plugins/os/unix/bsd/freebsd}/__init__.py +0 -0
  312. {dissect_target-3.18.dev16/dissect/target/plugins/os/unix/bsd/openbsd → dissect_target-3.19/dissect/target/plugins/os/unix/bsd/ios}/__init__.py +0 -0
  313. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/bsd/ios/_os.py +0 -0
  314. {dissect_target-3.18.dev16/dissect/target/plugins/os/unix/bsd/osx → dissect_target-3.19/dissect/target/plugins/os/unix/bsd/openbsd}/__init__.py +0 -0
  315. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/bsd/openbsd/_os.py +0 -0
  316. {dissect_target-3.18.dev16/dissect/target/plugins/os/unix/esxi → dissect_target-3.19/dissect/target/plugins/os/unix/bsd/osx}/__init__.py +0 -0
  317. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/bsd/osx/_os.py +0 -0
  318. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/bsd/osx/user.py +0 -0
  319. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/cronjobs.py +0 -0
  320. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/datetime.py +0 -0
  321. {dissect_target-3.18.dev16/dissect/target/plugins/os/unix/etc → dissect_target-3.19/dissect/target/plugins/os/unix/esxi}/__init__.py +0 -0
  322. {dissect_target-3.18.dev16/dissect/target/plugins/os/unix/linux → dissect_target-3.19/dissect/target/plugins/os/unix/etc}/__init__.py +0 -0
  323. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/etc.py +0 -0
  324. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/generic.py +0 -0
  325. {dissect_target-3.18.dev16/dissect/target/plugins/os/unix/linux/android → dissect_target-3.19/dissect/target/plugins/os/unix/linux}/__init__.py +0 -0
  326. {dissect_target-3.18.dev16/dissect/target/plugins/os/unix/linux/debian → dissect_target-3.19/dissect/target/plugins/os/unix/linux/android}/__init__.py +0 -0
  327. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/linux/cmdline.py +0 -0
  328. {dissect_target-3.18.dev16/dissect/target/plugins/os/unix/linux/debian/vyos → dissect_target-3.19/dissect/target/plugins/os/unix/linux/debian}/__init__.py +0 -0
  329. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/linux/debian/_os.py +0 -0
  330. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/linux/debian/apt.py +0 -0
  331. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/linux/debian/dpkg.py +0 -0
  332. {dissect_target-3.18.dev16/dissect/target/plugins/os/unix/linux/fortios → dissect_target-3.19/dissect/target/plugins/os/unix/linux/debian/vyos}/__init__.py +0 -0
  333. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/linux/debian/vyos/_os.py +0 -0
  334. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/linux/environ.py +0 -0
  335. {dissect_target-3.18.dev16/dissect/target/plugins/os/unix/linux/redhat → dissect_target-3.19/dissect/target/plugins/os/unix/linux/fortios}/__init__.py +0 -0
  336. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/linux/fortios/_keys.py +0 -0
  337. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/linux/fortios/_os.py +0 -0
  338. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/linux/fortios/generic.py +0 -0
  339. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/linux/fortios/locale.py +0 -0
  340. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/linux/iptables.py +0 -0
  341. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/linux/modules.py +0 -0
  342. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/linux/netstat.py +0 -0
  343. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/linux/proc.py +0 -0
  344. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/linux/processes.py +0 -0
  345. {dissect_target-3.18.dev16/dissect/target/plugins/os/unix/linux/suse → dissect_target-3.19/dissect/target/plugins/os/unix/linux/redhat}/__init__.py +0 -0
  346. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/linux/redhat/yum.py +0 -0
  347. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/linux/services.py +0 -0
  348. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/linux/sockets.py +0 -0
  349. {dissect_target-3.18.dev16/dissect/target/plugins/os/unix/locate → dissect_target-3.19/dissect/target/plugins/os/unix/linux/suse}/__init__.py +0 -0
  350. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/linux/suse/_os.py +0 -0
  351. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/linux/suse/zypper.py +0 -0
  352. {dissect_target-3.18.dev16/dissect/target/plugins/os/unix/log → dissect_target-3.19/dissect/target/plugins/os/unix/locate}/__init__.py +0 -0
  353. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/locate/gnulocate.py +0 -0
  354. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/locate/locate.py +0 -0
  355. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/locate/mlocate.py +0 -0
  356. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/locate/plocate.py +0 -0
  357. {dissect_target-3.18.dev16/dissect/target/plugins/os/windows → dissect_target-3.19/dissect/target/plugins/os/unix/log}/__init__.py +0 -0
  358. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/log/atop.py +0 -0
  359. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/log/audit.py +0 -0
  360. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/log/auth.py +0 -0
  361. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/log/journal.py +0 -0
  362. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/log/lastlog.py +0 -0
  363. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/log/messages.py +0 -0
  364. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/log/utmp.py +0 -0
  365. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/unix/packagemanager.py +0 -0
  366. {dissect_target-3.18.dev16/dissect/target/plugins/os/windows/defender_helpers → dissect_target-3.19/dissect/target/plugins/os/windows}/__init__.py +0 -0
  367. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/activitiescache.py +0 -0
  368. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/amcache.py +0 -0
  369. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/cim.py +0 -0
  370. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/clfs.py +0 -0
  371. {dissect_target-3.18.dev16/dissect/target/plugins/os/windows/dpapi → dissect_target-3.19/dissect/target/plugins/os/windows/credential}/__init__.py +0 -0
  372. {dissect_target-3.18.dev16/dissect/target/plugins/os/windows → dissect_target-3.19/dissect/target/plugins/os/windows/credential}/credhist.py +0 -0
  373. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/datetime.py +0 -0
  374. {dissect_target-3.18.dev16/dissect/target/plugins/os/windows/exchange → dissect_target-3.19/dissect/target/plugins/os/windows/defender_helpers}/__init__.py +0 -0
  375. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/defender_helpers/defender_patterns.py +0 -0
  376. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/defender_helpers/defender_records.py +0 -0
  377. {dissect_target-3.18.dev16/dissect/target/plugins/os/windows/log → dissect_target-3.19/dissect/target/plugins/os/windows/dpapi}/__init__.py +0 -0
  378. {dissect_target-3.18.dev16/dissect/target/plugins/os/windows/regf → dissect_target-3.19/dissect/target/plugins/os/windows/dpapi/keyprovider}/__init__.py +0 -0
  379. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/env.py +0 -0
  380. {dissect_target-3.18.dev16/dissect/target/plugins/os/windows/task_helpers → dissect_target-3.19/dissect/target/plugins/os/windows/exchange}/__init__.py +0 -0
  381. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/exchange/exchange.py +0 -0
  382. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/generic.py +0 -0
  383. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/locale.py +0 -0
  384. {dissect_target-3.18.dev16/dissect/target/tools → dissect_target-3.19/dissect/target/plugins/os/windows/log}/__init__.py +0 -0
  385. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/log/amcache.py +0 -0
  386. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/log/etl.py +0 -0
  387. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/log/evt.py +0 -0
  388. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/log/evtx.py +0 -0
  389. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/log/pfro.py +0 -0
  390. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/log/schedlgu.py +0 -0
  391. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/notifications.py +0 -0
  392. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/prefetch.py +0 -0
  393. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/recyclebin.py +0 -0
  394. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/regf/7zip.py +0 -0
  395. {dissect_target-3.18.dev16/dissect/target/tools/dump → dissect_target-3.19/dissect/target/plugins/os/windows/regf}/__init__.py +0 -0
  396. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/regf/appxdebugkeys.py +0 -0
  397. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/regf/auditpol.py +0 -0
  398. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/regf/bam.py +0 -0
  399. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/regf/cit.py +0 -0
  400. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/regf/clsid.py +0 -0
  401. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/regf/firewall.py +0 -0
  402. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/regf/mru.py +0 -0
  403. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/regf/muicache.py +0 -0
  404. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/regf/nethist.py +0 -0
  405. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/regf/recentfilecache.py +0 -0
  406. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/regf/regf.py +0 -0
  407. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/regf/runkeys.py +0 -0
  408. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/regf/shellbags.py +0 -0
  409. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/regf/trusteddocs.py +0 -0
  410. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/regf/userassist.py +0 -0
  411. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/registry.py +0 -0
  412. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/services.py +0 -0
  413. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/sru.py +0 -0
  414. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/startupinfo.py +0 -0
  415. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/syscache.py +0 -0
  416. {dissect_target-3.18.dev16/dissect/target/volumes → dissect_target-3.19/dissect/target/plugins/os/windows/task_helpers}/__init__.py +0 -0
  417. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/task_helpers/tasks_job.py +0 -0
  418. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/task_helpers/tasks_records.py +0 -0
  419. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/tasks.py +0 -0
  420. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/thumbcache.py +0 -0
  421. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/ual.py +0 -0
  422. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/plugins/os/windows/wer.py +0 -0
  423. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/report.py +0 -0
  424. {dissect_target-3.18.dev16/tests → dissect_target-3.19/dissect/target/tools}/__init__.py +0 -0
  425. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/tools/build_pluginlist.py +0 -0
  426. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/tools/dd.py +0 -0
  427. {dissect_target-3.18.dev16/tests/containers → dissect_target-3.19/dissect/target/tools/dump}/__init__.py +0 -0
  428. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/tools/dump/run.py +0 -0
  429. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/tools/dump/state.py +0 -0
  430. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/tools/dump/utils.py +0 -0
  431. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/tools/logging.py +0 -0
  432. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/tools/mount.py +0 -0
  433. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/tools/reg.py +0 -0
  434. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/volume.py +0 -0
  435. {dissect_target-3.18.dev16/tests/filesystems → dissect_target-3.19/dissect/target/volumes}/__init__.py +0 -0
  436. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/volumes/bde.py +0 -0
  437. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/volumes/ddf.py +0 -0
  438. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/volumes/disk.py +0 -0
  439. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/volumes/luks.py +0 -0
  440. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/volumes/lvm.py +0 -0
  441. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect/target/volumes/vmfs.py +0 -0
  442. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect.target.egg-info/dependency_links.txt +0 -0
  443. {dissect_target-3.18.dev16 → dissect_target-3.19}/dissect.target.egg-info/top_level.txt +0 -0
  444. {dissect_target-3.18.dev16 → dissect_target-3.19}/setup.cfg +0 -0
  445. {dissect_target-3.18.dev16/tests/helpers → dissect_target-3.19/tests}/__init__.py +0 -0
  446. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/_docs/Makefile +0 -0
  447. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/_docs/conf.py +0 -0
  448. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/_docs/index.rst +0 -0
  449. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/_utils.py +0 -0
  450. {dissect_target-3.18.dev16/tests/loaders → dissect_target-3.19/tests/containers}/__init__.py +0 -0
  451. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/containers/test_fortifw.py +0 -0
  452. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/containers/test_split.py +0 -0
  453. {dissect_target-3.18.dev16/tests/plugins → dissect_target-3.19/tests/filesystems}/__init__.py +0 -0
  454. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/filesystems/test_cb.py +0 -0
  455. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/filesystems/test_cpio.py +0 -0
  456. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/filesystems/test_dir.py +0 -0
  457. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/filesystems/test_exfat.py +0 -0
  458. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/filesystems/test_fat.py +0 -0
  459. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/filesystems/test_ntfs.py +0 -0
  460. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/filesystems/test_overlay.py +0 -0
  461. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/filesystems/test_smb.py +0 -0
  462. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/filesystems/test_tar.py +0 -0
  463. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/filesystems/test_vmtar.py +0 -0
  464. {dissect_target-3.18.dev16/tests/plugins/apps → dissect_target-3.19/tests/helpers}/__init__.py +0 -0
  465. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/helpers/test_cache.py +0 -0
  466. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/helpers/test_config.py +0 -0
  467. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/helpers/test_docs.py +0 -0
  468. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/helpers/test_fsutil.py +0 -0
  469. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/helpers/test_hashutil.py +0 -0
  470. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/helpers/test_keychain.py +0 -0
  471. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/helpers/test_localeutil.py +0 -0
  472. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/helpers/test_protobuf.py +0 -0
  473. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/helpers/test_record.py +0 -0
  474. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/helpers/test_regutil.py +0 -0
  475. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/helpers/test_utils.py +0 -0
  476. {dissect_target-3.18.dev16/tests/plugins/apps/av → dissect_target-3.19/tests/loaders}/__init__.py +0 -0
  477. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/loaders/test_asdf.py +0 -0
  478. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/loaders/test_cb.py +0 -0
  479. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/loaders/test_dir.py +0 -0
  480. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/loaders/test_hyperv.py +0 -0
  481. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/loaders/test_kape.py +0 -0
  482. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/loaders/test_local.py +0 -0
  483. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/loaders/test_log.py +0 -0
  484. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/loaders/test_multiraw.py +0 -0
  485. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/loaders/test_ova.py +0 -0
  486. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/loaders/test_overlay.py +0 -0
  487. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/loaders/test_ovf.py +0 -0
  488. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/loaders/test_phobos.py +0 -0
  489. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/loaders/test_pvm.py +0 -0
  490. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/loaders/test_pvs.py +0 -0
  491. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/loaders/test_remote.py +0 -0
  492. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/loaders/test_smb.py +0 -0
  493. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/loaders/test_tanium.py +0 -0
  494. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/loaders/test_tar.py +0 -0
  495. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/loaders/test_utm.py +0 -0
  496. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/loaders/test_vbox.py +0 -0
  497. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/loaders/test_velociraptor.py +0 -0
  498. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/loaders/test_vmwarevm.py +0 -0
  499. {dissect_target-3.18.dev16/tests/plugins/apps/browser → dissect_target-3.19/tests/plugins}/__init__.py +0 -0
  500. {dissect_target-3.18.dev16/tests/plugins/apps/container → dissect_target-3.19/tests/plugins/apps}/__init__.py +0 -0
  501. {dissect_target-3.18.dev16/tests/plugins/apps/remoteaccess → dissect_target-3.19/tests/plugins/apps/av}/__init__.py +0 -0
  502. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/apps/av/test_mcafee.py +0 -0
  503. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/apps/av/test_sophos.py +0 -0
  504. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/apps/av/test_symantec.py +0 -0
  505. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/apps/av/test_trendmicro.py +0 -0
  506. {dissect_target-3.18.dev16/tests/plugins/apps/shell → dissect_target-3.19/tests/plugins/apps/browser}/__init__.py +0 -0
  507. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/apps/browser/test_brave.py +0 -0
  508. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/apps/browser/test_chromium.py +0 -0
  509. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/apps/browser/test_iexplore.py +0 -0
  510. {dissect_target-3.18.dev16/tests/plugins/apps/ssh → dissect_target-3.19/tests/plugins/apps/container}/__init__.py +0 -0
  511. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/apps/container/test_docker.py +0 -0
  512. {dissect_target-3.18.dev16/tests/plugins/apps/vpn → dissect_target-3.19/tests/plugins/apps/remoteaccess}/__init__.py +0 -0
  513. {dissect_target-3.18.dev16/tests/plugins/apps/webhosting → dissect_target-3.19/tests/plugins/apps/shell}/__init__.py +0 -0
  514. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/apps/shell/test_powershell.py +0 -0
  515. {dissect_target-3.18.dev16/tests/plugins/apps/webserver → dissect_target-3.19/tests/plugins/apps/ssh}/__init__.py +0 -0
  516. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/apps/ssh/test_openssh.py +0 -0
  517. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/apps/ssh/test_opensshd.py +0 -0
  518. {dissect_target-3.18.dev16/tests/plugins/child → dissect_target-3.19/tests/plugins/apps/texteditor}/__init__.py +0 -0
  519. {dissect_target-3.18.dev16/tests/plugins/filesystem → dissect_target-3.19/tests/plugins/apps/vpn}/__init__.py +0 -0
  520. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/apps/vpn/test_openvpn.py +0 -0
  521. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/apps/vpn/test_wireguard.py +0 -0
  522. {dissect_target-3.18.dev16/tests/plugins/filesystem/ntfs → dissect_target-3.19/tests/plugins/apps/webhosting}/__init__.py +0 -0
  523. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/apps/webhosting/test_cpanel.py +0 -0
  524. {dissect_target-3.18.dev16/tests/plugins/filesystem/unix → dissect_target-3.19/tests/plugins/apps/webserver}/__init__.py +0 -0
  525. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/apps/webserver/test_apache.py +0 -0
  526. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/apps/webserver/test_caddy.py +0 -0
  527. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/apps/webserver/test_citrix.py +0 -0
  528. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/apps/webserver/test_iis.py +0 -0
  529. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/apps/webserver/test_nginx.py +0 -0
  530. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/apps/webserver/test_webserver.py +0 -0
  531. {dissect_target-3.18.dev16/tests/plugins/general → dissect_target-3.19/tests/plugins/child}/__init__.py +0 -0
  532. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/child/test_docker.py +0 -0
  533. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/child/test_hyperv.py +0 -0
  534. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/child/test_virtuozzo.py +0 -0
  535. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/child/test_wsl.py +0 -0
  536. {dissect_target-3.18.dev16/tests/plugins/os → dissect_target-3.19/tests/plugins/filesystem}/__init__.py +0 -0
  537. {dissect_target-3.18.dev16/tests/plugins/os/unix → dissect_target-3.19/tests/plugins/filesystem/ntfs}/__init__.py +0 -0
  538. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/filesystem/ntfs/test_usnjrnl.py +0 -0
  539. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/filesystem/test_acquire_handles.py +0 -0
  540. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/filesystem/test_acquire_hash.py +0 -0
  541. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/filesystem/test_icat.py +0 -0
  542. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/filesystem/test_resolver.py +0 -0
  543. {dissect_target-3.18.dev16/tests/plugins/os/unix/bsd → dissect_target-3.19/tests/plugins/filesystem/unix}/__init__.py +0 -0
  544. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/filesystem/unix/test_suid.py +0 -0
  545. {dissect_target-3.18.dev16/tests/plugins/os/unix/bsd/citrix → dissect_target-3.19/tests/plugins/general}/__init__.py +0 -0
  546. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/general/test_config.py +0 -0
  547. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/general/test_default.py +0 -0
  548. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/general/test_plugins.py +0 -0
  549. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/general/test_scrape.py +0 -0
  550. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/general/test_users.py +0 -0
  551. {dissect_target-3.18.dev16/tests/plugins/os/unix/bsd/osx → dissect_target-3.19/tests/plugins/os}/__init__.py +0 -0
  552. {dissect_target-3.18.dev16/tests/plugins/os/unix/esxi → dissect_target-3.19/tests/plugins/os/unix}/__init__.py +0 -0
  553. {dissect_target-3.18.dev16/tests/plugins/os/unix/linux → dissect_target-3.19/tests/plugins/os/unix/bsd}/__init__.py +0 -0
  554. {dissect_target-3.18.dev16/tests/plugins/os/unix/linux/android → dissect_target-3.19/tests/plugins/os/unix/bsd/citrix}/__init__.py +0 -0
  555. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/bsd/citrix/test__os.py +0 -0
  556. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/bsd/citrix/test_history.py +0 -0
  557. {dissect_target-3.18.dev16/tests/plugins/os/unix/linux/debian → dissect_target-3.19/tests/plugins/os/unix/bsd/osx}/__init__.py +0 -0
  558. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/bsd/osx/test__os.py +0 -0
  559. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/bsd/osx/test_user.py +0 -0
  560. {dissect_target-3.18.dev16/tests/plugins/os/unix/linux/redhat → dissect_target-3.19/tests/plugins/os/unix/esxi}/__init__.py +0 -0
  561. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/esxi/test__os.py +0 -0
  562. {dissect_target-3.18.dev16/tests/plugins/os/unix/linux/suse → dissect_target-3.19/tests/plugins/os/unix/linux}/__init__.py +0 -0
  563. {dissect_target-3.18.dev16/tests/plugins/os/unix/locate → dissect_target-3.19/tests/plugins/os/unix/linux/android}/__init__.py +0 -0
  564. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/linux/android/test__os.py +0 -0
  565. {dissect_target-3.18.dev16/tests/plugins/os/unix/log → dissect_target-3.19/tests/plugins/os/unix/linux/debian}/__init__.py +0 -0
  566. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/linux/debian/test_apt.py +0 -0
  567. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/linux/debian/test_dpkg.py +0 -0
  568. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/linux/fortios/test_keys.py +0 -0
  569. {dissect_target-3.18.dev16/tests/plugins/os/windows → dissect_target-3.19/tests/plugins/os/unix/linux/redhat}/__init__.py +0 -0
  570. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/linux/redhat/test_yum.py +0 -0
  571. {dissect_target-3.18.dev16/tests/plugins/os/windows/regf → dissect_target-3.19/tests/plugins/os/unix/linux/suse}/__init__.py +0 -0
  572. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/linux/suse/test_zypper.py +0 -0
  573. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/linux/test_cmdline.py +0 -0
  574. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/linux/test_environ.py +0 -0
  575. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/linux/test_iptables.py +0 -0
  576. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/linux/test_modules.py +0 -0
  577. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/linux/test_netstat.py +0 -0
  578. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/linux/test_proc.py +0 -0
  579. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/linux/test_processes.py +0 -0
  580. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/linux/test_services.py +0 -0
  581. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/linux/test_sockets.py +0 -0
  582. {dissect_target-3.18.dev16/tests/tools → dissect_target-3.19/tests/plugins/os/unix/locate}/__init__.py +0 -0
  583. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/locate/test_gnulocate.py +0 -0
  584. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/locate/test_mlocate.py +0 -0
  585. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/locate/test_plocate.py +0 -0
  586. {dissect_target-3.18.dev16/tests/volumes → dissect_target-3.19/tests/plugins/os/unix/log}/__init__.py +0 -0
  587. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/log/test_atop.py +0 -0
  588. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/log/test_audit.py +0 -0
  589. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/log/test_auth.py +0 -0
  590. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/log/test_lastlog.py +0 -0
  591. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/log/test_messages.py +0 -0
  592. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/log/test_utmp.py +0 -0
  593. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/test_history.py +0 -0
  594. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/test_journal.py +0 -0
  595. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/test_locale.py +0 -0
  596. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/test_packagemanager.py +0 -0
  597. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/unix/test_version.py +0 -0
  598. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/log/test_etl.py +0 -0
  599. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/log/test_evt.py +0 -0
  600. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/log/test_evtx.py +0 -0
  601. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/log/test_schedlgu.py +0 -0
  602. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/regf/test_appxdebugkeys.py +0 -0
  603. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/regf/test_cit.py +0 -0
  604. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/regf/test_clsid.py +0 -0
  605. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/regf/test_muicache.py +0 -0
  606. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/regf/test_shellbags.py +0 -0
  607. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/regf/test_trusteddocs.py +0 -0
  608. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/regf/test_userassist.py +0 -0
  609. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/test_adpolicy.py +0 -0
  610. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/test_amcache.py +0 -0
  611. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/test_catroot.py +0 -0
  612. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/test_clfs.py +0 -0
  613. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/test_datetime.py +0 -0
  614. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/test_defender.py +0 -0
  615. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/test_env.py +0 -0
  616. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/test_generic.py +0 -0
  617. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/test_locale.py +0 -0
  618. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/test_mru.py +0 -0
  619. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/test_notifications.py +0 -0
  620. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/test_prefetch.py +0 -0
  621. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/test_recyclebin.py +0 -0
  622. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/test_registry.py +0 -0
  623. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/test_shimcache.py +0 -0
  624. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/test_sru.py +0 -0
  625. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/test_syscache.py +0 -0
  626. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/test_tasks.py +0 -0
  627. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/test_thumbcache.py +0 -0
  628. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/test_ual.py +0 -0
  629. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/plugins/os/windows/test_wer.py +0 -0
  630. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/test_container.py +0 -0
  631. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/test_registration.py +0 -0
  632. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/test_report.py +0 -0
  633. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/test_target.py +0 -0
  634. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/test_volume.py +0 -0
  635. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/tools/test_dump.py +0 -0
  636. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/tools/test_fs.py +0 -0
  637. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/tools/test_mount.py +0 -0
  638. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/tools/test_reg.py +0 -0
  639. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/volumes/test_bde.py +0 -0
  640. {dissect_target-3.18.dev16 → dissect_target-3.19}/tests/volumes/test_md.py +0 -0
  641. {dissect_target-3.18.dev16 → dissect_target-3.19}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dissect.target
3
- Version: 3.18.dev16
3
+ Version: 3.19
4
4
  Summary: This module ties all other Dissect modules together, it provides a programming API and command line tools which allow easy access to various data sources inside disk images or file collections (a.k.a. targets)
5
5
  Author-email: Dissect Team <dissect@fox-it.com>
6
6
  License: Affero General Public License v3
@@ -31,7 +31,7 @@ Requires-Dist: dissect.ntfs<4,>=3.4
31
31
  Requires-Dist: dissect.regf<4,>=3.3
32
32
  Requires-Dist: dissect.util<4,>=3
33
33
  Requires-Dist: dissect.volume<4,>=2
34
- Requires-Dist: flow.record~=3.15.0
34
+ Requires-Dist: flow.record~=3.16.0
35
35
  Requires-Dist: structlog
36
36
  Provides-Extra: full
37
37
  Requires-Dist: asn1crypto; extra == "full"
@@ -44,6 +44,7 @@ Requires-Dist: dissect.extfs<4,>=3; extra == "full"
44
44
  Requires-Dist: dissect.fat<4,>=3; extra == "full"
45
45
  Requires-Dist: dissect.ffs<4,>=3; extra == "full"
46
46
  Requires-Dist: dissect.jffs<2,>=1; extra == "full"
47
+ Requires-Dist: dissect.ole<4,>=3; extra == "full"
47
48
  Requires-Dist: dissect.shellitem<4,>=3; extra == "full"
48
49
  Requires-Dist: dissect.squashfs<2,>=1; extra == "full"
49
50
  Requires-Dist: dissect.sql<4,>=3; extra == "full"
@@ -154,16 +155,19 @@ Opening a shell on a target is straight-forward. You can do so by specifying a p
154
155
 
155
156
  ```bash
156
157
  target-shell targets/EXAMPLE.vmx
157
- EXAMPLE /> help
158
+ WIN-EXAMPLE:/$ help
158
159
 
159
160
  Documented commands (type help <topic>):
160
161
  ========================================
161
- cat disks filesystems help less python save
162
- cd exit find hexdump ls readlink stat
163
- clear file hash info pwd registry volumes
162
+ attr cls enter find info man registry volumes
163
+ cat cyber exit hash less pwd save zcat
164
+ cd debug file help ll python stat zless
165
+ clear disks filesystems hexdump ls readlink tree
164
166
 
165
- EXAMPLE /> ls
167
+ WIN-EXAMPLE:/$ ls
168
+ $fs$
166
169
  c:
170
+ efi
167
171
  sysvol
168
172
  ```
169
173
 
@@ -58,16 +58,19 @@ Opening a shell on a target is straight-forward. You can do so by specifying a p
58
58
 
59
59
  ```bash
60
60
  target-shell targets/EXAMPLE.vmx
61
- EXAMPLE /> help
61
+ WIN-EXAMPLE:/$ help
62
62
 
63
63
  Documented commands (type help <topic>):
64
64
  ========================================
65
- cat disks filesystems help less python save
66
- cd exit find hexdump ls readlink stat
67
- clear file hash info pwd registry volumes
65
+ attr cls enter find info man registry volumes
66
+ cat cyber exit hash less pwd save zcat
67
+ cd debug file help ll python stat zless
68
+ clear disks filesystems hexdump ls readlink tree
68
69
 
69
- EXAMPLE /> ls
70
+ WIN-EXAMPLE:/$ ls
71
+ $fs$
70
72
  c:
73
+ efi
71
74
  sysvol
72
75
  ```
73
76
 
@@ -228,10 +228,9 @@ class Filesystem:
228
228
  topdown: bool = True,
229
229
  onerror: Optional[Callable] = None,
230
230
  followlinks: bool = False,
231
- ) -> Iterator[str]:
232
- """Walk a directory pointed to by ``path``, returning the string representation of both files and directories.
233
-
234
- It walks across all the files inside ``path`` recursively.
231
+ ) -> Iterator[tuple[str, list[str], list[str]]]:
232
+ """Recursively walk a directory pointed to by ``path``, returning the string representation of both files
233
+ and directories.
235
234
 
236
235
  Args:
237
236
  path: The path to walk on the filesystem.
@@ -250,10 +249,9 @@ class Filesystem:
250
249
  topdown: bool = True,
251
250
  onerror: Optional[Callable] = None,
252
251
  followlinks: bool = False,
253
- ) -> Iterator[FilesystemEntry]:
254
- """Walk a directory pointed to by ``path``, returning FilesystemEntry's of both files and directories.
255
-
256
- It walks across all the files inside ``path`` recursively.
252
+ ) -> Iterator[tuple[list[FilesystemEntry], list[FilesystemEntry], list[FilesystemEntry]]]:
253
+ """Recursively walk a directory pointed to by ``path``, returning :class:`FilesystemEntry` of files
254
+ and directories.
257
255
 
258
256
  Args:
259
257
  path: The path to walk on the filesystem.
@@ -266,6 +264,19 @@ class Filesystem:
266
264
  """
267
265
  return self.get(path).walk_ext(topdown, onerror, followlinks)
268
266
 
267
+ def recurse(self, path: str) -> Iterator[FilesystemEntry]:
268
+ """Recursively walk a directory and yield contents as :class:`FilesystemEntry`.
269
+
270
+ Does not follow symbolic links.
271
+
272
+ Args:
273
+ path: The path to recursively walk on the target filesystem.
274
+
275
+ Returns:
276
+ An iterator of :class:`FilesystemEntry`.
277
+ """
278
+ return self.get(path).recurse()
279
+
269
280
  def glob(self, pattern: str) -> Iterator[str]:
270
281
  """Iterate over the directory part of ``pattern``, returning entries matching ``pattern`` as strings.
271
282
 
@@ -578,10 +589,9 @@ class FilesystemEntry:
578
589
  topdown: bool = True,
579
590
  onerror: Optional[Callable] = None,
580
591
  followlinks: bool = False,
581
- ) -> Iterator[str]:
582
- """Walk a directory and list its contents as strings.
583
-
584
- It walks across all the files inside the entry recursively.
592
+ ) -> Iterator[tuple[str, list[str], list[str]]]:
593
+ """Recursively walk a directory and yield its contents as strings split in a tuple
594
+ of lists of files, directories and symlinks.
585
595
 
586
596
  These contents include::
587
597
  - files
@@ -603,15 +613,9 @@ class FilesystemEntry:
603
613
  topdown: bool = True,
604
614
  onerror: Optional[Callable] = None,
605
615
  followlinks: bool = False,
606
- ) -> Iterator[FilesystemEntry]:
607
- """Walk a directory and show its contents as :class:`FilesystemEntry`.
608
-
609
- It walks across all the files inside the entry recursively.
610
-
611
- These contents include::
612
- - files
613
- - directories
614
- - symboliclinks
616
+ ) -> Iterator[tuple[list[FilesystemEntry], list[FilesystemEntry], list[FilesystemEntry]]]:
617
+ """Recursively walk a directory and yield its contents as :class:`FilesystemEntry` split in a tuple of
618
+ lists of files, directories and symlinks.
615
619
 
616
620
  Args:
617
621
  topdown: ``True`` puts this entry at the top of the list, ``False`` puts this entry at the bottom.
@@ -619,10 +623,20 @@ class FilesystemEntry:
619
623
  followlinks: ``True`` if we want to follow any symbolic link
620
624
 
621
625
  Returns:
622
- An iterator of :class:`FilesystemEntry`.
626
+ An iterator of tuples :class:`FilesystemEntry`.
623
627
  """
624
628
  yield from fsutil.walk_ext(self, topdown, onerror, followlinks)
625
629
 
630
+ def recurse(self) -> Iterator[FilesystemEntry]:
631
+ """Recursively walk a directory and yield its contents as :class:`FilesystemEntry`.
632
+
633
+ Does not follow symbolic links.
634
+
635
+ Returns:
636
+ An iterator of :class:`FilesystemEntry`.
637
+ """
638
+ yield from fsutil.recurse(self)
639
+
626
640
  def glob(self, pattern: str) -> Iterator[str]:
627
641
  """Iterate over this directory part of ``patern``, returning entries matching ``pattern`` as strings.
628
642
 
@@ -739,7 +753,7 @@ class FilesystemEntry:
739
753
  """
740
754
  log.debug("%r::readlink_ext()", self)
741
755
  # Default behavior, resolve link own filesystem.
742
- return fsutil.resolve_link(fs=self.fs, entry=self)
756
+ return fsutil.resolve_link(self.fs, self.readlink(), self.path, alt_separator=self.fs.alt_separator)
743
757
 
744
758
  def stat(self, follow_symlinks: bool = True) -> fsutil.stat_result:
745
759
  """Determine the stat information of this entry.
@@ -1453,10 +1467,15 @@ class LayerFilesystem(Filesystem):
1453
1467
  """Get a :class:`FilesystemEntry` relative to a specific entry."""
1454
1468
  parts = path.split("/")
1455
1469
 
1456
- for part in parts:
1470
+ for i, part in enumerate(parts):
1457
1471
  if entry.is_symlink():
1458
1472
  # Resolve using the RootFilesystem instead of the entry's Filesystem
1459
- entry = fsutil.resolve_link(fs=self, entry=entry)
1473
+ entry = fsutil.resolve_link(
1474
+ self,
1475
+ entry.readlink(),
1476
+ "/".join(parts[:i]),
1477
+ alt_separator=entry.fs.alt_separator,
1478
+ )
1460
1479
  entry = entry.get(part)
1461
1480
 
1462
1481
  return entry
@@ -3,11 +3,11 @@ from __future__ import annotations
3
3
  import io
4
4
  import textwrap
5
5
  from logging import getLogger
6
- from typing import Any, BinaryIO, Iterator, Optional, Union
6
+ from typing import Any, BinaryIO, Iterator, Optional
7
7
 
8
8
  from dissect.target import Target
9
9
  from dissect.target.exceptions import ConfigurationParsingError, FileNotFoundError
10
- from dissect.target.filesystem import Filesystem, FilesystemEntry, VirtualFilesystem
10
+ from dissect.target.filesystem import FilesystemEntry, VirtualFilesystem
11
11
  from dissect.target.helpers import fsutil
12
12
  from dissect.target.helpers.configutil import ConfigurationParser, parse
13
13
 
@@ -46,7 +46,7 @@ class ConfigurationFilesystem(VirtualFilesystem):
46
46
  super().__init__(**kwargs)
47
47
  self.root.top = target.fs.get(path)
48
48
 
49
- def _get_till_file(self, path: str, relentry: FilesystemEntry) -> tuple[list[str], FilesystemEntry]:
49
+ def _get_till_file(self, path: str, relentry: FilesystemEntry | None) -> tuple[list[str], FilesystemEntry]:
50
50
  """Searches for the file entry that is pointed to by ``path``.
51
51
 
52
52
  The ``path`` could contain ``key`` entries too, so it searches for the entry from
@@ -56,9 +56,13 @@ class ConfigurationFilesystem(VirtualFilesystem):
56
56
  A list of ``parts`` containing keys: [keys, into, the, file].
57
57
  And the resolved entry: Entry(filename)
58
58
  """
59
+
59
60
  entry = relentry or self.root
61
+ root_path = relentry.path if relentry else self.root.top.path
60
62
 
61
- path = fsutil.normalize(path, alt_separator=self.alt_separator).strip("/")
63
+ # Calculate the relative path
64
+ relpath = fsutil.relpath(path, root_path, alt_separator=self.alt_separator)
65
+ path = fsutil.normalize(relpath, alt_separator=self.alt_separator).strip("/")
62
66
 
63
67
  if not path:
64
68
  return [], entry
@@ -85,10 +89,8 @@ class ConfigurationFilesystem(VirtualFilesystem):
85
89
 
86
90
  return parts[idx:], entry
87
91
 
88
- def get(
89
- self, path: str, relentry: Optional[FilesystemEntry] = None, *args, **kwargs
90
- ) -> Union[FilesystemEntry, ConfigurationEntry]:
91
- """Retrieve a :class:`ConfigurationEntry` or :class:`.FilesystemEntry` relative to the root or ``relentry``.
92
+ def get(self, path: str, relentry: Optional[FilesystemEntry] = None, *args, **kwargs) -> ConfigurationEntry:
93
+ """Retrieve a :class:`ConfigurationEntry` relative to the root or ``relentry``.
92
94
 
93
95
  Raises:
94
96
  FileNotFoundError: if it could not find the entry.
@@ -96,7 +98,7 @@ class ConfigurationFilesystem(VirtualFilesystem):
96
98
  parts, entry = self._get_till_file(path, relentry)
97
99
 
98
100
  if entry.is_dir():
99
- return entry
101
+ return ConfigurationEntry(self, entry.path, entry, None)
100
102
 
101
103
  entry = self._convert_entry(entry, *args, **kwargs)
102
104
 
@@ -108,23 +110,21 @@ class ConfigurationFilesystem(VirtualFilesystem):
108
110
 
109
111
  return entry
110
112
 
111
- def _convert_entry(
112
- self, file_entry: FilesystemEntry, *args, **kwargs
113
- ) -> Union[ConfigurationEntry, FilesystemEntry]:
113
+ def _convert_entry(self, file_entry: FilesystemEntry, *args, **kwargs) -> ConfigurationEntry:
114
114
  """Creates a :class:`ConfigurationEntry` from a ``file_entry``.
115
115
 
116
116
  If an error occurs during the parsing of the file contents,
117
117
  the original ``file_entry`` is returned.
118
118
  """
119
119
  entry = file_entry
120
+ config_parser = None
120
121
  try:
121
122
  config_parser = parse(entry, *args, **kwargs)
122
- entry = ConfigurationEntry(self, entry.path, entry, config_parser)
123
123
  except ConfigurationParsingError as e:
124
124
  # If a parsing error gets created, it should return the `entry`
125
125
  log.debug("Error when parsing %s with message '%s'", entry.path, e)
126
126
 
127
- return entry
127
+ return ConfigurationEntry(self, entry.path, entry, config_parser)
128
128
 
129
129
 
130
130
  class ConfigurationEntry(FilesystemEntry):
@@ -163,10 +163,10 @@ class ConfigurationEntry(FilesystemEntry):
163
163
 
164
164
  def __init__(
165
165
  self,
166
- fs: Filesystem,
166
+ fs: ConfigurationFilesystem,
167
167
  path: str,
168
168
  entry: FilesystemEntry,
169
- parser_items: Optional[Union[dict, ConfigurationParser, str, list]] = None,
169
+ parser_items: dict | ConfigurationParser | str | list | None = None,
170
170
  ) -> None:
171
171
  super().__init__(fs, path, entry)
172
172
  self.parser_items = parser_items
@@ -182,7 +182,7 @@ class ConfigurationEntry(FilesystemEntry):
182
182
 
183
183
  return f"<{self.__class__.__name__} {output}"
184
184
 
185
- def get(self, key, default: Optional[Any] = None) -> Union[ConfigurationEntry, Any, None]:
185
+ def get(self, key, default: Any | None = None) -> ConfigurationEntry | Any | None:
186
186
  """Gets the dictionary key that belongs to this entry using ``key``.
187
187
  Behaves like ``dictionary.get()``.
188
188
 
@@ -197,13 +197,19 @@ class ConfigurationEntry(FilesystemEntry):
197
197
  if not key:
198
198
  raise TypeError("key should be defined")
199
199
 
200
- if key in self.parser_items:
200
+ path = fsutil.join(self.path, key, alt_separator=self.fs.alt_separator)
201
+
202
+ if self.parser_items and key in self.parser_items:
201
203
  return ConfigurationEntry(
202
204
  self.fs,
203
- fsutil.join(self.path, key, alt_separator=self.fs.alt_separator),
205
+ path,
204
206
  self.entry,
205
207
  self.parser_items[key],
206
208
  )
209
+
210
+ if self.entry.is_dir():
211
+ return self.fs.get(path, self.entry)
212
+
207
213
  return default
208
214
 
209
215
  def _write_value_mapping(self, values: dict[str, Any], indentation_nr: int = 0) -> str:
@@ -257,6 +263,11 @@ class ConfigurationEntry(FilesystemEntry):
257
263
  if self.is_file():
258
264
  raise NotADirectoryError()
259
265
 
266
+ if self.parser_items is None and self.entry.is_dir():
267
+ for entry in self.entry.scandir():
268
+ yield ConfigurationEntry(self.fs, entry.name, entry, None)
269
+ return
270
+
260
271
  for key, values in self.parser_items.items():
261
272
  yield ConfigurationEntry(self.fs, key, self.entry, values)
262
273
 
@@ -266,7 +277,7 @@ class ConfigurationEntry(FilesystemEntry):
266
277
  def is_dir(self, follow_symlinks: bool = True) -> bool:
267
278
  """Returns whether this :class:`ConfigurationEntry` can be considered a directory."""
268
279
  # if self.parser_items has keys (thus sub-values), we can consider it a directory.
269
- return hasattr(self.parser_items, "keys")
280
+ return (self.parser_items is None and self.entry.is_dir()) or hasattr(self.parser_items, "keys")
270
281
 
271
282
  def is_symlink(self) -> bool:
272
283
  """Return whether this :class:`ConfigurationEntry` is a symlink or not.
@@ -284,7 +295,7 @@ class ConfigurationEntry(FilesystemEntry):
284
295
  Returns:
285
296
  Whether the ``entry`` and ``key`` exists
286
297
  """
287
- return self.entry.exists() and key in self.parser_items
298
+ return self.parser_items and self.entry.exists() and key in self.parser_items
288
299
 
289
300
  def stat(self, follow_symlinks: bool = True) -> fsutil.stat_result:
290
301
  """Returns the stat from the underlying :class:`.FilesystemEntry` :attr:`entry`."""
@@ -134,6 +134,10 @@ class ExtFilesystemEntry(FilesystemEntry):
134
134
  st_info.st_mtime_ns = self.entry.mtime_ns
135
135
  st_info.st_ctime_ns = self.entry.ctime_ns
136
136
 
137
+ # Set blocks
138
+ st_info.st_blocks = self.entry.inode.i_blocks_lo
139
+ st_info.st_blksize = self.entry.extfs.block_size
140
+
137
141
  return st_info
138
142
 
139
143
  def attr(self) -> Any:
@@ -94,7 +94,7 @@ class ITunesFilesystemEntry(VirtualFile):
94
94
  def readlink_ext(self) -> FilesystemEntry:
95
95
  """Read the link if this entry is a symlink. Returns a filesystem entry."""
96
96
  # Can't use the one in VirtualFile as it overrides the FilesystemEntry
97
- return fsutil.resolve_link(fs=self.fs, entry=self)
97
+ return fsutil.resolve_link(self.fs, self.readlink(), self.path, alt_separator=self.fs.alt_separator)
98
98
 
99
99
  def stat(self, follow_symlinks: bool = True) -> fsutil.stat_result:
100
100
  """Return the stat information of this entry."""
@@ -121,7 +121,7 @@ class TarFilesystemEntry(VirtualFile):
121
121
  def readlink_ext(self) -> FilesystemEntry:
122
122
  """Read the link if this entry is a symlink. Returns a filesystem entry."""
123
123
  # Can't use the one in VirtualFile as it overrides the FilesystemEntry
124
- return fsutil.resolve_link(fs=self.fs, entry=self)
124
+ return fsutil.resolve_link(self.fs, self.readlink(), self.path, alt_separator=self.fs.alt_separator)
125
125
 
126
126
  def stat(self, follow_symlinks: bool = True) -> fsutil.stat_result:
127
127
  """Return the stat information of this entry."""
@@ -0,0 +1,171 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+ import stat
5
+ import zipfile
6
+ from datetime import datetime, timezone
7
+ from typing import BinaryIO, Iterator
8
+
9
+ from dissect.util.stream import BufferedStream
10
+
11
+ from dissect.target.exceptions import (
12
+ FileNotFoundError,
13
+ FilesystemError,
14
+ IsADirectoryError,
15
+ NotADirectoryError,
16
+ NotASymlinkError,
17
+ )
18
+ from dissect.target.filesystem import (
19
+ Filesystem,
20
+ FilesystemEntry,
21
+ VirtualDirectory,
22
+ VirtualFilesystem,
23
+ )
24
+ from dissect.target.helpers import fsutil
25
+
26
+ log = logging.getLogger(__name__)
27
+
28
+
29
+ class ZipFilesystem(Filesystem):
30
+ """Filesystem implementation for zip files.
31
+
32
+ Python does not have symlink support in the zipfile module, so that's not currently supported.
33
+ See https://github.com/python/cpython/issues/82102 for more information.
34
+ """
35
+
36
+ __type__ = "zip"
37
+
38
+ def __init__(
39
+ self,
40
+ fh: BinaryIO,
41
+ base: str | None = None,
42
+ *args,
43
+ **kwargs,
44
+ ):
45
+ super().__init__(fh, *args, **kwargs)
46
+
47
+ fh.seek(0)
48
+
49
+ self.zip = zipfile.ZipFile(fh, mode="r")
50
+ self.base = base or ""
51
+
52
+ self._fs = VirtualFilesystem(alt_separator=self.alt_separator, case_sensitive=self.case_sensitive)
53
+
54
+ for member in self.zip.infolist():
55
+ mname = member.filename.strip("/")
56
+ if not mname.startswith(self.base) or mname == ".":
57
+ continue
58
+
59
+ rel_name = fsutil.normpath(mname[len(self.base) :], alt_separator=self.alt_separator)
60
+ self._fs.map_file_entry(rel_name, ZipFilesystemEntry(self, rel_name, member))
61
+
62
+ @staticmethod
63
+ def _detect(fh: BinaryIO) -> bool:
64
+ """Detect a zip file on a given file-like object."""
65
+ return zipfile.is_zipfile(fh)
66
+
67
+ def get(self, path: str, relentry: FilesystemEntry = None) -> FilesystemEntry:
68
+ """Returns a ZipFilesystemEntry object corresponding to the given path."""
69
+ return self._fs.get(path, relentry=relentry)
70
+
71
+
72
+ # Note: We subclass from VirtualDirectory because VirtualFilesystem is currently only compatible with VirtualDirectory
73
+ # Subclass from VirtualDirectory so we get that compatibility for free, and override the rest to do our own thing
74
+ class ZipFilesystemEntry(VirtualDirectory):
75
+ fs: ZipFilesystem
76
+ entry: zipfile.ZipInfo
77
+
78
+ def __init__(self, fs: ZipFilesystem, path: str, entry: zipfile.ZipInfo):
79
+ super().__init__(fs, path)
80
+ self.entry = entry
81
+
82
+ def open(self) -> BinaryIO:
83
+ if self.is_dir():
84
+ raise IsADirectoryError(self.path)
85
+
86
+ if self.is_symlink():
87
+ return self._resolve().open()
88
+
89
+ try:
90
+ return BufferedStream(self.fs.zip.open(self.entry), size=self.entry.file_size)
91
+ except Exception:
92
+ raise FileNotFoundError(self.path)
93
+
94
+ def iterdir(self) -> Iterator[str]:
95
+ if not self.is_dir():
96
+ raise NotADirectoryError(self.path)
97
+
98
+ entry = self._resolve()
99
+ if isinstance(entry, ZipFilesystemEntry):
100
+ yield from super(ZipFilesystemEntry, entry).iterdir()
101
+ else:
102
+ yield from entry.iterdir()
103
+
104
+ def scandir(self) -> Iterator[FilesystemEntry]:
105
+ if not self.is_dir():
106
+ raise NotADirectoryError(self.path)
107
+
108
+ entry = self._resolve()
109
+ if isinstance(entry, ZipFilesystemEntry):
110
+ yield from super(ZipFilesystemEntry, entry).scandir()
111
+ else:
112
+ yield from entry.scandir()
113
+
114
+ def is_dir(self, follow_symlinks: bool = True) -> bool:
115
+ try:
116
+ entry = self._resolve(follow_symlinks=follow_symlinks)
117
+ except FilesystemError:
118
+ return False
119
+
120
+ if isinstance(entry, ZipFilesystemEntry):
121
+ return entry.entry.is_dir()
122
+ return isinstance(entry, VirtualDirectory)
123
+
124
+ def is_file(self, follow_symlinks: bool = True) -> bool:
125
+ try:
126
+ entry = self._resolve(follow_symlinks=follow_symlinks)
127
+ except FilesystemError:
128
+ return False
129
+
130
+ if isinstance(entry, ZipFilesystemEntry):
131
+ return not entry.entry.is_dir()
132
+ return False
133
+
134
+ def is_symlink(self) -> bool:
135
+ return stat.S_ISLNK(self.entry.external_attr >> 16)
136
+
137
+ def readlink(self) -> str:
138
+ if not self.is_symlink():
139
+ raise NotASymlinkError()
140
+ return self.fs.zip.open(self.entry).read().decode()
141
+
142
+ def readlink_ext(self) -> FilesystemEntry:
143
+ return FilesystemEntry.readlink_ext(self)
144
+
145
+ def stat(self, follow_symlinks: bool = True) -> fsutil.stat_result:
146
+ return self._resolve(follow_symlinks=follow_symlinks).lstat()
147
+
148
+ def lstat(self) -> fsutil.stat_result:
149
+ """Return the stat information of the given path, without resolving links."""
150
+ # ['mode', 'addr', 'dev', 'nlink', 'uid', 'gid', 'size', 'atime', 'mtime', 'ctime']
151
+ mode = self.entry.external_attr >> 16
152
+
153
+ if self.entry.is_dir() and not stat.S_ISDIR(mode):
154
+ mode = stat.S_IFDIR | mode
155
+ elif not self.entry.is_dir() and not stat.S_ISREG(mode):
156
+ mode = stat.S_IFREG | mode
157
+
158
+ return fsutil.stat_result(
159
+ [
160
+ mode,
161
+ self.entry.header_offset,
162
+ id(self.fs),
163
+ 1,
164
+ 0,
165
+ 0,
166
+ self.entry.file_size,
167
+ 0,
168
+ datetime(*self.entry.date_time, tzinfo=timezone.utc).timestamp(),
169
+ 0,
170
+ ]
171
+ )
@@ -1,27 +1,35 @@
1
+ from __future__ import annotations
2
+
1
3
  import ast
2
4
  import importlib.machinery
3
5
  import importlib.util
4
6
  import logging
5
7
  from pathlib import Path
6
8
  from types import ModuleType
7
- from typing import Optional, Union
8
9
 
9
10
  log = logging.getLogger(__name__)
10
11
 
11
12
  CONFIG_NAME = ".targetcfg.py"
12
13
 
13
14
 
14
- def load(path: Optional[Union[Path, str]]) -> ModuleType:
15
+ def load(paths: list[Path | str] | Path | str | None) -> ModuleType:
16
+ """Attempt to load one configuration from the provided path(s)."""
17
+
18
+ if isinstance(paths, Path) or isinstance(paths, str):
19
+ paths = [paths]
20
+
15
21
  config_spec = importlib.machinery.ModuleSpec("config", None)
16
22
  config = importlib.util.module_from_spec(config_spec)
17
- config_file = _find_config_file(path)
23
+ config_file = _find_config_file(paths)
24
+
18
25
  if config_file:
19
26
  config_values = _parse_ast(config_file.read_bytes())
20
27
  config.__dict__.update(config_values)
28
+
21
29
  return config
22
30
 
23
31
 
24
- def _parse_ast(code: str) -> dict[str, Union[str, int]]:
32
+ def _parse_ast(code: str) -> dict[str, str | int]:
25
33
  # Only allow basic value assignments for backwards compatibility
26
34
  obj = {}
27
35
 
@@ -49,15 +57,19 @@ def _parse_ast(code: str) -> dict[str, Union[str, int]]:
49
57
  return obj
50
58
 
51
59
 
52
- def _find_config_file(path: Optional[Union[Path, str]]) -> Optional[Path]:
53
- """Find a config file anywhere in the given path and return it.
60
+ def _find_config_file(paths: list[Path | str] | None) -> Path | None:
61
+ """Find a config file anywhere in the given path(s) and return it.
54
62
 
55
63
  This algorithm allows parts of the path to not exist or the last part to be a filename.
56
64
  It also does not look in the root directory ('/') for config files.
57
65
  """
58
66
 
67
+ if not paths:
68
+ return
69
+
59
70
  config_file = None
60
- if path:
71
+
72
+ for path in paths:
61
73
  path = Path(path)
62
74
  cur_path = path.absolute()
63
75
 
@@ -69,4 +81,7 @@ def _find_config_file(path: Optional[Union[Path, str]]) -> Optional[Path]:
69
81
  config_file = cur_config
70
82
  cur_path = cur_path.parent
71
83
 
84
+ if config_file:
85
+ break
86
+
72
87
  return config_file