dissect.target 3.20.dev38__tar.gz → 3.20.dev40__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 (654) hide show
  1. {dissect_target-3.20.dev38/dissect.target.egg-info → dissect_target-3.20.dev40}/PKG-INFO +1 -1
  2. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/record.py +21 -0
  3. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/regutil.py +10 -1
  4. dissect_target-3.20.dev40/dissect/target/plugins/apps/editor/editor.py +23 -0
  5. {dissect_target-3.20.dev38/dissect/target/plugins/apps/texteditor → dissect_target-3.20.dev40/dissect/target/plugins/apps/editor}/windowsnotepad.py +40 -31
  6. dissect_target-3.20.dev40/dissect/target/plugins/os/unix/applications.py +78 -0
  7. dissect_target-3.20.dev40/dissect/target/plugins/os/unix/linux/debian/snap.py +79 -0
  8. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/packagemanager.py +1 -1
  9. dissect_target-3.20.dev40/dissect/target/plugins/os/windows/regf/applications.py +62 -0
  10. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40/dissect.target.egg-info}/PKG-INFO +1 -1
  11. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect.target.egg-info/SOURCES.txt +11 -5
  12. dissect_target-3.20.dev38/tests/plugins/apps/texteditor/test_texteditor.py → dissect_target-3.20.dev40/tests/plugins/apps/editor/test_windowsnotepad.py +12 -7
  13. dissect_target-3.20.dev40/tests/plugins/os/unix/linux/debian/test_snap.py +38 -0
  14. dissect_target-3.20.dev40/tests/plugins/os/unix/test_applications.py +92 -0
  15. dissect_target-3.20.dev40/tests/plugins/os/windows/regf/test_applications.py +99 -0
  16. dissect_target-3.20.dev38/dissect/target/plugins/apps/texteditor/texteditor.py +0 -13
  17. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/COPYRIGHT +0 -0
  18. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/LICENSE +0 -0
  19. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/MANIFEST.in +0 -0
  20. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/README.md +0 -0
  21. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/__init__.py +0 -0
  22. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/container.py +0 -0
  23. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/containers/__init__.py +0 -0
  24. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/containers/asdf.py +0 -0
  25. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/containers/ewf.py +0 -0
  26. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/containers/fortifw.py +0 -0
  27. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/containers/hdd.py +0 -0
  28. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/containers/hds.py +0 -0
  29. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/containers/qcow2.py +0 -0
  30. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/containers/raw.py +0 -0
  31. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/containers/split.py +0 -0
  32. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/containers/vdi.py +0 -0
  33. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/containers/vhd.py +0 -0
  34. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/containers/vhdx.py +0 -0
  35. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/containers/vmdk.py +0 -0
  36. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/data/autocompletion/target_bash_completion.sh +0 -0
  37. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/exceptions.py +0 -0
  38. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/filesystem.py +0 -0
  39. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/filesystems/__init__.py +0 -0
  40. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/filesystems/ad1.py +0 -0
  41. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/filesystems/btrfs.py +0 -0
  42. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/filesystems/cb.py +0 -0
  43. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/filesystems/config.py +0 -0
  44. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/filesystems/cpio.py +0 -0
  45. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/filesystems/dir.py +0 -0
  46. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/filesystems/exfat.py +0 -0
  47. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/filesystems/extfs.py +0 -0
  48. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/filesystems/fat.py +0 -0
  49. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/filesystems/ffs.py +0 -0
  50. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/filesystems/itunes.py +0 -0
  51. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/filesystems/jffs.py +0 -0
  52. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/filesystems/ntfs.py +0 -0
  53. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/filesystems/overlay.py +0 -0
  54. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/filesystems/smb.py +0 -0
  55. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/filesystems/squashfs.py +0 -0
  56. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/filesystems/tar.py +0 -0
  57. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/filesystems/vmfs.py +0 -0
  58. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/filesystems/vmtar.py +0 -0
  59. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/filesystems/xfs.py +0 -0
  60. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/filesystems/zip.py +0 -0
  61. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/__init__.py +0 -0
  62. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/cache.py +0 -0
  63. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/compat/__init__.py +0 -0
  64. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/compat/path_310.py +0 -0
  65. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/compat/path_311.py +0 -0
  66. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/compat/path_312.py +0 -0
  67. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/compat/path_39.py +0 -0
  68. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/compat/path_common.py +0 -0
  69. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/config.py +0 -0
  70. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/configutil.py +0 -0
  71. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/cyber.py +0 -0
  72. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/data/windowsZones.xml +0 -0
  73. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/descriptor_extensions.py +0 -0
  74. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/docs.py +0 -0
  75. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/fsutil.py +0 -0
  76. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/hashutil.py +0 -0
  77. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/keychain.py +0 -0
  78. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/lazy.py +0 -0
  79. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/loaderutil.py +0 -0
  80. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/localeutil.py +0 -0
  81. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/mount.py +0 -0
  82. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/mui.py +0 -0
  83. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/polypath.py +0 -0
  84. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/protobuf.py +0 -0
  85. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/record_modifier.py +0 -0
  86. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/shell_application_ids.py +0 -0
  87. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/shell_folder_ids.py +0 -0
  88. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/helpers/utils.py +0 -0
  89. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loader.py +0 -0
  90. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/__init__.py +0 -0
  91. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/ab.py +0 -0
  92. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/ad1.py +0 -0
  93. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/asdf.py +0 -0
  94. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/cb.py +0 -0
  95. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/cyber.py +0 -0
  96. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/dir.py +0 -0
  97. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/hyperv.py +0 -0
  98. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/itunes.py +0 -0
  99. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/kape.py +0 -0
  100. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/libvirt.py +0 -0
  101. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/local.py +0 -0
  102. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/log.py +0 -0
  103. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/mqtt.py +0 -0
  104. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/multiraw.py +0 -0
  105. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/ova.py +0 -0
  106. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/overlay.py +0 -0
  107. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/ovf.py +0 -0
  108. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/phobos.py +0 -0
  109. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/profile.py +0 -0
  110. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/pvm.py +0 -0
  111. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/pvs.py +0 -0
  112. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/raw.py +0 -0
  113. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/remote.py +0 -0
  114. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/res.py +0 -0
  115. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/smb.py +0 -0
  116. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/tanium.py +0 -0
  117. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/tar.py +0 -0
  118. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/target.py +0 -0
  119. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/utm.py +0 -0
  120. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/vb.py +0 -0
  121. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/vbox.py +0 -0
  122. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/velociraptor.py +0 -0
  123. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/vma.py +0 -0
  124. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/vmwarevm.py +0 -0
  125. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/vmx.py +0 -0
  126. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/loaders/xva.py +0 -0
  127. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugin.py +0 -0
  128. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/__init__.py +0 -0
  129. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/__init__.py +0 -0
  130. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/av/__init__.py +0 -0
  131. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/av/mcafee.py +0 -0
  132. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/av/sophos.py +0 -0
  133. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/av/symantec.py +0 -0
  134. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/av/trendmicro.py +0 -0
  135. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/browser/__init__.py +0 -0
  136. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/browser/brave.py +0 -0
  137. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/browser/browser.py +0 -0
  138. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/browser/chrome.py +0 -0
  139. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/browser/chromium.py +0 -0
  140. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/browser/edge.py +0 -0
  141. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/browser/firefox.py +0 -0
  142. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/browser/iexplore.py +0 -0
  143. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/container/__init__.py +0 -0
  144. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/container/docker.py +0 -0
  145. {dissect_target-3.20.dev38/dissect/target/plugins/apps/other → dissect_target-3.20.dev40/dissect/target/plugins/apps/editor}/__init__.py +0 -0
  146. {dissect_target-3.20.dev38/dissect/target/plugins/apps/remoteaccess → dissect_target-3.20.dev40/dissect/target/plugins/apps/other}/__init__.py +0 -0
  147. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/other/env.py +0 -0
  148. {dissect_target-3.20.dev38/dissect/target/plugins/apps/shell → dissect_target-3.20.dev40/dissect/target/plugins/apps/remoteaccess}/__init__.py +0 -0
  149. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/remoteaccess/anydesk.py +0 -0
  150. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/remoteaccess/remoteaccess.py +0 -0
  151. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/remoteaccess/teamviewer.py +0 -0
  152. {dissect_target-3.20.dev38/dissect/target/plugins/apps/ssh → dissect_target-3.20.dev40/dissect/target/plugins/apps/shell}/__init__.py +0 -0
  153. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/shell/powershell.py +0 -0
  154. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/shell/wget.py +0 -0
  155. {dissect_target-3.20.dev38/dissect/target/plugins/apps/texteditor → dissect_target-3.20.dev40/dissect/target/plugins/apps/ssh}/__init__.py +0 -0
  156. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/ssh/openssh.py +0 -0
  157. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/ssh/opensshd.py +0 -0
  158. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/ssh/putty.py +0 -0
  159. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/ssh/ssh.py +0 -0
  160. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/virtualization/__init__.py +0 -0
  161. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/virtualization/vmware_workstation.py +0 -0
  162. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/vpn/__init__.py +0 -0
  163. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/vpn/openvpn.py +0 -0
  164. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/vpn/wireguard.py +0 -0
  165. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/webhosting/__init__.py +0 -0
  166. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/webhosting/cpanel.py +0 -0
  167. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/webserver/__init__.py +0 -0
  168. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/webserver/apache.py +0 -0
  169. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/webserver/caddy.py +0 -0
  170. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/webserver/citrix.py +0 -0
  171. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/webserver/iis.py +0 -0
  172. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/webserver/nginx.py +0 -0
  173. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/apps/webserver/webserver.py +0 -0
  174. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/child/__init__.py +0 -0
  175. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/child/docker.py +0 -0
  176. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/child/esxi.py +0 -0
  177. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/child/hyperv.py +0 -0
  178. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/child/parallels.py +0 -0
  179. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/child/qemu.py +0 -0
  180. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/child/virtuozzo.py +0 -0
  181. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/child/vmware_workstation.py +0 -0
  182. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/child/wsl.py +0 -0
  183. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/filesystem/__init__.py +0 -0
  184. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/filesystem/acquire_handles.py +0 -0
  185. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/filesystem/acquire_hash.py +0 -0
  186. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/filesystem/icat.py +0 -0
  187. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/filesystem/ntfs/__init__.py +0 -0
  188. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/filesystem/ntfs/mft.py +0 -0
  189. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/filesystem/ntfs/mft_timeline.py +0 -0
  190. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/filesystem/ntfs/usnjrnl.py +0 -0
  191. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/filesystem/ntfs/utils.py +0 -0
  192. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/filesystem/resolver.py +0 -0
  193. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/filesystem/unix/__init__.py +0 -0
  194. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/filesystem/unix/capability.py +0 -0
  195. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/filesystem/unix/suid.py +0 -0
  196. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/filesystem/walkfs.py +0 -0
  197. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/filesystem/yara.py +0 -0
  198. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/general/__init__.py +0 -0
  199. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/general/config.py +0 -0
  200. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/general/default.py +0 -0
  201. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/general/example.py +0 -0
  202. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/general/loaders.py +0 -0
  203. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/general/network.py +0 -0
  204. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/general/osinfo.py +0 -0
  205. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/general/plugins.py +0 -0
  206. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/general/scrape.py +0 -0
  207. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/general/users.py +0 -0
  208. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/__init__.py +0 -0
  209. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/__init__.py +0 -0
  210. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/_os.py +0 -0
  211. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/bsd/__init__.py +0 -0
  212. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/bsd/_os.py +0 -0
  213. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/bsd/citrix/__init__.py +0 -0
  214. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/bsd/citrix/_os.py +0 -0
  215. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/bsd/citrix/history.py +0 -0
  216. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/bsd/freebsd/__init__.py +0 -0
  217. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/bsd/freebsd/_os.py +0 -0
  218. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/bsd/ios/__init__.py +0 -0
  219. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/bsd/ios/_os.py +0 -0
  220. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/bsd/openbsd/__init__.py +0 -0
  221. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/bsd/openbsd/_os.py +0 -0
  222. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/bsd/osx/__init__.py +0 -0
  223. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/bsd/osx/_os.py +0 -0
  224. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/bsd/osx/network.py +0 -0
  225. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/bsd/osx/user.py +0 -0
  226. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/cronjobs.py +0 -0
  227. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/datetime.py +0 -0
  228. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/esxi/__init__.py +0 -0
  229. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/esxi/_os.py +0 -0
  230. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/etc/__init__.py +0 -0
  231. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/etc/etc.py +0 -0
  232. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/generic.py +0 -0
  233. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/history.py +0 -0
  234. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/__init__.py +0 -0
  235. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/_os.py +0 -0
  236. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/android/__init__.py +0 -0
  237. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/android/_os.py +0 -0
  238. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/cmdline.py +0 -0
  239. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/debian/__init__.py +0 -0
  240. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/debian/_os.py +0 -0
  241. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/debian/apt.py +0 -0
  242. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/debian/dpkg.py +0 -0
  243. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/debian/vyos/__init__.py +0 -0
  244. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/debian/vyos/_os.py +0 -0
  245. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/environ.py +0 -0
  246. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/fortios/__init__.py +0 -0
  247. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/fortios/_keys.py +0 -0
  248. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/fortios/_os.py +0 -0
  249. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/fortios/generic.py +0 -0
  250. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/fortios/locale.py +0 -0
  251. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/iptables.py +0 -0
  252. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/modules.py +0 -0
  253. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/netstat.py +0 -0
  254. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/network_managers.py +0 -0
  255. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/proc.py +0 -0
  256. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/processes.py +0 -0
  257. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/redhat/__init__.py +0 -0
  258. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/redhat/_os.py +0 -0
  259. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/redhat/yum.py +0 -0
  260. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/services.py +0 -0
  261. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/sockets.py +0 -0
  262. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/suse/__init__.py +0 -0
  263. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/suse/_os.py +0 -0
  264. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/linux/suse/zypper.py +0 -0
  265. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/locale.py +0 -0
  266. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/locate/__init__.py +0 -0
  267. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/locate/gnulocate.py +0 -0
  268. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/locate/locate.py +0 -0
  269. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/locate/mlocate.py +0 -0
  270. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/locate/plocate.py +0 -0
  271. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/log/__init__.py +0 -0
  272. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/log/atop.py +0 -0
  273. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/log/audit.py +0 -0
  274. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/log/auth.py +0 -0
  275. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/log/journal.py +0 -0
  276. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/log/lastlog.py +0 -0
  277. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/log/messages.py +0 -0
  278. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/log/utmp.py +0 -0
  279. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/shadow.py +0 -0
  280. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/unix/trash.py +0 -0
  281. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/__init__.py +0 -0
  282. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/_os.py +0 -0
  283. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/activitiescache.py +0 -0
  284. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/adpolicy.py +0 -0
  285. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/amcache.py +0 -0
  286. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/catroot.py +0 -0
  287. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/cim.py +0 -0
  288. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/clfs.py +0 -0
  289. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/credential/__init__.py +0 -0
  290. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/credential/credhist.py +0 -0
  291. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/credential/lsa.py +0 -0
  292. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/credential/sam.py +0 -0
  293. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/datetime.py +0 -0
  294. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/defender.py +0 -0
  295. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/defender_helpers/__init__.py +0 -0
  296. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/defender_helpers/defender_patterns.py +0 -0
  297. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/defender_helpers/defender_records.py +0 -0
  298. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/dpapi/__init__.py +0 -0
  299. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/dpapi/blob.py +0 -0
  300. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/dpapi/crypto.py +0 -0
  301. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/dpapi/dpapi.py +0 -0
  302. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/dpapi/keyprovider/__init__.py +0 -0
  303. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/dpapi/keyprovider/credhist.py +0 -0
  304. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/dpapi/keyprovider/empty.py +0 -0
  305. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/dpapi/keyprovider/keychain.py +0 -0
  306. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/dpapi/keyprovider/keyprovider.py +0 -0
  307. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/dpapi/keyprovider/lsa.py +0 -0
  308. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/dpapi/master_key.py +0 -0
  309. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/env.py +0 -0
  310. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/exchange/__init__.py +0 -0
  311. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/exchange/exchange.py +0 -0
  312. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/generic.py +0 -0
  313. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/jumplist.py +0 -0
  314. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/lnk.py +0 -0
  315. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/locale.py +0 -0
  316. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/log/__init__.py +0 -0
  317. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/log/amcache.py +0 -0
  318. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/log/etl.py +0 -0
  319. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/log/evt.py +0 -0
  320. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/log/evtx.py +0 -0
  321. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/log/pfro.py +0 -0
  322. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/log/schedlgu.py +0 -0
  323. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/network.py +0 -0
  324. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/notifications.py +0 -0
  325. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/prefetch.py +0 -0
  326. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/recyclebin.py +0 -0
  327. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/regf/7zip.py +0 -0
  328. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/regf/__init__.py +0 -0
  329. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/regf/appxdebugkeys.py +0 -0
  330. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/regf/auditpol.py +0 -0
  331. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/regf/bam.py +0 -0
  332. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/regf/cit.py +0 -0
  333. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/regf/clsid.py +0 -0
  334. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/regf/firewall.py +0 -0
  335. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/regf/mru.py +0 -0
  336. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/regf/muicache.py +0 -0
  337. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/regf/nethist.py +0 -0
  338. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/regf/recentfilecache.py +0 -0
  339. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/regf/regf.py +0 -0
  340. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/regf/runkeys.py +0 -0
  341. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/regf/shellbags.py +0 -0
  342. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/regf/shimcache.py +0 -0
  343. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/regf/trusteddocs.py +0 -0
  344. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/regf/usb.py +0 -0
  345. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/regf/userassist.py +0 -0
  346. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/registry.py +0 -0
  347. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/services.py +0 -0
  348. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/sru.py +0 -0
  349. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/startupinfo.py +0 -0
  350. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/syscache.py +0 -0
  351. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/task_helpers/__init__.py +0 -0
  352. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/task_helpers/tasks_job.py +0 -0
  353. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/task_helpers/tasks_records.py +0 -0
  354. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/task_helpers/tasks_xml.py +0 -0
  355. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/tasks.py +0 -0
  356. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/thumbcache.py +0 -0
  357. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/ual.py +0 -0
  358. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/wer.py +0 -0
  359. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/plugins/os/windows/wua_history.py +0 -0
  360. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/report.py +0 -0
  361. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/target.py +0 -0
  362. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/tools/__init__.py +0 -0
  363. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/tools/build_pluginlist.py +0 -0
  364. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/tools/dd.py +0 -0
  365. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/tools/dump/__init__.py +0 -0
  366. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/tools/dump/run.py +0 -0
  367. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/tools/dump/state.py +0 -0
  368. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/tools/dump/utils.py +0 -0
  369. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/tools/fs.py +0 -0
  370. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/tools/fsutils.py +0 -0
  371. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/tools/info.py +0 -0
  372. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/tools/logging.py +0 -0
  373. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/tools/mount.py +0 -0
  374. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/tools/query.py +0 -0
  375. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/tools/reg.py +0 -0
  376. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/tools/shell.py +0 -0
  377. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/tools/utils.py +0 -0
  378. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/tools/yara.py +0 -0
  379. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/volume.py +0 -0
  380. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/volumes/__init__.py +0 -0
  381. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/volumes/bde.py +0 -0
  382. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/volumes/ddf.py +0 -0
  383. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/volumes/disk.py +0 -0
  384. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/volumes/luks.py +0 -0
  385. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/volumes/lvm.py +0 -0
  386. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/volumes/md.py +0 -0
  387. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect/target/volumes/vmfs.py +0 -0
  388. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect.target.egg-info/dependency_links.txt +0 -0
  389. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect.target.egg-info/entry_points.txt +0 -0
  390. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect.target.egg-info/requires.txt +0 -0
  391. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/dissect.target.egg-info/top_level.txt +0 -0
  392. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/pyproject.toml +0 -0
  393. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/setup.cfg +0 -0
  394. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/__init__.py +0 -0
  395. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/_docs/Makefile +0 -0
  396. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/_docs/conf.py +0 -0
  397. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/_docs/index.rst +0 -0
  398. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/_utils.py +0 -0
  399. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/conftest.py +0 -0
  400. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/containers/__init__.py +0 -0
  401. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/containers/test_fortifw.py +0 -0
  402. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/containers/test_split.py +0 -0
  403. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/filesystems/__init__.py +0 -0
  404. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/filesystems/test_btrfs.py +0 -0
  405. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/filesystems/test_cb.py +0 -0
  406. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/filesystems/test_config.py +0 -0
  407. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/filesystems/test_cpio.py +0 -0
  408. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/filesystems/test_dir.py +0 -0
  409. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/filesystems/test_exfat.py +0 -0
  410. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/filesystems/test_extfs.py +0 -0
  411. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/filesystems/test_fat.py +0 -0
  412. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/filesystems/test_jffs2.py +0 -0
  413. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/filesystems/test_ntfs.py +0 -0
  414. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/filesystems/test_overlay.py +0 -0
  415. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/filesystems/test_smb.py +0 -0
  416. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/filesystems/test_tar.py +0 -0
  417. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/filesystems/test_vmtar.py +0 -0
  418. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/filesystems/test_xfs.py +0 -0
  419. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/filesystems/test_zip.py +0 -0
  420. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/helpers/__init__.py +0 -0
  421. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/helpers/test_cache.py +0 -0
  422. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/helpers/test_config.py +0 -0
  423. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/helpers/test_configutil.py +0 -0
  424. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/helpers/test_docs.py +0 -0
  425. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/helpers/test_fsutil.py +0 -0
  426. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/helpers/test_hashutil.py +0 -0
  427. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/helpers/test_keychain.py +0 -0
  428. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/helpers/test_loaderutil.py +0 -0
  429. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/helpers/test_localeutil.py +0 -0
  430. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/helpers/test_modifier.py +0 -0
  431. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/helpers/test_protobuf.py +0 -0
  432. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/helpers/test_record.py +0 -0
  433. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/helpers/test_regutil.py +0 -0
  434. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/helpers/test_utils.py +0 -0
  435. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/loaders/__init__.py +0 -0
  436. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/loaders/test_ab.py +0 -0
  437. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/loaders/test_asdf.py +0 -0
  438. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/loaders/test_cb.py +0 -0
  439. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/loaders/test_dir.py +0 -0
  440. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/loaders/test_hyperv.py +0 -0
  441. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/loaders/test_kape.py +0 -0
  442. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/loaders/test_libvirt.py +0 -0
  443. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/loaders/test_local.py +0 -0
  444. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/loaders/test_log.py +0 -0
  445. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/loaders/test_mqtt.py +0 -0
  446. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/loaders/test_multiraw.py +0 -0
  447. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/loaders/test_ova.py +0 -0
  448. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/loaders/test_overlay.py +0 -0
  449. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/loaders/test_ovf.py +0 -0
  450. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/loaders/test_phobos.py +0 -0
  451. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/loaders/test_pvm.py +0 -0
  452. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/loaders/test_pvs.py +0 -0
  453. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/loaders/test_remote.py +0 -0
  454. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/loaders/test_smb.py +0 -0
  455. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/loaders/test_tanium.py +0 -0
  456. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/loaders/test_tar.py +0 -0
  457. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/loaders/test_utm.py +0 -0
  458. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/loaders/test_vbox.py +0 -0
  459. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/loaders/test_velociraptor.py +0 -0
  460. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/loaders/test_vmwarevm.py +0 -0
  461. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/__init__.py +0 -0
  462. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/__init__.py +0 -0
  463. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/av/__init__.py +0 -0
  464. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/av/test_mcafee.py +0 -0
  465. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/av/test_sophos.py +0 -0
  466. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/av/test_symantec.py +0 -0
  467. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/av/test_trendmicro.py +0 -0
  468. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/browser/__init__.py +0 -0
  469. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/browser/test_brave.py +0 -0
  470. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/browser/test_chrome.py +0 -0
  471. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/browser/test_chromium.py +0 -0
  472. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/browser/test_edge.py +0 -0
  473. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/browser/test_firefox.py +0 -0
  474. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/browser/test_iexplore.py +0 -0
  475. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/container/__init__.py +0 -0
  476. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/container/test_docker.py +0 -0
  477. {dissect_target-3.20.dev38/tests/plugins/apps/other → dissect_target-3.20.dev40/tests/plugins/apps/editor}/__init__.py +0 -0
  478. {dissect_target-3.20.dev38/tests/plugins/apps/remoteaccess → dissect_target-3.20.dev40/tests/plugins/apps/other}/__init__.py +0 -0
  479. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/other/test_envfile.py +0 -0
  480. {dissect_target-3.20.dev38/tests/plugins/apps/shell → dissect_target-3.20.dev40/tests/plugins/apps/remoteaccess}/__init__.py +0 -0
  481. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/remoteaccess/test_anydesk.py +0 -0
  482. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/remoteaccess/test_teamviewer.py +0 -0
  483. {dissect_target-3.20.dev38/tests/plugins/apps/ssh → dissect_target-3.20.dev40/tests/plugins/apps/shell}/__init__.py +0 -0
  484. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/shell/test_powershell.py +0 -0
  485. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/shell/test_wget.py +0 -0
  486. {dissect_target-3.20.dev38/tests/plugins/apps/texteditor → dissect_target-3.20.dev40/tests/plugins/apps/ssh}/__init__.py +0 -0
  487. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/ssh/test_openssh.py +0 -0
  488. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/ssh/test_opensshd.py +0 -0
  489. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/ssh/test_putty.py +0 -0
  490. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/virtualization/__init__.py +0 -0
  491. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/virtualization/test_vmware_workstation.py +0 -0
  492. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/vpn/__init__.py +0 -0
  493. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/vpn/test_openvpn.py +0 -0
  494. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/vpn/test_wireguard.py +0 -0
  495. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/webhosting/__init__.py +0 -0
  496. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/webhosting/test_cpanel.py +0 -0
  497. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/webserver/__init__.py +0 -0
  498. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/webserver/test_apache.py +0 -0
  499. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/webserver/test_caddy.py +0 -0
  500. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/webserver/test_citrix.py +0 -0
  501. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/webserver/test_iis.py +0 -0
  502. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/webserver/test_nginx.py +0 -0
  503. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/apps/webserver/test_webserver.py +0 -0
  504. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/child/__init__.py +0 -0
  505. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/child/test_docker.py +0 -0
  506. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/child/test_hyperv.py +0 -0
  507. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/child/test_parallels.py +0 -0
  508. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/child/test_qemu.py +0 -0
  509. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/child/test_virtuozzo.py +0 -0
  510. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/child/test_vmware_workstation.py +0 -0
  511. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/child/test_wsl.py +0 -0
  512. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/filesystem/__init__.py +0 -0
  513. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/filesystem/ntfs/__init__.py +0 -0
  514. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/filesystem/ntfs/test_mft.py +0 -0
  515. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/filesystem/ntfs/test_usnjrnl.py +0 -0
  516. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/filesystem/test_acquire_handles.py +0 -0
  517. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/filesystem/test_acquire_hash.py +0 -0
  518. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/filesystem/test_icat.py +0 -0
  519. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/filesystem/test_resolver.py +0 -0
  520. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/filesystem/test_walkfs.py +0 -0
  521. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/filesystem/test_yara.py +0 -0
  522. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/filesystem/unix/__init__.py +0 -0
  523. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/filesystem/unix/test_capability.py +0 -0
  524. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/filesystem/unix/test_suid.py +0 -0
  525. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/general/__init__.py +0 -0
  526. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/general/test_config.py +0 -0
  527. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/general/test_default.py +0 -0
  528. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/general/test_network.py +0 -0
  529. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/general/test_plugins.py +0 -0
  530. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/general/test_scrape.py +0 -0
  531. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/general/test_users.py +0 -0
  532. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/__init__.py +0 -0
  533. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/__init__.py +0 -0
  534. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/bsd/__init__.py +0 -0
  535. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/bsd/citrix/__init__.py +0 -0
  536. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/bsd/citrix/test__os.py +0 -0
  537. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/bsd/citrix/test_history.py +0 -0
  538. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/bsd/osx/__init__.py +0 -0
  539. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/bsd/osx/test__os.py +0 -0
  540. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/bsd/osx/test_network.py +0 -0
  541. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/bsd/osx/test_user.py +0 -0
  542. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/esxi/__init__.py +0 -0
  543. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/esxi/test__os.py +0 -0
  544. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/linux/__init__.py +0 -0
  545. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/linux/android/__init__.py +0 -0
  546. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/linux/android/test__os.py +0 -0
  547. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/linux/debian/__init__.py +0 -0
  548. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/linux/debian/test_apt.py +0 -0
  549. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/linux/debian/test_dpkg.py +0 -0
  550. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/linux/fortios/test_keys.py +0 -0
  551. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/linux/redhat/__init__.py +0 -0
  552. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/linux/redhat/test_yum.py +0 -0
  553. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/linux/suse/__init__.py +0 -0
  554. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/linux/suse/test_zypper.py +0 -0
  555. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/linux/test__os.py +0 -0
  556. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/linux/test_cmdline.py +0 -0
  557. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/linux/test_environ.py +0 -0
  558. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/linux/test_iptables.py +0 -0
  559. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/linux/test_modules.py +0 -0
  560. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/linux/test_netstat.py +0 -0
  561. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/linux/test_proc.py +0 -0
  562. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/linux/test_processes.py +0 -0
  563. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/linux/test_services.py +0 -0
  564. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/linux/test_sockets.py +0 -0
  565. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/locate/__init__.py +0 -0
  566. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/locate/test_gnulocate.py +0 -0
  567. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/locate/test_mlocate.py +0 -0
  568. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/locate/test_plocate.py +0 -0
  569. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/log/__init__.py +0 -0
  570. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/log/test_atop.py +0 -0
  571. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/log/test_audit.py +0 -0
  572. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/log/test_auth.py +0 -0
  573. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/log/test_journal.py +0 -0
  574. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/log/test_lastlog.py +0 -0
  575. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/log/test_messages.py +0 -0
  576. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/log/test_utmp.py +0 -0
  577. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/test__os.py +0 -0
  578. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/test_generic.py +0 -0
  579. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/test_history.py +0 -0
  580. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/test_ips.py +0 -0
  581. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/test_locale.py +0 -0
  582. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/test_packagemanager.py +0 -0
  583. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/test_shadow.py +0 -0
  584. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/test_trash.py +0 -0
  585. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/test_users.py +0 -0
  586. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/unix/test_version.py +0 -0
  587. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/__init__.py +0 -0
  588. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/credential/__init__.py +0 -0
  589. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/credential/test_credhist.py +0 -0
  590. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/credential/test_lsa.py +0 -0
  591. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/credential/test_sam.py +0 -0
  592. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/log/test_etl.py +0 -0
  593. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/log/test_evt.py +0 -0
  594. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/log/test_evtx.py +0 -0
  595. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/log/test_schedlgu.py +0 -0
  596. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/regf/__init__.py +0 -0
  597. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/regf/test_appxdebugkeys.py +0 -0
  598. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/regf/test_cit.py +0 -0
  599. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/regf/test_clsid.py +0 -0
  600. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/regf/test_muicache.py +0 -0
  601. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/regf/test_shellbags.py +0 -0
  602. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/regf/test_trusteddocs.py +0 -0
  603. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/regf/test_usb.py +0 -0
  604. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/regf/test_userassist.py +0 -0
  605. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/test__os.py +0 -0
  606. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/test_adpolicy.py +0 -0
  607. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/test_amcache.py +0 -0
  608. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/test_catroot.py +0 -0
  609. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/test_clfs.py +0 -0
  610. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/test_datetime.py +0 -0
  611. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/test_defender.py +0 -0
  612. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/test_dpapi.py +0 -0
  613. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/test_env.py +0 -0
  614. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/test_generic.py +0 -0
  615. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/test_jumplist.py +0 -0
  616. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/test_lnk.py +0 -0
  617. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/test_locale.py +0 -0
  618. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/test_mru.py +0 -0
  619. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/test_network.py +0 -0
  620. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/test_notifications.py +0 -0
  621. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/test_prefetch.py +0 -0
  622. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/test_recyclebin.py +0 -0
  623. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/test_registry.py +0 -0
  624. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/test_shimcache.py +0 -0
  625. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/test_sru.py +0 -0
  626. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/test_syscache.py +0 -0
  627. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/test_tasks.py +0 -0
  628. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/test_thumbcache.py +0 -0
  629. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/test_ual.py +0 -0
  630. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/test_wer.py +0 -0
  631. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/plugins/os/windows/test_wua_history.py +0 -0
  632. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/test_container.py +0 -0
  633. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/test_filesystem.py +0 -0
  634. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/test_plugin.py +0 -0
  635. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/test_registration.py +0 -0
  636. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/test_report.py +0 -0
  637. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/test_target.py +0 -0
  638. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/test_tests.py +0 -0
  639. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/test_volume.py +0 -0
  640. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/tools/__init__.py +0 -0
  641. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/tools/test_dump.py +0 -0
  642. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/tools/test_fs.py +0 -0
  643. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/tools/test_fsutils.py +0 -0
  644. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/tools/test_info.py +0 -0
  645. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/tools/test_mount.py +0 -0
  646. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/tools/test_query.py +0 -0
  647. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/tools/test_reg.py +0 -0
  648. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/tools/test_shell.py +0 -0
  649. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/tools/test_utils.py +0 -0
  650. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/tools/test_yara.py +0 -0
  651. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/volumes/__init__.py +0 -0
  652. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/volumes/test_bde.py +0 -0
  653. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tests/volumes/test_md.py +0 -0
  654. {dissect_target-3.20.dev38 → dissect_target-3.20.dev40}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dissect.target
