test_security.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. # Tests for the win32security module.
  2. import sys, os
  3. import unittest
  4. import winerror
  5. from pywin32_testutil import testmain, TestSkipped, ob2memory
  6. import win32api, win32con, win32security, ntsecuritycon
  7. class SecurityTests(unittest.TestCase):
  8. def setUp(self):
  9. self.pwr_sid=win32security.LookupAccountName('','Power Users')[0]
  10. self.admin_sid=win32security.LookupAccountName('','Administrator')[0]
  11. def tearDown(self):
  12. pass
  13. def testEqual(self):
  14. self.failUnlessEqual(win32security.LookupAccountName('','Administrator')[0],
  15. win32security.LookupAccountName('','Administrator')[0])
  16. def testNESID(self):
  17. self.failUnless(self.pwr_sid==self.pwr_sid)
  18. self.failUnless(self.pwr_sid!=self.admin_sid)
  19. def testNEOther(self):
  20. self.failUnless(self.pwr_sid!=None)
  21. self.failUnless(None!=self.pwr_sid)
  22. self.failIf(self.pwr_sid==None)
  23. self.failIf(None==self.pwr_sid)
  24. self.failIfEqual(None, self.pwr_sid)
  25. def testSIDInDict(self):
  26. d = dict(foo=self.pwr_sid)
  27. self.failUnlessEqual(d['foo'], self.pwr_sid)
  28. def testBuffer(self):
  29. self.failUnlessEqual(ob2memory(win32security.LookupAccountName('','Administrator')[0]),
  30. ob2memory(win32security.LookupAccountName('','Administrator')[0]))
  31. def testMemory(self):
  32. pwr_sid = self.pwr_sid
  33. admin_sid = self.admin_sid
  34. sd1=win32security.SECURITY_DESCRIPTOR()
  35. sd2=win32security.SECURITY_DESCRIPTOR()
  36. sd3=win32security.SECURITY_DESCRIPTOR()
  37. dacl=win32security.ACL()
  38. dacl.AddAccessAllowedAce(win32security.ACL_REVISION,win32con.GENERIC_READ,pwr_sid)
  39. dacl.AddAccessAllowedAce(win32security.ACL_REVISION,win32con.GENERIC_ALL,admin_sid)
  40. sd4=win32security.SECURITY_DESCRIPTOR()
  41. sacl=win32security.ACL()
  42. sacl.AddAuditAccessAce(win32security.ACL_REVISION,win32con.DELETE,admin_sid,1,1)
  43. sacl.AddAuditAccessAce(win32security.ACL_REVISION,win32con.GENERIC_ALL,pwr_sid,1,1)
  44. for x in xrange(0,200000):
  45. sd1.SetSecurityDescriptorOwner(admin_sid,0)
  46. sd2.SetSecurityDescriptorGroup(pwr_sid,0)
  47. sd3.SetSecurityDescriptorDacl(1,dacl,0)
  48. sd4.SetSecurityDescriptorSacl(1,sacl,0)
  49. class DomainTests(unittest.TestCase):
  50. def setUp(self):
  51. self.ds_handle = None
  52. try:
  53. # saving the handle means the other test itself should bind faster.
  54. self.ds_handle = win32security.DsBind()
  55. except win32security.error, exc:
  56. if exc.winerror != winerror.ERROR_NO_SUCH_DOMAIN:
  57. raise
  58. raise TestSkipped(exc)
  59. def tearDown(self):
  60. if self.ds_handle is not None:
  61. self.ds_handle.close()
  62. class TestDS(DomainTests):
  63. def testDsGetDcName(self):
  64. # Not sure what we can actually test here! At least calling it
  65. # does something :)
  66. win32security.DsGetDcName()
  67. def testDsListServerInfo(self):
  68. # again, not checking much, just exercising the code.
  69. h=win32security.DsBind()
  70. for (status, ignore, site) in win32security.DsListSites(h):
  71. for (status, ignore, server) in win32security.DsListServersInSite(h, site):
  72. info = win32security.DsListInfoForServer(h, server)
  73. for (status, ignore, domain) in win32security.DsListDomainsInSite(h, site):
  74. pass
  75. def testDsCrackNames(self):
  76. h = win32security.DsBind()
  77. fmt_offered = ntsecuritycon.DS_FQDN_1779_NAME
  78. name = win32api.GetUserNameEx(fmt_offered)
  79. result = win32security.DsCrackNames(h, 0, fmt_offered, fmt_offered, (name,))
  80. self.failUnlessEqual(name, result[0][2])
  81. def testDsCrackNamesSyntax(self):
  82. # Do a syntax check only - that allows us to avoid binding.
  83. # But must use DS_CANONICAL_NAME (or _EX)
  84. expected = win32api.GetUserNameEx(win32api.NameCanonical)
  85. fmt_offered = ntsecuritycon.DS_FQDN_1779_NAME
  86. name = win32api.GetUserNameEx(fmt_offered)
  87. result = win32security.DsCrackNames(None, ntsecuritycon.DS_NAME_FLAG_SYNTACTICAL_ONLY,
  88. fmt_offered, ntsecuritycon.DS_CANONICAL_NAME,
  89. (name,))
  90. self.failUnlessEqual(expected, result[0][2])
  91. class TestTranslate(DomainTests):
  92. def _testTranslate(self, fmt_from, fmt_to):
  93. name = win32api.GetUserNameEx(fmt_from)
  94. expected = win32api.GetUserNameEx(fmt_to)
  95. got = win32security.TranslateName(name, fmt_from, fmt_to)
  96. self.failUnlessEqual(got, expected)
  97. def testTranslate1(self):
  98. self._testTranslate(win32api.NameFullyQualifiedDN, win32api.NameSamCompatible)
  99. def testTranslate2(self):
  100. self._testTranslate(win32api.NameSamCompatible, win32api.NameFullyQualifiedDN)
  101. def testTranslate3(self):
  102. self._testTranslate(win32api.NameFullyQualifiedDN, win32api.NameUniqueId)
  103. def testTranslate4(self):
  104. self._testTranslate(win32api.NameUniqueId, win32api.NameFullyQualifiedDN)
  105. if __name__=='__main__':
  106. testmain()