dissect.target 3.20.dev5__tar.gz → 3.20.dev6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (630) hide show
  1. {dissect_target-3.20.dev5/dissect.target.egg-info → dissect_target-3.20.dev6}/PKG-INFO +1 -1
  2. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loader.py +0 -1
  3. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/mqtt.py +93 -11
  4. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/tools/query.py +0 -3
  5. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/tools/utils.py +0 -4
  6. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6/dissect.target.egg-info}/PKG-INFO +1 -1
  7. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect.target.egg-info/SOURCES.txt +0 -2
  8. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/loaders/test_mqtt.py +36 -23
  9. dissect_target-3.20.dev5/dissect/target/helpers/targetd.py +0 -58
  10. dissect_target-3.20.dev5/dissect/target/loaders/targetd.py +0 -223
  11. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/COPYRIGHT +0 -0
  12. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/LICENSE +0 -0
  13. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/MANIFEST.in +0 -0
  14. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/README.md +0 -0
  15. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/__init__.py +0 -0
  16. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/container.py +0 -0
  17. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/containers/__init__.py +0 -0
  18. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/containers/asdf.py +0 -0
  19. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/containers/ewf.py +0 -0
  20. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/containers/fortifw.py +0 -0
  21. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/containers/hdd.py +0 -0
  22. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/containers/hds.py +0 -0
  23. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/containers/qcow2.py +0 -0
  24. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/containers/raw.py +0 -0
  25. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/containers/split.py +0 -0
  26. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/containers/vdi.py +0 -0
  27. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/containers/vhd.py +0 -0
  28. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/containers/vhdx.py +0 -0
  29. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/containers/vmdk.py +0 -0
  30. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/data/autocompletion/target_bash_completion.sh +0 -0
  31. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/exceptions.py +0 -0
  32. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/filesystem.py +0 -0
  33. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/filesystems/__init__.py +0 -0
  34. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/filesystems/ad1.py +0 -0
  35. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/filesystems/btrfs.py +0 -0
  36. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/filesystems/cb.py +0 -0
  37. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/filesystems/config.py +0 -0
  38. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/filesystems/cpio.py +0 -0
  39. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/filesystems/dir.py +0 -0
  40. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/filesystems/exfat.py +0 -0
  41. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/filesystems/extfs.py +0 -0
  42. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/filesystems/fat.py +0 -0
  43. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/filesystems/ffs.py +0 -0
  44. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/filesystems/itunes.py +0 -0
  45. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/filesystems/jffs.py +0 -0
  46. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/filesystems/ntfs.py +0 -0
  47. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/filesystems/overlay.py +0 -0
  48. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/filesystems/smb.py +0 -0
  49. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/filesystems/squashfs.py +0 -0
  50. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/filesystems/tar.py +0 -0
  51. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/filesystems/vmfs.py +0 -0
  52. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/filesystems/vmtar.py +0 -0
  53. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/filesystems/xfs.py +0 -0
  54. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/filesystems/zip.py +0 -0
  55. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/__init__.py +0 -0
  56. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/cache.py +0 -0
  57. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/compat/__init__.py +0 -0
  58. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/compat/path_310.py +0 -0
  59. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/compat/path_311.py +0 -0
  60. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/compat/path_312.py +0 -0
  61. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/compat/path_39.py +0 -0
  62. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/compat/path_common.py +0 -0
  63. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/config.py +0 -0
  64. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/configutil.py +0 -0
  65. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/cyber.py +0 -0
  66. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/data/windowsZones.xml +0 -0
  67. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/descriptor_extensions.py +0 -0
  68. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/docs.py +0 -0
  69. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/fsutil.py +0 -0
  70. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/hashutil.py +0 -0
  71. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/keychain.py +0 -0
  72. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/lazy.py +0 -0
  73. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/loaderutil.py +0 -0
  74. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/localeutil.py +0 -0
  75. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/mount.py +0 -0
  76. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/mui.py +0 -0
  77. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/network_managers.py +0 -0
  78. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/polypath.py +0 -0
  79. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/protobuf.py +0 -0
  80. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/record.py +0 -0
  81. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/record_modifier.py +0 -0
  82. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/regutil.py +0 -0
  83. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/shell_application_ids.py +0 -0
  84. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/shell_folder_ids.py +0 -0
  85. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/helpers/utils.py +0 -0
  86. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/__init__.py +0 -0
  87. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/ab.py +0 -0
  88. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/ad1.py +0 -0
  89. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/asdf.py +0 -0
  90. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/cb.py +0 -0
  91. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/cyber.py +0 -0
  92. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/dir.py +0 -0
  93. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/hyperv.py +0 -0
  94. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/itunes.py +0 -0
  95. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/kape.py +0 -0
  96. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/libvirt.py +0 -0
  97. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/local.py +0 -0
  98. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/log.py +0 -0
  99. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/multiraw.py +0 -0
  100. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/ova.py +0 -0
  101. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/overlay.py +0 -0
  102. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/ovf.py +0 -0
  103. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/phobos.py +0 -0
  104. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/profile.py +0 -0
  105. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/pvm.py +0 -0
  106. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/pvs.py +0 -0
  107. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/raw.py +0 -0
  108. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/remote.py +0 -0
  109. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/res.py +0 -0
  110. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/smb.py +0 -0
  111. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/tanium.py +0 -0
  112. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/tar.py +0 -0
  113. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/target.py +0 -0
  114. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/utm.py +0 -0
  115. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/vb.py +0 -0
  116. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/vbox.py +0 -0
  117. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/velociraptor.py +0 -0
  118. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/vma.py +0 -0
  119. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/vmwarevm.py +0 -0
  120. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/vmx.py +0 -0
  121. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/loaders/xva.py +0 -0
  122. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugin.py +0 -0
  123. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/__init__.py +0 -0
  124. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/__init__.py +0 -0
  125. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/av/__init__.py +0 -0
  126. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/av/mcafee.py +0 -0
  127. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/av/sophos.py +0 -0
  128. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/av/symantec.py +0 -0
  129. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/av/trendmicro.py +0 -0
  130. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/browser/__init__.py +0 -0
  131. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/browser/brave.py +0 -0
  132. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/browser/browser.py +0 -0
  133. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/browser/chrome.py +0 -0
  134. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/browser/chromium.py +0 -0
  135. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/browser/edge.py +0 -0
  136. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/browser/firefox.py +0 -0
  137. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/browser/iexplore.py +0 -0
  138. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/container/__init__.py +0 -0
  139. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/container/docker.py +0 -0
  140. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/remoteaccess/__init__.py +0 -0
  141. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/remoteaccess/anydesk.py +0 -0
  142. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/remoteaccess/remoteaccess.py +0 -0
  143. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/remoteaccess/teamviewer.py +0 -0
  144. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/shell/__init__.py +0 -0
  145. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/shell/powershell.py +0 -0
  146. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/ssh/__init__.py +0 -0
  147. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/ssh/openssh.py +0 -0
  148. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/ssh/opensshd.py +0 -0
  149. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/ssh/putty.py +0 -0
  150. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/ssh/ssh.py +0 -0
  151. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/texteditor/__init__.py +0 -0
  152. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/texteditor/texteditor.py +0 -0
  153. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/texteditor/windowsnotepad.py +0 -0
  154. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/vpn/__init__.py +0 -0
  155. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/vpn/openvpn.py +0 -0
  156. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/vpn/wireguard.py +0 -0
  157. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/webhosting/__init__.py +0 -0
  158. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/webhosting/cpanel.py +0 -0
  159. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/webserver/__init__.py +0 -0
  160. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/webserver/apache.py +0 -0
  161. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/webserver/caddy.py +0 -0
  162. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/webserver/citrix.py +0 -0
  163. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/webserver/iis.py +0 -0
  164. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/webserver/nginx.py +0 -0
  165. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/apps/webserver/webserver.py +0 -0
  166. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/child/__init__.py +0 -0
  167. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/child/docker.py +0 -0
  168. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/child/esxi.py +0 -0
  169. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/child/hyperv.py +0 -0
  170. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/child/qemu.py +0 -0
  171. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/child/virtuozzo.py +0 -0
  172. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/child/vmware_workstation.py +0 -0
  173. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/child/wsl.py +0 -0
  174. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/filesystem/__init__.py +0 -0
  175. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/filesystem/acquire_handles.py +0 -0
  176. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/filesystem/acquire_hash.py +0 -0
  177. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/filesystem/icat.py +0 -0
  178. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/filesystem/ntfs/__init__.py +0 -0
  179. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/filesystem/ntfs/mft.py +0 -0
  180. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/filesystem/ntfs/mft_timeline.py +0 -0
  181. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/filesystem/ntfs/usnjrnl.py +0 -0
  182. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/filesystem/ntfs/utils.py +0 -0
  183. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/filesystem/resolver.py +0 -0
  184. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/filesystem/unix/__init__.py +0 -0
  185. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/filesystem/unix/capability.py +0 -0
  186. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/filesystem/unix/suid.py +0 -0
  187. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/filesystem/walkfs.py +0 -0
  188. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/filesystem/yara.py +0 -0
  189. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/general/__init__.py +0 -0
  190. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/general/config.py +0 -0
  191. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/general/default.py +0 -0
  192. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/general/example.py +0 -0
  193. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/general/loaders.py +0 -0
  194. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/general/network.py +0 -0
  195. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/general/osinfo.py +0 -0
  196. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/general/plugins.py +0 -0
  197. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/general/scrape.py +0 -0
  198. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/general/users.py +0 -0
  199. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/__init__.py +0 -0
  200. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/__init__.py +0 -0
  201. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/_os.py +0 -0
  202. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/bsd/__init__.py +0 -0
  203. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/bsd/_os.py +0 -0
  204. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/bsd/citrix/__init__.py +0 -0
  205. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/bsd/citrix/_os.py +0 -0
  206. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/bsd/citrix/history.py +0 -0
  207. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/bsd/freebsd/__init__.py +0 -0
  208. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/bsd/freebsd/_os.py +0 -0
  209. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/bsd/ios/__init__.py +0 -0
  210. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/bsd/ios/_os.py +0 -0
  211. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/bsd/openbsd/__init__.py +0 -0
  212. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/bsd/openbsd/_os.py +0 -0
  213. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/bsd/osx/__init__.py +0 -0
  214. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/bsd/osx/_os.py +0 -0
  215. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/bsd/osx/user.py +0 -0
  216. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/cronjobs.py +0 -0
  217. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/datetime.py +0 -0
  218. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/esxi/__init__.py +0 -0
  219. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/esxi/_os.py +0 -0
  220. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/etc/__init__.py +0 -0
  221. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/etc/etc.py +0 -0
  222. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/etc.py +0 -0
  223. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/generic.py +0 -0
  224. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/history.py +0 -0
  225. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/__init__.py +0 -0
  226. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/_os.py +0 -0
  227. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/android/__init__.py +0 -0
  228. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/android/_os.py +0 -0
  229. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/cmdline.py +0 -0
  230. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/debian/__init__.py +0 -0
  231. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/debian/_os.py +0 -0
  232. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/debian/apt.py +0 -0
  233. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/debian/dpkg.py +0 -0
  234. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/debian/vyos/__init__.py +0 -0
  235. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/debian/vyos/_os.py +0 -0
  236. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/environ.py +0 -0
  237. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/fortios/__init__.py +0 -0
  238. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/fortios/_keys.py +0 -0
  239. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/fortios/_os.py +0 -0
  240. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/fortios/generic.py +0 -0
  241. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/fortios/locale.py +0 -0
  242. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/iptables.py +0 -0
  243. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/modules.py +0 -0
  244. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/netstat.py +0 -0
  245. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/proc.py +0 -0
  246. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/processes.py +0 -0
  247. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/redhat/__init__.py +0 -0
  248. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/redhat/_os.py +0 -0
  249. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/redhat/yum.py +0 -0
  250. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/services.py +0 -0
  251. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/sockets.py +0 -0
  252. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/suse/__init__.py +0 -0
  253. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/suse/_os.py +0 -0
  254. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/linux/suse/zypper.py +0 -0
  255. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/locale.py +0 -0
  256. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/locate/__init__.py +0 -0
  257. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/locate/gnulocate.py +0 -0
  258. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/locate/locate.py +0 -0
  259. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/locate/mlocate.py +0 -0
  260. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/locate/plocate.py +0 -0
  261. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/log/__init__.py +0 -0
  262. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/log/atop.py +0 -0
  263. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/log/audit.py +0 -0
  264. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/log/auth.py +0 -0
  265. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/log/journal.py +0 -0
  266. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/log/lastlog.py +0 -0
  267. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/log/messages.py +0 -0
  268. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/log/utmp.py +0 -0
  269. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/packagemanager.py +0 -0
  270. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/unix/shadow.py +0 -0
  271. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/__init__.py +0 -0
  272. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/_os.py +0 -0
  273. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/activitiescache.py +0 -0
  274. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/adpolicy.py +0 -0
  275. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/amcache.py +0 -0
  276. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/catroot.py +0 -0
  277. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/cim.py +0 -0
  278. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/clfs.py +0 -0
  279. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/credential/__init__.py +0 -0
  280. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/credential/credhist.py +0 -0
  281. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/credential/lsa.py +0 -0
  282. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/credential/sam.py +0 -0
  283. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/datetime.py +0 -0
  284. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/defender.py +0 -0
  285. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/defender_helpers/__init__.py +0 -0
  286. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/defender_helpers/defender_patterns.py +0 -0
  287. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/defender_helpers/defender_records.py +0 -0
  288. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/dpapi/__init__.py +0 -0
  289. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/dpapi/blob.py +0 -0
  290. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/dpapi/crypto.py +0 -0
  291. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/dpapi/dpapi.py +0 -0
  292. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/dpapi/keyprovider/__init__.py +0 -0
  293. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/dpapi/keyprovider/credhist.py +0 -0
  294. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/dpapi/keyprovider/empty.py +0 -0
  295. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/dpapi/keyprovider/keychain.py +0 -0
  296. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/dpapi/keyprovider/keyprovider.py +0 -0
  297. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/dpapi/keyprovider/lsa.py +0 -0
  298. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/dpapi/master_key.py +0 -0
  299. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/env.py +0 -0
  300. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/exchange/__init__.py +0 -0
  301. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/exchange/exchange.py +0 -0
  302. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/generic.py +0 -0
  303. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/jumplist.py +0 -0
  304. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/lnk.py +0 -0
  305. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/locale.py +0 -0
  306. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/log/__init__.py +0 -0
  307. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/log/amcache.py +0 -0
  308. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/log/etl.py +0 -0
  309. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/log/evt.py +0 -0
  310. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/log/evtx.py +0 -0
  311. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/log/pfro.py +0 -0
  312. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/log/schedlgu.py +0 -0
  313. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/network.py +0 -0
  314. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/notifications.py +0 -0
  315. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/prefetch.py +0 -0
  316. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/recyclebin.py +0 -0
  317. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/regf/7zip.py +0 -0
  318. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/regf/__init__.py +0 -0
  319. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/regf/appxdebugkeys.py +0 -0
  320. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/regf/auditpol.py +0 -0
  321. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/regf/bam.py +0 -0
  322. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/regf/cit.py +0 -0
  323. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/regf/clsid.py +0 -0
  324. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/regf/firewall.py +0 -0
  325. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/regf/mru.py +0 -0
  326. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/regf/muicache.py +0 -0
  327. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/regf/nethist.py +0 -0
  328. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/regf/recentfilecache.py +0 -0
  329. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/regf/regf.py +0 -0
  330. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/regf/runkeys.py +0 -0
  331. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/regf/shellbags.py +0 -0
  332. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/regf/shimcache.py +0 -0
  333. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/regf/trusteddocs.py +0 -0
  334. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/regf/usb.py +0 -0
  335. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/regf/userassist.py +0 -0
  336. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/registry.py +0 -0
  337. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/services.py +0 -0
  338. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/sru.py +0 -0
  339. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/startupinfo.py +0 -0
  340. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/syscache.py +0 -0
  341. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/task_helpers/__init__.py +0 -0
  342. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/task_helpers/tasks_job.py +0 -0
  343. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/task_helpers/tasks_records.py +0 -0
  344. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/task_helpers/tasks_xml.py +0 -0
  345. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/tasks.py +0 -0
  346. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/thumbcache.py +0 -0
  347. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/ual.py +0 -0
  348. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/wer.py +0 -0
  349. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/plugins/os/windows/wua_history.py +0 -0
  350. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/report.py +0 -0
  351. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/target.py +0 -0
  352. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/tools/__init__.py +0 -0
  353. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/tools/build_pluginlist.py +0 -0
  354. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/tools/dd.py +0 -0
  355. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/tools/dump/__init__.py +0 -0
  356. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/tools/dump/run.py +0 -0
  357. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/tools/dump/state.py +0 -0
  358. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/tools/dump/utils.py +0 -0
  359. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/tools/fs.py +0 -0
  360. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/tools/fsutils.py +0 -0
  361. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/tools/info.py +0 -0
  362. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/tools/logging.py +0 -0
  363. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/tools/mount.py +0 -0
  364. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/tools/reg.py +0 -0
  365. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/tools/shell.py +0 -0
  366. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/tools/yara.py +0 -0
  367. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/volume.py +0 -0
  368. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/volumes/__init__.py +0 -0
  369. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/volumes/bde.py +0 -0
  370. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/volumes/ddf.py +0 -0
  371. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/volumes/disk.py +0 -0
  372. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/volumes/luks.py +0 -0
  373. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/volumes/lvm.py +0 -0
  374. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/volumes/md.py +0 -0
  375. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect/target/volumes/vmfs.py +0 -0
  376. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect.target.egg-info/dependency_links.txt +0 -0
  377. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect.target.egg-info/entry_points.txt +0 -0
  378. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect.target.egg-info/requires.txt +0 -0
  379. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/dissect.target.egg-info/top_level.txt +0 -0
  380. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/pyproject.toml +0 -0
  381. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/setup.cfg +0 -0
  382. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/__init__.py +0 -0
  383. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/_docs/Makefile +0 -0
  384. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/_docs/conf.py +0 -0
  385. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/_docs/index.rst +0 -0
  386. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/_utils.py +0 -0
  387. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/conftest.py +0 -0
  388. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/containers/__init__.py +0 -0
  389. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/containers/test_fortifw.py +0 -0
  390. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/containers/test_split.py +0 -0
  391. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/filesystems/__init__.py +0 -0
  392. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/filesystems/test_btrfs.py +0 -0
  393. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/filesystems/test_cb.py +0 -0
  394. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/filesystems/test_config.py +0 -0
  395. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/filesystems/test_cpio.py +0 -0
  396. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/filesystems/test_dir.py +0 -0
  397. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/filesystems/test_exfat.py +0 -0
  398. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/filesystems/test_fat.py +0 -0
  399. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/filesystems/test_ntfs.py +0 -0
  400. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/filesystems/test_overlay.py +0 -0
  401. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/filesystems/test_smb.py +0 -0
  402. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/filesystems/test_tar.py +0 -0
  403. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/filesystems/test_vmtar.py +0 -0
  404. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/filesystems/test_zip.py +0 -0
  405. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/helpers/__init__.py +0 -0
  406. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/helpers/test_cache.py +0 -0
  407. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/helpers/test_config.py +0 -0
  408. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/helpers/test_configutil.py +0 -0
  409. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/helpers/test_docs.py +0 -0
  410. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/helpers/test_fsutil.py +0 -0
  411. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/helpers/test_hashutil.py +0 -0
  412. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/helpers/test_keychain.py +0 -0
  413. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/helpers/test_loaderutil.py +0 -0
  414. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/helpers/test_localeutil.py +0 -0
  415. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/helpers/test_modifier.py +0 -0
  416. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/helpers/test_protobuf.py +0 -0
  417. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/helpers/test_record.py +0 -0
  418. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/helpers/test_regutil.py +0 -0
  419. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/helpers/test_utils.py +0 -0
  420. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/loaders/__init__.py +0 -0
  421. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/loaders/test_ab.py +0 -0
  422. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/loaders/test_asdf.py +0 -0
  423. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/loaders/test_cb.py +0 -0
  424. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/loaders/test_dir.py +0 -0
  425. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/loaders/test_hyperv.py +0 -0
  426. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/loaders/test_kape.py +0 -0
  427. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/loaders/test_libvirt.py +0 -0
  428. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/loaders/test_local.py +0 -0
  429. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/loaders/test_log.py +0 -0
  430. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/loaders/test_multiraw.py +0 -0
  431. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/loaders/test_ova.py +0 -0
  432. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/loaders/test_overlay.py +0 -0
  433. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/loaders/test_ovf.py +0 -0
  434. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/loaders/test_phobos.py +0 -0
  435. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/loaders/test_pvm.py +0 -0
  436. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/loaders/test_pvs.py +0 -0
  437. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/loaders/test_remote.py +0 -0
  438. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/loaders/test_smb.py +0 -0
  439. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/loaders/test_tanium.py +0 -0
  440. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/loaders/test_tar.py +0 -0
  441. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/loaders/test_utm.py +0 -0
  442. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/loaders/test_vbox.py +0 -0
  443. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/loaders/test_velociraptor.py +0 -0
  444. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/loaders/test_vmwarevm.py +0 -0
  445. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/__init__.py +0 -0
  446. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/__init__.py +0 -0
  447. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/av/__init__.py +0 -0
  448. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/av/test_mcafee.py +0 -0
  449. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/av/test_sophos.py +0 -0
  450. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/av/test_symantec.py +0 -0
  451. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/av/test_trendmicro.py +0 -0
  452. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/browser/__init__.py +0 -0
  453. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/browser/test_brave.py +0 -0
  454. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/browser/test_chrome.py +0 -0
  455. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/browser/test_chromium.py +0 -0
  456. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/browser/test_edge.py +0 -0
  457. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/browser/test_firefox.py +0 -0
  458. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/browser/test_iexplore.py +0 -0
  459. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/container/__init__.py +0 -0
  460. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/container/test_docker.py +0 -0
  461. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/remoteaccess/__init__.py +0 -0
  462. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/remoteaccess/test_anydesk.py +0 -0
  463. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/remoteaccess/test_teamviewer.py +0 -0
  464. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/shell/__init__.py +0 -0
  465. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/shell/test_powershell.py +0 -0
  466. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/ssh/__init__.py +0 -0
  467. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/ssh/test_openssh.py +0 -0
  468. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/ssh/test_opensshd.py +0 -0
  469. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/ssh/test_putty.py +0 -0
  470. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/texteditor/__init__.py +0 -0
  471. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/texteditor/test_texteditor.py +0 -0
  472. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/vpn/__init__.py +0 -0
  473. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/vpn/test_openvpn.py +0 -0
  474. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/vpn/test_wireguard.py +0 -0
  475. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/webhosting/__init__.py +0 -0
  476. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/webhosting/test_cpanel.py +0 -0
  477. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/webserver/__init__.py +0 -0
  478. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/webserver/test_apache.py +0 -0
  479. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/webserver/test_caddy.py +0 -0
  480. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/webserver/test_citrix.py +0 -0
  481. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/webserver/test_iis.py +0 -0
  482. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/webserver/test_nginx.py +0 -0
  483. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/apps/webserver/test_webserver.py +0 -0
  484. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/child/__init__.py +0 -0
  485. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/child/test_docker.py +0 -0
  486. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/child/test_hyperv.py +0 -0
  487. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/child/test_qemu.py +0 -0
  488. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/child/test_virtuozzo.py +0 -0
  489. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/child/test_wsl.py +0 -0
  490. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/filesystem/__init__.py +0 -0
  491. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/filesystem/ntfs/__init__.py +0 -0
  492. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/filesystem/ntfs/test_mft.py +0 -0
  493. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/filesystem/ntfs/test_usnjrnl.py +0 -0
  494. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/filesystem/test_acquire_handles.py +0 -0
  495. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/filesystem/test_acquire_hash.py +0 -0
  496. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/filesystem/test_icat.py +0 -0
  497. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/filesystem/test_resolver.py +0 -0
  498. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/filesystem/test_walkfs.py +0 -0
  499. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/filesystem/test_yara.py +0 -0
  500. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/filesystem/unix/__init__.py +0 -0
  501. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/filesystem/unix/test_capability.py +0 -0
  502. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/filesystem/unix/test_suid.py +0 -0
  503. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/general/__init__.py +0 -0
  504. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/general/test_config.py +0 -0
  505. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/general/test_default.py +0 -0
  506. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/general/test_network.py +0 -0
  507. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/general/test_plugins.py +0 -0
  508. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/general/test_scrape.py +0 -0
  509. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/general/test_users.py +0 -0
  510. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/__init__.py +0 -0
  511. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/__init__.py +0 -0
  512. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/bsd/__init__.py +0 -0
  513. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/bsd/citrix/__init__.py +0 -0
  514. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/bsd/citrix/test__os.py +0 -0
  515. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/bsd/citrix/test_history.py +0 -0
  516. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/bsd/osx/__init__.py +0 -0
  517. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/bsd/osx/test__os.py +0 -0
  518. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/bsd/osx/test_user.py +0 -0
  519. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/esxi/__init__.py +0 -0
  520. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/esxi/test__os.py +0 -0
  521. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/linux/__init__.py +0 -0
  522. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/linux/android/__init__.py +0 -0
  523. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/linux/android/test__os.py +0 -0
  524. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/linux/debian/__init__.py +0 -0
  525. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/linux/debian/test_apt.py +0 -0
  526. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/linux/debian/test_dpkg.py +0 -0
  527. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/linux/fortios/test_keys.py +0 -0
  528. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/linux/redhat/__init__.py +0 -0
  529. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/linux/redhat/test_yum.py +0 -0
  530. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/linux/suse/__init__.py +0 -0
  531. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/linux/suse/test_zypper.py +0 -0
  532. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/linux/test__os.py +0 -0
  533. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/linux/test_cmdline.py +0 -0
  534. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/linux/test_environ.py +0 -0
  535. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/linux/test_iptables.py +0 -0
  536. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/linux/test_modules.py +0 -0
  537. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/linux/test_netstat.py +0 -0
  538. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/linux/test_proc.py +0 -0
  539. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/linux/test_processes.py +0 -0
  540. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/linux/test_services.py +0 -0
  541. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/linux/test_sockets.py +0 -0
  542. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/locate/__init__.py +0 -0
  543. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/locate/test_gnulocate.py +0 -0
  544. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/locate/test_mlocate.py +0 -0
  545. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/locate/test_plocate.py +0 -0
  546. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/log/__init__.py +0 -0
  547. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/log/test_atop.py +0 -0
  548. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/log/test_audit.py +0 -0
  549. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/log/test_auth.py +0 -0
  550. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/log/test_lastlog.py +0 -0
  551. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/log/test_messages.py +0 -0
  552. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/log/test_utmp.py +0 -0
  553. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/test__os.py +0 -0
  554. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/test_generic.py +0 -0
  555. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/test_history.py +0 -0
  556. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/test_ips.py +0 -0
  557. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/test_journal.py +0 -0
  558. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/test_locale.py +0 -0
  559. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/test_packagemanager.py +0 -0
  560. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/test_shadow.py +0 -0
  561. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/test_users.py +0 -0
  562. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/unix/test_version.py +0 -0
  563. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/__init__.py +0 -0
  564. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/credential/__init__.py +0 -0
  565. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/credential/test_credhist.py +0 -0
  566. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/credential/test_lsa.py +0 -0
  567. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/credential/test_sam.py +0 -0
  568. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/log/test_etl.py +0 -0
  569. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/log/test_evt.py +0 -0
  570. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/log/test_evtx.py +0 -0
  571. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/log/test_schedlgu.py +0 -0
  572. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/regf/__init__.py +0 -0
  573. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/regf/test_appxdebugkeys.py +0 -0
  574. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/regf/test_cit.py +0 -0
  575. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/regf/test_clsid.py +0 -0
  576. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/regf/test_muicache.py +0 -0
  577. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/regf/test_shellbags.py +0 -0
  578. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/regf/test_trusteddocs.py +0 -0
  579. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/regf/test_usb.py +0 -0
  580. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/regf/test_userassist.py +0 -0
  581. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/test__os.py +0 -0
  582. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/test_adpolicy.py +0 -0
  583. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/test_amcache.py +0 -0
  584. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/test_catroot.py +0 -0
  585. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/test_clfs.py +0 -0
  586. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/test_datetime.py +0 -0
  587. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/test_defender.py +0 -0
  588. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/test_dpapi.py +0 -0
  589. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/test_env.py +0 -0
  590. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/test_generic.py +0 -0
  591. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/test_jumplist.py +0 -0
  592. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/test_lnk.py +0 -0
  593. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/test_locale.py +0 -0
  594. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/test_mru.py +0 -0
  595. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/test_network.py +0 -0
  596. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/test_notifications.py +0 -0
  597. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/test_prefetch.py +0 -0
  598. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/test_recyclebin.py +0 -0
  599. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/test_registry.py +0 -0
  600. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/test_shimcache.py +0 -0
  601. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/test_sru.py +0 -0
  602. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/test_syscache.py +0 -0
  603. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/test_tasks.py +0 -0
  604. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/test_thumbcache.py +0 -0
  605. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/test_ual.py +0 -0
  606. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/test_wer.py +0 -0
  607. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/plugins/os/windows/test_wua_history.py +0 -0
  608. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/test_container.py +0 -0
  609. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/test_filesystem.py +0 -0
  610. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/test_plugin.py +0 -0
  611. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/test_registration.py +0 -0
  612. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/test_report.py +0 -0
  613. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/test_target.py +0 -0
  614. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/test_tests.py +0 -0
  615. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/test_volume.py +0 -0
  616. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/tools/__init__.py +0 -0
  617. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/tools/test_dump.py +0 -0
  618. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/tools/test_fs.py +0 -0
  619. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/tools/test_fsutils.py +0 -0
  620. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/tools/test_info.py +0 -0
  621. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/tools/test_mount.py +0 -0
  622. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/tools/test_query.py +0 -0
  623. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/tools/test_reg.py +0 -0
  624. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/tools/test_shell.py +0 -0
  625. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/tools/test_utils.py +0 -0
  626. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/tools/test_yara.py +0 -0
  627. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/volumes/__init__.py +0 -0
  628. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/volumes/test_bde.py +0 -0
  629. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tests/volumes/test_md.py +0 -0
  630. {dissect_target-3.20.dev5 → dissect_target-3.20.dev6}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dissect.target
