dissect.database 1.2.dev7__tar.gz → 1.2.dev8__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 (217) hide show
  1. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/PKG-INFO +1 -1
  2. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/__init__.py +2 -0
  3. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/computer.py +7 -0
  4. dissect_database-1.2.dev8/dissect/database/ese/ntds/objects/msfve_recoveryinformation.py +45 -0
  5. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/object.py +5 -0
  6. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect.database.egg-info/PKG-INFO +1 -1
  7. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect.database.egg-info/SOURCES.txt +1 -0
  8. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/ese/ntds/conftest.py +7 -0
  9. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/ese/ntds/test_ntds.py +31 -0
  10. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/.git-blame-ignore-revs +0 -0
  11. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/COPYRIGHT +0 -0
  12. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/LICENSE +0 -0
  13. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/MANIFEST.in +0 -0
  14. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/README.md +0 -0
  15. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/__init__.py +0 -0
  16. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/bsd/__init__.py +0 -0
  17. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/bsd/c_db.py +0 -0
  18. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/bsd/c_db.pyi +0 -0
  19. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/bsd/db.py +0 -0
  20. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/bsd/tools/__init__.py +0 -0
  21. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/bsd/tools/c_rpm.py +0 -0
  22. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/bsd/tools/c_rpm.pyi +0 -0
  23. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/bsd/tools/rpm.py +0 -0
  24. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/__init__.py +0 -0
  25. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/c_ese.py +0 -0
  26. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/c_ese.pyi +0 -0
  27. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/compression.py +0 -0
  28. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/cursor.py +0 -0
  29. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ese.py +0 -0
  30. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/exception.py +0 -0
  31. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/index.py +0 -0
  32. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/lcmapstring.py +0 -0
  33. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/__init__.py +0 -0
  34. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/c_ds.py +0 -0
  35. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/c_ds.pyi +0 -0
  36. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/c_pek.py +0 -0
  37. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/c_pek.pyi +0 -0
  38. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/c_sd.py +0 -0
  39. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/c_sd.pyi +0 -0
  40. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/database.py +0 -0
  41. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/ntds.py +0 -0
  42. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/applicationsettings.py +0 -0
  43. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/attributeschema.py +0 -0
  44. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/builtindomain.py +0 -0
  45. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/certificationauthority.py +0 -0
  46. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/classschema.py +0 -0
  47. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/classstore.py +0 -0
  48. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/configuration.py +0 -0
  49. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/container.py +0 -0
  50. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/controlaccessright.py +0 -0
  51. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/crldistributionpoint.py +0 -0
  52. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/crossref.py +0 -0
  53. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/crossrefcontainer.py +0 -0
  54. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/dfsconfiguration.py +0 -0
  55. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/displayspecifier.py +0 -0
  56. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/dmd.py +0 -0
  57. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/dnsnode.py +0 -0
  58. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/dnszone.py +0 -0
  59. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/domain.py +0 -0
  60. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/domaindns.py +0 -0
  61. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/domainpolicy.py +0 -0
  62. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/dsuisettings.py +0 -0
  63. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/filelinktracking.py +0 -0
  64. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/foreignsecurityprincipal.py +0 -0
  65. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/group.py +0 -0
  66. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/grouppolicycontainer.py +0 -0
  67. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/infrastructureupdate.py +0 -0
  68. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/intersitetransport.py +0 -0
  69. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/intersitetransportcontainer.py +0 -0
  70. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/ipsecbase.py +0 -0
  71. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/ipsecfilter.py +0 -0
  72. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/ipsecisakmppolicy.py +0 -0
  73. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/ipsecnegotiationpolicy.py +0 -0
  74. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/ipsecnfa.py +0 -0
  75. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/ipsecpolicy.py +0 -0
  76. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/leaf.py +0 -0
  77. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/linktrackobjectmovetable.py +0 -0
  78. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/linktrackvolumetable.py +0 -0
  79. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/locality.py +0 -0
  80. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/lostandfound.py +0 -0
  81. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/msauthz_centralaccesspolicies.py +0 -0
  82. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/msauthz_centralaccessrules.py +0 -0
  83. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/msdfsr_content.py +0 -0
  84. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/msdfsr_contentset.py +0 -0
  85. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/msdfsr_globalsettings.py +0 -0
  86. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/msdfsr_localsettings.py +0 -0
  87. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/msdfsr_member.py +0 -0
  88. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/msdfsr_replicationgroup.py +0 -0
  89. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/msdfsr_subscriber.py +0 -0
  90. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/msdfsr_subscription.py +0 -0
  91. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/msdfsr_topology.py +0 -0
  92. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/msdns_serversettings.py +0 -0
  93. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/msds_authnpolicies.py +0 -0
  94. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/msds_authnpolicysilos.py +0 -0
  95. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/msds_claimstransformationpolicies.py +0 -0
  96. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/msds_claimtype.py +0 -0
  97. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/msds_claimtypepropertybase.py +0 -0
  98. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/msds_claimtypes.py +0 -0
  99. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/msds_optionalfeature.py +0 -0
  100. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/msds_passwordsettingscontainer.py +0 -0
  101. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/msds_quotacontainer.py +0 -0
  102. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/msds_resourceproperties.py +0 -0
  103. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/msds_resourceproperty.py +0 -0
  104. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/msds_resourcepropertylist.py +0 -0
  105. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/msds_shadowprincipalcontainer.py +0 -0
  106. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/msds_valuetype.py +0 -0
  107. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/msimaging_psps.py +0 -0
  108. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/mskds_provserverconfiguration.py +0 -0
  109. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/msmqenterprisesettings.py +0 -0
  110. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/mspki_enterpriseoid.py +0 -0
  111. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/mspki_privatekeyrecoveryagent.py +0 -0
  112. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/msspp_activationobjectscontainer.py +0 -0
  113. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/mstpm_informationobjectscontainer.py +0 -0
  114. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/ntdsconnection.py +0 -0
  115. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/ntdsdsa.py +0 -0
  116. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/ntdsservice.py +0 -0
  117. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/ntdssitesettings.py +0 -0
  118. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/ntfrssettings.py +0 -0
  119. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/organizationalperson.py +0 -0
  120. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/organizationalunit.py +0 -0
  121. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/person.py +0 -0
  122. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/physicallocation.py +0 -0
  123. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/pkicertificatetemplate.py +0 -0
  124. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/pkienrollmentservice.py +0 -0
  125. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/querypolicy.py +0 -0
  126. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/ridmanager.py +0 -0
  127. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/ridset.py +0 -0
  128. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/rpccontainer.py +0 -0
  129. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/rrasadministrationdictionary.py +0 -0
  130. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/samserver.py +0 -0
  131. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/secret.py +0 -0
  132. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/securityobject.py +0 -0
  133. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/server.py +0 -0
  134. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/serverscontainer.py +0 -0
  135. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/site.py +0 -0
  136. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/sitelink.py +0 -0
  137. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/sitescontainer.py +0 -0
  138. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/subnetcontainer.py +0 -0
  139. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/subschema.py +0 -0
  140. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/top.py +0 -0
  141. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/trusteddomain.py +0 -0
  142. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/objects/user.py +0 -0
  143. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/pek.py +0 -0
  144. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/query.py +0 -0
  145. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/schema.py +0 -0
  146. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/sd.py +0 -0
  147. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/tools/__init__.py +0 -0
  148. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/tools/ntds.py +0 -0
  149. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/ntds/util.py +0 -0
  150. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/page.py +0 -0
  151. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/record.py +0 -0
  152. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/sorting_table.py +0 -0
  153. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/table.py +0 -0
  154. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/tools/__init__.py +0 -0
  155. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/tools/certlog.py +0 -0
  156. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/tools/impacket.py +0 -0
  157. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/tools/sru.py +0 -0
  158. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/tools/ual.py +0 -0
  159. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/ese/util.py +0 -0
  160. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/exception.py +0 -0
  161. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/sqlite3/__init__.py +0 -0
  162. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/sqlite3/c_sqlite3.py +0 -0
  163. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/sqlite3/c_sqlite3.pyi +0 -0
  164. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/sqlite3/encryption/__init__.py +0 -0
  165. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/sqlite3/encryption/sqlcipher/__init__.py +0 -0
  166. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/sqlite3/encryption/sqlcipher/exception.py +0 -0
  167. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/sqlite3/encryption/sqlcipher/sqlcipher.py +0 -0
  168. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/sqlite3/exception.py +0 -0
  169. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/sqlite3/sqlite3.py +0 -0
  170. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/sqlite3/util.py +0 -0
  171. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect/database/sqlite3/wal.py +0 -0
  172. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect.database.egg-info/dependency_links.txt +0 -0
  173. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect.database.egg-info/entry_points.txt +0 -0
  174. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect.database.egg-info/requires.txt +0 -0
  175. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/dissect.database.egg-info/top_level.txt +0 -0
  176. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/pyproject.toml +0 -0
  177. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/setup.cfg +0 -0
  178. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/__init__.py +0 -0
  179. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/_docs/Makefile +0 -0
  180. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/_docs/conf.py +0 -0
  181. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/_docs/index.rst +0 -0
  182. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/_tools/sqlite3/__init__.py +0 -0
  183. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/_tools/sqlite3/generate_sqlite.py +0 -0
  184. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/_util.py +0 -0
  185. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/bsd/__init__.py +0 -0
  186. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/bsd/conftest.py +0 -0
  187. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/bsd/test_db.py +0 -0
  188. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/bsd/test_rpm.py +0 -0
  189. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/conftest.py +0 -0
  190. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/ese/__init__.py +0 -0
  191. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/ese/conftest.py +0 -0
  192. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/ese/ntds/__init__.py +0 -0
  193. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/ese/ntds/test_benchmark.py +0 -0
  194. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/ese/ntds/test_pek.py +0 -0
  195. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/ese/ntds/test_query.py +0 -0
  196. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/ese/ntds/test_schema.py +0 -0
  197. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/ese/ntds/test_sd.py +0 -0
  198. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/ese/ntds/test_util.py +0 -0
  199. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/ese/test_cursor.py +0 -0
  200. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/ese/test_ese.py +0 -0
  201. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/ese/test_index.py +0 -0
  202. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/ese/test_page.py +0 -0
  203. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/ese/test_record.py +0 -0
  204. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/ese/test_table.py +0 -0
  205. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/ese/tools/__init__.py +0 -0
  206. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/ese/tools/test_certlog.py +0 -0
  207. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/ese/tools/test_sru.py +0 -0
  208. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/ese/tools/test_ual.py +0 -0
  209. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/sqlite3/__init__.py +0 -0
  210. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/sqlite3/conftest.py +0 -0
  211. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/sqlite3/test_default_values.py +0 -0
  212. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/sqlite3/test_row.py +0 -0
  213. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/sqlite3/test_sqlcipher.py +0 -0
  214. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/sqlite3/test_sqlite3.py +0 -0
  215. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/sqlite3/test_util.py +0 -0
  216. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tests/sqlite3/test_wal.py +0 -0
  217. {dissect_database-1.2.dev7 → dissect_database-1.2.dev8}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dissect.database
