mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
4.6 KiB
121 lines
4.6 KiB
#ifndef __CERT_DS_MANAGER_H__
|
|
#define __CERT_DS_MANAGER_H__ 1
|
|
|
|
#include <winldap.h>
|
|
|
|
//--------------------------------------------------------------------------------
|
|
//
|
|
// CertDSManager interface.
|
|
//
|
|
// The CertDSManager provides a wrapper around the certcli API to allow
|
|
// any DS caching/optimization to be localized within a simple class.
|
|
//
|
|
//--------------------------------------------------------------------------------
|
|
class CertDSManager {
|
|
public:
|
|
virtual HRESULT CloseCA (IN HCAINFO hCAInfo) = 0;
|
|
virtual HRESULT CloseCertType (IN HCERTTYPE hCertType) = 0;
|
|
virtual HRESULT CountCAs (IN HCAINFO hCAInfo) = 0;
|
|
virtual HRESULT EnumCertTypesForCA (IN HCAINFO hCAInfo, IN DWORD dsFlags, OUT HCERTTYPE *phCertType) = 0;
|
|
virtual HRESULT EnumFirstCA (IN LPCWSTR wszScope, IN DWORD fFlags, OUT HCAINFO *phCAInfo) = 0;
|
|
virtual HRESULT EnumNextCA (IN HCAINFO hPrevCA, OUT HCAINFO *phCAInfo) = 0;
|
|
virtual HRESULT EnumNextCertType (IN HCERTTYPE hPrevCertType, OUT HCERTTYPE *phCertType) = 0;
|
|
virtual HRESULT FindCertTypeByName (IN LPCWSTR pwszCertType, IN HCAINFO hCAInfo, IN DWORD dwFlags, OUT HCERTTYPE *phCertType) = 0;
|
|
virtual HRESULT FindCAByName (IN LPCWSTR wszCAName,IN LPCWSTR wszScope,IN DWORD dwFlags,OUT HCAINFO *phCAInfo) = 0;
|
|
virtual HRESULT GetCACertificate (IN HCAINFO hCAInfo, OUT PCCERT_CONTEXT *ppCert) = 0;
|
|
|
|
|
|
HRESULT static MakeDSManager(OUT CertDSManager **ppDSManager);
|
|
|
|
protected:
|
|
virtual HRESULT Initialize() = 0;
|
|
};
|
|
|
|
|
|
//--------------------------------------------------------------------------------
|
|
//
|
|
// DefaultDSManager.
|
|
//
|
|
// Other DS manager classes should extend this class, and implement only those
|
|
// methods which they wish to modify.
|
|
//
|
|
//--------------------------------------------------------------------------------
|
|
class DefaultDSManager : public CertDSManager {
|
|
public:
|
|
virtual HRESULT CloseCA(IN HCAINFO hCAInfo) {
|
|
return ::CACloseCA(hCAInfo);
|
|
}
|
|
|
|
virtual HRESULT CloseCertType(IN HCERTTYPE hCertType) {
|
|
return ::CACloseCertType(hCertType);
|
|
}
|
|
|
|
virtual HRESULT CountCAs(IN HCAINFO hCAInfo) {
|
|
return ::CACountCAs(hCAInfo);
|
|
}
|
|
|
|
virtual HRESULT EnumCertTypesForCA(IN HCAINFO hCAInfo, IN DWORD dwFlags, OUT HCERTTYPE *phCertType) {
|
|
return ::CAEnumCertTypesForCA(hCAInfo, dwFlags, phCertType);
|
|
}
|
|
|
|
virtual HRESULT EnumFirstCA(IN LPCWSTR wszScope, IN DWORD dwFlags, OUT HCAINFO *phCAInfo) {
|
|
return ::CAEnumFirstCA(wszScope, dwFlags, phCAInfo);
|
|
}
|
|
|
|
virtual HRESULT EnumNextCA(IN HCAINFO hPrevCA, OUT HCAINFO *phCAInfo) {
|
|
return ::CAEnumNextCA(hPrevCA, phCAInfo);
|
|
}
|
|
|
|
virtual HRESULT EnumNextCertType(IN HCERTTYPE hPrevCertType, OUT HCERTTYPE *phCertType) {
|
|
return ::CAEnumNextCertType(hPrevCertType, phCertType);
|
|
}
|
|
|
|
virtual HRESULT FindCertTypeByName(IN LPCWSTR pwszCertType, IN HCAINFO hCAInfo, IN DWORD dwFlags, OUT HCERTTYPE *phCertType) {
|
|
return ::CAFindCertTypeByName(pwszCertType, hCAInfo, dwFlags, phCertType);
|
|
}
|
|
|
|
virtual HRESULT FindCAByName(IN LPCWSTR wszCAName, IN LPCWSTR wszScope, IN DWORD dwFlags, OUT HCAINFO *phCAInfo) {
|
|
return ::CAFindByName(wszCAName, wszScope, dwFlags, phCAInfo);
|
|
}
|
|
|
|
virtual HRESULT GetCACertificate(IN HCAINFO hCAInfo, OUT PCCERT_CONTEXT *ppCert) {
|
|
return ::CAGetCACertificate(hCAInfo, ppCert);
|
|
}
|
|
|
|
protected:
|
|
virtual HRESULT Initialize() { return S_OK; }
|
|
};
|
|
|
|
//--------------------------------------------------------------------------------
|
|
//
|
|
// CachingDSManager
|
|
//
|
|
// This DS manager caches the LDAP binding handle (where possible) to prevent
|
|
// unnecessary binds and unbinds. It uses an enhanced version of certcli which
|
|
// allows you to pass an LDAP binding handle.
|
|
//
|
|
//--------------------------------------------------------------------------------
|
|
|
|
class CachingDSManager : public DefaultDSManager {
|
|
friend class CertDSManager;
|
|
|
|
public:
|
|
virtual ~CachingDSManager();
|
|
|
|
// Extend those routines which allow you to use a cached binding handle
|
|
HRESULT EnumCertTypesForCA(IN HCAINFO hCAInfo, IN DWORD dwFlags, OUT HCERTTYPE * phCertType);
|
|
HRESULT EnumFirstCA(IN LPCWSTR wszScope, IN DWORD dwFlags, OUT HCAINFO *phCAInfo);
|
|
HRESULT FindCAByName(IN LPCWSTR wszCAName, IN LPCWSTR wszScope, IN DWORD dwFlags,OUT HCAINFO *phCAInfo);
|
|
HRESULT FindCertTypeByName(IN LPCWSTR pwszCertType, IN HCAINFO hCAInfo, IN DWORD dwFlags, OUT HCERTTYPE *phCertType);
|
|
|
|
protected:
|
|
HRESULT Initialize();
|
|
|
|
private:
|
|
CachingDSManager() : m_ldBindingHandle(NULL) { }
|
|
LDAP *m_ldBindingHandle;
|
|
};
|
|
|
|
|
|
|
|
#endif // #ifndef __CERT_DS_MANAGER_H__
|