3
- Version: 3.20.dev5
3
+ Version: 3.20.dev6
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
@@ -177,7 +177,6 @@ def open(item: Union[str, Path], *args, **kwargs) -> Loader:
177
177
  register("local", "LocalLoader")
178
178
  register("remote", "RemoteLoader")
179
179
  register("mqtt", "MQTTLoader")
180
- register("targetd", "TargetdLoader")
181
180
  register("asdf", "AsdfLoader")
182
181
  register("tar", "TarLoader")
183
182
  register("vmx", "VmxLoader")
@@ -1,9 +1,11 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import argparse
3
4
  import atexit
4
5
  import logging
5
6
  import math
6
7
  import os
8
+ import re
7
9
  import ssl
8
10
  import sys
9
11
  import time
@@ -280,7 +282,7 @@ class Broker:
280
282
  factor = 1
281
283
 
282
284
  def __init__(
283
- self, broker: Broker, port: str, key: str, crt: str, ca: str, case: str, username: str, password: str, **kwargs
285
+ self, broker: str, port: str, key: str, crt: str, ca: str, case: str, username: str, password: str, **kwargs
284
286
  ):
285
287
  self.broker_host = broker
286
288
  self.broker_port = int(port)
@@ -352,8 +354,7 @@ class Broker:
352
354
  log.error(f"Failed to decode payload for hostname {hostname}: {e}")
