EXIT.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:8k
源码类别:

Windows编程

开发平台:

Visual C++

  1. //+--------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1996-1997
  5. //
  6. // File:        exit.cpp
  7. //
  8. // Contents:    CCertExit implementation
  9. //
  10. //---------------------------------------------------------------------------
  11. #include "pch.cpp"
  12. #pragma hdrstop
  13. #include <stdio.h>
  14. #include "exit.h"
  15. #define myEXITEVENTS 
  16. EXITEVENT_CERTISSUED | 
  17. EXITEVENT_CERTPENDING | 
  18. EXITEVENT_CERTDENIED | 
  19. EXITEVENT_CERTREVOKED | 
  20. EXITEVENT_CERTRETRIEVEPENDING | 
  21. EXITEVENT_CRLISSUED | 
  22. EXITEVENT_SHUTDOWN
  23. #ifndef DBG_CERTSRV
  24. #error -- DBG_CERTSRV not defined!
  25. #endif
  26. BOOL fDebug = DBG_CERTSRV;
  27. #define wszDESCRIPTION L"Sample Exit Module"
  28. //+--------------------------------------------------------------------------
  29. // CCertExit::~CCertExit -- destructor
  30. //
  31. // free memory associated with this instance
  32. //+--------------------------------------------------------------------------
  33. CCertExit::~CCertExit()
  34. {
  35.     if (NULL != m_strConfig)
  36.     {
  37. SysFreeString(m_strConfig);
  38.     }
  39. }
  40. //+--------------------------------------------------------------------------
  41. // CCertExit::Initialize -- initialize for a CA & return interesting Event Mask
  42. //
  43. // Returns S_OK on success.
  44. //+--------------------------------------------------------------------------
  45. STDMETHODIMP
  46. CCertExit::Initialize(
  47.     /* [in] */ BSTR const strConfig,
  48.     /* [retval][out] */ LONG __RPC_FAR *pEventMask)
  49. {
  50.     HRESULT hr = S_OK;
  51.     m_strConfig = SysAllocString(strConfig);
  52.     if (NULL == m_strConfig)
  53.     {
  54. hr = E_OUTOFMEMORY;
  55.     }
  56.     else
  57.     {
  58. *pEventMask = myEXITEVENTS;
  59. printf("Exit::Initialize(%ws) ==> %xn", m_strConfig, *pEventMask);
  60.     }
  61.     return(hr);
  62. }
  63. HRESULT
  64. EnumerateExtensions(
  65.     IN ICertServerExit *pServer)
  66. {
  67.     HRESULT hr;
  68.     HRESULT hr2;
  69.     BSTR strName = NULL;
  70.     LONG ExtFlags;
  71.     VARIANT varValue;
  72.     BOOL fClose = FALSE;
  73.     VariantInit(&varValue);
  74.     hr = pServer->EnumerateExtensionsSetup(0);
  75.     if (S_OK != hr)
  76.     {
  77. if (fDebug)
  78. {
  79.     printf("Exit:EnumerateExtensionsSetup: %x", hr);
  80. }
  81. goto error;
  82.     }
  83.     fClose = TRUE;
  84.     while (TRUE)
  85.     {
  86. hr = pServer->EnumerateExtensions(&strName);
  87. if (S_OK != hr)
  88. {
  89.     if (S_FALSE == hr)
  90.     {
  91. hr = S_OK;
  92. break;
  93.     }
  94.     if (fDebug)
  95.     {
  96. printf("Exit:EnumerateExtensions: %x", hr);
  97.     }
  98.     goto error;
  99. }
  100. hr = pServer->GetCertificateExtension(
  101. strName,
  102. PROPTYPE_BINARY,
  103. &varValue);
  104. if (S_OK != hr)
  105. {
  106.     if (fDebug)
  107.     {
  108. printf("Exit:GetCertificateExtension: %x", hr);
  109.     }
  110.     goto error;
  111. }
  112. hr = pServer->GetCertificateExtensionFlags(&ExtFlags);
  113. if (S_OK != hr)
  114. {
  115.     if (fDebug)
  116.     {
  117. printf("Exit:GetCertificateExtensionFlags: %x", hr);
  118.     }
  119.     goto error;
  120. }
  121. if (fDebug)
  122. {
  123.     printf(
  124. "Exit:EnumerateExtensions(%ws, Flags=%x, %x bytes)n",
  125. strName,
  126. ExtFlags,
  127. SysStringByteLen(varValue.bstrVal));
  128. }
  129. VariantClear(&varValue);
  130.     }
  131. error:
  132.     if (fClose)
  133.     {
  134. hr2 = pServer->EnumerateExtensionsClose();
  135. if (S_OK != hr2)
  136. {
  137.     if (fDebug)
  138.     {
  139. printf("Exit:EnumerateExtensionsClose: %x", hr2);
  140.     }
  141.     if (S_OK == hr)
  142.     {
  143. hr = hr2;
  144.     }
  145.     goto error;
  146. }
  147.     }
  148.     if (NULL != strName)
  149.     {
  150. SysFreeString(strName);
  151.     }
  152.     VariantClear(&varValue);
  153.     return(hr);
  154. }
  155. HRESULT
  156. EnumerateAttributes(
  157.     IN ICertServerExit *pServer)
  158. {
  159.     HRESULT hr;
  160.     HRESULT hr2;
  161.     BSTR strName = NULL;
  162.     BOOL fClose = FALSE;
  163.     BSTR strValue = NULL;
  164.     hr = pServer->EnumerateAttributesSetup(0);
  165.     if (S_OK != hr)
  166.     {
  167. if (fDebug)
  168. {
  169.     printf("Exit:EnumerateAttributesSetup: %x", hr);
  170. }
  171. goto error;
  172.     }
  173.     fClose = TRUE;
  174.     while (TRUE)
  175.     {
  176. hr = pServer->EnumerateAttributes(&strName);
  177. if (S_OK != hr)
  178. {
  179.     if (S_FALSE == hr)
  180.     {
  181. hr = S_OK;
  182. break;
  183.     }
  184.     if (fDebug)
  185.     {
  186. printf("Exit:EnumerateAttributes: %x", hr);
  187.     }
  188.     goto error;
  189. }
  190. hr = pServer->GetRequestAttribute(strName, &strValue);
  191. if (S_OK != hr)
  192. {
  193.     if (fDebug)
  194.     {
  195. printf("Exit:GetRequestAttribute: %x", hr);
  196.     }
  197.     goto error;
  198. }
  199. if (fDebug)
  200. {
  201.     printf("Exit:EnumerateAttributes(%ws = %ws)n", strName, strValue);
  202. }
  203. if (NULL != strValue)
  204. {
  205.     SysFreeString(strValue);
  206.     strValue = NULL;
  207. }
  208.     }
  209. error:
  210.     if (fClose)
  211.     {
  212. hr2 = pServer->EnumerateAttributesClose();
  213. if (S_OK != hr2)
  214. {
  215.     if (fDebug)
  216.     {
  217. printf("Exit:EnumerateAttributesClose: %x", hr2);
  218.     }
  219.     if (S_OK == hr)
  220.     {
  221. hr = hr2;
  222.     }
  223.     goto error;
  224. }
  225.     }
  226.     if (NULL != strName)
  227.     {
  228. SysFreeString(strName);
  229.     }
  230.     if (NULL != strValue)
  231.     {
  232. SysFreeString(strValue);
  233.     }
  234.     return(hr);
  235. }
  236. HRESULT
  237. CheckRequestProperties(
  238.     IN ICertServerExit *pServer)
  239. {
  240.     HRESULT hr;
  241.     VARIANT varValue;
  242.     BSTR strName = NULL;
  243.     VariantInit(&varValue);
  244.     strName = SysAllocString(wszPROPREQUESTREQUESTID);
  245.     if (NULL == strName)
  246.     {
  247. hr = E_OUTOFMEMORY;
  248. goto error;
  249.     }
  250.     hr = pServer->GetRequestProperty(strName, PROPTYPE_LONG, &varValue);
  251.     if (S_OK != hr)
  252.     {
  253. if (fDebug)
  254. {
  255.     printf("Exit:GetRequestProperty: %x", hr);
  256. }
  257. goto error;
  258.     }
  259.     if (fDebug)
  260.     {
  261. printf(
  262.     "Exit:CheckRequestProperties(%ws = %x)n",
  263.     strName,
  264.     varValue.lVal);
  265.     }
  266.     VariantClear(&varValue);
  267. error:
  268.     if (NULL != strName)
  269.     {
  270. SysFreeString(strName);
  271.     }
  272.     return(hr);
  273. }
  274. HRESULT
  275. CheckCert(
  276.     LONG Context)
  277. {
  278.     HRESULT hr;
  279.     ICertServerExit *pServer = NULL;
  280.     hr = CoCreateInstance(
  281.     CLSID_CCertServerExit,
  282.     NULL, // pUnkOuter
  283.     CLSCTX_INPROC_SERVER,
  284.     IID_ICertServerExit,
  285.     (VOID **) &pServer);
  286.     if (S_OK != hr)
  287.     {
  288. goto exit;
  289.     }
  290.     hr = pServer->SetContext(Context);
  291.     if (S_OK != hr)
  292.     {
  293. goto exit;
  294.     }
  295.     hr = EnumerateExtensions(pServer);
  296.     if (S_OK != hr)
  297.     {
  298. goto exit;
  299.     }
  300.     hr = EnumerateAttributes(pServer);
  301.     if (S_OK != hr)
  302.     {
  303. goto exit;
  304.     }
  305.     hr = CheckRequestProperties(pServer);
  306.     if (S_OK != hr)
  307.     {
  308. goto exit;
  309.     }
  310. exit:
  311.     if (NULL != pServer)
  312.     {
  313. pServer->Release();
  314.     }
  315.     return(hr);
  316. }
  317. //+--------------------------------------------------------------------------
  318. // CCertExit::Notify -- Notify the exit module of an event
  319. //
  320. // Returns S_OK.
  321. //+--------------------------------------------------------------------------
  322. STDMETHODIMP
  323. CCertExit::Notify(
  324.     /* [in] */ LONG Event,
  325.     /* [in] */ LONG Context)
  326. {
  327.     HRESULT hr = S_OK;
  328.     char *psz = "UNKNOWN EVENT";
  329.     switch (Event)
  330.     {
  331. case EXITEVENT_CERTISSUED:
  332.     psz = "certissued";
  333.     break;
  334. case EXITEVENT_CERTPENDING:
  335.     psz = "certpending";
  336.     break;
  337. case EXITEVENT_CERTDENIED:
  338.     psz = "certdenied";
  339.     break;
  340. case EXITEVENT_CERTREVOKED:
  341.     psz = "certrevoked";
  342.     break;
  343. case EXITEVENT_CERTRETRIEVEPENDING:
  344.     psz = "retrievepending";
  345.     break;
  346. case EXITEVENT_CRLISSUED:
  347.     psz = "crlissued";
  348.     break;
  349. case EXITEVENT_SHUTDOWN:
  350.     psz = "shutdown";
  351.     break;
  352.     }
  353.     printf("Exit::Notify(%s=%x, ctx=%u)n", psz, Event, Context);
  354.     if (EXITEVENT_CERTISSUED == Event)
  355.     {
  356. hr = CheckCert(Context);
  357.     }
  358.     return(hr);
  359. }
  360. STDMETHODIMP
  361. CCertExit::GetDescription(
  362.     /* [retval][out] */ BSTR *pstrDescription)
  363. {
  364.     HRESULT hr = S_OK;
  365.     *pstrDescription = SysAllocString(wszDESCRIPTION);
  366.     if (NULL == *pstrDescription)
  367.     {
  368. hr = E_OUTOFMEMORY;
  369.     }
  370.     return(hr);
  371. }
  372. /////////////////////////////////////////////////////////////////////////////
  373. //
  374. STDMETHODIMP
  375. CCertExit::InterfaceSupportsErrorInfo(REFIID riid)
  376. {
  377.     int i;
  378.     static const IID *arr[] =
  379.     {
  380. &IID_ICertExit,
  381.     };
  382.     for (i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
  383.     {
  384. if (InlineIsEqualGUID(*arr[i],riid))
  385. {
  386.     return(S_OK);
  387. }
  388.     }
  389.     return(S_FALSE);
  390. }