3
- Version: 3.20.dev38
3
+ Version: 3.20.dev40
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
@@ -185,3 +185,24 @@ MacInterfaceRecord = TargetRecordDescriptor(
185
185
  ("boolean", "dhcp"),
186
186
  ],
187
187
  )
188
+
189
+
190
+ COMMON_APPLICATION_FIELDS = [
191
+ ("datetime", "ts_modified"),
192
+ ("datetime", "ts_installed"),
193
+ ("string", "name"),
194
+ ("string", "version"),
195
+ ("string", "author"),
196
+ ("string", "type"),
197
+ ("path", "path"),
198
+ ]
199
+
200
+ UnixApplicationRecord = TargetRecordDescriptor(
201
+ "unix/application",
202
+ COMMON_APPLICATION_FIELDS,
203
+ )
204
+
205
+ WindowsApplicationRecord = TargetRecordDescriptor(
206
+ "windows/application",
207
+ COMMON_APPLICATION_FIELDS,
208
+ )
@@ -310,6 +310,7 @@ class VirtualKey(RegistryKey):
310
310
  self._class_name = class_name
311
311
  self._values: dict[str, RegistryValue] = {}
312
312
  self._subkeys: dict[str, RegistryKey] = {}
313
+ self._timestamp: datetime = None
313
314
  self.top: RegistryKey = None
