dissect.target 3.19.dev28__tar.gz → 3.19.dev29__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 (596) hide show
  1. {dissect_target-3.19.dev28/dissect.target.egg-info → dissect_target-3.19.dev29}/PKG-INFO +1 -1
  2. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/browser/firefox.py +77 -32
  3. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/general/users.py +14 -10
  4. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29/dissect.target.egg-info}/PKG-INFO +1 -1
  5. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/browser/test_firefox.py +105 -27
  6. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/COPYRIGHT +0 -0
  7. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/LICENSE +0 -0
  8. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/MANIFEST.in +0 -0
  9. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/README.md +0 -0
  10. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/__init__.py +0 -0
  11. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/container.py +0 -0
  12. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/containers/__init__.py +0 -0
  13. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/containers/asdf.py +0 -0
  14. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/containers/ewf.py +0 -0
  15. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/containers/fortifw.py +0 -0
  16. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/containers/hdd.py +0 -0
  17. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/containers/hds.py +0 -0
  18. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/containers/qcow2.py +0 -0
  19. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/containers/raw.py +0 -0
  20. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/containers/split.py +0 -0
  21. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/containers/vdi.py +0 -0
  22. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/containers/vhd.py +0 -0
  23. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/containers/vhdx.py +0 -0
  24. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/containers/vmdk.py +0 -0
  25. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/data/autocompletion/target_bash_completion.sh +0 -0
  26. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/exceptions.py +0 -0
  27. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/filesystem.py +0 -0
  28. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/filesystems/__init__.py +0 -0
  29. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/filesystems/ad1.py +0 -0
  30. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/filesystems/btrfs.py +0 -0
  31. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/filesystems/cb.py +0 -0
  32. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/filesystems/config.py +0 -0
  33. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/filesystems/cpio.py +0 -0
  34. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/filesystems/dir.py +0 -0
  35. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/filesystems/exfat.py +0 -0
  36. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/filesystems/extfs.py +0 -0
  37. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/filesystems/fat.py +0 -0
  38. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/filesystems/ffs.py +0 -0
  39. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/filesystems/itunes.py +0 -0
  40. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/filesystems/jffs.py +0 -0
  41. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/filesystems/ntfs.py +0 -0
  42. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/filesystems/overlay.py +0 -0
  43. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/filesystems/smb.py +0 -0
  44. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/filesystems/squashfs.py +0 -0
  45. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/filesystems/tar.py +0 -0
  46. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/filesystems/vmfs.py +0 -0
  47. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/filesystems/vmtar.py +0 -0
  48. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/filesystems/xfs.py +0 -0
  49. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/filesystems/zip.py +0 -0
  50. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/__init__.py +0 -0
  51. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/cache.py +0 -0
  52. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/compat/__init__.py +0 -0
  53. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/compat/path_310.py +0 -0
  54. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/compat/path_311.py +0 -0
  55. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/compat/path_312.py +0 -0
  56. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/compat/path_39.py +0 -0
  57. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/compat/path_common.py +0 -0
  58. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/config.py +0 -0
  59. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/configutil.py +0 -0
  60. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/cyber.py +0 -0
  61. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/data/windowsZones.xml +0 -0
  62. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/descriptor_extensions.py +0 -0
  63. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/docs.py +0 -0
  64. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/fsutil.py +0 -0
  65. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/hashutil.py +0 -0
  66. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/keychain.py +0 -0
  67. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/lazy.py +0 -0
  68. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/loaderutil.py +0 -0
  69. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/localeutil.py +0 -0
  70. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/mount.py +0 -0
  71. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/mui.py +0 -0
  72. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/network_managers.py +0 -0
  73. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/polypath.py +0 -0
  74. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/protobuf.py +0 -0
  75. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/record.py +0 -0
  76. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/record_modifier.py +0 -0
  77. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/regutil.py +0 -0
  78. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/shell_folder_ids.py +0 -0
  79. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/targetd.py +0 -0
  80. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/helpers/utils.py +0 -0
  81. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loader.py +0 -0
  82. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/__init__.py +0 -0
  83. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/ab.py +0 -0
  84. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/ad1.py +0 -0
  85. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/asdf.py +0 -0
  86. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/cb.py +0 -0
  87. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/cyber.py +0 -0
  88. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/dir.py +0 -0
  89. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/hyperv.py +0 -0
  90. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/itunes.py +0 -0
  91. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/kape.py +0 -0
  92. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/local.py +0 -0
  93. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/log.py +0 -0
  94. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/mqtt.py +0 -0
  95. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/multiraw.py +0 -0
  96. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/ova.py +0 -0
  97. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/overlay.py +0 -0
  98. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/ovf.py +0 -0
  99. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/phobos.py +0 -0
  100. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/profile.py +0 -0
  101. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/pvm.py +0 -0
  102. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/pvs.py +0 -0
  103. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/raw.py +0 -0
  104. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/remote.py +0 -0
  105. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/res.py +0 -0
  106. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/smb.py +0 -0
  107. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/tanium.py +0 -0
  108. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/tar.py +0 -0
  109. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/target.py +0 -0
  110. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/targetd.py +0 -0
  111. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/utm.py +0 -0
  112. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/vb.py +0 -0
  113. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/vbox.py +0 -0
  114. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/velociraptor.py +0 -0
  115. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/vma.py +0 -0
  116. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/vmwarevm.py +0 -0
  117. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/vmx.py +0 -0
  118. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/loaders/xva.py +0 -0
  119. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugin.py +0 -0
  120. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/__init__.py +0 -0
  121. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/__init__.py +0 -0
  122. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/av/__init__.py +0 -0
  123. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/av/mcafee.py +0 -0
  124. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/av/sophos.py +0 -0
  125. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/av/symantec.py +0 -0
  126. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/av/trendmicro.py +0 -0
  127. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/browser/__init__.py +0 -0
  128. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/browser/brave.py +0 -0
  129. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/browser/browser.py +0 -0
  130. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/browser/chrome.py +0 -0
  131. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/browser/chromium.py +0 -0
  132. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/browser/edge.py +0 -0
  133. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/browser/iexplore.py +0 -0
  134. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/container/__init__.py +0 -0
  135. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/container/docker.py +0 -0
  136. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/remoteaccess/__init__.py +0 -0
  137. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/remoteaccess/anydesk.py +0 -0
  138. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/remoteaccess/remoteaccess.py +0 -0
  139. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/remoteaccess/teamviewer.py +0 -0
  140. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/shell/__init__.py +0 -0
  141. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/shell/powershell.py +0 -0
  142. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/ssh/__init__.py +0 -0
  143. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/ssh/openssh.py +0 -0
  144. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/ssh/opensshd.py +0 -0
  145. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/ssh/putty.py +0 -0
  146. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/ssh/ssh.py +0 -0
  147. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/vpn/__init__.py +0 -0
  148. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/vpn/openvpn.py +0 -0
  149. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/vpn/wireguard.py +0 -0
  150. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/webhosting/__init__.py +0 -0
  151. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/webhosting/cpanel.py +0 -0
  152. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/webserver/__init__.py +0 -0
  153. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/webserver/apache.py +0 -0
  154. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/webserver/caddy.py +0 -0
  155. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/webserver/citrix.py +0 -0
  156. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/webserver/iis.py +0 -0
  157. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/webserver/nginx.py +0 -0
  158. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/apps/webserver/webserver.py +0 -0
  159. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/child/__init__.py +0 -0
  160. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/child/docker.py +0 -0
  161. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/child/esxi.py +0 -0
  162. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/child/hyperv.py +0 -0
  163. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/child/virtuozzo.py +0 -0
  164. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/child/vmware_workstation.py +0 -0
  165. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/child/wsl.py +0 -0
  166. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/filesystem/__init__.py +0 -0
  167. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/filesystem/acquire_handles.py +0 -0
  168. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/filesystem/acquire_hash.py +0 -0
  169. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/filesystem/icat.py +0 -0
  170. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/filesystem/ntfs/__init__.py +0 -0
  171. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/filesystem/ntfs/mft.py +0 -0
  172. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/filesystem/ntfs/mft_timeline.py +0 -0
  173. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/filesystem/ntfs/usnjrnl.py +0 -0
  174. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/filesystem/ntfs/utils.py +0 -0
  175. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/filesystem/resolver.py +0 -0
  176. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/filesystem/unix/__init__.py +0 -0
  177. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/filesystem/unix/capability.py +0 -0
  178. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/filesystem/unix/suid.py +0 -0
  179. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/filesystem/walkfs.py +0 -0
  180. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/filesystem/yara.py +0 -0
  181. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/general/__init__.py +0 -0
  182. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/general/config.py +0 -0
  183. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/general/default.py +0 -0
  184. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/general/example.py +0 -0
  185. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/general/loaders.py +0 -0
  186. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/general/osinfo.py +0 -0
  187. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/general/plugins.py +0 -0
  188. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/general/scrape.py +0 -0
  189. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/__init__.py +0 -0
  190. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/__init__.py +0 -0
  191. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/_os.py +0 -0
  192. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/bsd/__init__.py +0 -0
  193. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/bsd/_os.py +0 -0
  194. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/bsd/citrix/__init__.py +0 -0
  195. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/bsd/citrix/_os.py +0 -0
  196. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/bsd/citrix/history.py +0 -0
  197. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/bsd/freebsd/__init__.py +0 -0
  198. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/bsd/freebsd/_os.py +0 -0
  199. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/bsd/ios/__init__.py +0 -0
  200. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/bsd/ios/_os.py +0 -0
  201. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/bsd/openbsd/__init__.py +0 -0
  202. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/bsd/openbsd/_os.py +0 -0
  203. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/bsd/osx/__init__.py +0 -0
  204. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/bsd/osx/_os.py +0 -0
  205. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/bsd/osx/user.py +0 -0
  206. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/cronjobs.py +0 -0
  207. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/datetime.py +0 -0
  208. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/esxi/__init__.py +0 -0
  209. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/esxi/_os.py +0 -0
  210. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/etc/__init__.py +0 -0
  211. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/etc/etc.py +0 -0
  212. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/etc.py +0 -0
  213. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/generic.py +0 -0
  214. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/history.py +0 -0
  215. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/__init__.py +0 -0
  216. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/_os.py +0 -0
  217. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/android/__init__.py +0 -0
  218. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/android/_os.py +0 -0
  219. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/cmdline.py +0 -0
  220. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/debian/__init__.py +0 -0
  221. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/debian/_os.py +0 -0
  222. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/debian/apt.py +0 -0
  223. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/debian/dpkg.py +0 -0
  224. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/debian/vyos/__init__.py +0 -0
  225. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/debian/vyos/_os.py +0 -0
  226. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/environ.py +0 -0
  227. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/fortios/__init__.py +0 -0
  228. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/fortios/_keys.py +0 -0
  229. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/fortios/_os.py +0 -0
  230. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/fortios/generic.py +0 -0
  231. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/fortios/locale.py +0 -0
  232. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/iptables.py +0 -0
  233. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/modules.py +0 -0
  234. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/netstat.py +0 -0
  235. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/proc.py +0 -0
  236. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/processes.py +0 -0
  237. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/redhat/__init__.py +0 -0
  238. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/redhat/_os.py +0 -0
  239. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/redhat/yum.py +0 -0
  240. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/services.py +0 -0
  241. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/sockets.py +0 -0
  242. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/suse/__init__.py +0 -0
  243. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/suse/_os.py +0 -0
  244. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/linux/suse/zypper.py +0 -0
  245. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/locale.py +0 -0
  246. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/locate/__init__.py +0 -0
  247. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/locate/gnulocate.py +0 -0
  248. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/locate/locate.py +0 -0
  249. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/locate/mlocate.py +0 -0
  250. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/locate/plocate.py +0 -0
  251. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/log/__init__.py +0 -0
  252. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/log/atop.py +0 -0
  253. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/log/audit.py +0 -0
  254. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/log/auth.py +0 -0
  255. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/log/journal.py +0 -0
  256. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/log/lastlog.py +0 -0
  257. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/log/messages.py +0 -0
  258. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/log/utmp.py +0 -0
  259. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/packagemanager.py +0 -0
  260. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/unix/shadow.py +0 -0
  261. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/__init__.py +0 -0
  262. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/_os.py +0 -0
  263. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/activitiescache.py +0 -0
  264. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/adpolicy.py +0 -0
  265. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/amcache.py +0 -0
  266. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/catroot.py +0 -0
  267. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/cim.py +0 -0
  268. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/clfs.py +0 -0
  269. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/credhist.py +0 -0
  270. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/datetime.py +0 -0
  271. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/defender.py +0 -0
  272. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/defender_helpers/__init__.py +0 -0
  273. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/defender_helpers/defender_patterns.py +0 -0
  274. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/defender_helpers/defender_records.py +0 -0
  275. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/dpapi/__init__.py +0 -0
  276. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/dpapi/blob.py +0 -0
  277. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/dpapi/crypto.py +0 -0
  278. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/dpapi/dpapi.py +0 -0
  279. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/dpapi/master_key.py +0 -0
  280. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/env.py +0 -0
  281. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/exchange/__init__.py +0 -0
  282. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/exchange/exchange.py +0 -0
  283. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/generic.py +0 -0
  284. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/lnk.py +0 -0
  285. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/locale.py +0 -0
  286. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/log/__init__.py +0 -0
  287. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/log/amcache.py +0 -0
  288. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/log/etl.py +0 -0
  289. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/log/evt.py +0 -0
  290. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/log/evtx.py +0 -0
  291. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/log/pfro.py +0 -0
  292. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/log/schedlgu.py +0 -0
  293. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/notifications.py +0 -0
  294. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/prefetch.py +0 -0
  295. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/recyclebin.py +0 -0
  296. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/regf/7zip.py +0 -0
  297. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/regf/__init__.py +0 -0
  298. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/regf/appxdebugkeys.py +0 -0
  299. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/regf/auditpol.py +0 -0
  300. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/regf/bam.py +0 -0
  301. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/regf/cit.py +0 -0
  302. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/regf/clsid.py +0 -0
  303. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/regf/firewall.py +0 -0
  304. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/regf/mru.py +0 -0
  305. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/regf/muicache.py +0 -0
  306. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/regf/nethist.py +0 -0
  307. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/regf/recentfilecache.py +0 -0
  308. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/regf/regf.py +0 -0
  309. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/regf/runkeys.py +0 -0
  310. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/regf/shellbags.py +0 -0
  311. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/regf/shimcache.py +0 -0
  312. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/regf/trusteddocs.py +0 -0
  313. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/regf/usb.py +0 -0
  314. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/regf/userassist.py +0 -0
  315. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/registry.py +0 -0
  316. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/sam.py +0 -0
  317. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/services.py +0 -0
  318. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/sru.py +0 -0
  319. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/startupinfo.py +0 -0
  320. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/syscache.py +0 -0
  321. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/task_helpers/__init__.py +0 -0
  322. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/task_helpers/tasks_job.py +0 -0
  323. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/task_helpers/tasks_records.py +0 -0
  324. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/task_helpers/tasks_xml.py +0 -0
  325. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/tasks.py +0 -0
  326. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/thumbcache.py +0 -0
  327. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/ual.py +0 -0
  328. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/plugins/os/windows/wer.py +0 -0
  329. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/report.py +0 -0
  330. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/target.py +0 -0
  331. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/tools/__init__.py +0 -0
  332. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/tools/build_pluginlist.py +0 -0
  333. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/tools/dd.py +0 -0
  334. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/tools/dump/__init__.py +0 -0
  335. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/tools/dump/run.py +0 -0
  336. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/tools/dump/state.py +0 -0
  337. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/tools/dump/utils.py +0 -0
  338. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/tools/fs.py +0 -0
  339. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/tools/info.py +0 -0
  340. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/tools/logging.py +0 -0
  341. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/tools/mount.py +0 -0
  342. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/tools/query.py +0 -0
  343. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/tools/reg.py +0 -0
  344. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/tools/shell.py +0 -0
  345. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/tools/utils.py +0 -0
  346. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/tools/yara.py +0 -0
  347. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/volume.py +0 -0
  348. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/volumes/__init__.py +0 -0
  349. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/volumes/bde.py +0 -0
  350. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/volumes/ddf.py +0 -0
  351. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/volumes/disk.py +0 -0
  352. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/volumes/luks.py +0 -0
  353. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/volumes/lvm.py +0 -0
  354. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/volumes/md.py +0 -0
  355. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect/target/volumes/vmfs.py +0 -0
  356. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect.target.egg-info/SOURCES.txt +0 -0
  357. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect.target.egg-info/dependency_links.txt +0 -0
  358. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect.target.egg-info/entry_points.txt +0 -0
  359. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect.target.egg-info/requires.txt +0 -0
  360. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/dissect.target.egg-info/top_level.txt +0 -0
  361. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/pyproject.toml +0 -0
  362. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/setup.cfg +0 -0
  363. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/__init__.py +0 -0
  364. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/_docs/Makefile +0 -0
  365. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/_docs/conf.py +0 -0
  366. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/_docs/index.rst +0 -0
  367. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/_utils.py +0 -0
  368. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/conftest.py +0 -0
  369. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/containers/__init__.py +0 -0
  370. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/containers/test_fortifw.py +0 -0
  371. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/containers/test_split.py +0 -0
  372. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/filesystems/__init__.py +0 -0
  373. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/filesystems/test_cb.py +0 -0
  374. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/filesystems/test_config.py +0 -0
  375. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/filesystems/test_cpio.py +0 -0
  376. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/filesystems/test_dir.py +0 -0
  377. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/filesystems/test_exfat.py +0 -0
  378. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/filesystems/test_fat.py +0 -0
  379. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/filesystems/test_ntfs.py +0 -0
  380. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/filesystems/test_overlay.py +0 -0
  381. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/filesystems/test_smb.py +0 -0
  382. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/filesystems/test_tar.py +0 -0
  383. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/filesystems/test_vmtar.py +0 -0
  384. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/filesystems/test_zip.py +0 -0
  385. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/helpers/__init__.py +0 -0
  386. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/helpers/test_cache.py +0 -0
  387. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/helpers/test_config.py +0 -0
  388. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/helpers/test_configutil.py +0 -0
  389. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/helpers/test_docs.py +0 -0
  390. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/helpers/test_fsutil.py +0 -0
  391. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/helpers/test_hashutil.py +0 -0
  392. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/helpers/test_keychain.py +0 -0
  393. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/helpers/test_loaderutil.py +0 -0
  394. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/helpers/test_localeutil.py +0 -0
  395. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/helpers/test_modifier.py +0 -0
  396. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/helpers/test_protobuf.py +0 -0
  397. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/helpers/test_record.py +0 -0
  398. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/helpers/test_regutil.py +0 -0
  399. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/helpers/test_utils.py +0 -0
  400. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/loaders/__init__.py +0 -0
  401. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/loaders/test_ab.py +0 -0
  402. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/loaders/test_asdf.py +0 -0
  403. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/loaders/test_cb.py +0 -0
  404. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/loaders/test_dir.py +0 -0
  405. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/loaders/test_hyperv.py +0 -0
  406. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/loaders/test_kape.py +0 -0
  407. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/loaders/test_local.py +0 -0
  408. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/loaders/test_log.py +0 -0
  409. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/loaders/test_mqtt.py +0 -0
  410. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/loaders/test_multiraw.py +0 -0
  411. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/loaders/test_ova.py +0 -0
  412. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/loaders/test_overlay.py +0 -0
  413. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/loaders/test_ovf.py +0 -0
  414. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/loaders/test_phobos.py +0 -0
  415. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/loaders/test_pvm.py +0 -0
  416. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/loaders/test_pvs.py +0 -0
  417. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/loaders/test_remote.py +0 -0
  418. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/loaders/test_smb.py +0 -0
  419. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/loaders/test_tanium.py +0 -0
  420. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/loaders/test_tar.py +0 -0
  421. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/loaders/test_utm.py +0 -0
  422. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/loaders/test_vbox.py +0 -0
  423. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/loaders/test_velociraptor.py +0 -0
  424. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/loaders/test_vmwarevm.py +0 -0
  425. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/__init__.py +0 -0
  426. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/__init__.py +0 -0
  427. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/av/__init__.py +0 -0
  428. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/av/test_mcafee.py +0 -0
  429. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/av/test_sophos.py +0 -0
  430. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/av/test_symantec.py +0 -0
  431. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/av/test_trendmicro.py +0 -0
  432. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/browser/__init__.py +0 -0
  433. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/browser/test_brave.py +0 -0
  434. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/browser/test_chrome.py +0 -0
  435. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/browser/test_chromium.py +0 -0
  436. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/browser/test_edge.py +0 -0
  437. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/browser/test_iexplore.py +0 -0
  438. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/container/__init__.py +0 -0
  439. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/container/test_docker.py +0 -0
  440. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/remoteaccess/__init__.py +0 -0
  441. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/remoteaccess/test_anydesk.py +0 -0
  442. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/remoteaccess/test_teamviewer.py +0 -0
  443. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/shell/__init__.py +0 -0
  444. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/shell/test_powershell.py +0 -0
  445. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/ssh/__init__.py +0 -0
  446. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/ssh/test_openssh.py +0 -0
  447. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/ssh/test_opensshd.py +0 -0
  448. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/ssh/test_putty.py +0 -0
  449. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/vpn/__init__.py +0 -0
  450. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/vpn/test_openvpn.py +0 -0
  451. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/vpn/test_wireguard.py +0 -0
  452. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/webhosting/__init__.py +0 -0
  453. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/webhosting/test_cpanel.py +0 -0
  454. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/webserver/__init__.py +0 -0
  455. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/webserver/test_apache.py +0 -0
  456. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/webserver/test_caddy.py +0 -0
  457. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/webserver/test_citrix.py +0 -0
  458. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/webserver/test_iis.py +0 -0
  459. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/webserver/test_nginx.py +0 -0
  460. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/apps/webserver/test_webserver.py +0 -0
  461. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/child/__init__.py +0 -0
  462. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/child/test_docker.py +0 -0
  463. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/child/test_hyperv.py +0 -0
  464. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/child/test_virtuozzo.py +0 -0
  465. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/child/test_wsl.py +0 -0
  466. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/filesystem/__init__.py +0 -0
  467. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/filesystem/ntfs/__init__.py +0 -0
  468. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/filesystem/ntfs/test_mft.py +0 -0
  469. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/filesystem/ntfs/test_usnjrnl.py +0 -0
  470. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/filesystem/test_acquire_handles.py +0 -0
  471. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/filesystem/test_acquire_hash.py +0 -0
  472. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/filesystem/test_icat.py +0 -0
  473. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/filesystem/test_resolver.py +0 -0
  474. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/filesystem/test_walkfs.py +0 -0
  475. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/filesystem/test_yara.py +0 -0
  476. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/filesystem/unix/__init__.py +0 -0
  477. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/filesystem/unix/test_capability.py +0 -0
  478. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/filesystem/unix/test_suid.py +0 -0
  479. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/general/__init__.py +0 -0
  480. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/general/test_config.py +0 -0
  481. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/general/test_default.py +0 -0
  482. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/general/test_plugins.py +0 -0
  483. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/general/test_scrape.py +0 -0
  484. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/general/test_users.py +0 -0
  485. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/__init__.py +0 -0
  486. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/__init__.py +0 -0
  487. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/bsd/__init__.py +0 -0
  488. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/bsd/citrix/__init__.py +0 -0
  489. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/bsd/citrix/test__os.py +0 -0
  490. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/bsd/citrix/test_history.py +0 -0
  491. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/bsd/osx/__init__.py +0 -0
  492. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/bsd/osx/test__os.py +0 -0
  493. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/bsd/osx/test_user.py +0 -0
  494. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/esxi/__init__.py +0 -0
  495. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/esxi/test__os.py +0 -0
  496. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/linux/__init__.py +0 -0
  497. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/linux/android/__init__.py +0 -0
  498. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/linux/android/test__os.py +0 -0
  499. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/linux/debian/__init__.py +0 -0
  500. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/linux/debian/test_apt.py +0 -0
  501. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/linux/debian/test_dpkg.py +0 -0
  502. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/linux/fortios/test_keys.py +0 -0
  503. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/linux/redhat/__init__.py +0 -0
  504. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/linux/redhat/test_yum.py +0 -0
  505. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/linux/suse/__init__.py +0 -0
  506. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/linux/suse/test_zypper.py +0 -0
  507. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/linux/test_cmdline.py +0 -0
  508. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/linux/test_environ.py +0 -0
  509. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/linux/test_iptables.py +0 -0
  510. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/linux/test_modules.py +0 -0
  511. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/linux/test_netstat.py +0 -0
  512. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/linux/test_proc.py +0 -0
  513. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/linux/test_processes.py +0 -0
  514. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/linux/test_services.py +0 -0
  515. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/linux/test_sockets.py +0 -0
  516. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/locate/__init__.py +0 -0
  517. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/locate/test_gnulocate.py +0 -0
  518. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/locate/test_mlocate.py +0 -0
  519. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/locate/test_plocate.py +0 -0
  520. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/log/__init__.py +0 -0
  521. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/log/test_atop.py +0 -0
  522. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/log/test_audit.py +0 -0
  523. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/log/test_auth.py +0 -0
  524. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/log/test_lastlog.py +0 -0
  525. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/log/test_messages.py +0 -0
  526. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/log/test_utmp.py +0 -0
  527. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/test__os.py +0 -0
  528. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/test_generic.py +0 -0
  529. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/test_history.py +0 -0
  530. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/test_ips.py +0 -0
  531. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/test_journal.py +0 -0
  532. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/test_locale.py +0 -0
  533. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/test_packagemanager.py +0 -0
  534. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/test_shadow.py +0 -0
  535. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/test_users.py +0 -0
  536. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/unix/test_version.py +0 -0
  537. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/__init__.py +0 -0
  538. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/log/test_etl.py +0 -0
  539. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/log/test_evt.py +0 -0
  540. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/log/test_evtx.py +0 -0
  541. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/log/test_schedlgu.py +0 -0
  542. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/regf/__init__.py +0 -0
  543. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/regf/test_appxdebugkeys.py +0 -0
  544. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/regf/test_cit.py +0 -0
  545. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/regf/test_clsid.py +0 -0
  546. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/regf/test_muicache.py +0 -0
  547. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/regf/test_shellbags.py +0 -0
  548. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/regf/test_trusteddocs.py +0 -0
  549. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/regf/test_usb.py +0 -0
  550. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/regf/test_userassist.py +0 -0
  551. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/test__os.py +0 -0
  552. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/test_adpolicy.py +0 -0
  553. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/test_amcache.py +0 -0
  554. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/test_catroot.py +0 -0
  555. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/test_clfs.py +0 -0
  556. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/test_credhist.py +0 -0
  557. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/test_datetime.py +0 -0
  558. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/test_defender.py +0 -0
  559. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/test_dpapi.py +0 -0
  560. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/test_env.py +0 -0
  561. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/test_generic.py +0 -0
  562. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/test_lnk.py +0 -0
  563. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/test_locale.py +0 -0
  564. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/test_mru.py +0 -0
  565. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/test_notifications.py +0 -0
  566. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/test_prefetch.py +0 -0
  567. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/test_recyclebin.py +0 -0
  568. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/test_registry.py +0 -0
  569. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/test_sam.py +0 -0
  570. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/test_shimcache.py +0 -0
  571. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/test_sru.py +0 -0
  572. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/test_syscache.py +0 -0
  573. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/test_tasks.py +0 -0
  574. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/test_thumbcache.py +0 -0
  575. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/test_ual.py +0 -0
  576. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/plugins/os/windows/test_wer.py +0 -0
  577. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/test_container.py +0 -0
  578. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/test_filesystem.py +0 -0
  579. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/test_plugin.py +0 -0
  580. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/test_registration.py +0 -0
  581. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/test_report.py +0 -0
  582. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/test_target.py +0 -0
  583. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/test_volume.py +0 -0
  584. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/tools/__init__.py +0 -0
  585. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/tools/test_dump.py +0 -0
  586. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/tools/test_fs.py +0 -0
  587. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/tools/test_mount.py +0 -0
  588. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/tools/test_query.py +0 -0
  589. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/tools/test_reg.py +0 -0
  590. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/tools/test_shell.py +0 -0
  591. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/tools/test_utils.py +0 -0
  592. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/tools/test_yara.py +0 -0
  593. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/volumes/__init__.py +0 -0
  594. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/volumes/test_bde.py +0 -0
  595. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tests/volumes/test_md.py +0 -0
  596. {dissect_target-3.19.dev28 → dissect_target-3.19.dev29}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dissect.target