3
- Version: 1.2.dev7
3
+ Version: 1.2.dev8
4
4
  Summary: A Dissect module implementing parsers for various database formats, including Berkeley DB, Microsofts Extensible Storage Engine (ESE) and SQLite3
5
5
  Author-email: Dissect Team <dissect@fox-it.com>
6
6
  License-Expression: Apache-2.0
@@ -68,6 +68,7 @@ from dissect.database.ese.ntds.objects.msds_resourceproperty import MSDSResource
68
68
  from dissect.database.ese.ntds.objects.msds_resourcepropertylist import MSDSResourcePropertyList
69
69
  from dissect.database.ese.ntds.objects.msds_shadowprincipalcontainer import MSDSShadowPrincipalContainer
70
70
  from dissect.database.ese.ntds.objects.msds_valuetype import MSDSValueType
71
+ from dissect.database.ese.ntds.objects.msfve_recoveryinformation import MSFVERecoveryInformation
71
72
  from dissect.database.ese.ntds.objects.msimaging_psps import MSImagingPSPs
72
73
  from dissect.database.ese.ntds.objects.mskds_provserverconfiguration import MSKDSProvServerConfiguration
73
74
  from dissect.database.ese.ntds.objects.msmqenterprisesettings import MSMQEnterpriseSettings