314
315
  super().__init__(hive=hive)
315
316
 
@@ -339,11 +340,19 @@ class VirtualKey(RegistryKey):
339
340
  return self._path
340
341
 
341
342
  @property
342
- def timestamp(self) -> datetime:
343
+ def timestamp(self) -> datetime | None:
343
344
  if self.top:
344
345
  return self.top.timestamp
346
+
347
+ if self._timestamp:
348
+ return self._timestamp
349
+
345
350
  return None
346
351
 
352
+ @timestamp.setter
353
+ def timestamp(self, ts: datetime) -> None:
354
+ self._timestamp = ts
355
+
347
356
  def subkey(self, subkey: str) -> RegistryKey:
348
357
  try:
349
358
  return self._subkeys[subkey.lower()]
@@ -0,0 +1,23 @@
1
+ from dissect.target.plugin import NamespacePlugin, export
2
+
3
+ COMMON_EDITOR_FIELDS = [
4
+ ("datetime", "ts"),
5
+ ("string", "editor"),
6
+ ("path", "source"),
7
+ ]
8
+
9
+
10
+ class EditorPlugin(NamespacePlugin):
11
+ """Editor plugin."""
12
+
13
+ __namespace__ = "editor"
14
+
15
+ @export
16
+ def extensions(self) -> None:
17
+ """Yields installed extensions."""
18
+ raise NotImplementedError
19
+
20
+ @export
21
+ def history(self) -> None:
22
+ """Yields history of files."""
23
+ raise NotImplementedError
@@ -16,11 +16,8 @@ from dissect.target.helpers.record import (
16
16
  WindowsUserRecord,
17
17
  create_extended_descriptor,
18
18
  )
