624 lines
13 KiB
C++
624 lines
13 KiB
C++
//---------------------------------------------------------------------------
|
||
//
|
||
// Microsoft Windows
|
||
// Copyright (C) Microsoft Corporation, 1992 - 1995
|
||
//
|
||
// File: cAccessControlEntry.cxx
|
||
//
|
||
// Contents: AccessControlEntry object
|
||
//
|
||
// History: 11-1-95 krishnag Created.
|
||
//
|
||
//----------------------------------------------------------------------------
|
||
|
||
#include "oleds.hxx"
|
||
#pragma hdrstop
|
||
|
||
// Class CAccessControlEntry
|
||
|
||
DEFINE_IDispatch_Implementation(CAccessControlEntry)
|
||
|
||
CAccessControlEntry::CAccessControlEntry():
|
||
_pDispMgr(NULL),
|
||
_dwAceType(0),
|
||
_dwAccessMask(0),
|
||
_dwAceFlags(0),
|
||
_dwFlags(0),
|
||
_lpObjectType(NULL),
|
||
_lpInheritedObjectType(NULL),
|
||
_lpTrustee(NULL),
|
||
_pSid(NULL),
|
||
_dwSidLen(0)
|
||
{
|
||
ENLIST_TRACKING(CAccessControlEntry);
|
||
}
|
||
|
||
|
||
HRESULT
|
||
CAccessControlEntry::CreateAccessControlEntry(
|
||
REFIID riid,
|
||
void **ppvObj
|
||
)
|
||
{
|
||
CAccessControlEntry FAR * pAccessControlEntry = NULL;
|
||
HRESULT hr = S_OK;
|
||
|
||
hr = AllocateAccessControlEntryObject(&pAccessControlEntry);
|
||
BAIL_ON_FAILURE(hr);
|
||
|
||
hr = pAccessControlEntry->QueryInterface(riid, ppvObj);
|
||
BAIL_ON_FAILURE(hr);
|
||
|
||
pAccessControlEntry->Release();
|
||
|
||
RRETURN(hr);
|
||
|
||
error:
|
||
delete pAccessControlEntry;
|
||
|
||
RRETURN_EXP_IF_ERR(hr);
|
||
|
||
}
|
||
|
||
|
||
CAccessControlEntry::~CAccessControlEntry( )
|
||
{
|
||
delete _pDispMgr;
|
||
if (_lpInheritedObjectType) {
|
||
FreeADsStr(_lpInheritedObjectType);
|
||
_lpInheritedObjectType = NULL;
|
||
}
|
||
if (_lpObjectType) {
|
||
FreeADsStr(_lpObjectType);
|
||
_lpObjectType = NULL;
|
||
}
|
||
if (_lpTrustee) {
|
||
FreeADsStr(_lpTrustee);
|
||
}
|
||
if (_pSid) {
|
||
FreeADsMem(_pSid);
|
||
}
|
||
|
||
}
|
||
|
||
STDMETHODIMP
|
||
CAccessControlEntry::QueryInterface(
|
||
REFIID iid,
|
||
LPVOID FAR* ppv
|
||
)
|
||
{
|
||
if (IsEqualIID(iid, IID_IUnknown))
|
||
{
|
||
*ppv = (IADsAccessControlEntry FAR *) this;
|
||
}
|
||
else if (IsEqualIID(iid, IID_IADsAccessControlEntry))
|
||
{
|
||
*ppv = (IADsAccessControlEntry FAR *) this;
|
||
}
|
||
else if (IsEqualIID(iid, IID_IDispatch))
|
||
{
|
||
*ppv = (IADsAccessControlEntry FAR *) this;
|
||
}
|
||
else if (IsEqualIID(iid, IID_ISupportErrorInfo))
|
||
{
|
||
*ppv = (ISupportErrorInfo FAR *) this;
|
||
}
|
||
else if (IsEqualIID(iid, IID_IADsAcePrivate)) {
|
||
*ppv = (IADsAcePrivate FAR *) this;
|
||
}
|
||
else
|
||
{
|
||
*ppv = NULL;
|
||
return E_NOINTERFACE;
|
||
}
|
||
AddRef();
|
||
return NOERROR;
|
||
}
|
||
|
||
HRESULT
|
||
CAccessControlEntry::AllocateAccessControlEntryObject(
|
||
CAccessControlEntry ** ppAccessControlEntry
|
||
)
|
||
{
|
||
CAccessControlEntry FAR * pAccessControlEntry = NULL;
|
||
CDispatchMgr FAR * pDispMgr = NULL;
|
||
HRESULT hr = S_OK;
|
||
|
||
pAccessControlEntry = new CAccessControlEntry();
|
||
if (pAccessControlEntry == NULL) {
|
||
hr = E_OUTOFMEMORY;
|
||
}
|
||
BAIL_ON_FAILURE(hr);
|
||
|
||
pDispMgr = new CDispatchMgr;
|
||
if (pDispMgr == NULL) {
|
||
hr = E_OUTOFMEMORY;
|
||
}
|
||
BAIL_ON_FAILURE(hr);
|
||
|
||
hr = LoadTypeInfoEntry(
|
||
pDispMgr,
|
||
LIBID_ADs,
|
||
IID_IADsAccessControlEntry,
|
||
(IADsAccessControlEntry *)pAccessControlEntry,
|
||
DISPID_REGULAR
|
||
);
|
||
BAIL_ON_FAILURE(hr);
|
||
|
||
pAccessControlEntry->_pDispMgr = pDispMgr;
|
||
*ppAccessControlEntry = pAccessControlEntry;
|
||
|
||
RRETURN(hr);
|
||
|
||
error:
|
||
|
||
delete pDispMgr;
|
||
|
||
RRETURN_EXP_IF_ERR(hr);
|
||
|
||
}
|
||
|
||
|
||
//
|
||
// ISupportErrorInfo method
|
||
//
|
||
STDMETHODIMP
|
||
CAccessControlEntry::InterfaceSupportsErrorInfo(THIS_ REFIID riid)
|
||
{
|
||
if (IsEqualIID(riid, IID_IADsAccessControlEntry)) {
|
||
return S_OK;
|
||
} else {
|
||
return S_FALSE;
|
||
}
|
||
}
|
||
|
||
//
|
||
// IADsAccessControlEntry implementation
|
||
//
|
||
|
||
STDMETHODIMP
|
||
CAccessControlEntry::get_AceType(THIS_ long FAR * retval)
|
||
{
|
||
*retval = _dwAceType;
|
||
RRETURN(S_OK);
|
||
}
|
||
|
||
STDMETHODIMP
|
||
CAccessControlEntry::put_AceType(THIS_ long lnAceType)
|
||
{
|
||
_dwAceType = lnAceType;
|
||
|
||
RRETURN(S_OK);
|
||
}
|
||
|
||
STDMETHODIMP
|
||
CAccessControlEntry::get_AceFlags(THIS_ long FAR * retval)
|
||
{
|
||
*retval = _dwAceFlags;
|
||
|
||
RRETURN(S_OK);
|
||
}
|
||
|
||
STDMETHODIMP
|
||
CAccessControlEntry::put_AceFlags(THIS_ long lnAceFlags)
|
||
{
|
||
_dwAceFlags = lnAceFlags;
|
||
|
||
RRETURN(S_OK);
|
||
}
|
||
|
||
|
||
STDMETHODIMP
|
||
CAccessControlEntry::get_Flags(THIS_ long FAR * retval)
|
||
{
|
||
*retval = _dwFlags;
|
||
RRETURN(S_OK);
|
||
}
|
||
|
||
STDMETHODIMP
|
||
CAccessControlEntry::put_Flags(THIS_ long lnFlags)
|
||
{
|
||
_dwFlags = lnFlags;
|
||
|
||
RRETURN(S_OK);
|
||
}
|
||
|
||
STDMETHODIMP
|
||
CAccessControlEntry::get_AccessMask(THIS_ long FAR * retval)
|
||
{
|
||
|
||
*retval = (long)_dwAccessMask;
|
||
|
||
RRETURN(S_OK);
|
||
}
|
||
|
||
STDMETHODIMP
|
||
CAccessControlEntry::put_AccessMask(THIS_ long lnAccessMask)
|
||
{
|
||
_dwAccessMask = (DWORD)lnAccessMask;
|
||
|
||
RRETURN(S_OK);
|
||
}
|
||
|
||
|
||
STDMETHODIMP
|
||
CAccessControlEntry::get_ObjectType(THIS_ BSTR FAR * retval)
|
||
{
|
||
HRESULT hr = S_OK;
|
||
|
||
hr = ADsAllocString(_lpObjectType, retval);
|
||
RRETURN_EXP_IF_ERR(hr);
|
||
|
||
}
|
||
|
||
STDMETHODIMP
|
||
CAccessControlEntry::put_ObjectType(THIS_ BSTR bstrObjectType)
|
||
{
|
||
|
||
if (_lpObjectType) {
|
||
FreeADsStr(_lpObjectType);
|
||
_lpObjectType = NULL;
|
||
}
|
||
|
||
if (bstrObjectType) {
|
||
|
||
_lpObjectType = AllocADsStr(bstrObjectType);
|
||
|
||
if (!_lpObjectType) {
|
||
RRETURN_EXP_IF_ERR(E_OUTOFMEMORY);
|
||
}
|
||
|
||
}
|
||
RRETURN(S_OK);
|
||
}
|
||
|
||
|
||
STDMETHODIMP
|
||
CAccessControlEntry::get_InheritedObjectType(THIS_ BSTR FAR * retval)
|
||
{
|
||
HRESULT hr = S_OK;
|
||
|
||
hr = ADsAllocString(_lpInheritedObjectType, retval);
|
||
RRETURN_EXP_IF_ERR(hr);
|
||
|
||
}
|
||
|
||
STDMETHODIMP
|
||
CAccessControlEntry::put_InheritedObjectType(THIS_ BSTR bstrInheritedObjectType)
|
||
{
|
||
if (_lpInheritedObjectType) {
|
||
FreeADsStr(_lpInheritedObjectType);
|
||
_lpInheritedObjectType = NULL;
|
||
}
|
||
|
||
if (bstrInheritedObjectType) {
|
||
_lpInheritedObjectType = AllocADsStr(bstrInheritedObjectType);
|
||
|
||
if (!_lpInheritedObjectType) {
|
||
RRETURN(E_OUTOFMEMORY);
|
||
}
|
||
}
|
||
|
||
RRETURN(S_OK);
|
||
}
|
||
|
||
STDMETHODIMP
|
||
CAccessControlEntry::get_Trustee(THIS_ BSTR FAR * retval)
|
||
{
|
||
HRESULT hr = S_OK;
|
||
|
||
hr = ADsAllocString(_lpTrustee, retval);
|
||
RRETURN_EXP_IF_ERR(hr);
|
||
|
||
}
|
||
|
||
STDMETHODIMP
|
||
CAccessControlEntry::put_Trustee(THIS_ BSTR bstrTrustee)
|
||
{
|
||
|
||
if (!bstrTrustee) {
|
||
RRETURN(E_FAIL);
|
||
}
|
||
|
||
if (_lpTrustee) {
|
||
FreeADsStr(_lpTrustee);
|
||
}
|
||
|
||
//
|
||
// Since we are changing the trustee, we need to make
|
||
// sure the sid value is cleared.
|
||
//
|
||
if (_dwSidLen) {
|
||
_dwSidLen = 0;
|
||
}
|
||
|
||
if (_pSid) {
|
||
FreeADsMem(_pSid);
|
||
_pSid = NULL;
|
||
}
|
||
|
||
_lpTrustee = AllocADsStr(bstrTrustee);
|
||
|
||
if (!_lpTrustee) {
|
||
RRETURN_EXP_IF_ERR(E_OUTOFMEMORY);
|
||
}
|
||
|
||
RRETURN(S_OK);
|
||
}
|
||
|
||
|
||
HRESULT
|
||
CopyAccessControlEntry(
|
||
IADsAccessControlEntry * pSourceAce,
|
||
IADsAccessControlEntry ** ppTargetAce
|
||
)
|
||
{
|
||
IADsAccessControlEntry * pTargetAce = NULL;
|
||
IADsAcePrivate *pPrivAceTarget = NULL;
|
||
IADsAcePrivate *pPrivAceSource = NULL;
|
||
BSTR bstrInheritedObjectTypeClsid = NULL;
|
||
BSTR bstrObjectTypeClsid = NULL;
|
||
BSTR bstrTrustee = NULL;
|
||
HRESULT hr = S_OK;
|
||
|
||
DWORD dwAceType = 0;
|
||
DWORD dwAceFlags = 0;
|
||
DWORD dwAccessMask = 0;
|
||
DWORD dwFlags = 0;
|
||
DWORD dwSidLen = 0;
|
||
BOOL fSidValid = FALSE;
|
||
PSID pSid = NULL;
|
||
|
||
hr = pSourceAce->get_AceType((LONG *)&dwAceType);
|
||
BAIL_ON_FAILURE(hr);
|
||
|
||
hr = pSourceAce->get_Trustee(&bstrTrustee);
|
||
BAIL_ON_FAILURE(hr);
|
||
|
||
hr = pSourceAce->get_AceFlags((long *)&dwAceFlags);
|
||
BAIL_ON_FAILURE(hr);
|
||
|
||
hr = pSourceAce->get_AccessMask((long *)&dwAccessMask);
|
||
BAIL_ON_FAILURE(hr);
|
||
|
||
hr = pSourceAce->get_Flags((LONG *)&dwFlags);
|
||
BAIL_ON_FAILURE(hr);
|
||
|
||
hr = pSourceAce->get_ObjectType(&bstrObjectTypeClsid);
|
||
BAIL_ON_FAILURE(hr);
|
||
|
||
hr = pSourceAce->get_InheritedObjectType(&bstrInheritedObjectTypeClsid);
|
||
BAIL_ON_FAILURE(hr);
|
||
|
||
hr = CoCreateInstance(
|
||
CLSID_AccessControlEntry,
|
||
NULL,
|
||
CLSCTX_INPROC_SERVER,
|
||
IID_IADsAccessControlEntry,
|
||
(void **)&pTargetAce
|
||
);
|
||
BAIL_ON_FAILURE(hr);
|
||
|
||
hr = pTargetAce->put_AccessMask(dwAccessMask);
|
||
BAIL_ON_FAILURE(hr);
|
||
|
||
hr = pTargetAce->put_AceFlags(dwAceFlags);
|
||
BAIL_ON_FAILURE(hr);
|
||
|
||
hr = pTargetAce->put_AceType(dwAceType);
|
||
BAIL_ON_FAILURE(hr);
|
||
|
||
hr = pTargetAce->put_Trustee(bstrTrustee);
|
||
BAIL_ON_FAILURE(hr);
|
||
|
||
hr = pTargetAce->put_Flags((LONG)dwFlags);
|
||
BAIL_ON_FAILURE(hr);
|
||
|
||
hr = pTargetAce->put_ObjectType(bstrObjectTypeClsid);
|
||
BAIL_ON_FAILURE(hr);
|
||
|
||
hr = pTargetAce->put_InheritedObjectType(bstrInheritedObjectTypeClsid);
|
||
BAIL_ON_FAILURE(hr);
|
||
|
||
hr = pTargetAce->QueryInterface(
|
||
IID_IADsAcePrivate,
|
||
(void **) &pPrivAceTarget
|
||
);
|
||
|
||
if (SUCCEEDED(hr)) {
|
||
hr = pSourceAce->QueryInterface(
|
||
IID_IADsAcePrivate,
|
||
(void **) &pPrivAceSource
|
||
);
|
||
|
||
if (SUCCEEDED(hr)) {
|
||
hr = pPrivAceSource->isSidValid(&fSidValid);
|
||
|
||
if (SUCCEEDED(hr) && fSidValid) {
|
||
//
|
||
// Get the sid and try putting it.
|
||
//
|
||
hr = pPrivAceSource->getSid(
|
||
&pSid,
|
||
&dwSidLen
|
||
);
|
||
|
||
if (SUCCEEDED(hr)) {
|
||
pPrivAceTarget->putSid(
|
||
pSid,
|
||
dwSidLen
|
||
);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
*ppTargetAce = pTargetAce;
|
||
|
||
error:
|
||
|
||
if (bstrTrustee) {
|
||
ADsFreeString(bstrTrustee);
|
||
}
|
||
|
||
if (bstrObjectTypeClsid) {
|
||
ADsFreeString(bstrObjectTypeClsid);
|
||
}
|
||
|
||
if (bstrInheritedObjectTypeClsid) {
|
||
ADsFreeString(bstrInheritedObjectTypeClsid);
|
||
}
|
||
|
||
if (pPrivAceTarget) {
|
||
pPrivAceTarget->Release();
|
||
}
|
||
|
||
if (pPrivAceSource) {
|
||
pPrivAceSource->Release();
|
||
}
|
||
|
||
if (pSid) {
|
||
FreeADsMem(pSid);
|
||
}
|
||
|
||
RRETURN_EXP_IF_ERR(hr);
|
||
}
|
||
|
||
//
|
||
// IADsAcePrivate methods.
|
||
//
|
||
|
||
//+---------------------------------------------------------------------------
|
||
// Function: CAccessControlEntry::getSid - IADsAcePrivate method.
|
||
//
|
||
// Synopsis: Returns the SID associated with the trustee on this ACE
|
||
// object assuming there is one that is correct.
|
||
//
|
||
// Arguments: ppSid - Return pointer to SID.
|
||
// pdwLength - Return lenght of the SID.
|
||
//
|
||
// Returns: S_OK or appropriate failure error code.
|
||
//
|
||
// Modifies: ppSid and pdwLength
|
||
//
|
||
//----------------------------------------------------------------------------
|
||
STDMETHODIMP
|
||
CAccessControlEntry::getSid(
|
||
OUT PSID *ppSid,
|
||
OUT DWORD *pdwLength
|
||
)
|
||
{
|
||
HRESULT hr = S_OK;
|
||
PSID pSid = NULL;
|
||
|
||
if (!ppSid || !pdwLength) {
|
||
BAIL_ON_FAILURE(hr = E_ADS_BAD_PARAMETER);
|
||
}
|
||
if (!_pSid) {
|
||
//
|
||
// This means that the there is no usable value for the sid.
|
||
//
|
||
RRETURN(E_FAIL);
|
||
}
|
||
|
||
pSid = (PSID) AllocADsMem(_dwSidLen);
|
||
|
||
if (!pSid) {
|
||
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
||
}
|
||
|
||
memcpy(pSid, _pSid, _dwSidLen);
|
||
|
||
*pdwLength = _dwSidLen;
|
||
|
||
*ppSid = pSid;
|
||
|
||
error:
|
||
|
||
RRETURN(hr);
|
||
}
|
||
|
||
|
||
//+---------------------------------------------------------------------------
|
||
// Function: CAccessControlEntry::putSid - IADsAcePrivate method.
|
||
//
|
||
// Synopsis: Updates the SID associated with the trustee on this Ace
|
||
// object to the value specified.
|
||
//
|
||
// Arguments: PSID - Pointer to SID.
|
||
// dwLength - Lenght of the SID.
|
||
//
|
||
// Returns: S_OK on success or E_ADS_BAD_PARAMETER, E_OUTOFMEMORY
|
||
// on failure.
|
||
//
|
||
// Modifies: _pSid and _dwSidLen.
|
||
//
|
||
//----------------------------------------------------------------------------
|
||
STDMETHODIMP
|
||
CAccessControlEntry::putSid(
|
||
IN PSID pSid,
|
||
IN DWORD dwLength
|
||
)
|
||
{
|
||
HRESULT hr = S_OK;
|
||
PSID pLocalSid = NULL;
|
||
|
||
if (dwLength && !pSid) {
|
||
BAIL_ON_FAILURE(hr = E_ADS_BAD_PARAMETER);
|
||
}
|
||
|
||
if (_pSid) {
|
||
FreeADsMem(_pSid);
|
||
_pSid = NULL;
|
||
_dwSidLen = 0;
|
||
}
|
||
|
||
if (dwLength) {
|
||
//
|
||
// pSid also has to be valid at this point
|
||
//
|
||
_pSid = (PSID) AllocADsMem(dwLength);
|
||
if (!_pSid) {
|
||
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
|
||
}
|
||
|
||
memcpy(_pSid, pSid, dwLength);
|
||
|
||
_dwSidLen = dwLength;
|
||
}
|
||
|
||
error:
|
||
|
||
RRETURN(hr);
|
||
}
|
||
|
||
//+---------------------------------------------------------------------------
|
||
// Function: CAccessControlEntry::isSidValid - IADsAcePrivate method.
|
||
//
|
||
// Synopsis: Returns status of the sid associated with this ACE's trustee.
|
||
//
|
||
// Arguments: pfSidValid - Return value.
|
||
//
|
||
// Returns: S_OK or E_ADS_BAD_PARAMETER.
|
||
//
|
||
// Modifies: pfSidValid set to TRUE or FALSE as appropriate.
|
||
//
|
||
//----------------------------------------------------------------------------
|
||
STDMETHODIMP
|
||
CAccessControlEntry::isSidValid(
|
||
OUT BOOL *pfSidValid
|
||
)
|
||
{
|
||
if (!pfSidValid) {
|
||
RRETURN(E_ADS_BAD_PARAMETER);
|
||
}
|
||
|
||
//
|
||
// If the Sid length is zero, then there is no sid for trustee.
|
||
//
|
||
*pfSidValid = (_dwSidLen != 0);
|
||
RRETURN(S_OK);
|
||
}
|
||
|
||
|