# # (C) Copyright 2014 Enthought, Inc., Austin, TX # All right reserved. # # This file is open source software distributed according to the terms in # LICENSE.txt # from __future__ import absolute_import 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, CRED_PERSIST_ENTERPRISE, CRED_TYPE_GENERIC) from win32ctypes.tests import compat # 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(compat.TestCase): @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): username = u"john" password = u"doefsajfsakfj" comment = u"Created by MiniPyWin32Cred test suite" target = "{0}@{1}".format(username, password) credentials = {"Type": CRED_TYPE_GENERIC, "TargetName": target, "UserName": username, "CredentialBlob": password, "Comment": comment, "Persist": CRED_PERSIST_ENTERPRISE} CredWrite(credentials) res = win32cred.CredRead( TargetName=target, Type=CRED_TYPE_GENERIC) self.assertEqual(res["Type"], CRED_TYPE_GENERIC) self.assertEqual(res["UserName"], username) self.assertEqual(res["TargetName"], target) self.assertEqual(res["Comment"], comment) self.assertEqual( res["CredentialBlob"].decode('utf-16'), password) def test_read_from_pywin32(self): username = "john" password = "doe" comment = u"Created by MiniPyWin32Cred test suite" target = u"{0}@{1}".format(username, password) r_credentials = { u"Type": CRED_TYPE_GENERIC, u"TargetName": target, u"UserName": username, u"CredentialBlob": password, u"Comment": comment, u"Persist": CRED_PERSIST_ENTERPRISE} win32cred.CredWrite(r_credentials) credentials = CredRead(target, CRED_TYPE_GENERIC) # 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 as well, and we try to be backward compatible here. self.assertEqual(credentials["UserName"], username) self.assertEqual(credentials["TargetName"], target) self.assertEqual(credentials["Comment"], comment) self.assertEqual( credentials["CredentialBlob"].decode("utf-16"), password) def test_read_write(self): username = "john" password = "doe" comment = u"Created by MiniPyWin32Cred test suite" target = u"{0}@{1}".format(username, password) r_credentials = { u"Type": CRED_TYPE_GENERIC, u"TargetName": target, u"UserName": username, u"CredentialBlob": password, u"Comment": comment, u"Persist": CRED_PERSIST_ENTERPRISE} CredWrite(r_credentials) credentials = CredRead(target, CRED_TYPE_GENERIC) # 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 as well, and we try to be backward compatible here. self.assertEqual(credentials["UserName"], username) self.assertEqual(credentials["TargetName"], target) self.assertEqual(credentials["Comment"], comment) self.assertEqual( credentials["CredentialBlob"].decode("utf-16"), password) def test_read_doesnt_exists(self): target = "Floupi_dont_exists@MiniPyWin" with self.assertRaises(error) as ctx: CredRead(target, CRED_TYPE_GENERIC) self.assertTrue(ctx.exception.winerror, ERROR_NOT_FOUND) def test_delete_simple(self): username = "john" password = "doe" comment = "Created by MiniPyWin32Cred test suite" target = "{0}@{1}".format(username, password) r_credentials = { "Type": CRED_TYPE_GENERIC, "TargetName": target, "UserName": username, "CredentialBlob": password, "Comment": comment, "Persist": CRED_PERSIST_ENTERPRISE} CredWrite(r_credentials, 0) credentials = CredRead(target, CRED_TYPE_GENERIC) self.assertTrue(credentials is not None) CredDelete(target, CRED_TYPE_GENERIC) 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): target = u"Floupi_doesnt_exists@MiniPyWin32" 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()