353
355
  return
354
356
 
355
- # The payload with the username and password is comma separated
356
- print(f'"{hostname}",{decoded_payload}')
357
+ print(decoded_payload)
357
358
 
358
359
  def _on_log(self, client: mqtt.Client, userdata: Any, log_level: int, message: str) -> None:
359
360
  log.debug(message)
@@ -423,16 +424,97 @@ class Broker:
423
424
  self.mqtt_client.loop_start()
424
425
 
425
426
 
426
- @arg("--mqtt-peers", type=int, dest="peers", help="minimum number of peers to await for first alias")
427
- @arg("--mqtt-case", dest="case", help="case name (broker will determine if you are allowed to access this data)")
428
- @arg("--mqtt-port", type=int, dest="port", help="broker connection port")
429
- @arg("--mqtt-broker", dest="broker", help="broker ip-address")
430
- @arg("--mqtt-key", dest="key", help="private key file")
431
- @arg("--mqtt-crt", dest="crt", help="client certificate file")
432
- @arg("--mqtt-ca", dest="ca", help="certificate authority file")
427
+ def strictly_positive(value: str) -> int:
428
+ """
429
+ Validates that the provided value is a strictly positive integer.
430
+
431
+ This function is intended to be used as a type for argparse arguments.
432
+
433
+ Args:
434
+ value (str): The value to validate.
435
+
436
+ Returns:
437
+ int: The validated integer value.
438
+
439
+ Raises:
440
+ argparse.ArgumentTypeError: If the value is not a strictly positive integer.
441
+ """
442
+ try:
443
+ strictly_positive_value = int(value)
444
+ if strictly_positive_value < 1:
445
+ raise argparse.ArgumentTypeError("Value must be larger than or equal to 1.")
446
+ return strictly_positive_value
447
+ except ValueError:
448
+ raise argparse.ArgumentTypeError(f"Invalid integer value specified: '{value}'")
449
+
450
+
451
+ def port(value: str) -> int:
452
+ """
453
+ Convert a string value to an integer representing a valid port number.
454
+
455
+ This function is intended to be used as a type for argparse arguments.
456
+
457
+ Args:
458
+ value (str): The string representation of the port number.
459
+ Returns:
460
+ int: The port number as an integer.
461
+ Raises:
462
+ argparse.ArgumentTypeError: If the port number is not an integer or out of the valid range (1-65535).
463
+ """
464
+
465
+ try:
466
+ port = int(value)
467
+ if port < 1 or port > 65535:
468
+ raise argparse.ArgumentTypeError("Port number must be between 1 and 65535.")
469
+ return port
470
+ except ValueError:
471
+ raise argparse.ArgumentTypeError(f"Invalid port number specified: '{value}'")
472
+
473
+
474
+ def case(value: str) -> str:
475
+ """
476
+ Validates that the given value is a valid case name consisting of
477
+ alphanumeric characters and underscores only.
478
+
479
+ This function is intended to be used as a type for argparse arguments.
480
+
481
+ Args:
482
+ value (str): The case name to validate.
483
+
484
+ Returns:
485
+ str: The validated case name if it matches the required pattern.
486
+
487
+ Raises:
488
+ argparse.ArgumentTypeError: If the case name does not match the required pattern.
489
+ """
490
+
491
+ if re.match(r"^[a-zA-Z0-9_]+$", value):
492
+ return value
493
+
494
+ raise argparse.ArgumentTypeError(f"Invalid case name specified: '{value}'")
495
+
496
+
497
+ @arg(
498
+ "--mqtt-peers",
499
+ type=strictly_positive,
500
+ dest="peers",
501
+ default=1,
502
+ help="minimum number of peers to await for first alias",
503
+ )
504
+ @arg(
505
+ "--mqtt-case",
506
+ type=case,
507
+ dest="case",
508
+ help="case name (broker will determine if you are allowed to access this data)",
509
+ )
510
+ @arg("--mqtt-port", type=port, dest="port", default=443, help="broker connection port")
511
+ @arg("--mqtt-broker", default="localhost", dest="broker", help="broker ip-address")
512
+ @arg("--mqtt-key", type=Path, dest="key", required=True, help="private key file")
513
+ @arg("--mqtt-crt", type=Path, dest="crt", required=True, help="client certificate file")
514
+ @arg("--mqtt-ca", type=Path, dest="ca", required=True, help="certificate authority file")
433
515
  @arg("--mqtt-command", dest="command", help="direct command to client(s)")