@@ -174,6 +175,7 @@ __all__ = [
174
175
  "MSDSResourcePropertyList",
175
176
  "MSDSShadowPrincipalContainer",
176
177
  "MSDSValueType",
178
+ "MSFVERecoveryInformation",
177
179
  "MSImagingPSPs",
178
180
  "MSKDSProvServerConfiguration",
179
181
  "MSMQEnterpriseSettings",
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from typing import TYPE_CHECKING
4
4
 
5
+ from dissect.database.ese.ntds.objects.msfve_recoveryinformation import MSFVERecoveryInformation
5
6
  from dissect.database.ese.ntds.objects.user import User
6
7
 
7
8
  if TYPE_CHECKING:
@@ -22,6 +23,12 @@ class Computer(User):
22
23
  def __repr_body__(self) -> str:
23
24
  return f"name={self.name!r}"
24
25
 
26
+ def fve_recovery_information(self) -> Iterator[MSFVERecoveryInformation]:
27
+ """Return the BitLocker recovery information objects associated with this computer."""
28
+ for child in self.children():
29
+ if isinstance(child, MSFVERecoveryInformation):
30
+ yield child
31
+
25
32
  def managed_by(self) -> Iterator[Object]:
26
33
  """Return the objects that manage this computer."""
27
34
  self._assert_local()
@@ -0,0 +1,45 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+ from uuid import UUID
5
+
6
+ from dissect.database.ese.ntds.objects.top import Top
7
+
8
+ if TYPE_CHECKING:
9
+ from dissect.database.ese.ntds.objects import Computer
10
+
11
+
12
+ class MSFVERecoveryInformation(Top):
13
+ """Represents a msFVE-RecoveryInformation object in the Active Directory.
14
+
15
+ References:
16
+ - https://learn.microsoft.com/en-us/windows/win32/adschema/c-msfve-recoveryinformation
17
+ """
18
+
19
+ __object_class__ = "msFVE-RecoveryInformation"
20
+
21
+ @property
22
+ def volume_guid(self) -> UUID:
23
+ """Return the volume GUID associated with this recovery information."""
24
+ return UUID(bytes_le=self.get("msFVE-VolumeGuid"))
25
+
26
+ @property
27
+ def recovery_guid(self) -> UUID:
28
+ """Return the recovery GUID associated with this recovery information."""
29
+ return UUID(bytes_le=self.get("msFVE-RecoveryGuid"))
30
+
31
+ @property
32
+ def recovery_password(self) -> str | None:
33
+ """Return the recovery password associated with this recovery information."""
34
+ return self.get("msFVE-RecoveryPassword")
35
+
36
+ @property
37
+ def key_package(self) -> bytes | None:
38
+ """Return the key package associated with this recovery information, if any."""
39
+ return self.get("msFVE-KeyPackage")
40
+
41
+ def computer(self) -> Computer:
42
+ """Return the computer object associated with this recovery information."""
43
+ if (parent := self.parent()) is None:
44
+ raise ValueError("msFVE-RecoveryInformation object has no parent computer")
45
+ return parent
@@ -57,6 +57,11 @@ class Object:
57
57
  def __getattr__(self, name: str) -> Any:
58
58
  return self.get(name)
59
59
 
60
+ def __eq__(self, other: object) -> bool:
61
+ if not isinstance(other, Object):
62
+ return NotImplemented
63
+ return self.record == other.record
64
+
60
65
  @classmethod
61
66
  def from_record(cls, db: Database, record: Record) -> Object:
62
67
  """Create an Object instance from a database record.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dissect.database
3
- Version: 1.2.dev7
3
+ Version: 1.2.dev8
4
4
  Summary: A Dissect module implementing parsers for various database formats, including Berkeley DB, Microsofts Extensible Storage Engine (ESE) and SQLite3
5
5
  Author-email: Dissect Team <dissect@fox-it.com>
6
6
  License-Expression: Apache-2.0
@@ -116,6 +116,7 @@ dissect/database/ese/ntds/objects/msds_resourceproperty.py
116
116
  dissect/database/ese/ntds/objects/msds_resourcepropertylist.py
117
117
  dissect/database/ese/ntds/objects/msds_shadowprincipalcontainer.py
118
118
  dissect/database/ese/ntds/objects/msds_valuetype.py
119
+ dissect/database/ese/ntds/objects/msfve_recoveryinformation.py
119
120
  dissect/database/ese/ntds/objects/msimaging_psps.py
120
121
  dissect/database/ese/ntds/objects/mskds_provserverconfiguration.py
121
122
  dissect/database/ese/ntds/objects/msmqenterprisesettings.py
@@ -34,6 +34,13 @@ def adam() -> Iterator[NTDS]:
34
34
  yield NTDS(fh)
35
35
 
36
36
 
37
+ @pytest.fixture(scope="module")
38
+ def fve() -> Iterator[NTDS]:
39
+ """NTDS file with BitLocker recovery information."""
40
+ for fh in open_file_gz("_data/ese/ntds/fve/ntds.dit.gz"):
41
+ yield NTDS(fh)
42
+
43
+
37
44
  @pytest.fixture(scope="module")
38
45
  def large() -> Iterator[NTDS]:
39
46
  """Large NTDS file for performance testing.
@@ -320,3 +320,34 @@ def test_backup_keys(goad: NTDS) -> None:
320
320
  hashlib.sha256(keys[1].public_key).hexdigest()
321
321
  == "398fef9281677096b18785d0ad000251d41f76b82e28687718d6a9812ddaca8a"
322
322
  )
