992 lines
23 KiB
C++
992 lines
23 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1992 - 1996.
|
||
|
//
|
||
|
// File: var2ldap.cxx
|
||
|
//
|
||
|
// Contents: Variant to LDAP object Copy Routines
|
||
|
//
|
||
|
// Functions:
|
||
|
//
|
||
|
// History: 25-Jun-96 yihsins Created.
|
||
|
//
|
||
|
//
|
||
|
// Issues:
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
#include "ldap.hxx"
|
||
|
|
||
|
//
|
||
|
// LdapType objects copy code
|
||
|
//
|
||
|
|
||
|
HRESULT
|
||
|
VarTypeToLdapTypeString(
|
||
|
PVARIANT pVarSrcObject,
|
||
|
PLDAPOBJECT pLdapDestObject
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
DWORD nStrLen;
|
||
|
|
||
|
if(pVarSrcObject->vt != VT_BSTR){
|
||
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
||
|
}
|
||
|
|
||
|
if (!pVarSrcObject->bstrVal) {
|
||
|
RRETURN(hr = E_ADS_BAD_PARAMETER);
|
||
|
}
|
||
|
|
||
|
nStrLen = _tcslen( pVarSrcObject->bstrVal );
|
||
|
|
||
|
LDAPOBJECT_STRING(pLdapDestObject) =
|
||
|
(LPTSTR) AllocADsMem( (nStrLen + 1) * sizeof(TCHAR));
|
||
|
|
||
|
if ( LDAPOBJECT_STRING(pLdapDestObject) == NULL)
|
||
|
{
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
RRETURN(hr);
|
||
|
}
|
||
|
|
||
|
if ( nStrLen == 0 ) {
|
||
|
_tcscpy( LDAPOBJECT_STRING(pLdapDestObject), L"");
|
||
|
RRETURN(S_OK);
|
||
|
}
|
||
|
|
||
|
_tcscpy( LDAPOBJECT_STRING(pLdapDestObject), pVarSrcObject->bstrVal );
|
||
|
|
||
|
RRETURN(S_OK);
|
||
|
}
|
||
|
|
||
|
HRESULT
|
||
|
VarTypeToLdapTypeBoolean(
|
||
|
PVARIANT pVarSrcObject,
|
||
|
PLDAPOBJECT pLdapDestObject
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
LPTSTR pszStr = NULL;
|
||
|
|
||
|
if(pVarSrcObject->vt != VT_BOOL){
|
||
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
||
|
}
|
||
|
|
||
|
if ( pVarSrcObject->boolVal )
|
||
|
pszStr = TEXT("TRUE");
|
||
|
else
|
||
|
pszStr = TEXT("FALSE");
|
||
|
|
||
|
LDAPOBJECT_STRING(pLdapDestObject) =
|
||
|
(LPTSTR) AllocADsMem( (_tcslen(pszStr) + 1) * sizeof(TCHAR));
|
||
|
|
||
|
if ( LDAPOBJECT_STRING(pLdapDestObject) == NULL)
|
||
|
{
|
||
|
RRETURN(hr = E_OUTOFMEMORY);
|
||
|
|
||
|
}
|
||
|
|
||
|
_tcscpy( LDAPOBJECT_STRING(pLdapDestObject), pszStr );
|
||
|
|
||
|
RRETURN(hr);
|
||
|
}
|
||
|
|
||
|
HRESULT
|
||
|
VarTypeToLdapTypeUTCTime(
|
||
|
PVARIANT pVarSrcObject,
|
||
|
PLDAPOBJECT pLdapDestObject
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
int nSuccess = 0;
|
||
|
ADSVALUE adsValue;
|
||
|
DWORD dwSyntaxId = 0;
|
||
|
|
||
|
if (pVarSrcObject->vt != VT_DATE)
|
||
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
||
|
|
||
|
adsValue.dwType = ADSTYPE_UTC_TIME;
|
||
|
nSuccess = VariantTimeToSystemTime(
|
||
|
pVarSrcObject->date,
|
||
|
&adsValue.UTCTime
|
||
|
);
|
||
|
if (!nSuccess) {
|
||
|
hr = E_ADS_CANT_CONVERT_DATATYPE;
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
}
|
||
|
|
||
|
hr = AdsTypeToLdapTypeCopyTime(
|
||
|
&adsValue,
|
||
|
pLdapDestObject,
|
||
|
&dwSyntaxId
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
error:
|
||
|
RRETURN(hr);
|
||
|
}
|
||
|
|
||
|
HRESULT
|
||
|
VarTypeToLdapTypeGeneralizedTime(
|
||
|
PVARIANT pVarSrcObject,
|
||
|
PLDAPOBJECT pLdapDestObject
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
ADSVALUE adsValue;
|
||
|
DWORD dwErr = 0;
|
||
|
DWORD dwSyntaxId = 0;
|
||
|
|
||
|
if (pVarSrcObject->vt != VT_DATE)
|
||
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
||
|
|
||
|
adsValue.dwType = ADSTYPE_UTC_TIME;
|
||
|
|
||
|
dwErr = VariantTimeToSystemTime(
|
||
|
pVarSrcObject->date,
|
||
|
&adsValue.UTCTime
|
||
|
);
|
||
|
|
||
|
if (dwErr != TRUE) {
|
||
|
BAIL_ON_FAILURE(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
||
|
}
|
||
|
|
||
|
|
||
|
hr = AdsTypeToLdapTypeCopyGeneralizedTime(
|
||
|
&adsValue,
|
||
|
pLdapDestObject,
|
||
|
&dwSyntaxId
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
error:
|
||
|
RRETURN(hr);
|
||
|
}
|
||
|
|
||
|
HRESULT
|
||
|
VarTypeToLdapTypeInteger(
|
||
|
PVARIANT pVarSrcObject,
|
||
|
PLDAPOBJECT pLdapDestObject
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
TCHAR Buffer[64];
|
||
|
|
||
|
if( pVarSrcObject->vt != VT_I4 && pVarSrcObject->vt != VT_I2){
|
||
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
||
|
}
|
||
|
|
||
|
if(pVarSrcObject->vt == VT_I4)
|
||
|
_ltot( pVarSrcObject->lVal, Buffer, 10 );
|
||
|
else
|
||
|
_itot( pVarSrcObject->iVal, Buffer, 10 );
|
||
|
|
||
|
LDAPOBJECT_STRING(pLdapDestObject) =
|
||
|
(LPTSTR) AllocADsMem( (_tcslen(Buffer) + 1) * sizeof(TCHAR));
|
||
|
|
||
|
if ( LDAPOBJECT_STRING(pLdapDestObject) == NULL)
|
||
|
{
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
RRETURN(hr);
|
||
|
}
|
||
|
|
||
|
_tcscpy( LDAPOBJECT_STRING(pLdapDestObject), Buffer );
|
||
|
|
||
|
RRETURN(hr);
|
||
|
}
|
||
|
|
||
|
HRESULT
|
||
|
VarTypeToLdapTypeBinaryData(
|
||
|
PVARIANT pVarSrcObject,
|
||
|
PLDAPOBJECT pLdapDestObject
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
LONG dwSLBound = 0;
|
||
|
LONG dwSUBound = 0;
|
||
|
CHAR HUGEP *pArray = NULL;
|
||
|
|
||
|
if( pVarSrcObject->vt != (VT_ARRAY | VT_UI1)) {
|
||
|
RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE);
|
||
|
}
|
||
|
|
||
|
hr = SafeArrayGetLBound(V_ARRAY(pVarSrcObject),
|
||
|
1,
|
||
|
(long FAR *) &dwSLBound );
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
hr = SafeArrayGetUBound(V_ARRAY(pVarSrcObject),
|
||
|
1,
|
||
|
(long FAR *) &dwSUBound );
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
LDAPOBJECT_BERVAL(pLdapDestObject) =
|
||
|
(struct berval *) AllocADsMem( sizeof(struct berval) + dwSUBound - dwSLBound + 1);
|
||
|
|
||
|
if ( LDAPOBJECT_BERVAL(pLdapDestObject) == NULL)
|
||
|
{
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
}
|
||
|
|
||
|
LDAPOBJECT_BERVAL_LEN(pLdapDestObject) = dwSUBound - dwSLBound + 1;
|
||
|
LDAPOBJECT_BERVAL_VAL(pLdapDestObject) = (CHAR *) ((LPBYTE) LDAPOBJECT_BERVAL(pLdapDestObject) + sizeof(struct berval));
|
||
|
|
||
|
hr = SafeArrayAccessData( V_ARRAY(pVarSrcObject),
|
||
|
(void HUGEP * FAR *) &pArray );
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
memcpy( LDAPOBJECT_BERVAL_VAL(pLdapDestObject), pArray,dwSUBound-dwSLBound+1);
|
||
|
|
||
|
SafeArrayUnaccessData( V_ARRAY(pVarSrcObject) );
|
||
|
|
||
|
error:
|
||
|
|
||
|
RRETURN(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
VarTypeToLdapTypeSecDes(
|
||
|
LPWSTR pszServerName,
|
||
|
CCredentials& Credentials,
|
||
|
PVARIANT pVarSrcObject,
|
||
|
PLDAPOBJECT pLdapDestObject
|
||
|
)
|
||
|
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
IADsSecurityDescriptor FAR * pSecDes = NULL;
|
||
|
PSECURITY_DESCRIPTOR pSecurityDescriptor = NULL;
|
||
|
DWORD dwSDLength = 0;
|
||
|
IDispatch FAR * pDispatch = NULL;
|
||
|
BOOL fNTDS = TRUE;
|
||
|
|
||
|
if (V_VT(pVarSrcObject) != VT_DISPATCH){
|
||
|
hr = E_FAIL;
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
pDispatch = V_DISPATCH(pVarSrcObject);
|
||
|
|
||
|
hr = pDispatch->QueryInterface(
|
||
|
IID_IADsSecurityDescriptor,
|
||
|
(void **)&pSecDes
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
|
||
|
hr = ReadServerType(
|
||
|
pszServerName,
|
||
|
&Credentials,
|
||
|
&fNTDS
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
hr = ConvertSecurityDescriptorToSecDes(
|
||
|
pszServerName,
|
||
|
Credentials,
|
||
|
pSecDes,
|
||
|
&pSecurityDescriptor,
|
||
|
&dwSDLength,
|
||
|
fNTDS
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
LDAPOBJECT_BERVAL(pLdapDestObject) =
|
||
|
|
||
|
(struct berval *) AllocADsMem( sizeof(struct berval) + dwSDLength);
|
||
|
|
||
|
|
||
|
if ( LDAPOBJECT_BERVAL(pLdapDestObject) == NULL) {
|
||
|
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
LDAPOBJECT_BERVAL_LEN(pLdapDestObject) = dwSDLength;
|
||
|
LDAPOBJECT_BERVAL_VAL(pLdapDestObject) =(CHAR *) ((LPBYTE) LDAPOBJECT_BERVAL(pLdapDestObject) + sizeof(struct berval));
|
||
|
|
||
|
memcpy( LDAPOBJECT_BERVAL_VAL(pLdapDestObject), pSecurityDescriptor, dwSDLength);
|
||
|
|
||
|
|
||
|
error:
|
||
|
if (pSecurityDescriptor) {
|
||
|
FreeADsMem(pSecurityDescriptor);
|
||
|
}
|
||
|
if (pSecDes) {
|
||
|
pSecDes->Release();
|
||
|
}
|
||
|
|
||
|
RRETURN(hr);
|
||
|
}
|
||
|
|
||
|
HRESULT
|
||
|
VarTypeToLdapTypeLargeInteger(
|
||
|
PVARIANT pVarSrcObject,
|
||
|
PLDAPOBJECT pLdapDestObject
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
IDispatch FAR * pDispatch = NULL;
|
||
|
IADsLargeInteger *pLargeInteger = NULL;
|
||
|
TCHAR Buffer[64];
|
||
|
LARGE_INTEGER LargeInteger;
|
||
|
|
||
|
if (V_VT(pVarSrcObject) != VT_DISPATCH){
|
||
|
hr = E_FAIL;
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
}
|
||
|
|
||
|
pDispatch = V_DISPATCH(pVarSrcObject);
|
||
|
hr = pDispatch->QueryInterface(
|
||
|
IID_IADsLargeInteger,
|
||
|
(void **)&pLargeInteger
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
hr = pLargeInteger->get_HighPart(&LargeInteger.HighPart);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
hr = pLargeInteger->get_LowPart((LONG*)&LargeInteger.LowPart);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
swprintf (Buffer, L"%I64d", LargeInteger);
|
||
|
|
||
|
LDAPOBJECT_STRING(pLdapDestObject) = (LPTSTR) AllocADsStr( Buffer );
|
||
|
|
||
|
if ( LDAPOBJECT_STRING(pLdapDestObject) == NULL )
|
||
|
{
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
RRETURN(hr);
|
||
|
}
|
||
|
|
||
|
error:
|
||
|
if (pLargeInteger) {
|
||
|
pLargeInteger->Release();
|
||
|
}
|
||
|
|
||
|
RRETURN(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
VarTypeToLdapTypeDNWithBinary(
|
||
|
PVARIANT pVarSrcObject,
|
||
|
PLDAPOBJECT pLdapDestObject
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
IDispatch FAR * pDispatch = NULL;
|
||
|
IADsDNWithBinary *pDNBinary = NULL;
|
||
|
PADSVALUE pADsValue = NULL;
|
||
|
VARIANT vBinary;
|
||
|
BSTR bstrDN = NULL;
|
||
|
LONG dwSLBound = 0;
|
||
|
LONG dwSUBound = 0;
|
||
|
DWORD dwSyntaxId = 0;
|
||
|
DWORD dwLength = 0;
|
||
|
LPBYTE lpByte = NULL;
|
||
|
CHAR HUGEP *pArray = NULL;
|
||
|
|
||
|
VariantInit(&vBinary);
|
||
|
|
||
|
if (V_VT(pVarSrcObject) != VT_DISPATCH){
|
||
|
hr = E_FAIL;
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
}
|
||
|
|
||
|
pDispatch = V_DISPATCH(pVarSrcObject);
|
||
|
hr = pDispatch->QueryInterface(
|
||
|
IID_IADsDNWithBinary,
|
||
|
(void **)&pDNBinary
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
//
|
||
|
// Convert to ADSVALUE and then to ldap representation.
|
||
|
// This way the code to and from LDAP lives in one place.
|
||
|
//
|
||
|
hr = pDNBinary->get_BinaryValue(&vBinary);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
if ((vBinary.vt != (VT_ARRAY | VT_UI1))
|
||
|
&& vBinary.vt != VT_EMPTY) {
|
||
|
|
||
|
BAIL_ON_FAILURE(hr = E_FAIL);
|
||
|
}
|
||
|
|
||
|
hr = pDNBinary->get_DNString(&bstrDN);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
//
|
||
|
// Get the byte array in a usable format.
|
||
|
//
|
||
|
hr = SafeArrayGetLBound(
|
||
|
V_ARRAY(&vBinary),
|
||
|
1,
|
||
|
(long FAR *) &dwSLBound
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
hr = SafeArrayGetUBound(
|
||
|
V_ARRAY(&vBinary),
|
||
|
1,
|
||
|
(long FAR *) &dwSUBound
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
dwLength = dwSUBound - dwSLBound + 1;
|
||
|
|
||
|
lpByte = (LPBYTE) AllocADsMem(dwLength);
|
||
|
|
||
|
if (dwLength && !lpByte) {
|
||
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
||
|
}
|
||
|
|
||
|
hr = SafeArrayAccessData(
|
||
|
V_ARRAY(&vBinary),
|
||
|
(void HUGEP * FAR *) &pArray
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
memcpy(lpByte, pArray, dwLength);
|
||
|
|
||
|
SafeArrayUnaccessData( V_ARRAY(&vBinary) );
|
||
|
|
||
|
pADsValue = (PADSVALUE) AllocADsMem(sizeof(ADSVALUE));
|
||
|
|
||
|
if (!pADsValue) {
|
||
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
||
|
}
|
||
|
|
||
|
pADsValue->dwType = ADSTYPE_DN_WITH_BINARY;
|
||
|
pADsValue->pDNWithBinary = (PADS_DN_WITH_BINARY)
|
||
|
AllocADsMem(sizeof(ADS_DN_WITH_BINARY));
|
||
|
|
||
|
if (!pADsValue->pDNWithBinary) {
|
||
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
||
|
}
|
||
|
|
||
|
pADsValue->pDNWithBinary->dwLength = dwLength;
|
||
|
pADsValue->pDNWithBinary->lpBinaryValue = lpByte;
|
||
|
|
||
|
|
||
|
pADsValue->pDNWithBinary->pszDNString = AllocADsStr(bstrDN);
|
||
|
|
||
|
if (bstrDN && !pADsValue->pDNWithBinary->pszDNString) {
|
||
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// At this point the ADSIValue object is ready
|
||
|
//
|
||
|
hr = AdsTypeToLdapTypeCopyDNWithBinary(
|
||
|
pADsValue,
|
||
|
pLdapDestObject,
|
||
|
&dwSyntaxId
|
||
|
);
|
||
|
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
error:
|
||
|
|
||
|
if (pDNBinary) {
|
||
|
pDNBinary->Release();
|
||
|
}
|
||
|
|
||
|
VariantClear(&vBinary);
|
||
|
|
||
|
if (bstrDN) {
|
||
|
ADsFreeString(bstrDN);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Since we just have ptr to the byte array in the adsvalue
|
||
|
// struct, if that is freed, we do not have to seperately
|
||
|
// free the lpByte - if not we have to.
|
||
|
//
|
||
|
if (pADsValue) {
|
||
|
//
|
||
|
// Maybe we should replace with ADsTypeFreeAdsObjects.
|
||
|
//
|
||
|
if (pADsValue->pDNWithBinary) {
|
||
|
if (pADsValue->pDNWithBinary->pszDNString) {
|
||
|
FreeADsStr(pADsValue->pDNWithBinary->pszDNString);
|
||
|
}
|
||
|
if (pADsValue->pDNWithBinary->lpBinaryValue) {
|
||
|
FreeADsMem(pADsValue->pDNWithBinary->lpBinaryValue);
|
||
|
}
|
||
|
FreeADsMem(pADsValue->pDNWithBinary);
|
||
|
}
|
||
|
|
||
|
FreeADsMem(pADsValue);
|
||
|
}
|
||
|
else if (lpByte) {
|
||
|
FreeADsMem(lpByte);
|
||
|
}
|
||
|
|
||
|
|
||
|
RRETURN(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
VarTypeToLdapTypeDNWithString(
|
||
|
PVARIANT pVarSrcObject,
|
||
|
PLDAPOBJECT pLdapDestObject
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
IDispatch FAR * pDispatch = NULL;
|
||
|
IADsDNWithString *pDNString = NULL;
|
||
|
PADSVALUE pADsValue = NULL;
|
||
|
BSTR bstrStringValue = NULL;
|
||
|
BSTR bstrDN = NULL;
|
||
|
DWORD dwSyntaxId = 0;
|
||
|
DWORD dwLength = 0;
|
||
|
|
||
|
|
||
|
if (V_VT(pVarSrcObject) != VT_DISPATCH){
|
||
|
hr = E_FAIL;
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
}
|
||
|
|
||
|
pDispatch = V_DISPATCH(pVarSrcObject);
|
||
|
hr = pDispatch->QueryInterface(
|
||
|
IID_IADsDNWithString,
|
||
|
(void **)&pDNString
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
//
|
||
|
// Convert to ADSVALUE and then to ldap representation.
|
||
|
// This way the code to and from LDAP lives in one place.
|
||
|
//
|
||
|
hr = pDNString->get_StringValue(&bstrStringValue);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
hr = pDNString->get_DNString(&bstrDN);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
pADsValue = (PADSVALUE) AllocADsMem(sizeof(ADSVALUE));
|
||
|
|
||
|
if (!pADsValue) {
|
||
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
||
|
}
|
||
|
|
||
|
pADsValue->dwType = ADSTYPE_DN_WITH_STRING;
|
||
|
pADsValue->pDNWithString = (PADS_DN_WITH_STRING)
|
||
|
AllocADsMem(sizeof(ADS_DN_WITH_STRING));
|
||
|
|
||
|
if (!pADsValue->pDNWithString) {
|
||
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Put String value in the DNString struct.
|
||
|
//
|
||
|
pADsValue->pDNWithString->pszStringValue = AllocADsStr(bstrStringValue);
|
||
|
|
||
|
if (bstrStringValue && !pADsValue->pDNWithString->pszStringValue) {
|
||
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
||
|
}
|
||
|
|
||
|
pADsValue->pDNWithString->pszDNString = AllocADsStr(bstrDN);
|
||
|
|
||
|
if (bstrDN && !pADsValue->pDNWithString->pszDNString) {
|
||
|
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// At this point the ADSIValue object is ready
|
||
|
//
|
||
|
hr = AdsTypeToLdapTypeCopyDNWithString(
|
||
|
pADsValue,
|
||
|
pLdapDestObject,
|
||
|
&dwSyntaxId
|
||
|
);
|
||
|
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
error:
|
||
|
|
||
|
if (pDNString) {
|
||
|
pDNString->Release();
|
||
|
}
|
||
|
|
||
|
if (bstrStringValue) {
|
||
|
ADsFreeString(bstrStringValue);
|
||
|
}
|
||
|
|
||
|
if (bstrDN) {
|
||
|
ADsFreeString(bstrDN);
|
||
|
}
|
||
|
|
||
|
if (pADsValue) {
|
||
|
//
|
||
|
// Maybe we should replace with ADsTypeFreeAdsObjects.
|
||
|
//
|
||
|
if (pADsValue->pDNWithString) {
|
||
|
|
||
|
if (pADsValue->pDNWithString->pszDNString) {
|
||
|
FreeADsStr(pADsValue->pDNWithString->pszDNString);
|
||
|
}
|
||
|
|
||
|
if (pADsValue->pDNWithString->pszStringValue) {
|
||
|
FreeADsMem(pADsValue->pDNWithString->pszStringValue);
|
||
|
}
|
||
|
FreeADsMem(pADsValue->pDNWithString);
|
||
|
}
|
||
|
|
||
|
FreeADsMem(pADsValue);
|
||
|
}
|
||
|
|
||
|
RRETURN(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
VarTypeToLdapTypeCopy(
|
||
|
LPWSTR pszServerName,
|
||
|
CCredentials& Credentials,
|
||
|
DWORD dwLdapType,
|
||
|
PVARIANT pVarSrcObject,
|
||
|
PLDAPOBJECT pLdapDestObject,
|
||
|
BOOL *pfIsString
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
*pfIsString = TRUE; // This will only be FALSE when the variant
|
||
|
// contains binary data
|
||
|
|
||
|
switch (dwLdapType){
|
||
|
case LDAPTYPE_BITSTRING:
|
||
|
case LDAPTYPE_PRINTABLESTRING:
|
||
|
case LDAPTYPE_DIRECTORYSTRING:
|
||
|
case LDAPTYPE_COUNTRYSTRING:
|
||
|
case LDAPTYPE_DN:
|
||
|
case LDAPTYPE_NUMERICSTRING:
|
||
|
case LDAPTYPE_IA5STRING:
|
||
|
case LDAPTYPE_CASEIGNORESTRING:
|
||
|
case LDAPTYPE_CASEEXACTSTRING:
|
||
|
// case LDAPTYPE_CASEIGNOREIA5STRING:
|
||
|
|
||
|
case LDAPTYPE_OID:
|
||
|
case LDAPTYPE_TELEPHONENUMBER:
|
||
|
case LDAPTYPE_ATTRIBUTETYPEDESCRIPTION:
|
||
|
case LDAPTYPE_OBJECTCLASSDESCRIPTION:
|
||
|
|
||
|
//
|
||
|
// These types are treatable as strings
|
||
|
// (see RFCs 2252, 2256)
|
||
|
//
|
||
|
case LDAPTYPE_DELIVERYMETHOD:
|
||
|
case LDAPTYPE_ENHANCEDGUIDE:
|
||
|
case LDAPTYPE_FACSIMILETELEPHONENUMBER:
|
||
|
case LDAPTYPE_GUIDE:
|
||
|
case LDAPTYPE_NAMEANDOPTIONALUID:
|
||
|
case LDAPTYPE_POSTALADDRESS:
|
||
|
case LDAPTYPE_PRESENTATIONADDRESS:
|
||
|
case LDAPTYPE_TELEXNUMBER:
|
||
|
case LDAPTYPE_DSAQUALITYSYNTAX:
|
||
|
case LDAPTYPE_DATAQUALITYSYNTAX:
|
||
|
case LDAPTYPE_MAILPREFERENCE:
|
||
|
case LDAPTYPE_OTHERMAILBOX:
|
||
|
case LDAPTYPE_ACCESSPOINTDN:
|
||
|
case LDAPTYPE_ORNAME:
|
||
|
case LDAPTYPE_ORADDRESS:
|
||
|
|
||
|
hr = VarTypeToLdapTypeString(
|
||
|
pVarSrcObject,
|
||
|
pLdapDestObject
|
||
|
);
|
||
|
break;
|
||
|
|
||
|
case LDAPTYPE_BOOLEAN:
|
||
|
hr = VarTypeToLdapTypeBoolean(
|
||
|
pVarSrcObject,
|
||
|
pLdapDestObject
|
||
|
);
|
||
|
break;
|
||
|
|
||
|
case LDAPTYPE_INTEGER:
|
||
|
hr = VarTypeToLdapTypeInteger(
|
||
|
pVarSrcObject,
|
||
|
pLdapDestObject
|
||
|
);
|
||
|
break;
|
||
|
|
||
|
case LDAPTYPE_OCTETSTRING:
|
||
|
case LDAPTYPE_CERTIFICATE:
|
||
|
case LDAPTYPE_CERTIFICATELIST:
|
||
|
case LDAPTYPE_CERTIFICATEPAIR:
|
||
|
case LDAPTYPE_PASSWORD:
|
||
|
case LDAPTYPE_TELETEXTERMINALIDENTIFIER:
|
||
|
case LDAPTYPE_AUDIO:
|
||
|
case LDAPTYPE_JPEG:
|
||
|
case LDAPTYPE_FAX:
|
||
|
*pfIsString = FALSE;
|
||
|
hr = VarTypeToLdapTypeBinaryData(
|
||
|
pVarSrcObject,
|
||
|
pLdapDestObject
|
||
|
);
|
||
|
break;
|
||
|
|
||
|
case LDAPTYPE_GENERALIZEDTIME:
|
||
|
hr = VarTypeToLdapTypeGeneralizedTime(
|
||
|
pVarSrcObject,
|
||
|
pLdapDestObject
|
||
|
);
|
||
|
break;
|
||
|
|
||
|
case LDAPTYPE_UTCTIME:
|
||
|
hr = VarTypeToLdapTypeUTCTime(
|
||
|
pVarSrcObject,
|
||
|
pLdapDestObject
|
||
|
);
|
||
|
break;
|
||
|
|
||
|
case LDAPTYPE_SECURITY_DESCRIPTOR:
|
||
|
*pfIsString = FALSE;
|
||
|
hr = VarTypeToLdapTypeSecDes(
|
||
|
pszServerName,
|
||
|
Credentials,
|
||
|
pVarSrcObject,
|
||
|
pLdapDestObject
|
||
|
);
|
||
|
break;
|
||
|
|
||
|
case LDAPTYPE_INTEGER8:
|
||
|
hr = VarTypeToLdapTypeLargeInteger(
|
||
|
pVarSrcObject,
|
||
|
pLdapDestObject
|
||
|
);
|
||
|
break;
|
||
|
|
||
|
#if 0
|
||
|
case LDAPTYPE_CASEEXACTLIST:
|
||
|
case LDAPTYPE_CASEIGNORELIST:
|
||
|
#endif
|
||
|
|
||
|
case LDAPTYPE_DNWITHBINARY:
|
||
|
hr = VarTypeToLdapTypeDNWithBinary(
|
||
|
pVarSrcObject,
|
||
|
pLdapDestObject
|
||
|
);
|
||
|
break;
|
||
|
|
||
|
case LDAPTYPE_DNWITHSTRING:
|
||
|
hr = VarTypeToLdapTypeDNWithString(
|
||
|
pVarSrcObject,
|
||
|
pLdapDestObject
|
||
|
);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
hr = E_ADS_CANT_CONVERT_DATATYPE;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
RRETURN(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
VarTypeToLdapTypeCopyConstruct(
|
||
|
LPWSTR pszServerName,
|
||
|
CCredentials& Credentials,
|
||
|
DWORD dwLdapType,
|
||
|
LPVARIANT pVarSrcObjects,
|
||
|
DWORD dwNumObjects,
|
||
|
LDAPOBJECTARRAY *pLdapDestObjects
|
||
|
)
|
||
|
{
|
||
|
|
||
|
DWORD i = 0;
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
|
||
|
if ( dwNumObjects == 0 )
|
||
|
{
|
||
|
pLdapDestObjects->dwCount = 0;
|
||
|
pLdapDestObjects->pLdapObjects = NULL;
|
||
|
RRETURN(S_OK);
|
||
|
}
|
||
|
|
||
|
pLdapDestObjects->pLdapObjects =
|
||
|
(PLDAPOBJECT)AllocADsMem( dwNumObjects * sizeof(LDAPOBJECT));
|
||
|
|
||
|
if (pLdapDestObjects->pLdapObjects == NULL)
|
||
|
RRETURN(E_OUTOFMEMORY);
|
||
|
|
||
|
pLdapDestObjects->dwCount = dwNumObjects;
|
||
|
|
||
|
for (i = 0; i < dwNumObjects; i++ ) {
|
||
|
hr = VarTypeToLdapTypeCopy(
|
||
|
pszServerName,
|
||
|
Credentials,
|
||
|
dwLdapType,
|
||
|
pVarSrcObjects + i,
|
||
|
pLdapDestObjects->pLdapObjects + i,
|
||
|
&(pLdapDestObjects->fIsString)
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
}
|
||
|
|
||
|
RRETURN(S_OK);
|
||
|
|
||
|
error:
|
||
|
|
||
|
LdapTypeFreeLdapObjects( pLdapDestObjects );
|
||
|
|
||
|
RRETURN(hr);
|
||
|
}
|
||
|
|
||
|
HRESULT
|
||
|
GetLdapSyntaxFromVariant(
|
||
|
VARIANT * pvProp,
|
||
|
PDWORD pdwSyntaxId,
|
||
|
LPTSTR pszServer,
|
||
|
LPTSTR pszAttrName,
|
||
|
CCredentials& Credentials,
|
||
|
DWORD dwPort
|
||
|
)
|
||
|
{
|
||
|
|
||
|
// IADsSecurityDescriptor * pSecDes = NULL;
|
||
|
// IADsLargeInteger * pLargeInt = NULL;
|
||
|
IDispatch * pDispObj = NULL;
|
||
|
IDispatch * pDispatch = NULL;
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
if (!pvProp) {
|
||
|
hr = E_FAIL;
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
}
|
||
|
|
||
|
switch (pvProp->vt) {
|
||
|
case VT_BSTR:
|
||
|
*pdwSyntaxId = LDAPTYPE_CASEIGNORESTRING;
|
||
|
break;
|
||
|
|
||
|
case VT_I8:
|
||
|
*pdwSyntaxId = LDAPTYPE_INTEGER8;
|
||
|
break;
|
||
|
|
||
|
case VT_I4:
|
||
|
*pdwSyntaxId = LDAPTYPE_INTEGER;
|
||
|
break;
|
||
|
|
||
|
case VT_I2:
|
||
|
*pdwSyntaxId = LDAPTYPE_INTEGER;
|
||
|
break;
|
||
|
|
||
|
case VT_BOOL:
|
||
|
*pdwSyntaxId = LDAPTYPE_BOOLEAN;
|
||
|
break;
|
||
|
|
||
|
case VT_DATE:
|
||
|
//
|
||
|
// We need to determine if it is a GeneralizedTime
|
||
|
// or UTCTime property. If the lookup fails on the
|
||
|
// server we will failover to GenTime.
|
||
|
//
|
||
|
hr = E_FAIL;
|
||
|
|
||
|
if (pszAttrName) {
|
||
|
|
||
|
//
|
||
|
// pszAttrName will be null if we are coming in
|
||
|
// from the property cache on putproperty
|
||
|
//
|
||
|
hr = LdapGetSyntaxOfAttributeOnServer(
|
||
|
pszServer,
|
||
|
pszAttrName,
|
||
|
pdwSyntaxId,
|
||
|
Credentials,
|
||
|
dwPort
|
||
|
);
|
||
|
}
|
||
|
|
||
|
if (FAILED(hr)) {
|
||
|
// Default to GenTime
|
||
|
*pdwSyntaxId = LDAPTYPE_GENERALIZEDTIME;
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
case (VT_ARRAY | VT_UI1):
|
||
|
*pdwSyntaxId = LDAPTYPE_OCTETSTRING;
|
||
|
break;
|
||
|
|
||
|
|
||
|
case (VT_DISPATCH):
|
||
|
pDispatch = V_DISPATCH(pvProp);
|
||
|
|
||
|
// Security Descriptor
|
||
|
hr = pDispatch->QueryInterface(
|
||
|
IID_IADsSecurityDescriptor,
|
||
|
(void **)&pDispObj
|
||
|
);
|
||
|
|
||
|
if (SUCCEEDED(hr)) {
|
||
|
pDispObj->Release();
|
||
|
*pdwSyntaxId = LDAPTYPE_SECURITY_DESCRIPTOR;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// Large Integer
|
||
|
hr = pDispatch->QueryInterface(
|
||
|
IID_IADsLargeInteger,
|
||
|
(void **)&pDispObj
|
||
|
);
|
||
|
if (SUCCEEDED(hr)) {
|
||
|
pDispObj->Release();
|
||
|
*pdwSyntaxId = LDAPTYPE_INTEGER8;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// DN With Binary
|
||
|
hr = pDispatch->QueryInterface(
|
||
|
IID_IADsDNWithBinary,
|
||
|
(void **)&pDispObj
|
||
|
);
|
||
|
if (SUCCEEDED(hr)) {
|
||
|
pDispObj->Release();
|
||
|
*pdwSyntaxId = LDAPTYPE_DNWITHBINARY;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// DN With String
|
||
|
hr = pDispatch->QueryInterface(
|
||
|
IID_IADsDNWithString,
|
||
|
(void **)&pDispObj
|
||
|
);
|
||
|
if (SUCCEEDED(hr)) {
|
||
|
pDispObj->Release();
|
||
|
*pdwSyntaxId = LDAPTYPE_DNWITHSTRING;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
BAIL_ON_FAILURE(hr = E_ADS_BAD_PARAMETER)
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
RRETURN(E_FAIL);
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
RRETURN(S_OK);
|
||
|
|
||
|
error:
|
||
|
|
||
|
RRETURN(hr);
|
||
|
|
||
|
}
|