windows-nt/Source/XPSP1/NT/ds/security/services/ca/certmmc/certwrap.h
2020-09-26 16:20:57 +08:00

221 lines
5.2 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1997 - 1999
//
// File: certwrap.h
//
//--------------------------------------------------------------------------
#ifndef _CERTWRAP_H_
#define _CERTWRAP_H_
#include <iads.h>
#include <adshlp.h>
// fwd
class CertSvrMachine;
class CertSvrCA
{
protected:
HCERTSTORE m_hCACertStore; // our cert store
BOOL m_fCertStoreOpenAttempted;
HRESULT m_hrCACertStoreOpen;
HCERTSTORE m_hRootCertStore; // root store on machine
BOOL m_fRootStoreOpenAttempted;
HRESULT m_hrRootCertStoreOpen;
HCERTSTORE m_hKRACertStore; // KRA store on machine
BOOL m_fKRAStoreOpenAttempted;
HRESULT m_hrKRACertStoreOpen;
BOOL m_fIsUsingDS;
BOOL m_fIsUsingDSKnown;
ENUM_CATYPES m_enumCAType;
BOOL m_fCATypeKnown;
BOOL m_fAdvancedServer;
BOOL m_fAdvancedServerKnown;
DWORD m_dwRoles;
BOOL m_fRolesKnown;
public:
CertSvrMachine* m_pParentMachine;
CString m_strServer;
CString m_strCommonName;
CString m_strSanitizedName;
CString m_strConfig;
CString m_strComment;
CString m_strCAObjectDN;
BSTR m_bstrConfig; // oft used as BSTR
public:
CertSvrCA(CertSvrMachine* pParent);
~CertSvrCA();
public:
DWORD GetMyRoles();
BOOL AccessAllowed(DWORD dwAccess);
HRESULT GetConfigEntry(
LPWSTR szConfigSubKey,
LPWSTR szConfigEntry,
VARIANT *pvarOut);
HRESULT SetConfigEntry(
LPWSTR szConfigSubKey,
LPWSTR szConfigEntry,
VARIANT *pvarIn);
DWORD DeleteConfigEntry(
LPWSTR szConfigSubKey,
LPWSTR szConfigEntry);
ENUM_CATYPES GetCAType();
BOOL FIsUsingDS();
BOOL FIsIncompleteInstallation();
BOOL FIsRequestOutstanding();
BOOL FIsAdvancedServer();
BOOL FDoesSecurityNeedUpgrade();
BOOL FDoesServerAllowForeignCerts();
DWORD GetCACertStore(HCERTSTORE* phCertStore); // class frees
DWORD GetRootCertStore(HCERTSTORE* phCertStore); // class frees
DWORD GetKRACertStore(HCERTSTORE* phCertStore); // class frees
DWORD GetCurrentCRL(PCCRL_CONTEXT* ppCRLCtxt, BOOL fBaseCRL); // use CertFreeCRLContext()
DWORD GetCRLByKeyIndex(PCCRL_CONTEXT* ppCRLCtxt, BOOL fBaseCRL, int iKeyIndex); // use CertFreeCRLContext()
DWORD GetCACertByKeyIndex(PCCERT_CONTEXT*ppCertCtxt, int iKeyIndex); // use CertFreeCertificateContext()
HRESULT FixEnrollmentObject();
protected:
HRESULT IsCAAllowedFullControl(
PSECURITY_DESCRIPTOR pSDRead,
PSID pSid,
bool& fAllowed);
HRESULT AllowCAFullControl(
PSECURITY_DESCRIPTOR pSDRead,
PSID pSid,
PSECURITY_DESCRIPTOR& pSDWrite);
HRESULT GetCAFlagsFromDS(
PDWORD pdwFlags);
};
class CertSvrMachine
{
friend CComponentDataImpl;
public:
// IPersistStream interface members
STDMETHOD(Load)(IStream *pStm);
STDMETHOD(Save)(IStream *pStm, BOOL fClearDirty);
STDMETHOD(GetSizeMax)(int *pcbSize);
#if DBG
bool m_bInitializedCD;
bool m_bLoadedCD;
bool m_bDestroyedCD;
#endif
public:
CString m_strMachineNamePersist; // Machine name to persist into .msc file
CString m_strMachineName; // Effective machine name
DWORD m_dwServiceStatus; //
HKEY m_hCachedConfigBaseKey; // base registry key
BOOL m_bAttemptedBaseKeyOpen;
BOOL m_fIsWhistlerMachine;
BOOL m_fIsWhistlerMachineKnown;
protected:
CArray<CertSvrCA*, CertSvrCA*> m_CAList;
public:
CertSvrMachine();
~CertSvrMachine();
ULONG AddRef() { return(InterlockedIncrement(&m_cRef)); }
ULONG Release()
{
ULONG cRef = InterlockedDecrement(&m_cRef);
if (0 == cRef)
{
delete this;
}
return cRef;
}
private:
DWORD RetrieveCertSvrCAs(DWORD dwFlags);
LONG m_cRef;
BOOL m_fLocalIsKnown, m_fIsLocal;
void Init();
public:
HRESULT GetAdmin(ICertAdmin** ppAdmin);
HRESULT GetAdmin2(ICertAdmin2** ppAdmin, bool fIgnoreServiceDown = false);
// Fills local cache with CAs for current machine
DWORD PrepareData(HWND hwndParent);
// enum CAs on current machine
LPCWSTR GetCaCommonNameAtPos(DWORD iPos);
CertSvrCA* GetCaAtPos(DWORD iPos);
HRESULT GetRootConfigEntry(
LPWSTR szConfigEntry,
VARIANT *pvarOut);
DWORD GetCaCount()
{ return m_CAList.GetSize(); }
BOOL FIsWhistlerMachine();
// control CA on current machine
DWORD CertSvrStartStopService(HWND hwndParent, BOOL fStartSvc);
DWORD RefreshServiceStatus();
DWORD GetCertSvrServiceStatus()
{ return m_dwServiceStatus; };
BOOL IsCertSvrServiceRunning()
{ return (m_dwServiceStatus == SERVICE_RUNNING); };
BOOL IsLocalMachine()
{
if (!m_fLocalIsKnown)
{
m_fLocalIsKnown = TRUE;
m_fIsLocal = FIsCurrentMachine(m_strMachineName);
}
return m_fIsLocal;
};
};
#endif // _CERTWRAP_H_