windows-nt/Source/XPSP1/NT/ds/security/services/ca/certif/cipolicy.cpp
2020-09-26 16:20:57 +08:00

447 lines
10 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1995 - 1999
//
// File: cipolicy.cpp
//
//--------------------------------------------------------------------------
// cipolicy.cpp: Implementation of CCertServerPolicy
#include "pch.cpp"
#pragma hdrstop
#include "csprop.h"
#include "csdisp.h"
#include "ciinit.h"
#include <assert.h>
#include "cipolicy.h"
extern SERVERCALLBACKS ServerCallBacks;
/////////////////////////////////////////////////////////////////////////////
//
CCertServerPolicy::~CCertServerPolicy()
{
EnumerateExtensionsClose();
EnumerateAttributesClose();
}
STDMETHODIMP
CCertServerPolicy::SetContext(
IN LONG Context)
{
HRESULT hr;
VARIANT var;
VariantInit(&var);
if (0 != Context)
{
assert(NULL != ServerCallBacks.pfnGetProperty);
if (NULL == ServerCallBacks.pfnGetProperty)
{
hr = E_UNEXPECTED;
_JumpError(hr, error, "pfnGetProperty NULL");
}
hr = (*ServerCallBacks.pfnGetProperty)(
Context,
PROPTYPE_LONG |
PROPCALLER_POLICY |
PROPTABLE_CERTIFICATE,
wszPROPREQUESTREQUESTID,
&var);
_JumpIfError(hr, error, "GetProperty");
}
m_Context = Context;
hr = S_OK;
error:
VariantClear(&var);
return(_SetErrorInfo(hr, L"CCertServerPolicy::SetContext", NULL));
}
STDMETHODIMP
CCertServerPolicy::GetRequestProperty(
IN BSTR const strPropertyName,
IN LONG PropertyType,
OUT VARIANT __RPC_FAR *pvarPropertyValue)
{
HRESULT hr;
assert(NULL != ServerCallBacks.pfnGetProperty);
if (NULL == ServerCallBacks.pfnGetProperty)
{
hr = E_UNEXPECTED;
_JumpError(hr, error, "pfnGetProperty NULL");
}
hr = (*ServerCallBacks.pfnGetProperty)(
m_Context,
(PropertyType & PROPTYPE_MASK) |
PROPCALLER_POLICY | PROPTABLE_REQUEST,
strPropertyName,
pvarPropertyValue);
error:
return(_SetErrorInfo(hr, L"CCertServerPolicy::GetRequestProperty", strPropertyName));
}
STDMETHODIMP
CCertServerPolicy::GetRequestAttribute(
IN BSTR const strAttributeName,
OUT BSTR __RPC_FAR *pstrAttributeValue)
{
HRESULT hr;
VARIANT var;
var.vt = VT_BYREF | VT_BSTR;
var.pbstrVal = pstrAttributeValue;
if (NULL == pstrAttributeValue)
{
hr = E_POINTER;
_JumpError(hr, error, "pstrAttributeValue NULL");
}
assert(NULL != ServerCallBacks.pfnGetProperty);
if (NULL == ServerCallBacks.pfnGetProperty)
{
hr = E_UNEXPECTED;
_JumpError(hr, error, "pfnGetProperty NULL");
}
hr = (*ServerCallBacks.pfnGetProperty)(
m_Context,
PROPTYPE_STRING |
PROPCALLER_POLICY |
PROPTABLE_ATTRIBUTE,
strAttributeName,
&var);
*pstrAttributeValue = NULL;
if (VT_BSTR == var.vt)
{
*pstrAttributeValue = var.bstrVal;
var.vt = VT_EMPTY;
}
else
if ((VT_BYREF | VT_BSTR) == var.vt)
{
*pstrAttributeValue = *var.pbstrVal;
var.vt = VT_EMPTY;
}
error:
VariantClear(&var);
return(_SetErrorInfo(hr, L"CCertServerPolicy::GetRequestAttribute", strAttributeName));
}
STDMETHODIMP
CCertServerPolicy::GetCertificateProperty(
IN BSTR const strPropertyName,
IN LONG PropertyType,
OUT VARIANT __RPC_FAR *pvarPropertyValue)
{
HRESULT hr;
assert(NULL != ServerCallBacks.pfnGetProperty);
if (NULL == ServerCallBacks.pfnGetProperty)
{
hr = E_UNEXPECTED;
_JumpError(hr, error, "pfnGetProperty NULL");
}
hr = (*ServerCallBacks.pfnGetProperty)(
m_Context,
(PropertyType & PROPTYPE_MASK) |
PROPCALLER_POLICY | PROPTABLE_CERTIFICATE,
strPropertyName,
pvarPropertyValue);
error:
return(_SetErrorInfo(hr, L"CCertServerPolicy::GetCertificateProperty", strPropertyName));
}
STDMETHODIMP
CCertServerPolicy::SetCertificateProperty(
IN BSTR const strPropertyName,
IN LONG PropertyType,
IN VARIANT const __RPC_FAR *pvarPropertyValue)
{
HRESULT hr;
assert(NULL != ServerCallBacks.pfnSetProperty);
if (NULL == ServerCallBacks.pfnSetProperty)
{
hr = E_UNEXPECTED;
_JumpError(hr, error, "pfnSetProperty NULL");
}
hr = (*ServerCallBacks.pfnSetProperty)(
m_Context,
(PropertyType & PROPTYPE_MASK) |
PROPCALLER_POLICY | PROPTABLE_CERTIFICATE,
strPropertyName,
pvarPropertyValue);
error:
return(_SetErrorInfo(hr, L"CCertServerPolicy::SetCertificateProperty", strPropertyName));
}
STDMETHODIMP
CCertServerPolicy::GetCertificateExtension(
IN BSTR const strExtensionName,
IN LONG Type,
OUT VARIANT __RPC_FAR *pvarValue)
{
HRESULT hr;
m_fExtensionValid = FALSE;
assert(NULL != ServerCallBacks.pfnGetExtension);
if (NULL == ServerCallBacks.pfnGetExtension)
{
hr = E_UNEXPECTED;
_JumpError(hr, error, "pfnGetExtension NULL");
}
hr = (*ServerCallBacks.pfnGetExtension)(
m_Context,
(Type & PROPTYPE_MASK) | PROPCALLER_POLICY,
strExtensionName,
(DWORD *) &m_ExtFlags,
pvarValue);
if (S_OK == hr)
{
m_fExtensionValid = TRUE;
}
error:
return(_SetErrorInfo(hr, L"CCertServerPolicy::GetCertificateExtension", strExtensionName));
}
STDMETHODIMP
CCertServerPolicy::GetCertificateExtensionFlags(
OUT LONG __RPC_FAR *pExtFlags)
{
HRESULT hr = E_INVALIDARG;
if (NULL == pExtFlags)
{
hr = E_POINTER;
_JumpError(hr, error, "NULL parm");
}
*pExtFlags = 0;
if (m_fExtensionValid)
{
*pExtFlags = m_ExtFlags;
hr = S_OK;
}
error:
return(_SetErrorInfo(hr, L"CCertServerPolicy::GetCertificateExtensionFlags", NULL));
}
STDMETHODIMP
CCertServerPolicy::SetCertificateExtension(
IN BSTR const strExtensionName,
IN LONG Type,
IN LONG ExtFlags,
IN VARIANT const __RPC_FAR *pvarValue)
{
HRESULT hr;
assert(NULL != ServerCallBacks.pfnSetExtension);
if (NULL == ServerCallBacks.pfnSetExtension)
{
hr = E_UNEXPECTED;
_JumpError(hr, error, "pfnSetExtension NULL");
}
hr = (*ServerCallBacks.pfnSetExtension)(
m_Context,
(Type & PROPTYPE_MASK) | PROPCALLER_POLICY,
strExtensionName,
(ExtFlags & EXTENSION_POLICY_MASK) |
EXTENSION_ORIGIN_POLICY,
pvarValue);
error:
return(_SetErrorInfo(hr, L"CCertServerPolicy::SetCertificateExtension", strExtensionName));
}
STDMETHODIMP
CCertServerPolicy::EnumerateExtensionsSetup(
IN LONG Flags)
{
HRESULT hr;
assert(NULL != ServerCallBacks.pfnEnumSetup);
if (NULL == ServerCallBacks.pfnEnumSetup)
{
hr = E_UNEXPECTED;
_JumpError(hr, error, "pfnEnumSetup NULL");
}
hr = (*ServerCallBacks.pfnEnumSetup)(
m_Context,
(Flags & CIE_OBJECTID) |
CIE_TABLE_EXTENSIONS |
CIE_CALLER_POLICY,
&m_ciEnumExtensions);
error:
return(_SetErrorInfo(hr, L"CCertServerPolicy::EnumerateExtensionsSetup", NULL));
}
STDMETHODIMP
CCertServerPolicy::EnumerateExtensions(
OUT BSTR *pstrExtensionName)
{
HRESULT hr;
assert(NULL != ServerCallBacks.pfnEnumNext);
if (NULL == ServerCallBacks.pfnEnumNext)
{
hr = E_UNEXPECTED;
_JumpError(hr, error, "pfnEnumNext NULL");
}
hr = (*ServerCallBacks.pfnEnumNext)(
&m_ciEnumExtensions,
pstrExtensionName);
error:
return(_SetErrorInfo(hr, L"CCertServerPolicy::EnumerateExtensions", NULL));
}
STDMETHODIMP
CCertServerPolicy::EnumerateExtensionsClose(VOID)
{
HRESULT hr;
assert(NULL != ServerCallBacks.pfnEnumClose);
if (NULL == ServerCallBacks.pfnEnumClose)
{
hr = E_UNEXPECTED;
_JumpError(hr, error, "pfnEnumClose NULL");
}
hr = (*ServerCallBacks.pfnEnumClose)(&m_ciEnumExtensions);
error:
return(_SetErrorInfo(hr, L"CCertServerPolicy::EnumerateExtensionsClose", NULL));
}
STDMETHODIMP
CCertServerPolicy::EnumerateAttributesSetup(
IN LONG Flags)
{
HRESULT hr;
assert(NULL != ServerCallBacks.pfnEnumSetup);
if (NULL == ServerCallBacks.pfnEnumSetup)
{
hr = E_UNEXPECTED;
_JumpError(hr, error, "pfnEnumSetup NULL");
}
hr = (*ServerCallBacks.pfnEnumSetup)(
m_Context,
(Flags & CIE_OBJECTID) |
CIE_TABLE_ATTRIBUTES |
CIE_CALLER_POLICY,
&m_ciEnumAttributes);
error:
return(_SetErrorInfo(hr, L"CCertServerPolicy::EnumerateAttributesSetup", NULL));
}
STDMETHODIMP
CCertServerPolicy::EnumerateAttributes(
OUT BSTR *pstrAttributeName)
{
HRESULT hr;
assert(NULL != ServerCallBacks.pfnEnumNext);
if (NULL == ServerCallBacks.pfnEnumNext)
{
hr = E_UNEXPECTED;
_JumpError(hr, error, "pfnEnumNext NULL");
}
hr = (*ServerCallBacks.pfnEnumNext)(
&m_ciEnumAttributes,
pstrAttributeName);
error:
return(_SetErrorInfo(hr, L"CCertServerPolicy::EnumerateAttributes", NULL));
}
STDMETHODIMP
CCertServerPolicy::EnumerateAttributesClose(VOID)
{
HRESULT hr;
assert(NULL != ServerCallBacks.pfnEnumClose);
if (NULL == ServerCallBacks.pfnEnumClose)
{
hr = E_UNEXPECTED;
_JumpError(hr, error, "pfnEnumClose NULL");
}
hr = (*ServerCallBacks.pfnEnumClose)(&m_ciEnumAttributes);
error:
return(_SetErrorInfo(hr, L"CCertServerPolicy::EnumerateAttributesClose", NULL));
}
HRESULT
CCertServerPolicy::_SetErrorInfo(
IN HRESULT hrError,
IN WCHAR const *pwszDescription,
OPTIONAL IN WCHAR const *pwszPropName)
{
CSASSERT(FAILED(hrError) || S_OK == hrError || S_FALSE == hrError);
CSASSERT(pwszDescription != NULL);
if (NULL == pwszDescription)
{
_JumpError(E_POINTER, error, "NULL parm");
}
if (FAILED(hrError))
{
HRESULT hr;
WCHAR const *pwszLog = pwszDescription;
WCHAR *pwszAlloc = NULL;
if (NULL != pwszPropName)
{
pwszAlloc = (WCHAR *) LocalAlloc(
LMEM_FIXED,
(wcslen(pwszDescription) +
wcslen(pwszPropName) +
2 +
1) * sizeof(WCHAR));
if (NULL != pwszAlloc)
{
wcscpy(pwszAlloc, pwszDescription);
wcscat(pwszAlloc, wszLPAREN);
wcscat(pwszAlloc, pwszPropName);
wcscat(pwszAlloc, wszRPAREN);
pwszLog = pwszAlloc;
}
}
hr = DispatchSetErrorInfo(
hrError,
pwszLog,
wszCLASS_CERTSERVERPOLICY,
&IID_ICertServerPolicy);
CSASSERT(hr == hrError);
if (NULL != pwszAlloc)
{
LocalFree(pwszAlloc);
}
}
error:
return(hrError);
}