dissect.database 1.1.dev7__tar.gz → 1.1.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 (209) hide show
  1. {dissect_database-1.1.dev7/dissect.database.egg-info → dissect_database-1.1.dev8}/PKG-INFO +1 -1
  2. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/object.py +5 -1
  3. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/util.py +37 -1
  4. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8/dissect.database.egg-info}/PKG-INFO +1 -1
  5. dissect_database-1.1.dev8/tests/ese/ntds/test_pek.py +51 -0
  6. dissect_database-1.1.dev7/tests/ese/ntds/test_pek.py +0 -37
  7. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/COPYRIGHT +0 -0
  8. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/LICENSE +0 -0
  9. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/MANIFEST.in +0 -0
  10. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/README.md +0 -0
  11. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/__init__.py +0 -0
  12. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/bsd/__init__.py +0 -0
  13. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/bsd/c_db.py +0 -0
  14. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/bsd/c_db.pyi +0 -0
  15. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/bsd/db.py +0 -0
  16. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/bsd/tools/__init__.py +0 -0
  17. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/bsd/tools/c_rpm.py +0 -0
  18. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/bsd/tools/c_rpm.pyi +0 -0
  19. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/bsd/tools/rpm.py +0 -0
  20. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/__init__.py +0 -0
  21. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/btree.py +0 -0
  22. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/c_ese.py +0 -0
  23. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/c_ese.pyi +0 -0
  24. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/compression.py +0 -0
  25. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/cursor.py +0 -0
  26. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ese.py +0 -0
  27. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/exception.py +0 -0
  28. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/index.py +0 -0
  29. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/lcmapstring.py +0 -0
  30. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/__init__.py +0 -0
  31. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/c_ds.py +0 -0
  32. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/c_ds.pyi +0 -0
  33. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/c_pek.py +0 -0
  34. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/c_pek.pyi +0 -0
  35. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/c_sd.py +0 -0
  36. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/c_sd.pyi +0 -0
  37. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/database.py +0 -0
  38. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/ntds.py +0 -0
  39. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/__init__.py +0 -0
  40. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/applicationsettings.py +0 -0
  41. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/attributeschema.py +0 -0
  42. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/builtindomain.py +0 -0
  43. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/certificationauthority.py +0 -0
  44. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/classschema.py +0 -0
  45. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/classstore.py +0 -0
  46. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/computer.py +0 -0
  47. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/configuration.py +0 -0
  48. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/container.py +0 -0
  49. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/controlaccessright.py +0 -0
  50. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/crldistributionpoint.py +0 -0
  51. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/crossref.py +0 -0
  52. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/crossrefcontainer.py +0 -0
  53. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/dfsconfiguration.py +0 -0
  54. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/displayspecifier.py +0 -0
  55. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/dmd.py +0 -0
  56. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/dnsnode.py +0 -0
  57. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/dnszone.py +0 -0
  58. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/domain.py +0 -0
  59. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/domaindns.py +0 -0
  60. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/domainpolicy.py +0 -0
  61. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/dsuisettings.py +0 -0
  62. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/filelinktracking.py +0 -0
  63. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/foreignsecurityprincipal.py +0 -0
  64. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/group.py +0 -0
  65. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/grouppolicycontainer.py +0 -0
  66. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/infrastructureupdate.py +0 -0
  67. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/intersitetransport.py +0 -0
  68. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/intersitetransportcontainer.py +0 -0
  69. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/ipsecbase.py +0 -0
  70. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/ipsecfilter.py +0 -0
  71. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/ipsecisakmppolicy.py +0 -0
  72. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/ipsecnegotiationpolicy.py +0 -0
  73. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/ipsecnfa.py +0 -0
  74. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/ipsecpolicy.py +0 -0
  75. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/leaf.py +0 -0
  76. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/linktrackobjectmovetable.py +0 -0
  77. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/linktrackvolumetable.py +0 -0
  78. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/locality.py +0 -0
  79. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/lostandfound.py +0 -0
  80. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/msauthz_centralaccesspolicies.py +0 -0
  81. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/msauthz_centralaccessrules.py +0 -0
  82. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/msdfsr_content.py +0 -0
  83. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/msdfsr_contentset.py +0 -0
  84. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/msdfsr_globalsettings.py +0 -0
  85. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/msdfsr_localsettings.py +0 -0
  86. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/msdfsr_member.py +0 -0
  87. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/msdfsr_replicationgroup.py +0 -0
  88. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/msdfsr_subscriber.py +0 -0
  89. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/msdfsr_subscription.py +0 -0
  90. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/msdfsr_topology.py +0 -0
  91. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/msdns_serversettings.py +0 -0
  92. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/msds_authnpolicies.py +0 -0
  93. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/msds_authnpolicysilos.py +0 -0
  94. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/msds_claimstransformationpolicies.py +0 -0
  95. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/msds_claimtype.py +0 -0
  96. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/msds_claimtypepropertybase.py +0 -0
  97. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/msds_claimtypes.py +0 -0
  98. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/msds_optionalfeature.py +0 -0
  99. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/msds_passwordsettingscontainer.py +0 -0
  100. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/msds_quotacontainer.py +0 -0
  101. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/msds_resourceproperties.py +0 -0
  102. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/msds_resourceproperty.py +0 -0
  103. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/msds_resourcepropertylist.py +0 -0
  104. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/msds_shadowprincipalcontainer.py +0 -0
  105. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/msds_valuetype.py +0 -0
  106. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/msimaging_psps.py +0 -0
  107. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/mskds_provserverconfiguration.py +0 -0
  108. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/msmqenterprisesettings.py +0 -0
  109. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/mspki_enterpriseoid.py +0 -0
  110. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/mspki_privatekeyrecoveryagent.py +0 -0
  111. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/msspp_activationobjectscontainer.py +0 -0
  112. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/mstpm_informationobjectscontainer.py +0 -0
  113. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/ntdsconnection.py +0 -0
  114. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/ntdsdsa.py +0 -0
  115. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/ntdsservice.py +0 -0
  116. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/ntdssitesettings.py +0 -0
  117. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/ntfrssettings.py +0 -0
  118. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/organizationalperson.py +0 -0
  119. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/organizationalunit.py +0 -0
  120. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/person.py +0 -0
  121. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/physicallocation.py +0 -0
  122. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/pkicertificatetemplate.py +0 -0
  123. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/pkienrollmentservice.py +0 -0
  124. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/querypolicy.py +0 -0
  125. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/ridmanager.py +0 -0
  126. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/ridset.py +0 -0
  127. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/rpccontainer.py +0 -0
  128. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/rrasadministrationdictionary.py +0 -0
  129. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/samserver.py +0 -0
  130. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/secret.py +0 -0
  131. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/securityobject.py +0 -0
  132. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/server.py +0 -0
  133. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/serverscontainer.py +0 -0
  134. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/site.py +0 -0
  135. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/sitelink.py +0 -0
  136. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/sitescontainer.py +0 -0
  137. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/subnetcontainer.py +0 -0
  138. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/subschema.py +0 -0
  139. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/top.py +0 -0
  140. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/trusteddomain.py +0 -0
  141. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/objects/user.py +0 -0
  142. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/pek.py +0 -0
  143. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/query.py +0 -0
  144. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/schema.py +0 -0
  145. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/ntds/sd.py +0 -0
  146. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/page.py +0 -0
  147. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/record.py +0 -0
  148. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/sorting_table.py +0 -0
  149. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/table.py +0 -0
  150. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/tools/__init__.py +0 -0
  151. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/tools/certlog.py +0 -0
  152. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/tools/impacket.py +0 -0
  153. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/tools/sru.py +0 -0
  154. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/tools/ual.py +0 -0
  155. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/ese/util.py +0 -0
  156. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/exception.py +0 -0
  157. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/sqlite3/__init__.py +0 -0
  158. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/sqlite3/c_sqlite3.py +0 -0
  159. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/sqlite3/c_sqlite3.pyi +0 -0
  160. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/sqlite3/exception.py +0 -0
  161. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/sqlite3/sqlite3.py +0 -0
  162. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/sqlite3/util.py +0 -0
  163. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect/database/sqlite3/wal.py +0 -0
  164. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect.database.egg-info/SOURCES.txt +0 -0
  165. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect.database.egg-info/dependency_links.txt +0 -0
  166. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect.database.egg-info/requires.txt +0 -0
  167. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/dissect.database.egg-info/top_level.txt +0 -0
  168. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/pyproject.toml +0 -0
  169. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/setup.cfg +0 -0
  170. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/__init__.py +0 -0
  171. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/_docs/Makefile +0 -0
  172. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/_docs/conf.py +0 -0
  173. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/_docs/index.rst +0 -0
  174. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/_tools/sqlite3/__init__.py +0 -0
  175. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/_tools/sqlite3/generate_sqlite.py +0 -0
  176. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/_util.py +0 -0
  177. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/bsd/__init__.py +0 -0
  178. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/bsd/conftest.py +0 -0
  179. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/bsd/test_db.py +0 -0
  180. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/bsd/test_rpm.py +0 -0
  181. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/conftest.py +0 -0
  182. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/ese/__init__.py +0 -0
  183. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/ese/conftest.py +0 -0
  184. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/ese/ntds/__init__.py +0 -0
  185. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/ese/ntds/conftest.py +0 -0
  186. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/ese/ntds/test_benchmark.py +0 -0
  187. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/ese/ntds/test_ntds.py +0 -0
  188. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/ese/ntds/test_query.py +0 -0
  189. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/ese/ntds/test_schema.py +0 -0
  190. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/ese/ntds/test_sd.py +0 -0
  191. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/ese/ntds/test_util.py +0 -0
  192. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/ese/test_cursor.py +0 -0
  193. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/ese/test_ese.py +0 -0
  194. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/ese/test_index.py +0 -0
  195. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/ese/test_page.py +0 -0
  196. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/ese/test_record.py +0 -0
  197. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/ese/test_table.py +0 -0
  198. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/ese/tools/__init__.py +0 -0
  199. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/ese/tools/test_certlog.py +0 -0
  200. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/ese/tools/test_sru.py +0 -0
  201. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/ese/tools/test_ual.py +0 -0
  202. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/sqlite3/__init__.py +0 -0
  203. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/sqlite3/conftest.py +0 -0
  204. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/sqlite3/test_default_values.py +0 -0
  205. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/sqlite3/test_row.py +0 -0
  206. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/sqlite3/test_sqlite3.py +0 -0
  207. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/sqlite3/test_util.py +0 -0
  208. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tests/sqlite3/test_wal.py +0 -0
  209. {dissect_database-1.1.dev7 → dissect_database-1.1.dev8}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dissect.database