323
+
324
+
325
+ def test_fve_recovery_information(fve: NTDS) -> None:
326
+ """Test retrieval of BitLocker recovery information."""
327
+ computer = next(c for c in fve.computers() if c.name == "WIN11")
328
+ assert isinstance(computer, Computer)
329
+
330
+ recovery_info = list(computer.fve_recovery_information())
331
+ assert len(recovery_info) == 1
332
+ assert recovery_info[0].volume_guid == UUID("616127c1-403a-4bdf-9213-42c285cf9ee7")
333
+ assert recovery_info[0].recovery_guid == UUID("1d3184e4-ff3f-44f8-9255-32d1728f6172")
334
+ assert recovery_info[0].recovery_password == "197307-494857-485111-648725-619432-662057-360844-079310"
335
+ assert recovery_info[0].key_package == bytes.fromhex(
336
+ "d40100000100000030000000d4010000c12761613a40df4b921342c285cf9ee7"
337
+ "0100000000000000a0bad003caa5dc015000030005000100a039ebd4c8a5dc01"
338
+ "090000003a621f05e8ca419a50af679b12eef8b0dba5cef0249ab9a509164767"
339
+ "2ff5d3ea058671c43643fbc6f503f5fb966f6e61acda9b5d44ad4730ca200fe9"
340
+ "3c01020008000100e484311d3ffff844925532d1728f61721040cdd6c8a5dc01"
341
+ "00000008ac0000000300010000100000b351f88395b15fc67a7bcbf9132ba131"
342
+ "4000120005000100a039ebd4c8a5dc0105000000373c16060ab99c0619679931"
343
+ "1b2f3cfccb4ca31f6ae9dbd41c5c67a605674db0b96512e4184c815bc4d38ad1"
344
+ "5000130005000100a039ebd4c8a5dc01060000002ee39c79df7a782cead1fb91"
345
+ "73b073b5d512e054c9700c69076cf7a374e066b13b56fec03e12fa623acaaab0"
346
+ "702141d694cb726163f5b4da002a5cc85000000005000100a039ebd4c8a5dc01"
347
+ "07000000df655b5d65e9a8d969c990083a846ca8c34708334d4710b5fb532887"
348
+ "a9689ff9e1191521f5abe368cf5476e82cd2ecad01ba90b6065cd7e87447a8ad"
349
+ "1c00000015000100f06475dec8a5dc01f06475dec8a5dc011000020018000f00"
350
+ "0f00010000400e04000000000020000000000000"
351
+ )
352
+
353
+ assert recovery_info[0].computer() == computer