434
516
  @arg("--mqtt-diag", action="store_true", dest="diag", help="show MQTT diagnostic information")
435
- @arg("--mqtt-username", dest="username", help="Username for connection")
517
+ @arg("--mqtt-username", dest="username", default="mqtt-loader", help="Username for connection")
436
518
  @arg("--mqtt-password", action="store_true", dest="password", help="Ask for password before connecting")
437
519
  class MQTTLoader(Loader):
438
520
  """Load remote targets through a broker."""
@@ -18,7 +18,6 @@ from dissect.target.exceptions import (
18
18
  UnsupportedPluginError,
19
19
  )
20
20
  from dissect.target.helpers import cache, record_modifier
21
- from dissect.target.loaders.targetd import ProxyLoader
22
21
  from dissect.target.plugin import PLUGINS, OSPlugin, Plugin, find_plugin_functions
23
22
  from dissect.target.report import ExecutionReport
24
23
  from dissect.target.tools.utils import (
@@ -174,8 +173,6 @@ def main():
174
173
 
175
174
  if targets:
176
175
  for plugin_target in Target.open_all(targets, args.children):
177
- if isinstance(plugin_target._loader, ProxyLoader):
178
- parser.error("can't list compatible plugins for remote targets.")
179
176
  funcs, _ = find_plugin_functions(plugin_target, args.list, compatibility=True, show_hidden=True)
180
177
  for func in funcs:
181
178
  collected_plugins[func.path] = func.plugin_desc
@@ -16,7 +16,6 @@ from dissect.target import Target
16
16
  from dissect.target.exceptions import UnsupportedPluginError
17
17
  from dissect.target.helpers import docs, keychain
18
18
  from dissect.target.helpers.docs import get_docstring
19
- from dissect.target.helpers.targetd import CommandProxy
20
19
  from dissect.target.loader import LOADERS_BY_SCHEME
21
20
  from dissect.target.plugin import (
22
21
  OSPlugin,
@@ -250,9 +249,6 @@ def plugin_function_with_argparser(
250
249
 
251
250
  plugin_method = plugin_obj.get_all_records
252
251
  parser = generate_argparse_for_plugin(plugin_obj)
253
- elif isinstance(target_attr, CommandProxy):
254
- plugin_method = target_attr.command()
255
- parser = generate_argparse_for_bound_method(plugin_method)
256
252
  elif callable(target_attr):
257
253
  plugin_method = target_attr
258
254
  parser = generate_argparse_for_bound_method(target_attr)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dissect.target
3
- Version: 3.20.dev5
3
+ Version: 3.20.dev6
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
@@ -78,7 +78,6 @@ dissect/target/helpers/record_modifier.py
78
78
  dissect/target/helpers/regutil.py
79
79
  dissect/target/helpers/shell_application_ids.py
80
80
  dissect/target/helpers/shell_folder_ids.py
81
- dissect/target/helpers/targetd.py
82
81
  dissect/target/helpers/utils.py
83
82
  dissect/target/helpers/compat/__init__.py
84
83
  dissect/target/helpers/compat/path_310.py
@@ -116,7 +115,6 @@ dissect/target/loaders/smb.py
116
115
  dissect/target/loaders/tanium.py
117
116
  dissect/target/loaders/tar.py
118
117
  dissect/target/loaders/target.py
119
- dissect/target/loaders/targetd.py
120
118
  dissect/target/loaders/utm.py
121
119
  dissect/target/loaders/vb.py
122
120
  dissect/target/loaders/vbox.py
@@ -1,15 +1,17 @@
1
1
  from __future__ import annotations
2
2
 
3
- import sys
3
+ import argparse
4
4
  import time
5
5
  from dataclasses import dataclass
6
6
  from struct import pack
7
7
  from typing import Iterator
8
8
  from unittest.mock import MagicMock, patch
9
9
 
10
+ import paho.mqtt.client as mqtt
10
11
  import pytest
11
12
 
12
13
  from dissect.target import Target
14
+ from dissect.target.loaders.mqtt import Broker, MQTTConnection, case
13
15
 
14
16
 
15
17
  class MQTTMock(MagicMock):
@@ -67,24 +69,6 @@ class MockBroker(MagicMock):
67
69
  return None
68
70
 
69
71
 
70
- @pytest.fixture
71
- def mock_paho(monkeypatch: pytest.MonkeyPatch) -> Iterator[MagicMock]:
72
- with monkeypatch.context() as m:
73
- mock_paho = MagicMock()
74
- m.setitem(sys.modules, "paho", mock_paho)
75
- m.setitem(sys.modules, "paho.mqtt", mock_paho.mqtt)
76
- m.setitem(sys.modules, "paho.mqtt.client", mock_paho.mqtt.client)
77
-
78
- yield mock_paho
79
-
80
-
81
- @pytest.fixture
82
- def mock_client(mock_paho: MagicMock) -> Iterator[MagicMock]:
83
- mock_client = MQTTMock()
84
- mock_paho.mqtt.client.Client.return_value = mock_client
85
- yield mock_client
86
-
87
-
88
72
  @pytest.fixture
89
73
  def mock_broker() -> Iterator[MockBroker]:
90
74
  yield MockBroker()
@@ -103,7 +87,7 @@ def mock_broker() -> Iterator[MockBroker]:
103
87
  @patch.object(time, "sleep") # improve speed during test, no need to wait for peers
104
88
  def test_remote_loader_stream(
105
89
  time: MagicMock,
106
- mock_client: MagicMock,
90
+ monkeypatch: pytest.MonkeyPatch,
107
91
  alias: str,
108
92
  hosts: list[str],
109
93
  disks: list[int],
@@ -112,7 +96,7 @@ def test_remote_loader_stream(
112
96
  read: int,
113
97
  expected: bytes,
114
98
  ) -> None:
115
- from dissect.target.loaders.mqtt import Broker
99
+ monkeypatch.setattr(mqtt, "Client", MQTTMock)
116
100
 
117
101
  broker = Broker("0.0.0.0", "1884", "key", "crt", "ca", "case1", "user", "pass")
118
102
  broker.connect()
@@ -133,8 +117,6 @@ def test_remote_loader_stream(
133
117
 
134
118
 
135
119
  def test_mqtt_loader_prefetch(mock_broker: MockBroker) -> None:
136
- from dissect.target.loaders.mqtt import MQTTConnection
137
-
138
120
  connection = MQTTConnection(mock_broker, "")
139
121
  connection.prefetch_factor_inc = 10
140
122
  assert connection.factor == 1
@@ -148,3 +130,34 @@ def test_mqtt_loader_prefetch(mock_broker: MockBroker) -> None:
148
130
  connection.read(1, 1200, 100, 0)
149
131
  assert connection.factor == (connection.prefetch_factor_inc * 2) + 1
150
132
  assert connection.prev == 1200
133
+
134
+
135
+ @pytest.mark.parametrize(
136
+ "case_name, parse_result",
137
+ [
138
+ ("valid_case_name", "valid_case_name"),
139
+ ("ValidCase123", "ValidCase123"),
140
+ ("valid_case_123", "valid_case_123"),
141
+ ("invalid-case", pytest.raises(argparse.ArgumentTypeError)),
142
+ ("invalid case", pytest.raises(argparse.ArgumentTypeError)),
143
+ ("invalid.case", pytest.raises(argparse.ArgumentTypeError)),
144
+ ("invalid@case", pytest.raises(argparse.ArgumentTypeError)),
145
+ ("", pytest.raises(argparse.ArgumentTypeError)),
146
+ ],
147
+ ids=[
148
+ "valid_case_lower",
149
+ "valid_case_mixed",
150
+ "valid_case_with_numbers",
151
+ "invalid_case_hyphen",
152
+ "invalid_case_space",
153
+ "invalid_case_dot",
154
+ "invalid_case_special_char",
155
+ "invalid_case_empty",
156
+ ],
157
+ )
158
+ def test_case(case_name, parse_result: str | pytest.RaisesContext[argparse.ArgumentTypeError]) -> None:
159
+ if isinstance(parse_result, str):
160
+ assert case(case_name) == parse_result
161
+ else:
162
+ with parse_result:
163
+ case(case_name)
@@ -1,58 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import functools
4
- from typing import Any, Callable, Optional, Union
5
-
6
- from dissect.util.stream import AlignedStream
7
-
8
- from dissect.target.exceptions import FatalError
9
- from dissect.target.loader import Loader
10
-
11
-
12
- class TargetdStream(AlignedStream):
13
- def _read(self, offset: int, length: int) -> bytes:
14
- return b""
15
-
16
-
17
- # Marker interface to indicate this loader loads targets from remote machines
18
- class ProxyLoader(Loader):
19
- pass
20
-
21
-
22
- class TargetdInvalidStateError(FatalError):
23
- pass
24
-
25
-
26
- class CommandProxy:
27
- def __init__(self, loader: Loader, func: Callable, namespace: Optional[str] = None):
28
- self._loader = loader
29
- self._func = func
30
- self._namespace = namespace or func
31
-
32
- def __getattr__(self, func: Union[Callable, str]) -> CommandProxy:
33
- if func == "func":
34
- return self._func.func
35
- self._func = func
36
- return self
37
-
38
- def command(self) -> Callable:
39
- namespace = None if self._func == self._namespace else self._namespace
40
- return self._get(namespace, self._func)
41
-
42
- def _get(self, namespace: Optional[str], plugin_func: Callable) -> Callable:
43
- if namespace:
44
- func = functools.update_wrapper(
45
- functools.partial(self._loader.plugin_bridge, plugin_func=self._func, namespace=self._namespace),
46
- self._loader.plugin_bridge,
47
- )
48
- else:
49
- func = functools.update_wrapper(
50
- functools.partial(self._loader.plugin_bridge, plugin_func=plugin_func), self._loader.plugin_bridge
51
- )
52
- return func
53
-
54
- def __call__(self, *args, **kwargs) -> Any:
55
- return self.command()(*args, **kwargs)
56
-
57
- def __repr__(self) -> str:
58
- return str(self._get(None, "get")(**{"property_name": self._func}))
@@ -1,223 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import functools
4
- import ssl
5
- import time
6
- import urllib
7
- from pathlib import Path
8
- from platform import os
9
- from typing import Any, Callable, Optional, Union
10
-
11
- from dissect.target.containers.raw import RawContainer
12
- from dissect.target.exceptions import LoaderError
13
-
14
- # to avoid loading issues during automatic loader detection
15
- from dissect.target.helpers.targetd import (
16
- CommandProxy,
17
- ProxyLoader,
18
- TargetdInvalidStateError,
19
- TargetdStream,
20
- )
21
- from dissect.target.loader import Loader
22
- from dissect.target.plugin import Plugin, export
23
- from dissect.target.target import Target
24
-
25
- TARGETD_AVAILABLE = False
26
- try:
27
- from flow import remoting
28
- from targetd.clients import Client
29
-
30
- TARGETD_AVAILABLE = True
31
- except Exception:
32
- pass
33
-
34
-
35
- class TargetdLoader(ProxyLoader):
36
- """Load remote targets through a broker."""
37
-
38
- instance = None
39
-
40
- def __init__(self, path: Union[Path, str], **kwargs):
41
- super().__init__(path)
42
- self._plugin_func = None
43
- self.client = None
44
- self.output = None
45
- self.peers = 1
46
- self.cacert = None
47
- self.adapter = "Flow.Remoting"
48
- self.host = "localhost"
49
- self.port = 1883
50
- self.chunking = True
51
- self.local_link = "unix:///tmp/targetd" if os.name == "posix" else "pipe:///tmp/targetd"
52
- # @todo Add these options to loader help (when available)
53
- self.configurables = [
54
- ["cacert", Path, "SSL: cacert file"],
55
- ["host", str, "IP-address of targetd broker"],
56
- ["port", int, "Port for connecting to targetd broker"],
57
- ["local_link", str, "Domain socket or named pipe"],
58
- ["adapter", str, "Adapter to use"],
59
- ["peers", int, "Minimum number of hosts to wait for before executing query"],
60
- ["chunking", int, "Chunk mode"],
61
- ]
62
- uri = kwargs.get("parsed_path")
63
- if uri is None:
64
- raise LoaderError("No URI connection details have been passed.")
65
- self.uri = uri.path
66
- self.options = dict(urllib.parse.parse_qsl(uri.query, keep_blank_values=True))
67
-
68
- def _process_options(self, target: Target) -> None:
69
- for configurable_details in self.configurables:
70
- configurable, value_type, description = configurable_details
71
- configuration = self.options.get(configurable)
72
- if not configuration:
73
- default_value = getattr(self, configurable)
74
- target.log.warning("%s not configured, using: %s=%s", description, configurable, default_value)
75
- else:
76
- setattr(self, configurable, value_type(configuration))
77
-
78
- @export(output="record", cache=False)
79
- def plugin_bridge(self, *args, **kwargs) -> list[Any]:
80
- """Command Execution Bridge Plugin for Targetd.
81
-
82
- This is a generic plugin interceptor that becomes active only if using
83
- the targetd loader. This plugin acts as a bridge to connect to the Targetd broker
84
- and will translate the requested plugin-operation into Targetd-commands using the selected
85
- adapter (i.e. Flow.Remoting).
86
- """
87
-
88
- if not TARGETD_AVAILABLE:
89
- raise ImportError("This loader requires the targetd package to be installed.")
90
-
91
- self.output = None
92
- self.has_output = False
93
-
94
- plugin_func = kwargs.pop("plugin_func", None)
95
-
96
- if self.client is None:
97
- ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
98
- ssl_context.check_hostname = False
99
- if self.cacert and not self.cacert.exists():
100
- raise LoaderError(f"file not found: {self.cacert}")
101
- if self.cacert:
102
- ssl_context.load_verify_locations(self.cacert)
103
- else:
104
- ssl_context.load_default_certs(purpose=ssl.Purpose.SERVER_AUTH)
105
- self.client = Client(self.host, self.port, ssl_context, [self.uri], self.local_link, "targetd")
106
- self.client.module_fullname = "dissect.target.loaders"
107
- self.client.module_fromlist = ["command_runner"]
108
- self.client.command = plugin_func
109
- try:
110
- self.client.start(*args, **kwargs)
111
- except Exception:
112
- # If something happens that prevents targetd from properly closing/resetting the
113
- # connection, this exception is thrown during the next connection and the connection
114
- # is closed properly after all so that the next time the loader will be able to
115
- # use a new connection with a new session.
116
- self.client.close()
117
- raise TargetdInvalidStateError("Targetd connection is in invalid state, retry.")
118
- else:
119
- self.client.command = plugin_func
120
- self.client.exec_command(*args, **kwargs)
121
-
122
- while not self.has_output:
123
- time.sleep(1)
124
- return self.output
125
-
126
- def _get_command(self, func: str, namespace: str = None) -> tuple[Loader, functools.partial]:
127
- return (self, CommandProxy(self, func, namespace=namespace))
128
-
129
- def each(self, func: Callable, target: Optional[Target] = None) -> Any:
130
- """Allows you to attach a scriptlet (function) to each of the remote hosts.
131
- The results of the function are accumulated using +=. Exceptions are
132
- catched and logged as warnings.
133
-
134
- Usage:
135
-
136
- def my_function(remote_target):
137
- ...do something interesting...
138
-
139
- targets = Target.open( targetd://... )
140
- targets.each(my_function)
141
-
142
- """
143
- result = None
144
- if not self.client:
145
- target.init()
146
- for peer in self.client.peers:
147
- target.select(peer)
148
- try:
149
- if result is None:
150
- result = func(target)
151
- else:
152
- result += func(target)
153
- except Exception as failure:
154
- target.log.warning("Exception while applying function to target: %s: %s", peer, failure)
155
- return result
156
-
157
- def _add_plugin(self, plugin: Plugin):
158
- plugin.check_compatibe = lambda: True
159
-
160
- def map(self, target: Target) -> None:
161
- if TargetdLoader.instance:
162
- raise Exception("You can only initiated 1 targetd control connection per session.")
163
- self._process_options(target)
164
- target.disks.add(RawContainer(TargetdStream()))
165
- target.get_function = self._get_command
166
- target.add_plugin = self._add_plugin
167
- target.each = functools.update_wrapper(functools.partial(self.each, target=target), self.each)
168
- TargetdLoader.instance = self
169
-
170
- @staticmethod
171
- def detect(path: Path) -> bool:
172
- # You can only activate this loader by URI-scheme "targetd://"
173
- return False
174
-
175
- def __del__(self) -> None:
176
- if self.client:
177
- self.client.close()
178
-
179
-
180
- if TARGETD_AVAILABLE:
181
- # Loader has to provide the control script for targetd in this case
182
- def command_runner(link: str, targetd: Client, *args, **kwargs) -> None:
183
- caller = TargetdLoader.instance
184
- if not targetd.rpcs:
185
- targetd.easy_connect_remoting(remoting, link, caller.peers)
186
-
187
- obj = targetd.rpcs
188
- if namespace := kwargs.get("namespace", None):
189
- obj = getattr(obj, namespace)
190
-
191
- caller.has_output = True
192
- if targetd.command == "init":
193
- caller.output = True
194
- return
195
-
196
- if targetd.command == "select":
197
- targetd.rpcs.select(*args)
198
- caller.output = True
199
- return
200
-
201
- if targetd.command == "deselect":
202
- targetd.rpcs.deselect()
203
- caller.output = True
204
- return
205
-
206
- func = getattr(obj, targetd.command)
207
-
208
- result = func(*args, **kwargs)
209
- if result is not None:
210
- if targetd.command == "get":
211
- result = list(result)[0]
212
- elif caller.chunking:
213
- data = []
214
- gen = func()
215
- targetd.reset()
216
- while True:
217
- try:
218
- data.append(next(gen))
219
- except Exception:
220
- break
221
- result = data
222
- caller.output = result
223
- targetd.reset()