3
- Version: 1.1.dev7
3
+ Version: 1.1.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
@@ -64,7 +64,7 @@ class Object:
64
64
  db: The database instance associated with this object.
65
65
  record: The :class:`Record` instance representing this object.
66
66
  """
67
- if (object_classes := _get_attribute(db, record, "objectClass")) is not None and (
67
+ if (object_classes := _get_attribute(db, record, "objectClass")) and (
68
68
  known_cls := cls.__known_classes__.get(object_classes[0])
69
69
  ) is not None:
70
70
  return known_cls(db, record)
@@ -261,6 +261,10 @@ def _get_attribute(db: Database, record: Record, name: str, *, raw: bool = False
261
261
  # There are a few attributes that have the flag IsSingleValued but are marked as MultiValue in ESE
262
262
  value = value[0]
263
263
 
264
+ if not schema.is_single_valued and value is None:
265
+ # Return an empty list for multi-valued attributes that are not set
266
+ value = []
267
+
264
268
  if raw:
265
269
  return value
266
270
 
@@ -280,6 +280,29 @@ def _decode_supplemental_credentials(db: Database, value: bytes) -> dict[str, by
280
280
  return result
281
281
 
282
282
 
283
+ def _decode_pwd_history(db: Database, value: list[bytes]) -> list[bytes]:
284
+ """Decode the ``ntPwdHistory`` or ``lmPwdHistory`` attribute value.
285
+
286
+ Args:
287
+ db: The associated NTDS database instance.
288
+ value: The raw list of bytes values for the password history attribute.
289
+
290
+ Returns:
291
+ A list of decrypted password hashes, or the original value if the PEK is locked.
292
+ """
293
+ if db.data.pek is None or not db.data.pek.unlocked:
294
+ return value
295
+
296
+ result = []
297
+ for buf in value:
298
+ buf = db.data.pek.decrypt(buf)
299
+ # The history attributes can contain multiple hashes concatenated together, so we need to split them up
300
+ # NT and LM hashes are both 16 bytes long
301
+ result.extend(buf[i : i + 16] for i in range(0, len(buf), 16))
302
+
303
+ return result
304
+
305
+
283
306
  ATTRIBUTE_ENCODE_DECODE_MAP: dict[
284
307
  str, tuple[Callable[[Database, Any], Any] | None, Callable[[Database, Any], Any] | None]
285
308
  ] = {
@@ -314,6 +337,13 @@ ATTRIBUTE_ENCODE_DECODE_MAP: dict[
314
337
  "msDS-ExecuteScriptPassword": (None, _pek_decrypt),
315
338
  }
316
339
 
340
+ ATTRIBUTE_LIST_ENCODE_DECODE_MAP: dict[
341
+ str, tuple[Callable[[Database, list[Any]], list[Any]], Callable[[Database, list[Any]], list[Any]]]
342
+ ] = {
343
+ "ntPwdHistory": (None, _decode_pwd_history),
344
+ "lmPwdHistory": (None, _decode_pwd_history),
345
+ }
346
+
317
347
 
318
348
  def _ldapDisplayName_to_DNT(db: Database, value: str) -> int | str:
319
349
  """Convert an LDAP display name to its corresponding DNT value.
