# # (C) Copyright 2014 Enthought, Inc., Austin, TX # All right reserved. # # This file is open source software distributed according to the terms in # LICENSE.txt # import os import sys import unittest import win32cred from win32ctypes.core._winerrors import ERROR_NOT_FOUND from win32ctypes.pywin32.pywintypes import error from win32ctypes.pywin32.win32cred import ( CredDelete, CredRead, CredWrite, CredEnumerate, CRED_PERSIST_ENTERPRISE, CRED_TYPE_GENERIC, CRED_ENUMERATE_ALL_CREDENTIALS) # find the pywin32 version version_file = os.path.join( os.path.dirname( os.path.dirname(win32cred.__file__)), 'pywin32.version.txt') if os.path.exists(version_file): with open(version_file) as handle: pywin32_build = handle.read().strip() else: pywin32_build = None class TestCred(unittest.TestCase): def setUp(self): from pywintypes import error try: win32cred.CredDelete(u'jone@doe', CRED_TYPE_GENERIC) except error: pass def _demo_credentials(self, UserName=u'jone'): return { "Type": CRED_TYPE_GENERIC, "TargetName": u'jone@doe', "UserName": UserName, "CredentialBlob": u"doefsajfsakfj", "Comment": u"Created by MiniPyWin32Cred test suite", "Persist": CRED_PERSIST_ENTERPRISE} @unittest.skipIf( pywin32_build == "223" and sys.version_info[:2] == (3, 7), "pywin32 version 223 bug with CredRead (mhammond/pywin32#1232)") def test_write_to_pywin32(self): # given target = u'jone@doe' r_credentials = self._demo_credentials() CredWrite(r_credentials) # when credentials = win32cred.CredRead( TargetName=target, Type=CRED_TYPE_GENERIC) # then self.assertEqual(credentials["Type"], CRED_TYPE_GENERIC) self.assertEqual(credentials["UserName"], u"jone") self.assertEqual(credentials["TargetName"], u'jone@doe') self.assertEqual( credentials["Comment"], u"Created by MiniPyWin32Cred test suite") # XXX: the fact that we have to decode the password when reading, but # not encode when writing is a bit strange, but that's what pywin32 # seems to do and we try to be backward compatible here. self.assertEqual( credentials["CredentialBlob"].decode('utf-16'), u"doefsajfsakfj") def test_read_from_pywin32(self): # given target = u'jone@doe' r_credentials = self._demo_credentials() win32cred.CredWrite(r_credentials) # when credentials = CredRead(target, CRED_TYPE_GENERIC) # then self.assertEqual(credentials["UserName"], u"jone") self.assertEqual(credentials["TargetName"], u'jone@doe') self.assertEqual( credentials["Comment"], u"Created by MiniPyWin32Cred test suite") self.assertEqual( credentials["CredentialBlob"].decode('utf-16'), u"doefsajfsakfj") def test_read_from_pywin32_with_none_usename(self): # given target = u'jone@doe' r_credentials = self._demo_credentials(None) win32cred.CredWrite(r_credentials) # when credentials = CredRead(target, CRED_TYPE_GENERIC) self.assertEqual(credentials["UserName"], None) self.assertEqual(credentials["TargetName"], u'jone@doe') self.assertEqual( credentials["Comment"], u"Created by MiniPyWin32Cred test suite") self.assertEqual( credentials["CredentialBlob"].decode('utf-16'), u"doefsajfsakfj") def test_write_to_pywin32_with_none_usename(self): # given target = u'jone@doe' r_credentials = self._demo_credentials(None) CredWrite(r_credentials) # when credentials = win32cred.CredRead(target, CRED_TYPE_GENERIC) self.assertEqual(credentials["UserName"], None) self.assertEqual(credentials["TargetName"], u'jone@doe') self.assertEqual( credentials["Comment"], u"Created by MiniPyWin32Cred test suite") self.assertEqual( credentials["CredentialBlob"].decode('utf-16'), u"doefsajfsakfj") def test_read_write(self): # given target = u'jone@doe' r_credentials = self._demo_credentials() # when CredWrite(r_credentials) credentials = CredRead(target, CRED_TYPE_GENERIC) self.assertEqual(credentials["UserName"], u"jone") self.assertEqual(credentials["TargetName"], u'jone@doe') self.assertEqual( credentials["Comment"], u"Created by MiniPyWin32Cred test suite") self.assertEqual( credentials["CredentialBlob"].decode('utf-16'), u"doefsajfsakfj") def test_read_write_with_none_username(self): # given target = u'jone@doe' r_credentials = self._demo_credentials(None) # when CredWrite(r_credentials) credentials = CredRead(target, CRED_TYPE_GENERIC) # then self.assertEqual(credentials["UserName"], None) self.assertEqual(credentials["TargetName"], u'jone@doe') self.assertEqual( credentials["Comment"], u"Created by MiniPyWin32Cred test suite") self.assertEqual( credentials["CredentialBlob"].decode('utf-16'), u"doefsajfsakfj") def test_enumerate_filter(self): # given r_credentials = self._demo_credentials() CredWrite(r_credentials) # when credentials = CredEnumerate('jone*')[0] # then self.assertEqual(credentials["UserName"], u"jone") self.assertEqual(credentials["TargetName"], u'jone@doe') self.assertEqual( credentials["Comment"], u"Created by MiniPyWin32Cred test suite") self.assertEqual( credentials["CredentialBlob"].decode('utf-16'), u"doefsajfsakfj") def test_enumerate_no_filter(self): # given r_credentials = self._demo_credentials() CredWrite(r_credentials) # when pywin32_result = win32cred.CredEnumerate() credentials = CredEnumerate() # then self.assertEqual(len(credentials), len(pywin32_result)) def test_enumerate_all(self): # when credentials = CredEnumerate(Flags=CRED_ENUMERATE_ALL_CREDENTIALS) # then self.assertGreater(len(credentials), 1) def test_read_doesnt_exists(self): # given target = "Floupi_dont_exists@MiniPyWin" # when/then with self.assertRaises(error) as ctx: CredRead(target, CRED_TYPE_GENERIC) self.assertTrue(ctx.exception.winerror, ERROR_NOT_FOUND) def test_delete_simple(self): # given target = u'jone@doe' r_credentials = self._demo_credentials() CredWrite(r_credentials, 0) credentials = CredRead(target, CRED_TYPE_GENERIC) self.assertTrue(credentials is not None) # when CredDelete(target, CRED_TYPE_GENERIC) # then with self.assertRaises(error) as ctx: CredRead(target, CRED_TYPE_GENERIC) self.assertEqual(ctx.exception.winerror, ERROR_NOT_FOUND) self.assertEqual(ctx.exception.funcname, "CredRead") def test_delete_doesnt_exists(self): # given target = u"Floupi_doesnt_exists@MiniPyWin32" # when/then with self.assertRaises(error) as ctx: CredDelete(target, CRED_TYPE_GENERIC) self.assertEqual(ctx.exception.winerror, ERROR_NOT_FOUND) self.assertEqual(ctx.exception.funcname, "CredDelete") if __name__ == '__main__': unittest.main()