Source code for win32ctypes.pywin32.win32cred

#
# (C) Copyright 2014 Enthought, Inc., Austin, TX
# All right reserved.
#
# This file is open source software distributed according to the terms in
# LICENSE.txt
#
""" Interface to credentials management functions. """
from win32ctypes.core import _authentication, _common, _backend
from win32ctypes.pywin32.pywintypes import pywin32error as _pywin32error

CRED_TYPE_GENERIC = 0x1
CRED_PERSIST_SESSION = 0x1
CRED_PERSIST_LOCAL_MACHINE = 0x2
CRED_PERSIST_ENTERPRISE = 0x3
CRED_PRESERVE_CREDENTIAL_BLOB = 0
CRED_ENUMERATE_ALL_CREDENTIALS = 0x1


[docs]def CredWrite(Credential, Flags=CRED_PRESERVE_CREDENTIAL_BLOB): """ Creates or updates a stored credential. Parameters ---------- Credential : dict A dictionary corresponding to the PyWin32 ``PyCREDENTIAL`` structure. Flags : int Always pass ``CRED_PRESERVE_CREDENTIAL_BLOB`` (i.e. 0). """ c_creds = _authentication.CREDENTIAL.fromdict(Credential, Flags) c_pcreds = _authentication.PCREDENTIAL(c_creds) with _pywin32error(): _authentication._CredWrite(c_pcreds, 0)
[docs]def CredRead(TargetName, Type, Flags=0): """ Retrieves a stored credential. Parameters ---------- TargetName : unicode The target name to fetch from the keyring. Type : int One of the CRED_TYPE_* constants. Flags : int Reserved, always use 0. Returns ------- credentials : dict ``None`` if the target name was not found or A dictionary corresponding to the PyWin32 ``PyCREDENTIAL`` structure. """ if Type != CRED_TYPE_GENERIC: raise ValueError("Type != CRED_TYPE_GENERIC not yet supported") flag = 0 with _pywin32error(): if _backend == 'cffi': ppcreds = _authentication.PPCREDENTIAL() _authentication._CredRead(TargetName, Type, flag, ppcreds) pcreds = _common.dereference(ppcreds) else: pcreds = _authentication.PCREDENTIAL() _authentication._CredRead( TargetName, Type, flag, _common.byreference(pcreds)) try: return _authentication.credential2dict(_common.dereference(pcreds)) finally: _authentication._CredFree(pcreds)
[docs]def CredDelete(TargetName, Type, Flags=0): """ Remove the given target name from the stored credentials. Parameters ---------- TargetName : unicode The target name to fetch from the keyring. Type : int One of the CRED_TYPE_* constants. Flags : int Reserved, always use 0. """ if not Type == CRED_TYPE_GENERIC: raise ValueError("Type != CRED_TYPE_GENERIC not yet supported.") with _pywin32error(): _authentication._CredDelete(TargetName, Type, 0)
[docs]def CredEnumerate(Filter=None, Flags=0): """ Remove the given target name from the stored credentials. Parameters ---------- Filter : unicode Matches credentials' target names by prefix, can be None. Flags : int When set to CRED_ENUMERATE_ALL_CREDENTIALS enumerates all of the credentials in the user's credential set but in that case the Filter parameter should be NULL, an error is raised otherwise Returns ------- credentials : list Returns a sequence of CREDENTIAL dictionaries. """ with _pywin32error(): if _backend == 'cffi': pcount = _common.PDWORD() pppcredential = _authentication.PPPCREDENTIAL() _authentication._CredEnumerate( Filter, Flags, pcount, pppcredential) count = pcount[0] data = _common.dereference( _common.ffi.cast(f"PCREDENTIAL*[{count}]", pppcredential)) memory = _common.dereference(pppcredential) else: import ctypes count = _authentication.DWORD() pcredential = _authentication.PCREDENTIAL() ppcredential = ctypes.pointer(pcredential) pppcredential = ctypes.pointer(ppcredential) _authentication._CredEnumerate( Filter, Flags, _common.byreference(count), pppcredential) count = count.value data = _common.dereference( _common.cast( ppcredential, _common.POINTER(_authentication.PCREDENTIAL*count))) memory = pcredential try: result = [] for i in range(count): credential = _common.dereference(data[i]) result.append(_authentication.credential2dict(credential)) return result finally: _authentication._CredFree(memory)