19
- from dissect.target.plugin import export
20
- from dissect.target.plugins.apps.texteditor.texteditor import (
21
- GENERIC_TAB_CONTENTS_RECORD_FIELDS,
22
- TexteditorPlugin,
23
- )
19
+ from dissect.target.plugin import alias, export
20
+ from dissect.target.plugins.apps.editor.editor import COMMON_EDITOR_FIELDS, EditorPlugin
24
21
  from dissect.target.target import Target
25
22
 
26
23
  # Thanks to @Nordgaren, @daddycocoaman, @JustArion and @ogmini for their suggestions and feedback in the PR
@@ -94,16 +91,25 @@ struct options_v2 {
94
91
  };
95
92
  """
96
93
 
97
- WINDOWS_SAVED_TABS_EXTRA_FIELDS = [("datetime", "modification_time"), ("digest", "hashes"), ("path", "saved_path")]
94
+ GENERIC_TAB_CONTENTS_RECORD_FIELDS = [
95
+ ("string", "content"),
96
+ ("path", "path"),
97
+ ("string", "deleted_content"),
98
+ ]
98
99
 
99
100
  WindowsNotepadUnsavedTabRecord = create_extended_descriptor([UserRecordDescriptorExtension])(
100
- "texteditor/windowsnotepad/tab/unsaved",
101
- GENERIC_TAB_CONTENTS_RECORD_FIELDS,
101
+ "application/editor/windowsnotepad/tab/unsaved",
102
+ COMMON_EDITOR_FIELDS + GENERIC_TAB_CONTENTS_RECORD_FIELDS,
102
103
  )
103
104
 
104
105
  WindowsNotepadSavedTabRecord = create_extended_descriptor([UserRecordDescriptorExtension])(
105
- "texteditor/windowsnotepad/tab/saved",
106
- GENERIC_TAB_CONTENTS_RECORD_FIELDS + WINDOWS_SAVED_TABS_EXTRA_FIELDS,
106
+ "application/editor/windowsnotepad/tab/saved",
107
+ COMMON_EDITOR_FIELDS
108
+ + GENERIC_TAB_CONTENTS_RECORD_FIELDS
109
+ + [
110
+ ("digest", "digest"),
111
+ ("path", "saved_path"),
112
+ ],
107
113
  )
108
114
 
109
115
  c_windowstab = cstruct().load(windowstab_def)
@@ -264,7 +270,7 @@ class WindowsNotepadTab:
264
270
  self.deleted_content = deleted_content if deleted_content else None
265
271
 
266
272
 
267
- class WindowsNotepadPlugin(TexteditorPlugin):
273
+ class WindowsNotepadPlugin(EditorPlugin):
268
274
  """Windows notepad tab content plugin."""
269
275
 
270
276
  __namespace__ = "windowsnotepad"
@@ -273,28 +279,27 @@ class WindowsNotepadPlugin(TexteditorPlugin):
273
279
 
274
280
  def __init__(self, target: Target):
275
281
  super().__init__(target)
276
- self.users_tabs: list[TargetPath, UnixUserRecord | WindowsUserRecord] = []
282
+ self.users_tabs: set[TargetPath, UnixUserRecord | WindowsUserRecord] = set()
277
283
  for user_details in self.target.user_details.all_with_home():
278
284
  for tab_file in user_details.home_path.glob(self.GLOB):
279
- # These files seem to contain information on different settings / configurations,
280
- # and are skipped for now
285
+ # These files contain information on different settings / configurations, and are skipped for now.
281
286
  if tab_file.name.endswith(".1.bin") or tab_file.name.endswith(".0.bin"):
282
287
  continue
283
288
 
284
- self.users_tabs.append((tab_file, user_details.user))
289
+ self.users_tabs.add((tab_file, user_details.user))
285
290
 
286
291
  def check_compatible(self) -> None:
287
292
  if not self.users_tabs:
288
293
  raise UnsupportedPluginError("No Windows Notepad tab files found")
289
294
 
295
+ @alias("tabs")
290
296
  @export(record=[WindowsNotepadSavedTabRecord, WindowsNotepadUnsavedTabRecord])
291
- def tabs(self) -> Iterator[WindowsNotepadSavedTabRecord | WindowsNotepadUnsavedTabRecord]:
297
+ def history(self) -> Iterator[WindowsNotepadSavedTabRecord | WindowsNotepadUnsavedTabRecord]:
292
298
  """Return contents from Windows 11 Notepad tabs - and its deleted content if available.
