265 lines
6.8 KiB
C++
265 lines
6.8 KiB
C++
/***********************************************************************
|
|
File: common.cpp
|
|
Description: this is where all the global functions go.
|
|
***********************************************************************/
|
|
|
|
#include "clsCommand.h"
|
|
|
|
|
|
// Separates the property from the path
|
|
int IsProperty(BSTR FullPath, BSTR *AbsolutePath, BSTR *Property)
|
|
{
|
|
WCHAR *pdest; // temp pointer to the last slash in the string
|
|
DWORD dwSizeOfFullPath;
|
|
|
|
dwSizeOfFullPath = wcslen (FullPath);
|
|
|
|
*AbsolutePath = SysAllocString(FullPath);
|
|
|
|
// trim a trailing slash if it exists.
|
|
if ((*AbsolutePath)[dwSizeOfFullPath] == '/')
|
|
(*AbsolutePath)[dwSizeOfFullPath] = '\0';
|
|
|
|
|
|
pdest = wcsrchr(*AbsolutePath, '/');
|
|
|
|
// Check to see if a '/' actually exists - if not there is a SERIOUS error
|
|
if (pdest == NULL)
|
|
{ printf ("FATAL ERROR: No slash found in the full path\n");
|
|
return 1;
|
|
}
|
|
else
|
|
{ *Property = pdest + 1; // +1 skips the slash and copies from then on.
|
|
*pdest = L'\0'; // terminate the Absolute path
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
// Checks to see if a Property is actually set or just has a default value
|
|
/*
|
|
// if you want to use this function, add this code
|
|
IISBaseObject *pBaseObject = NULL;
|
|
hresError = ADsGetObject(Path, IID_IISBaseObject, (void **) &pBaseObject);
|
|
if (hresError != ERROR_SUCCESS)
|
|
{ printf("Could not get the base object\n");
|
|
return 1;
|
|
}
|
|
*/
|
|
int IsSet(IISBaseObject *pBaseObject, BSTR Path, BSTR Property)
|
|
{ // 0 = Not set
|
|
// 1 = set
|
|
|
|
HRESULT hresError = 0;
|
|
int iResult = 0;
|
|
SAFEARRAY *PathArray;
|
|
VARIANT *varPath;
|
|
|
|
VARIANT pvPaths;
|
|
VariantInit(&pvPaths);
|
|
hresError = pBaseObject->GetDataPaths(Property, 0, &pvPaths);
|
|
if (hresError == ERROR_SUCCESS)
|
|
{ PathArray = pvPaths.parray;
|
|
varPath = (VARIANT*) PathArray->pvData;
|
|
if (varPath->vt == VT_BSTR)
|
|
{ if (!_wcsicmp(varPath->bstrVal, Path))
|
|
{ iResult = 1;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{ VariantClear(&pvPaths);
|
|
VariantInit(&pvPaths);
|
|
hresError = pBaseObject->GetDataPaths(Property, 1, &pvPaths);
|
|
if (hresError == ERROR_SUCCESS)
|
|
{ PathArray = pvPaths.parray;
|
|
varPath = (VARIANT*) PathArray->pvData;
|
|
if (varPath->vt == VT_BSTR)
|
|
{ if (!_wcsicmp(varPath->bstrVal, Path))
|
|
{ iResult = 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
VariantClear(&pvPaths);
|
|
VariantClear(varPath);
|
|
return iResult;
|
|
}
|
|
|
|
int IsSpecialProperty(BSTR bstrProperty)
|
|
{ int iResult = PROP_OK;
|
|
if ((!_wcsicmp(bstrProperty, L"mimemap")) ||
|
|
(!_wcsicmp(bstrProperty, L"set")) ||
|
|
(!_wcsicmp(bstrProperty, L"servercommand")) ||
|
|
(!_wcsicmp(bstrProperty, L"accessperm")) ||
|
|
(!_wcsicmp(bstrProperty, L"set")) ||
|
|
(!_wcsicmp(bstrProperty, L"vrpath")) ||
|
|
(!_wcsicmp(bstrProperty, L"authorization")))
|
|
{ iResult = PROP_SKIP;
|
|
}
|
|
else
|
|
{ iResult = PROP_OK;
|
|
}
|
|
return iResult;
|
|
}
|
|
|
|
// Does some of the grunt work for getting the value of a property
|
|
void GetProperty(IADs *pADs, BSTR bstrProperty, VARIANT *varValue, BSTR *bstrType)
|
|
{ HRESULT hresError = 0;
|
|
// IADs *pADs = NULL;
|
|
VARIANT varTempValue;
|
|
VariantInit(&varTempValue);
|
|
|
|
|
|
hresError = pADs->Get(bstrProperty, &varTempValue);
|
|
if (hresError != ERROR_SUCCESS)
|
|
{ printf("Could not get %S\n", bstrProperty);
|
|
return;
|
|
}
|
|
else
|
|
{ switch (varTempValue.vt)
|
|
{ case VT_EMPTY:
|
|
{ *bstrType = SysAllocString(L"EMPTY");
|
|
break;
|
|
}
|
|
case VT_NULL:
|
|
{ *bstrType = SysAllocString(L"NULL");
|
|
break;
|
|
}
|
|
case VT_I4:
|
|
{ *bstrType = SysAllocString(L"INTEGER");
|
|
hresError = VariantChangeType(varValue, &varTempValue, 0, VT_BSTR);
|
|
break;
|
|
}
|
|
case VT_BSTR:
|
|
{ *bstrType = SysAllocString(L"STRING");
|
|
*varValue = varTempValue;
|
|
break;
|
|
}
|
|
case VT_BOOL:
|
|
{ *bstrType = SysAllocString(L"BOOLEAN");
|
|
if (varTempValue.boolVal == 0)
|
|
{ varValue->vt = VT_BSTR;
|
|
varValue->bstrVal = SysAllocString(L"False");
|
|
}
|
|
else
|
|
{ varValue->vt = VT_BSTR;
|
|
varValue->bstrVal = SysAllocString(L"True");
|
|
}
|
|
break;
|
|
}
|
|
case VT_ARRAY|VT_VARIANT: // SafeArray of Variants
|
|
{
|
|
|
|
*varValue = varTempValue;
|
|
*bstrType = SysAllocString(L"LIST");
|
|
break;
|
|
}
|
|
case VT_DISPATCH:
|
|
{ if (!_wcsicmp(bstrProperty, L"ipsecurity"))
|
|
{ SAFEARRAY FAR* psa;
|
|
SAFEARRAYBOUND rgsabound[1];
|
|
rgsabound[0].lLbound = 0;
|
|
rgsabound[0].cElements = 5;
|
|
|
|
psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
|
|
if (psa == NULL)
|
|
{ goto xit;
|
|
}
|
|
|
|
varValue->vt = VT_ARRAY|VT_VARIANT;
|
|
varValue->parray = psa;
|
|
|
|
VARIANT *varValueArray;
|
|
varValueArray = (VARIANT*) varValue->parray->pvData;
|
|
// Set the values
|
|
IISIPSecurity *pIPSecurity = NULL;
|
|
hresError = varTempValue.pdispVal->QueryInterface(IID_IISIPSecurity, (void **) &pIPSecurity);
|
|
if (hresError != ERROR_SUCCESS)
|
|
{ goto xit;
|
|
}
|
|
hresError = pIPSecurity->get_IPDeny(&varValueArray[0]);
|
|
hresError = pIPSecurity->get_IPGrant(&varValueArray[1]);
|
|
hresError = pIPSecurity->get_DomainDeny(&varValueArray[2]);
|
|
hresError = pIPSecurity->get_DomainGrant(&varValueArray[3]);
|
|
short GrantByDefault = false;
|
|
hresError = pIPSecurity->get_GrantByDefault(&GrantByDefault);
|
|
pIPSecurity->Release();
|
|
varValueArray[4].vt = VT_BSTR;
|
|
if (GrantByDefault)
|
|
varValueArray[4].bstrVal = SysAllocString(L"False");
|
|
else
|
|
varValueArray[4].bstrVal = SysAllocString(L"True");
|
|
*bstrType = SysAllocString(L"IPSec");
|
|
|
|
}
|
|
else
|
|
{
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
{ break;
|
|
}
|
|
}
|
|
}
|
|
xit:
|
|
VariantClear(&varTempValue);
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
void PrintVariant(VARIANT varInput)
|
|
{ switch (varInput.vt)
|
|
{ case VT_ARRAY|VT_VARIANT:
|
|
{
|
|
printf("\n");
|
|
printf(" ");
|
|
SAFEARRAY FAR * varArray;
|
|
SAFEARRAYBOUND rgsabound[100];
|
|
rgsabound[0].lLbound = varInput.parray->rgsabound[0].lLbound;
|
|
rgsabound[0].cElements = varInput.parray->rgsabound[0].cElements;
|
|
varArray = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
|
|
varArray =varInput.parray;
|
|
|
|
VARIANT *varArrayData;
|
|
varArrayData = (VARIANT*) varArray->pvData;
|
|
for (unsigned long m = varArray->rgsabound[0].lLbound; m < varArray->rgsabound[0].cElements; m++)
|
|
{
|
|
varArrayData[m].vt= VT_BSTR;
|
|
//PrintVariant(varArrayData[m]);
|
|
//if (m < varArray->rgsabound[0].cElements - 1)
|
|
// printf(",");
|
|
}
|
|
|
|
SafeArrayDestroy(varArray);
|
|
break;
|
|
}
|
|
|
|
case VT_ARRAY|VT_BSTR:
|
|
{ printf("\n");
|
|
printf(" ");
|
|
VARIANT *varArray = (VARIANT*) varInput.parray->pvData;
|
|
for (unsigned long m = 0; m < varInput.parray->rgsabound[0].cElements; m++)
|
|
{ printf("\"%S\"", varArray[m]);
|
|
if (m < varInput.parray->rgsabound[0].cElements - 1)
|
|
printf(",");
|
|
}
|
|
VariantClear(varArray);
|
|
break;
|
|
}
|
|
|
|
case VT_BSTR:
|
|
{
|
|
printf("%S", varInput.bstrVal);
|
|
break;
|
|
}
|
|
default:
|
|
{ printf("%x", varInput.vt);
|
|
break;
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|