3
- Version: 3.19.dev28
3
+ Version: 3.19.dev29
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
@@ -3,6 +3,7 @@ import json
3
3
  import logging
4
4
  from base64 import b64decode
5
5
  from hashlib import pbkdf2_hmac, sha1
6
+ from itertools import chain
6
7
  from typing import Iterator, Optional
7
8
 
8
9
  from dissect.sql import sqlite3
@@ -14,7 +15,7 @@ from dissect.target.exceptions import FileNotFoundError, UnsupportedPluginError
14
15
  from dissect.target.helpers.descriptor_extensions import UserRecordDescriptorExtension
15
16
  from dissect.target.helpers.fsutil import TargetPath
16
17
  from dissect.target.helpers.record import create_extended_descriptor
17
- from dissect.target.plugin import export
18
+ from dissect.target.plugin import OperatingSystem, export
18
19
  from dissect.target.plugins.apps.browser.browser import (
19
20
  GENERIC_COOKIE_FIELDS,
20
21
  GENERIC_DOWNLOAD_RECORD_FIELDS,
@@ -24,7 +25,7 @@ from dissect.target.plugins.apps.browser.browser import (
24
25
  BrowserPlugin,
25
26
  try_idna,
26
27
  )
27
- from dissect.target.plugins.general.users import UserDetails
28
+ from dissect.target.plugins.general.users import UserRecord
28
29
 
29
30
  try:
30
31
  from asn1crypto import algos, core
@@ -44,7 +45,10 @@ try:
44
45
  except ImportError:
45
46
  HAS_CRYPTO = False
46
47
 
47
- FIREFOX_EXTENSION_RECORD_FIELDS = [("uri", "source_uri"), ("string[]", "optional_permissions")]
48
+ FIREFOX_EXTENSION_RECORD_FIELDS = [
49
+ ("uri", "source_uri"),
50
+ ("string[]", "optional_permissions"),
51
+ ]
48
52
 
49
53
  log = logging.getLogger(__name__)
50
54
 
@@ -54,7 +58,7 @@ class FirefoxPlugin(BrowserPlugin):
54
58
 
55
59
  __namespace__ = "firefox"
56
60
 
57
- DIRS = [
61
+ USER_DIRS = [
58
62
  # Windows
59
63
  "AppData/Roaming/Mozilla/Firefox/Profiles",
60
64
  "AppData/local/Mozilla/Firefox/Profiles",
@@ -66,6 +70,10 @@ class FirefoxPlugin(BrowserPlugin):
66
70
  "Library/Application Support/Firefox",
67
71
  ]
68
72
 
73
+ SYSTEM_DIRS = [
74
+ "/data/data/org.mozilla.vrbrowser/files/mozilla",
75
+ ]
76
+
69
77
  BrowserHistoryRecord = create_extended_descriptor([UserRecordDescriptorExtension])(
70
78
  "browser/firefox/history", GENERIC_HISTORY_RECORD_FIELDS
71
79
  )
@@ -79,7 +87,8 @@ class FirefoxPlugin(BrowserPlugin):
79
87
  )
80
88
 
81
89
  BrowserExtensionRecord = create_extended_descriptor([UserRecordDescriptorExtension])(
82
- "browser/firefox/extension", GENERIC_EXTENSION_RECORD_FIELDS + FIREFOX_EXTENSION_RECORD_FIELDS
90
+ "browser/firefox/extension",
91
+ GENERIC_EXTENSION_RECORD_FIELDS + FIREFOX_EXTENSION_RECORD_FIELDS,
83
92
  )
84
93
 
85
94
  BrowserPasswordRecord = create_extended_descriptor([UserRecordDescriptorExtension])(
@@ -88,27 +97,32 @@ class FirefoxPlugin(BrowserPlugin):
88
97
 
89
98
  def __init__(self, target):
90
99
  super().__init__(target)
91
- self.users_dirs: list[tuple[UserDetails, TargetPath]] = []
100
+ self.dirs: list[tuple[UserRecord, TargetPath]] = []
101
+
92
102
  for user_details in self.target.user_details.all_with_home():
93
- for directory in self.DIRS:
103
+ for directory in self.USER_DIRS:
94
104
  cur_dir = user_details.home_path.joinpath(directory)
95
105
  if not cur_dir.exists():
96
106
  continue
97
- self.users_dirs.append((user_details, cur_dir))
107
+ self.dirs.append((user_details.user, cur_dir))
108
+
109
+ for directory in self.SYSTEM_DIRS:
110
+ if (cur_dir := target.fs.path(directory)).exists():
111
+ self.dirs.append((None, cur_dir))
98
112
 
99
113
  def check_compatible(self) -> None:
100
- if not len(self.users_dirs):
114
+ if not len(self.dirs):
101
115
  raise UnsupportedPluginError("No Firefox directories found")
102
116
 
103
- def _iter_profiles(self) -> Iterator[tuple[UserDetails, TargetPath, TargetPath]]:
117
+ def _iter_profiles(self) -> Iterator[tuple[UserRecord, TargetPath, TargetPath]]:
104
118
  """Yield user directories."""
105
- for user, cur_dir in self.users_dirs:
119
+ for user, cur_dir in self.dirs:
106
120
  for profile_dir in cur_dir.iterdir():
107
121
  if not profile_dir.is_dir():
108
122
  continue
109
123
  yield user, cur_dir, profile_dir
110
124
 
111
- def _iter_db(self, filename: str) -> Iterator[tuple[UserDetails, SQLite3]]:
125
+ def _iter_db(self, filename: str) -> Iterator[tuple[UserRecord, SQLite3]]:
112
126
  """Yield opened history database files of all users.
113
127
 
114
128
  Args:
@@ -117,12 +131,24 @@ class FirefoxPlugin(BrowserPlugin):
117
131
  Yields:
118
132
  Opened SQLite3 databases.
119
133
  """
120
- for user, cur_dir, profile_dir in self._iter_profiles():
121
- db_file = profile_dir.joinpath(filename)
134
+ iter_system = ((None, system_dir, None) for user, system_dir in self.dirs if user is None)
135
+
136
+ for user, cur_dir, profile_dir in chain(iter_system, self._iter_profiles()):
137
+ if user is None and profile_dir is None:
138
+ db_file = cur_dir.parent.joinpath(filename)
139
+ # On some Android variants, some files may exist in the base directory (places.sqlite) but others
140
+ # in a nested profile directory (cookies.sqlite)
141
+ # /data/data/org.mozilla.vrbrowser/files/places.sqlite
142
+ # /data/data/org.mozilla.vrbrowser/files/mozilla/xxxxxx.default/cookies.sqlite
143
+ if not db_file.exists():
144
+ continue
145
+ else:
146
+ db_file = profile_dir.joinpath(filename)
147
+
122
148
  try:
123
149
  yield user, db_file, sqlite3.SQLite3(db_file.open())
124
150
  except FileNotFoundError:
125
- self.target.log.warning("Could not find %s file: %s", filename, db_file)
151
+ self.target.log.info("Could not find %s file: %s", filename, db_file)
126
152
  except SQLError as e:
127
153
  self.target.log.warning("Could not open %s file: %s", filename, db_file)
128
154
  self.target.log.debug("", exc_info=e)
@@ -151,6 +177,11 @@ class FirefoxPlugin(BrowserPlugin):
151
177
  from_url (uri): URL of the "from" visit.
152
178
  source: (path): The source file of the history record.
153
179
  """
180
+ if self.target.os == OperatingSystem.ANDROID:
181
+ from_timestamp = from_unix_ms
182
+ else:
183
+ from_timestamp = from_unix_us
184
+
154
185
  for user, db_file, db in self._iter_db("places.sqlite"):
155
186
  try:
156
187
  places = {row.id: row for row in db.table("moz_places").rows()}
@@ -167,7 +198,7 @@ class FirefoxPlugin(BrowserPlugin):
167
198
  from_visit, from_place = None, None
168
199
 
169
200
  yield self.BrowserHistoryRecord(
170
- ts=from_unix_us(row.visit_date),
201
+ ts=from_timestamp(row.visit_date),
171
202
  browser="firefox",
172
203
  id=row.id,
173
204
  url=try_idna(place.url),
@@ -183,7 +214,7 @@ class FirefoxPlugin(BrowserPlugin):
183
214
  from_url=try_idna(from_place.url) if from_place else None,
184
215
  source=db_file,
185
216
  _target=self.target,
186
- _user=user.user,
217
+ _user=user,
187
218
  )
188
219
  except SQLError as e:
189
220
  self.target.log.warning("Error processing history file: %s", db_file, exc_info=e)
@@ -229,7 +260,7 @@ class FirefoxPlugin(BrowserPlugin):
229
260
  same_site=bool(cookie.sameSite),
230
261
  source=db_file,
231
262
  _target=self.target,
232
- _user=user.user,
263
+ _user=user,
233
264
  )
234
265
  except SQLError as e:
235
266
  self.target.log.warning("Error processing cookie file: %s", db_file, exc_info=e)
@@ -255,7 +286,10 @@ class FirefoxPlugin(BrowserPlugin):
255
286
  for user, db_file, db in self._iter_db("places.sqlite"):
256
287
  try:
257
288
  places = {row.id: row for row in db.table("moz_places").rows()}
258
- attributes = {row.id: row.name for row in db.table("moz_anno_attributes").rows()}
289
+ if not (moz_anno_attributes := db.table("moz_anno_attributes")):
290
+ continue
291
+
292
+ attributes = {row.id: row.name for row in moz_anno_attributes.rows()}
259
293
  annotations = {}
260
294
 
261
295
  for row in db.table("moz_annos"):
@@ -316,7 +350,7 @@ class FirefoxPlugin(BrowserPlugin):
316
350
  state=state,
317
351
  source=db_file,
318
352
  _target=self.target,
319
- _user=user.user,
353
+ _user=user,
320
354
  )
321
355
  except SQLError as e:
322
356
  self.target.log.warning("Error processing history file: %s", db_file, exc_info=e)
@@ -351,7 +385,9 @@ class FirefoxPlugin(BrowserPlugin):
351
385
 
352
386
  if not extension_file.exists():
353
387
  self.target.log.warning(
354
- "No 'extensions.json' addon file found for user %s in directory %s", user.user.name, profile_dir
388
+ "No 'extensions.json' addon file found for user %s in directory %s",
389
+ user.name,
390
+ profile_dir,
355
391
  )
356
392
  continue
357
393
 
@@ -360,8 +396,8 @@ class FirefoxPlugin(BrowserPlugin):
360
396
 
361
397
  for extension in extensions.get("addons", []):
362
398
  yield self.BrowserExtensionRecord(
363
- ts_install=extension.get("installDate", 0) // 1000,
364
- ts_update=extension.get("updateDate", 0) // 1000,
399
+ ts_install=from_unix_ms(extension.get("installDate", 0)),
400
+ ts_update=from_unix_ms(extension.get("updateDate", 0)),
365
401
  browser="firefox",
366
402
  id=extension.get("id"),
367
403
  name=(extension.get("defaultLocale", {}) or {}).get("name"),
@@ -377,12 +413,14 @@ class FirefoxPlugin(BrowserPlugin):
377
413
  optional_permissions=(extension.get("optionalPermissions", {}) or {}).get("permissions"),
378
414
  source=extension_file,
379
415
  _target=self.target,
380
- _user=user.user,
416
+ _user=user,
381
417
  )
382
418
 
383
419
  except FileNotFoundError:
384
420
  self.target.log.info(
385
- "No 'extensions.json' addon file found for user %s in directory %s", user.user.name, profile_dir
421
+ "No 'extensions.json' addon file found for user %s in directory %s",
422
+ user.name,
423
+ profile_dir,
386
424
  )
387
425
  except json.JSONDecodeError:
388
426
  self.target.log.warning(
@@ -410,7 +448,9 @@ class FirefoxPlugin(BrowserPlugin):
410
448
 
411
449
  if not login_file.exists():
412
450
  self.target.log.warning(
413
- "No 'logins.json' password file found for user %s in directory %s", user, profile_dir
451
+ "No 'logins.json' password file found for user %s in directory %s",
452
+ user.name,
453
+ profile_dir,
414
454
  )
415
455
  continue
416
456
 
@@ -445,9 +485,9 @@ class FirefoxPlugin(BrowserPlugin):
445
485
  break
446
486
 
447
487
  yield self.BrowserPasswordRecord(
448
- ts_created=login.get("timeCreated", 0) // 1000,
449
- ts_last_used=login.get("timeLastUsed", 0) // 1000,
450
- ts_last_changed=login.get("timePasswordChanged", 0) // 1000,
488
+ ts_created=from_unix_ms(login.get("timeCreated", 0)),
489
+ ts_last_used=from_unix_ms(login.get("timeLastUsed", 0)),
490
+ ts_last_changed=from_unix_ms(login.get("timePasswordChanged", 0)),
451
491
  browser="firefox",
452
492
  id=login.get("id"),
453
493
  url=login.get("hostname"),
@@ -457,14 +497,19 @@ class FirefoxPlugin(BrowserPlugin):
457
497
  decrypted_password=decrypted_password,
458
498
  source=login_file,
459
499
  _target=self.target,
460
- _user=user.user,
500
+ _user=user,
461
501
  )
462
502
 
463
503
  except FileNotFoundError:
464
- self.target.log.info("No password file found for user %s in directory %s", user, profile_dir)
504
+ self.target.log.info(
505
+ "No password file found for user %s in directory %s",
506
+ user.name,
507
+ profile_dir,
508
+ )
465
509
  except json.JSONDecodeError:
466
510
  self.target.log.warning(
467
- "logins.json file in directory %s is malformed, consider inspecting the file manually", profile_dir
511
+ "logins.json file in directory %s is malformed, consider inspecting the file manually",
512
+ profile_dir,
468
513
  )
469
514
 
470
515
 
@@ -1,5 +1,7 @@
1
+ from __future__ import annotations
2
+
1
3
  from functools import lru_cache
2
- from typing import Generator, NamedTuple, Optional, Union
4
+ from typing import Iterator, NamedTuple, Union
3
5
 
4
6
  from dissect.target import Target
5
7
  from dissect.target.exceptions import UnsupportedPluginError
@@ -7,10 +9,12 @@ from dissect.target.helpers.fsutil import TargetPath
7
9
  from dissect.target.helpers.record import UnixUserRecord, WindowsUserRecord
8
10
  from dissect.target.plugin import InternalPlugin
9
11
 
12
+ UserRecord = Union[UnixUserRecord, WindowsUserRecord]
13
+
10
14
 
11
15
  class UserDetails(NamedTuple):
12
- user: Union[UnixUserRecord, WindowsUserRecord]
13
- home_path: Optional[TargetPath]
16
+ user: UserRecord
17
+ home_path: TargetPath | None
14
18
 
15
19
 
16
20
  class UsersPlugin(InternalPlugin):
@@ -28,11 +32,11 @@ class UsersPlugin(InternalPlugin):
28
32
 
29
33
  def find(
30
34
  self,
31
- sid: Optional[str] = None,
32
- uid: Optional[str] = None,
33
- username: Optional[str] = None,
35
+ sid: str | None = None,
36
+ uid: str | None = None,
37
+ username: str | None = None,
34
38
  force_case_sensitive: bool = False,
35
- ) -> Optional[UserDetails]:
39
+ ) -> UserDetails | None:
36
40
  """Find User record matching provided sid, uid or username and return UserDetails object"""
37
41
  if all(map(lambda x: x is None, [sid, uid, username])):
38
42
  raise ValueError("Either sid or uid or username is expected")
@@ -52,7 +56,7 @@ class UsersPlugin(InternalPlugin):
52
56
  ):
53
57
  return self.get(user)
54
58
 
55
- def get(self, user: Union[UnixUserRecord, WindowsUserRecord]) -> UserDetails:
59
+ def get(self, user: UserRecord) -> UserDetails:
56
60
  """Return additional details about the user"""
57
61
  # Resolving the user home can not use the user's environment variables,
58
62
  # as those depend on the user's home to be known first. So we resolve
@@ -60,12 +64,12 @@ class UsersPlugin(InternalPlugin):
60
64
  home_path = self.target.fs.path(self.target.resolve(str(user.home))) if user.home else None
61
65
  return UserDetails(user=user, home_path=home_path)
62
66
 
63
- def all(self) -> Generator[UserDetails, None, None]:
67
+ def all(self) -> Iterator[UserDetails]:
64
68
  """Return UserDetails objects for all users found"""
65
69
  for user in self.target.users():
66
70
  yield self.get(user)
67
71
 
68
- def all_with_home(self) -> Generator[UserDetails, None, None]:
72
+ def all_with_home(self) -> Iterator[UserDetails]:
69
73
  """Return UserDetails objects for users that have existing directory set as home directory"""
70
74
  for user in self.target.users():
71
75
  if user.home:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dissect.target
3
- Version: 3.19.dev28
3
+ Version: 3.19.dev29
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
@@ -2,7 +2,6 @@ from typing import Iterator
2
2
  from unittest.mock import patch
3
3
 
4
4
  import pytest
5
- from _pytest.fixtures import fixture
6
5
  from asn1crypto.algos import EncryptionAlgorithmId
7
6
  from flow.record.fieldtypes import datetime as dt
8
7
 
@@ -47,6 +46,18 @@ def target_firefox_unix(target_unix_users: Target, fs_unix: VirtualFilesystem) -
47
46
  yield target_unix_users
48
47
 
49
48
 
49
+ @pytest.fixture
50
+ def target_firefox_oculus(target_android: Target, fs_android: VirtualFilesystem) -> Iterator[Target]:
51
+ fs_android.map_dir(
52
+ "/data/data/org.mozilla.vrbrowser",
53
+ absolute_path("_data/plugins/apps/browser/firefox/android/org.mozilla.vrbrowser"),
54
+ )
55
+
56
+ target_android.add_plugin(FirefoxPlugin)
57
+
58
+ yield target_android
59
+
60
+
50
61
  @pytest.mark.parametrize(
51
62
  "target_platform",
52
63
  ["target_firefox_win", "target_firefox_unix"],
@@ -99,6 +110,7 @@ def test_firefox_cookies(target_platform: Target, request: pytest.FixtureRequest
99
110
  assert len(records) == 4
100
111
  assert set(["firefox"]) == set(record.browser for record in records)
101
112
 
113
+ assert records[0].ts_created == dt("2023-07-13 09:53:47.460676+00:00")
102
114
  assert sorted([*map(lambda c: c.name, records)]) == [
103
115
  "_lr_env_src_ats",
104
116
  "_lr_retry_request",
@@ -119,8 +131,8 @@ def test_firefox_extensions(target_platform: Target, request: pytest.FixtureRequ
119
131
  assert set(["firefox"]) == set(record.browser for record in records)
120
132
  assert len(records) == 2
121
133
  assert records[0].id == "uBlock0@raymondhill.net"
122
- assert records[0].ts_install == dt("2024-04-23 07:07:21+00:00")
123
- assert records[0].ts_update == dt("2024-04-23 07:07:21+00:00")
134
+ assert records[0].ts_install == dt("2024-04-23 07:07:21.516000+00:00")
135
+ assert records[0].ts_update == dt("2024-04-23 07:07:21.516000+00:00")
124
136
  assert (
125
137
  records[0].ext_path == "C:\\Users\\Win11\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles"
126
138
  "\\9nxit8q0.default-release\\extensions\\uBlock0@raymondhill.net.xpi"
@@ -144,7 +156,7 @@ def test_firefox_extensions(target_platform: Target, request: pytest.FixtureRequ
144
156
  "target_platform",
145
157
  ["target_firefox_win", "target_firefox_unix"],
146
158
  )
147
- def test_firefox_password_plugin(target_platform: Target, request: pytest.FixtureRequest) -> None:
159
+ def test_firefox_passwords(target_platform: Target, request: pytest.FixtureRequest) -> None:
148
160
  target_platform = request.getfixturevalue(target_platform)
149
161
 
150
162
  records = list(target_platform.firefox.passwords())
@@ -156,9 +168,7 @@ def test_firefox_password_plugin(target_platform: Target, request: pytest.Fixtur
156
168
  assert record.decrypted_password == "password"
157
169
 
158
170
 
159
- def test_unix_firefox_password_plugin_with_primary_password(
160
- target_unix_users: Target, fs_unix: VirtualFilesystem
161
- ) -> None:
171
+ def test_unix_firefox_passwords_with_primary_password(target_unix_users: Target, fs_unix: VirtualFilesystem) -> None:
162
172
  fs_unix.map_dir(
163
173
  "/root/.mozilla/firefox/g1rbw8y7.default-release/",
164
174
  absolute_path("_data/plugins/apps/browser/firefox/passwords/primary/"),
@@ -185,8 +195,76 @@ def test_unix_firefox_password_plugin_with_primary_password(
185
195
  assert record.decrypted_password == "password"
186
196
 
187
197
 
188
- @fixture
189
- def path_key4(fs_unix):
198
+ def test_firefox_oculus_history(target_firefox_oculus: Target) -> None:
199
+ records = list(target_firefox_oculus.firefox.history())
200
+
201
+ assert len(records) == 191
202
+ assert set(["firefox"]) == set(record.browser for record in records)
203
+
204
+ assert records[0].url == "https://webxr.today/"
205
+ assert records[0].id == "1"
206
+ assert records[0].description == "47356570952011"
207
+ assert records[0].ts == dt("2021-11-04 13:29:30.780000+00:00")
208
+
209
+
210
+ def test_firefox_oculus_cookies(target_firefox_oculus: Target) -> None:
211
+ records = list(target_firefox_oculus.firefox.cookies())
212
+
213
+ assert len(records) == 33
214
+ assert set(["firefox"]) == set(record.browser for record in records)
215
+
216
+ assert records[0].ts_created == dt("2023-07-06 07:50:55.352988+00:00")
217
+ assert sorted([*map(lambda c: c.name, records)]) == [
218
+ "AEC",
219
+ "AWSALBTGCORS",
220
+ "CONSENT",
221
+ "Features",
222
+ "Locale",
223
+ "NID",
224
+ "OptanonConsent",
225
+ "SNID",
226
+ "SOCS",
227
+ "Session-Id",
228
+ "Tag",
229
+ "Tag",
230
+ "Tag",
231
+ "Tag",
232
+ "VISITOR_INFO1_LIVE",
233
+ "_ga",
234
+ "_ga_18EC69JQ0P",
235
+ "_ga_2VC139B3XV",
236
+ "_gat_gtag_UA_36116321_2",
237
+ "_gid",
238
+ "_hjFirstSeen",
239
+ "count",
240
+ "is-proton-user",
241
+ "lst",
242
+ "lst",
243
+ "mp_abe3945ad0ddaadc3d987393d8d7c2ce_mixpanel",
244
+ "session_id",
245
+ "spid.6b32",
246
+ "spses.6b32",
247
+ "visid_incap_1329355",
248
+ "visid_incap_2188750",
249
+ "visid_incap_2295456",
250
+ "visid_incap_2809573",
251
+ ]
252
+
253
+
254
+ def test_firefox_oculus_extensions(target_firefox_oculus: Target) -> None:
255
+ records = list(target_firefox_oculus.firefox.extensions())
256
+
257
+ assert set(["firefox"]) == set(record.browser for record in records)
258
+ assert len(records) == 5
259
+ assert records[0].id == "default-theme@mozilla.org"
260
+ assert records[0].ts_install == dt("2021-11-04 13:29:29.988000+00:00")
261
+ assert records[0].ts_update == dt("1970-01-01 00:00:00+00:00")
262
+ assert records[0].ext_path is None
263
+ assert records[0].permissions == []
264
+
265
+
266
+ @pytest.fixture
267
+ def path_key4(fs_unix: VirtualFilesystem) -> TargetPath:
190
268
  fs_unix.map_file(
191
269
  "/key4.db",
192
270
  absolute_path("_data/plugins/apps/browser/firefox/key4.db"),
@@ -197,8 +275,8 @@ def path_key4(fs_unix):
197
275
  PRIMARY_PASSWORD = "PrimaryPassword"
198
276
 
199
277
 
200
- @fixture
201
- def path_key4_primary_password(fs_unix):
278
+ @pytest.fixture
279
+ def path_key4_primary_password(fs_unix: VirtualFilesystem) -> TargetPath:
202
280
  fs_unix.map_file(
203
281
  "/key4.db",
204
282
  absolute_path("_data/plugins/apps/browser/firefox/passwords/primary/key4.db"),
@@ -206,45 +284,45 @@ def path_key4_primary_password(fs_unix):
206
284
  return TargetPath(fs_unix, "/key4.db")
207
285
 
208
286
 
209
- @fixture
210
- def logins():
287
+ @pytest.fixture
288
+ def logins() -> dict[str, str]:
211
289
  return {
212
290
  "username": "MDoEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECIFVMX6MyYxpBBC2j8K+bCEaE9/FmqE1wo2A",
213
291
  "password": "MDoEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECB2ZPCZBORUJBBDZ8dBZUVgECoiFD5vPvTbP",
214
292
  }
215
293
 
216
294
 
217
- @fixture
218
- def logins_with_primary_password():
295
+ @pytest.fixture
296
+ def logins_with_primary_password() -> dict[str, str]:
219
297
  return {
220
298
  "username": "MDoEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECPEZvPh6dhBkBBB3/O2puJy1NiBUo5gS8hZh",
221
299
  "password": "MDoEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECM00msnMxFyVBBByTarrnS+FSR5OHQhZfs8t",
222
300
  }
223
301
 
224
302
 
225
- @fixture
226
- def decrypted():
303
+ @pytest.fixture
304
+ def decrypted() -> dict[str, str]:
227
305
  return {
228
306
  "username": "username",
229
307
  "password": "password",
230
308
  }
231
309
 
232
310
 
233
- def test_decrypt_is_succesful(path_key4, logins, decrypted):
311
+ def test_decrypt_is_succesful(path_key4: TargetPath, logins: dict[str, str], decrypted: dict[str, str]) -> None:
234
312
  dec_username, dec_password = decrypt(logins.get("username"), logins.get("password"), path_key4)
235
313
  assert dec_username == decrypted.get("username")
236
314
  assert dec_password == decrypted.get("password")
237
315
 
238
316
 
239
317
  @patch("dissect.target.plugins.apps.browser.firefox.retrieve_master_key", side_effect=ValueError(""))
240
- def test_decrypt_bad_master_key(mock_target, path_key4, logins):
318
+ def test_decrypt_bad_master_key(path_key4: TargetPath, logins: dict[str, str]) -> None:
241
319
  with pytest.raises(ValueError):
242
320
  decrypt(logins.get("username"), logins.get("password"), path_key4)
243
321
 
244
322
 
245
323
  def test_decrypt_with_primary_password_is_succesful(
246
- path_key4_primary_password, logins_with_primary_password, decrypted
247
- ):
324
+ path_key4_primary_password: TargetPath, logins_with_primary_password: dict[str, str], decrypted: dict[str, str]
325
+ ) -> None:
248
326
  dec_username, dec_password = decrypt(
249
327
  logins_with_primary_password.get("username"),
250
328
  logins_with_primary_password.get("password"),
@@ -256,9 +334,9 @@ def test_decrypt_with_primary_password_is_succesful(
256
334
 
257
335
 
258
336
  def test_decrypt_with_bad_primary_password_is_unsuccesful(
259
- path_key4_primary_password,
260
- logins_with_primary_password,
261
- ):
337
+ path_key4_primary_password: TargetPath,
338
+ logins_with_primary_password: dict[str, str],
339
+ ) -> None:
262
340
  with pytest.raises(ValueError) as e:
263
341
  decrypt(
264
342
  logins_with_primary_password.get("username"),
@@ -269,7 +347,7 @@ def test_decrypt_with_bad_primary_password_is_unsuccesful(
269
347
  assert e.msg == "Failed to decrypt password using keyfile /key4.db and password 'BAD_PRIMARY_PASSWORD'"
270
348
 
271
349
 
272
- def test_retrieve_master_key_is_succesful(path_key4):
350
+ def test_retrieve_master_key_is_succesful(path_key4: TargetPath) -> None:
273
351
  key, algorithm = retrieve_master_key(b"", path_key4)
274
352
 
275
353
  assert EncryptionAlgorithmId.map(algorithm) == "pbes2"
@@ -277,13 +355,13 @@ def test_retrieve_master_key_is_succesful(path_key4):
277
355
 
278
356
 
279
357
  @patch("dissect.target.plugins.apps.browser.firefox.query_master_key", return_value=(b"aaaa", "BAD_CKA_VALUE"))
280
- def test_retrieve_master_key_bad_cka_value(mock_target, path_key4):
358
+ def test_retrieve_master_key_bad_cka_value(mock_target: Target, path_key4: TargetPath) -> None:
281
359
  with pytest.raises(ValueError) as e:
282
360
  retrieve_master_key(b"", path_key4)
283
361
  assert "Password master key CKA_ID 'BAD_CKA_VALUE' is not equal to expected value" in e.msg
284
362
 
285
363
 
286
- def test_query_master_key(path_key4):
364
+ def test_query_master_key(path_key4: TargetPath) -> None:
287
365
  master_key, master_key_cka = query_master_key(path_key4)
288
366
 
289
367
  assert isinstance(master_key, bytes)