293
299
 
294
300
  Windows Notepad application for Windows 11 is now able to restore both saved and unsaved tabs when you re-open
295
301
  the application.
296
302
 
297
-
298
303
  Resources:
299
304
  - https://github.com/fox-it/dissect.target/pull/540
300
305
  - https://github.com/JustArion/Notepad-Tabs
@@ -304,37 +309,41 @@ class WindowsNotepadPlugin(TexteditorPlugin):
304
309
  - https://github.com/Nordgaren/tabstate-util/issues/1
305
310
  - https://medium.com/@mahmoudsoheem/new-digital-forensics-artifact-from-windows-notepad-527645906b7b
306
311
 
307
- Yields a WindowsNotepadSavedTabRecord or WindowsNotepadUnsavedTabRecord. with fields:
312
+ Yields ``WindowsNotepadSavedTabRecord`` or ``WindowsNotepadUnsavedTabRecord`` records:
308
313
 
309
314
  .. code-block:: text
310
315
 
311
- content (string): The content of the tab.
312
- path (path): The path to the tab file.
313
- deleted_content (string): The deleted content of the tab, if available.
314
- hashes (digest): A digest of the tab content.
315
- saved_path (path): The path where the tab was saved.
316
- modification_time (datetime): The modification time of the tab.
316
+ ts (datetime): The modification time of the tab.
317
+ content (string): The content of the tab.
318
+ path (path): The path to the tab file.
319
+ deleted_content (string): The deleted content of the tab, if available.
320
+ digest (digest): A digest of the tab content.
321
+ saved_path (path): The path where the tab was saved.
317
322
  """
318
323
  for file, user in self.users_tabs:
319
- # Parse the file
320
- tab: WindowsNotepadTab = WindowsNotepadTab(file)
324
+ tab = WindowsNotepadTab(file)
321
325
 
322
326
  if tab.is_saved:
323
327
  yield WindowsNotepadSavedTabRecord(
328
+ ts=wintimestamp(tab.tab_header.timestamp),
329
+ editor="windowsnotepad",
324
330
  content=tab.content,
325
331
  path=tab.file,
326
332
  deleted_content=tab.deleted_content,
327
- hashes=digest((None, None, tab.tab_header.sha256.hex())),
333
+ digest=digest((None, None, tab.tab_header.sha256.hex())),
328
334
  saved_path=tab.tab_header.filePath,
329
- modification_time=wintimestamp(tab.tab_header.timestamp),
330
- _target=self.target,
335
+ source=file,
331
336
  _user=user,
337
+ _target=self.target,
332
338
  )
339
+
333
340
  else:
334
341
  yield WindowsNotepadUnsavedTabRecord(
342
+ editor="windowsnotepad",
335
343
  content=tab.content,
344
+ deleted_content=tab.deleted_content,
336
345
  path=tab.file,
337
- _target=self.target,
346
+ source=file,
338
347
  _user=user,
339
- deleted_content=tab.deleted_content,
348
+ _target=self.target,
340
349
  )
@@ -0,0 +1,78 @@
1
+ from typing import Iterator
2
+
3
+ from dissect.target.exceptions import UnsupportedPluginError
4
+ from dissect.target.helpers import configutil
5
+ from dissect.target.helpers.fsutil import TargetPath
6
+ from dissect.target.helpers.record import UnixApplicationRecord
7
+ from dissect.target.plugin import Plugin, export
8
+ from dissect.target.target import Target
9
+
10
+
11
+ class UnixApplicationsPlugin(Plugin):
12
+ """Unix Applications plugin."""
13
+
14
+ SYSTEM_PATHS = [
15
+ "/usr/share/applications/",
16
+ "/usr/local/share/applications/",
17
+ "/var/lib/snapd/desktop/applications/",
18
+ "/var/lib/flatpak/exports/share/applications/",
19
+ ]
20
+
21
+ USER_PATHS = [
22
+ ".local/share/applications/",
23
+ ]
24
+
25
+ SYSTEM_APPS = ("org.gnome.",)
26
+
27
+ def __init__(self, target: Target):
28
+ super().__init__(target)
29
+ self.desktop_files = list(self._find_desktop_files())
30
+
31
+ def _find_desktop_files(self) -> Iterator[TargetPath]:
32
+ for dir in self.SYSTEM_PATHS:
33
+ for file in self.target.fs.path(dir).glob("*.desktop"):
34
+ yield file
35
+
36
+ for user_details in self.target.user_details.all_with_home():
37
+ for dir in self.USER_PATHS:
38
+ for file in user_details.home_path.joinpath(dir).glob("*.desktop"):
39
+ yield file
40
+
41
+ def check_compatible(self) -> None:
42
+ if not self.desktop_files:
43
+ raise UnsupportedPluginError("No application .desktop files found")
44
+
45
+ @export(record=UnixApplicationRecord)
46
+ def applications(self) -> Iterator[UnixApplicationRecord]:
47
+ """Yield installed Unix GUI applications from GNOME and XFCE.
48
+
49
+ Resources:
50
+ - https://wiki.archlinux.org/title/Desktop_entries
51
+ - https://specifications.freedesktop.org/desktop-entry-spec/latest/
52
+ - https://unix.stackexchange.com/questions/582928/where-gnome-apps-are-installed
53
+
54
+ Yields ``UnixApplicationRecord`` records with the following fields:
55
+
56
+ .. code-block:: text
57
+
58
+ ts_modified (datetime): timestamp when the installation was modified
59
+ ts_installed (datetime): timestamp when the application was installed on the system
60
+ name (string): name of the application
61
+ version (string): version of the application
62
+ author (string): author of the application
63
+ type (string): type of the application, either user or system
64
+ path (string): path to the desktop file entry of the application
65
+ """
66
+ for file in self.desktop_files:
67
+ config = configutil.parse(file, hint="ini").get("Desktop Entry") or {}
68
+ stat = file.lstat()
69
+
70
+ yield UnixApplicationRecord(
71
+ ts_modified=stat.st_mtime,
72
+ ts_installed=stat.st_btime if hasattr(stat, "st_btime") else None,
73
+ name=config.get("Name"),
74
+ version=config.get("Version"),
75
+ path=config.get("Exec"),
76
+ type="system" if config.get("Icon", "").startswith(self.SYSTEM_APPS) else "user",
77
+ _target=self.target,
78
+ )
@@ -0,0 +1,79 @@
1
+ from typing import Iterator
2
+
3
+ from dissect.target.exceptions import UnsupportedPluginError
4
+ from dissect.target.filesystems.squashfs import SquashFSFilesystem
5
+ from dissect.target.helpers import configutil
6
+ from dissect.target.helpers.fsutil import TargetPath
7
+ from dissect.target.helpers.record import UnixApplicationRecord
8
+ from dissect.target.plugin import Plugin, alias, export
9
+ from dissect.target.target import Target
10
+
11
+
12
+ class SnapPlugin(Plugin):
13
+ """Canonical Linux Snapcraft plugin."""
14
+
15
+ PATHS = [
16
+ "/var/lib/snapd/snaps",
17
+ ]
18
+
19
+ def __init__(self, target: Target):
20
+ super().__init__(target)
21
+ self.installs = list(self._find_installs())
22
+
23
+ def check_compatible(self) -> None:
24
+ if not configutil.HAS_YAML:
25
+ raise UnsupportedPluginError("Missing required dependency ruamel.yaml")
26
+
27
+ if not self.installs:
28
+ raise UnsupportedPluginError("No snapd install folder(s) found")
29
+
30
+ def _find_installs(self) -> Iterator[TargetPath]:
31
+ for str_path in self.PATHS:
32
+ if (path := self.target.fs.path(str_path)).exists():
33
+ yield path
34
+
35
+ @export(record=UnixApplicationRecord)
36
+ @alias("snaps")
37
+ def snap(self) -> Iterator[UnixApplicationRecord]:
38
+ """Yields installed Canonical Linux Snapcraft (snaps) applications on the target system.
39
+
40
+ Reads information from installed SquashFS ``*.snap`` files found in ``/var/lib/snapd/snaps``.
41
+ Logs of the ``snapd`` daemon can be parsed using the ``journal`` or ``syslog`` plugins.
42
+
43
+ Resources:
44
+ - https://github.com/canonical/snapcraft
45
+ - https://en.wikipedia.org/wiki/Snap_(software)
46
+
47
+ Yields ``UnixApplicationRecord`` records with the following fields:
48
+
49
+ .. code-block:: text
50
+
51
+ ts_modified (datetime): timestamp when the installation was modified
52
+ name (string): name of the application
53
+ version (string): version of the application
54
+ path (string): path to the application snap file
55
+ """
56
+
57
+ for install_path in self.installs:
58
+ for snap in install_path.glob("*.snap"):
59
+ try:
60
+ squashfs = SquashFSFilesystem(snap.open())
61
+
62
+ except (ValueError, NotImplementedError) as e:
63
+ self.target.log.warning("Unable to open snap file %s", snap)
64
+ self.target.log.debug("", exc_info=e)
65
+ continue
66
+
67
+ if not (meta := squashfs.path("meta/snap.yaml")).exists():
68
+ self.target.log.warning("Snap %s has no meta/snap.yaml file")
69
+ continue
70
+
71
+ meta_data = configutil.parse(meta, hint="yaml")
72
+
73
+ yield UnixApplicationRecord(
74
+ ts_modified=meta.lstat().st_mtime,
75
+ name=meta_data.get("name"),
76
+ version=meta_data.get("version"),
77
+ path=snap,
78
+ _target=self.target,
79
+ )
@@ -6,7 +6,7 @@ from dissect.target.helpers.record import TargetRecordDescriptor
6
6
  from dissect.target.plugin import NamespacePlugin
7
7
 
8
8
  PackageManagerLogRecord = TargetRecordDescriptor(
9
- "unix/log/packagemanager",
9
+ "unix/packagemanager/log",
10
10
  [
11
11
  ("datetime", "ts"),
12
12
  ("string", "package_manager"),
@@ -0,0 +1,62 @@
1
+ from datetime import datetime
2
+ from typing import Iterator
3
+
4
+ from dissect.target.exceptions import UnsupportedPluginError
5
+ from dissect.target.helpers.record import WindowsApplicationRecord
6
+ from dissect.target.plugin import Plugin, export
7
+ from dissect.target.target import Target
8
+
9
+
10
+ class WindowsApplicationsPlugin(Plugin):
11
+ """Windows Applications plugin."""
12
+
13
+ def __init__(self, target: Target):
14
+ super().__init__(target)
15
+ self.keys = list(self.target.registry.keys("HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"))
16
+
17
+ def check_compatible(self) -> None:
18
+ if not self.target.has_function("registry"):
19
+ raise UnsupportedPluginError("No Windows registry found")
20
+
21
+ if not self.keys:
22
+ raise UnsupportedPluginError("No 'Uninstall' registry keys found")
23
+
24
+ @export(record=WindowsApplicationRecord)
25
+ def applications(self) -> Iterator[WindowsApplicationRecord]:
26
+ """Yields currently installed applications from the Windows registry.
27
+
28
+ Use the Windows eventlog plugin (``evtx``, ``evt``) to parse install and uninstall events
29
+ of applications and services (e.g. ``4697``, ``110707``, ``1034`` and ``11724``).
30
+
31
+ Resources:
32
+ - https://learn.microsoft.com/en-us/windows/win32/msi/uninstall-registry-key
33
+
34
+ Yields ``WindowsApplicationRecord`` records with the following fields:
35
+
36
+ .. code-block:: text
37
+
38
+ ts_modified (datetime): timestamp when the installation was modified according to the registry
39
+ ts_installed (datetime): timestamp when the application was installed according to the application
40
+ name (string): name of the application
41
+ version (string): version of the application
42
+ author (string): author of the application
43
+ type (string): type of the application, either user or system
44
+ path (string): path to the installed location or installer of the application
45
+ """
46
+ for uninstall in self.keys:
47
+ for app in uninstall.subkeys():
48
+ values = {value.name: value.value for value in app.values()}
49
+
50
+ if install_date := values.get("InstallDate"):
51
+ install_date = datetime.strptime(install_date, "%Y%m%d")
52
+
53
+ yield WindowsApplicationRecord(
54
+ ts_modified=app.ts,
55
+ ts_installed=install_date,
56
+ name=values.get("DisplayName") or app.name,
57
+ version=values.get("DisplayVersion"),
58
+ author=values.get("Publisher"),
59
+ type="system" if values.get("SystemComponent") or not values else "user",
60
+ path=values.get("DisplayIcon") or values.get("InstallLocation") or values.get("InstallSource"),
61
+ _target=self.target,
62
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dissect.target
3
- Version: 3.20.dev38
3
+ Version: 3.20.dev40
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
@@ -139,6 +139,9 @@ dissect/target/plugins/apps/browser/firefox.py
139
139
  dissect/target/plugins/apps/browser/iexplore.py
140
140
  dissect/target/plugins/apps/container/__init__.py
141
141
  dissect/target/plugins/apps/container/docker.py
142
+ dissect/target/plugins/apps/editor/__init__.py
143
+ dissect/target/plugins/apps/editor/editor.py
144
+ dissect/target/plugins/apps/editor/windowsnotepad.py
142
145
  dissect/target/plugins/apps/other/__init__.py
143
146
  dissect/target/plugins/apps/other/env.py
144
147
  dissect/target/plugins/apps/remoteaccess/__init__.py
@@ -153,9 +156,6 @@ dissect/target/plugins/apps/ssh/openssh.py
153
156
  dissect/target/plugins/apps/ssh/opensshd.py
154
157
  dissect/target/plugins/apps/ssh/putty.py
155
158
  dissect/target/plugins/apps/ssh/ssh.py
156
- dissect/target/plugins/apps/texteditor/__init__.py
157
- dissect/target/plugins/apps/texteditor/texteditor.py
158
- dissect/target/plugins/apps/texteditor/windowsnotepad.py
159
159
  dissect/target/plugins/apps/virtualization/__init__.py
160
160
  dissect/target/plugins/apps/virtualization/vmware_workstation.py
161
161
  dissect/target/plugins/apps/vpn/__init__.py
@@ -207,6 +207,7 @@ dissect/target/plugins/general/users.py
207
207
  dissect/target/plugins/os/__init__.py
208
208
  dissect/target/plugins/os/unix/__init__.py
209
209
  dissect/target/plugins/os/unix/_os.py
210
+ dissect/target/plugins/os/unix/applications.py
210
211
  dissect/target/plugins/os/unix/cronjobs.py
211
212
  dissect/target/plugins/os/unix/datetime.py
212
213
  dissect/target/plugins/os/unix/generic.py
@@ -252,6 +253,7 @@ dissect/target/plugins/os/unix/linux/debian/__init__.py
252
253
  dissect/target/plugins/os/unix/linux/debian/_os.py
253
254
  dissect/target/plugins/os/unix/linux/debian/apt.py
254
255
  dissect/target/plugins/os/unix/linux/debian/dpkg.py
256
+ dissect/target/plugins/os/unix/linux/debian/snap.py
255
257
  dissect/target/plugins/os/unix/linux/debian/vyos/__init__.py
256
258
  dissect/target/plugins/os/unix/linux/debian/vyos/_os.py
257
259
  dissect/target/plugins/os/unix/linux/fortios/__init__.py
@@ -336,6 +338,7 @@ dissect/target/plugins/os/windows/log/pfro.py
336
338
  dissect/target/plugins/os/windows/log/schedlgu.py
337
339
  dissect/target/plugins/os/windows/regf/7zip.py
338
340
  dissect/target/plugins/os/windows/regf/__init__.py
341
+ dissect/target/plugins/os/windows/regf/applications.py
339
342
  dissect/target/plugins/os/windows/regf/appxdebugkeys.py
340
343
  dissect/target/plugins/os/windows/regf/auditpol.py
341
344
  dissect/target/plugins/os/windows/regf/bam.py
@@ -473,6 +476,8 @@ tests/plugins/apps/browser/test_firefox.py
473
476
  tests/plugins/apps/browser/test_iexplore.py
474
477
  tests/plugins/apps/container/__init__.py
475
478
  tests/plugins/apps/container/test_docker.py
479
+ tests/plugins/apps/editor/__init__.py
480
+ tests/plugins/apps/editor/test_windowsnotepad.py
476
481
  tests/plugins/apps/other/__init__.py
477
482
  tests/plugins/apps/other/test_envfile.py
478
483
  tests/plugins/apps/remoteaccess/__init__.py
@@ -485,8 +490,6 @@ tests/plugins/apps/ssh/__init__.py
485
490
  tests/plugins/apps/ssh/test_openssh.py
486
491
  tests/plugins/apps/ssh/test_opensshd.py
487
492
  tests/plugins/apps/ssh/test_putty.py
488
- tests/plugins/apps/texteditor/__init__.py
489
- tests/plugins/apps/texteditor/test_texteditor.py
490
493
  tests/plugins/apps/virtualization/__init__.py
491
494
  tests/plugins/apps/virtualization/test_vmware_workstation.py
492
495
  tests/plugins/apps/vpn/__init__.py
@@ -532,6 +535,7 @@ tests/plugins/general/test_users.py
532
535
  tests/plugins/os/__init__.py
533
536
  tests/plugins/os/unix/__init__.py
534
537
  tests/plugins/os/unix/test__os.py
538
+ tests/plugins/os/unix/test_applications.py
535
539
  tests/plugins/os/unix/test_generic.py
536
540
  tests/plugins/os/unix/test_history.py
537
541
  tests/plugins/os/unix/test_ips.py
@@ -567,6 +571,7 @@ tests/plugins/os/unix/linux/android/test__os.py
567
571
  tests/plugins/os/unix/linux/debian/__init__.py
568
572
  tests/plugins/os/unix/linux/debian/test_apt.py
569
573
  tests/plugins/os/unix/linux/debian/test_dpkg.py
574
+ tests/plugins/os/unix/linux/debian/test_snap.py
570
575
  tests/plugins/os/unix/linux/fortios/test_keys.py
571
576
  tests/plugins/os/unix/linux/redhat/__init__.py
572
577
  tests/plugins/os/unix/linux/redhat/test_yum.py
@@ -621,6 +626,7 @@ tests/plugins/os/windows/log/test_evt.py
621
626
  tests/plugins/os/windows/log/test_evtx.py
622
627
  tests/plugins/os/windows/log/test_schedlgu.py
623
628
  tests/plugins/os/windows/regf/__init__.py
629
+ tests/plugins/os/windows/regf/test_applications.py
624
630
  tests/plugins/os/windows/regf/test_appxdebugkeys.py
625
631
  tests/plugins/os/windows/regf/test_cit.py
626
632
  tests/plugins/os/windows/regf/test_clsid.py
@@ -1,10 +1,9 @@
1
1
  import os
2
+ from datetime import datetime, timezone
2
3
  from pathlib import Path
3
4
 
4
- from flow.record.fieldtypes import datetime as dt
5
-
6
5
  from dissect.target.filesystem import VirtualFilesystem
7
- from dissect.target.plugins.apps.texteditor.windowsnotepad import (
6
+ from dissect.target.plugins.apps.editor.windowsnotepad import (
8
7
  WindowsNotepadPlugin,
9
8
  WindowsNotepadTab,
10
9
  )
@@ -77,8 +76,10 @@ def test_windows_tab_plugin_deleted_contents(
77
76
 
78
77
  # The recovered content in the records should match the original data, as well as the length
79
78
  for rec in records:
79
+ assert rec.editor == "windowsnotepad"
80
80
  assert rec.content == file_text_map[rec.path.name][0]
81
81
  assert rec.deleted_content == file_text_map[rec.path.name][1]
82
+ assert rec.source is not None
82
83
 
83
84
 
84
85
  def test_windows_tab_plugin_default(
@@ -137,8 +138,10 @@ def test_windows_tab_plugin_default(
137
138
 
138
139
  # The recovered content in the records should match the original data, as well as the length
139
140
  for rec in records:
141
+ assert rec.editor == "windowsnotepad"
140
142
  assert rec.content == file_text_map[rec.path.name][0]
141
143
  assert rec.deleted_content == file_text_map[rec.path.name][1]
144
+ assert rec.source is not None
142
145
 
143
146
 
144
147
  def test_windows_saved_tab_plugin_extra_fields(
@@ -148,13 +151,13 @@ def test_windows_saved_tab_plugin_extra_fields(
148
151
  "saved.bin": (
149
152
  "Saved!",
150
153
  "C:\\Users\\user\\Desktop\\Saved!.txt",
151
- dt(2024, 3, 28, 13, 7, 55, 482183),
154
+ datetime(2024, 3, 28, 13, 7, 55, 482183, tzinfo=timezone.utc),
152
155
  "ed9b760289e614c9dc8776e7280abe870be0a85019a32220b35acc54c0ecfbc1",
153
156
  ),
154
157
  "appclosed_saved_and_deletions.bin": (
155
158
  text8,
156
159
  "C:\\Users\\user\\Desktop\\Saved.txt",
157
- dt(2024, 3, 28, 13, 16, 21, 158279),
160
+ datetime(2024, 3, 28, 13, 16, 21, 158279, tzinfo=timezone.utc),
158
161
  "8d0533144aa42e2d81e7474332bdef6473e42b699041528d55a62e5391e914ce",
159
162
  ),
160
163
  }
@@ -183,8 +186,10 @@ def test_windows_saved_tab_plugin_extra_fields(
183
186
  # The recovered content in the records should match the original data, as well as the length and all the
184
187
  # other saved metadata
185
188
  for rec in records:
189
+ assert rec.editor == "windowsnotepad"
186
190
  assert len(rec.content) == len(file_text_map[rec.path.name][0])
187
191
  assert rec.content == file_text_map[rec.path.name][0]
188
192
  assert rec.saved_path == file_text_map[rec.path.name][1]
189
- assert rec.modification_time == file_text_map[rec.path.name][2]
190
- assert rec.hashes.sha256 == file_text_map[rec.path.name][3]
193
+ assert rec.ts == file_text_map[rec.path.name][2]
194
+ assert rec.digest.sha256 == file_text_map[rec.path.name][3]
195
+ assert rec.source is not None
@@ -0,0 +1,38 @@
1
+ from datetime import datetime, timezone
2
+ from io import BytesIO
3
+
4
+ from dissect.target.filesystem import VirtualFilesystem
5
+ from dissect.target.plugins.os.unix._os import UnixPlugin
6
+ from dissect.target.plugins.os.unix.linux.debian.snap import SnapPlugin
7
+ from dissect.target.target import Target
8
+ from tests._utils import absolute_path
9
+
10
+
11
+ def test_snap_packages(target_unix_users: Target, fs_unix: VirtualFilesystem) -> None:
12
+ """test if snap packages are discovered on unix systems"""
13
+
14
+ fs_unix.map_file_fh("/etc/hostname", BytesIO(b"hostname"))
15
+ fs_unix.map_file(
16
+ "/var/lib/snapd/snaps/firefox_12345.snap",
17
+ absolute_path("_data/plugins/os/unix/linux/debian/snap/firefox.snap"),
18
+ )
19
+ fs_unix.map_file(
20
+ "/var/lib/snapd/snaps/firefox_67890.snap",
21
+ absolute_path("_data/plugins/os/unix/linux/debian/snap/firefox.snap"),
22
+ )
23
+
24
+ target_unix_users.add_plugin(UnixPlugin)
25
+ target_unix_users.add_plugin(SnapPlugin)
26
+
27
+ assert target_unix_users.has_function("snap")
28
+
29
+ results = list(target_unix_users.snaps())
30
+ assert len(results) == 2
31
+
32
+ assert results[0].hostname == "hostname"
33
+ assert results[0].ts_modified == datetime(2024, 9, 17, 13, 18, 58, tzinfo=timezone.utc)
34
+ assert results[0].name == "firefox"
35
+ assert results[0].version == "129.0.2-1"
36
+ assert results[0].author is None
37
+ assert results[0].type is None
38
+ assert results[0].path == "/var/lib/snapd/snaps/firefox_12345.snap"