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)