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 __future__ import absolute_import
from win32ctypes.core import _advapi32, _common, _backend
from win32ctypes.pywin32.pywintypes import pywin32error
CRED_TYPE_GENERIC = 0x1
CRED_PERSIST_ENTERPRISE = 0x3
CRED_PRESERVE_CREDENTIAL_BLOB = 0
[docs]def CredWrite(Credential, Flags=CRED_PRESERVE_CREDENTIAL_BLOB):
""" Creates or updates a stored credential.
Parameters
----------
Credential : dict
Parameters to be passed to win32 API CredWrite/
Flags : int
Always pass CRED_PRESERVE_CREDENTIAL_BLOB (i.e. 0).
Returns
-------
credentials : dict
A dictionary containing the following:
- Type: the type of credential (see MSDN)
- TargetName: the target to use (string)
- Persist: see MSDN
- UserName: the retrieved username
- CredentialBlob: the password (as a *string*, not an encoded
binary stream - this function takes care of the encoding).
- Comment: a string
"""
c_creds = _advapi32.CREDENTIAL.fromdict(Credential, Flags)
c_pcreds = _advapi32.PCREDENTIAL(c_creds)
with pywin32error():
_advapi32._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
A dictionary containing the following:
- UserName: the retrieved username
- CredentialBlob: the password (as an utf-16 encoded 'string')
``None`` if the target name was not found.
"""
if Type != CRED_TYPE_GENERIC:
raise ValueError("Type != CRED_TYPE_GENERIC not yet supported")
flag = 0
with pywin32error():
if _backend == 'cffi':
ppcreds = _advapi32.PPCREDENTIAL()
_advapi32._CredRead(TargetName, Type, flag, ppcreds)
pcreds = _common.dereference(ppcreds)
else:
pcreds = _advapi32.PCREDENTIAL()
_advapi32._CredRead(
TargetName, Type, flag, _common.byreference(pcreds))
try:
return _advapi32.credential2dict(_common.dereference(pcreds))
finally:
_advapi32._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():
_advapi32._CredDelete(TargetName, Type, 0)