@@ -494,7 +524,13 @@ def decode_value(db: Database, attribute: str, value: Any) -> Any:
494
524
  if value is None:
495
525
  return value
496
526
 
497
- # First check the list of deviations
527
+ # First check if we have a special decoder for this attribute
528
+ # Check for special handing of multi-valued attributes first
529
+ if isinstance(value, list):
530
+ _, decode = ATTRIBUTE_LIST_ENCODE_DECODE_MAP.get(attribute, (None, None))
531
+ if decode is not None:
532
+ return decode(db, value)
533
+
498
534
  _, decode = ATTRIBUTE_ENCODE_DECODE_MAP.get(attribute, (None, None))
499
535
  if decode is None:
500
536
  # Next, try it using the regular OID_ENCODE_DECODE_MAP mapping
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dissect.database
3
- Version: 1.1.dev7
3
+ Version: 1.1.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
@@ -0,0 +1,51 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ if TYPE_CHECKING:
6
+ from dissect.database.ese.ntds import NTDS
7
+
8
+
9
+ def test_pek(goad: NTDS) -> None:
10
+ """Test PEK unlocking and decryption."""
11
+ syskey = bytes.fromhex("079f95655b66f16deb28aa1ab3a81eb0")
12
+
13
+ user = next((u for u in goad.users() if u.name == "ESSOS$"), None)
14
+ assert user is not None
15
+
16
+ encrypted = user.unicodePwd
17
+ # Verify encrypted value
18
+ assert encrypted == bytes.fromhex(
19
+ "1300000000000000248a47921aa22e6886017494709f23bb10000000708afcb8360cfb0b4a972c5bc65b2864540436aad24654c2e037c83eafe70d43"
20
+ )
21
+
22
+ assert user.lmPwdHistory == [
23
+ bytes.fromhex(
24
+ "1300000000000000771e30dbd13e7f1a641ecd8e3ec85765200000005e5c46e1eb6ffaff7bee7fa75a092215e5c9bc34e1223a09322f9c15260310b98b30a2045e2f1bc8dcab1ad8b8ce13c3"
25
+ )
26
+ ]
27
+
28
+ goad.pek.unlock(syskey)
29
+ assert goad.pek.unlocked
30
+
31
+ # Test decryption of the user's password
32
+ assert goad.pek.decrypt(encrypted) == bytes.fromhex("909e2178d8b7944d60a5cd2053fef570")
33
+ # Should work transparently now too
34
+ assert user.unicodePwd == bytes.fromhex("909e2178d8b7944d60a5cd2053fef570")
35
+ assert user.lmPwdHistory == [
36
+ bytes.fromhex("f4badffd76f158087909e33b4e4b40c1"),
37
+ bytes.fromhex("4383d43a2d9bbc9bda43c5a3d0e4f38c"),
38
+ ]
39
+ assert user.ntPwdHistory == [
40
+ bytes.fromhex("909e2178d8b7944d60a5cd2053fef570"),
41
+ bytes.fromhex("909e2178d8b7944d60a5cd2053fef570"),
42
+ ]
43
+
44
+
45
+ def test_pek_adam(adam: NTDS) -> None:
46
+ """Test PEK unlocking and decryption for AD LDS NTDS.dit."""
47
+ # The PEK in AD LDS is derived within the database itself
48
+ assert adam.pek.unlocked
49
+
50
+ user = next(adam.users(), None)
51
+ assert user.unicodePwd == bytes.fromhex("8846f7eaee8fb117ad06bdd830b7586c")
@@ -1,37 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import TYPE_CHECKING
4
-
5
- if TYPE_CHECKING:
6
- from dissect.database.ese.ntds import NTDS
7
-
8
-
9
- def test_pek(goad: NTDS) -> None:
10
- """Test PEK unlocking and decryption."""
11
- syskey = bytes.fromhex("079f95655b66f16deb28aa1ab3a81eb0")
12
-
13
- user = next(goad.users(), None)
14
- assert user is not None
15
-
16
- encrypted = user.unicodePwd
17
- # Verify encrypted value
18
- assert encrypted == bytes.fromhex(
19
- "130000000000000029fbdaafb52bf724a51052f668152ac5100000006d06616d95c026064fff245bd256f3d4990f7bffb546f76de566723da4855227"
20
- )
21
-
22
- goad.pek.unlock(syskey)
23
- assert goad.pek.unlocked
24
-
25
- # Test decryption of the user's password
26
- assert goad.pek.decrypt(encrypted) == bytes.fromhex("06bb564317712dc60761a32914e4048c")
27
- # Should work transparently now too
28
- assert user.unicodePwd == bytes.fromhex("06bb564317712dc60761a32914e4048c")
29
-
30
-
31
- def test_pek_adam(adam: NTDS) -> None:
32
- """Test PEK unlocking and decryption for AD LDS NTDS.dit."""
33
- # The PEK in AD LDS is derived within the database itself
34
- assert adam.pek.unlocked
35
-
36
- user = next(adam.users(), None)
37
- assert user.unicodePwd == bytes.fromhex("8846f7eaee8fb117ad06bdd830b7586c")