//--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1995 // // File: cSecurityDescriptor.cxx // // Contents: SecurityDescriptor object // // History: 11-1-95 krishnag Created. // //---------------------------------------------------------------------------- #include "oleds.hxx" #pragma hdrstop // Class CSecurityDescriptor DEFINE_IDispatch_Implementation(CSecurityDescriptor) CSecurityDescriptor::CSecurityDescriptor(): _pDispMgr(NULL), _lpOwner(NULL), _fOwnerDefaulted(FALSE), _lpGroup(NULL), _fGroupDefaulted(FALSE), _dwRevision(0), _dwControl(0), _pDAcl(NULL), _fDaclDefaulted(FALSE), _pSAcl(NULL), _fSaclDefaulted(FALSE) { ENLIST_TRACKING(CSecurityDescriptor); } HRESULT CSecurityDescriptor::CreateSecurityDescriptor( REFIID riid, void **ppvObj ) { CSecurityDescriptor FAR * pSecurityDescriptor = NULL; HRESULT hr = S_OK; hr = AllocateSecurityDescriptorObject(&pSecurityDescriptor); BAIL_ON_FAILURE(hr); hr = pSecurityDescriptor->QueryInterface(riid, ppvObj); BAIL_ON_FAILURE(hr); pSecurityDescriptor->Release(); RRETURN(hr); error: delete pSecurityDescriptor; RRETURN_EXP_IF_ERR(hr); } CSecurityDescriptor::~CSecurityDescriptor( ) { delete _pDispMgr; if (_pDAcl) { _pDAcl->Release(); } if (_pSAcl) { _pSAcl->Release(); } if (_lpOwner) { FreeADsStr(_lpOwner); } if (_lpGroup) { FreeADsStr(_lpGroup); } } STDMETHODIMP CSecurityDescriptor::QueryInterface( REFIID iid, LPVOID FAR* ppv ) { if (IsEqualIID(iid, IID_IUnknown)) { *ppv = (IADsSecurityDescriptor FAR *) this; } else if (IsEqualIID(iid, IID_IADsSecurityDescriptor)) { *ppv = (IADsSecurityDescriptor FAR *) this; } else if (IsEqualIID(iid, IID_IDispatch)) { *ppv = (IADsSecurityDescriptor FAR *) this; } else if (IsEqualIID(iid, IID_ISupportErrorInfo)) { *ppv = (ISupportErrorInfo FAR *) this; } else { *ppv = NULL; return E_NOINTERFACE; } AddRef(); return NOERROR; } HRESULT CSecurityDescriptor::AllocateSecurityDescriptorObject( CSecurityDescriptor ** ppSecurityDescriptor ) { CSecurityDescriptor FAR * pSecurityDescriptor = NULL; CDispatchMgr FAR * pDispMgr = NULL; HRESULT hr = S_OK; pSecurityDescriptor = new CSecurityDescriptor(); if (pSecurityDescriptor == 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_IADsSecurityDescriptor, (IADsSecurityDescriptor *)pSecurityDescriptor, DISPID_REGULAR ); BAIL_ON_FAILURE(hr); pSecurityDescriptor->_pDispMgr = pDispMgr; *ppSecurityDescriptor = pSecurityDescriptor; RRETURN(hr); error: delete pSecurityDescriptor; delete pDispMgr; RRETURN_EXP_IF_ERR(hr); } // // ISupportErrorInfo method // STDMETHODIMP CSecurityDescriptor::InterfaceSupportsErrorInfo(THIS_ REFIID riid) { if (IsEqualIID(riid, IID_IADsSecurityDescriptor)) { return S_OK; } else { return S_FALSE; } } STDMETHODIMP CSecurityDescriptor::get_DiscretionaryAcl( IDispatch FAR * FAR * retval ) { if (_pDAcl) { // // Need to AddRef this pointer _pDAcl->AddRef(); *retval = _pDAcl; }else { *retval = NULL; } RRETURN(S_OK); } STDMETHODIMP CSecurityDescriptor::put_DiscretionaryAcl( IDispatch FAR * pDiscretionaryAcl ) { HRESULT hr = S_OK; if (_pDAcl) { _pDAcl->Release(); } if (pDiscretionaryAcl) { hr = pDiscretionaryAcl->QueryInterface( IID_IADsAccessControlList, (void **)&_pDAcl ); }else { _pDAcl = NULL; } RRETURN_EXP_IF_ERR(hr); } STDMETHODIMP CSecurityDescriptor::get_SystemAcl( IDispatch FAR * FAR * retval ) { if (_pSAcl) { // // Need to AddRef this pointer // _pSAcl->AddRef(); *retval = _pSAcl; }else { *retval = NULL; } RRETURN(S_OK); } STDMETHODIMP CSecurityDescriptor::put_SystemAcl( IDispatch FAR * pSystemAcl ) { HRESULT hr = S_OK; if (_pSAcl) { _pSAcl->Release(); } if (pSystemAcl) { hr = pSystemAcl->QueryInterface( IID_IADsAccessControlList, (void **)&_pSAcl ); }else { _pSAcl = NULL; } RRETURN_EXP_IF_ERR(hr); } STDMETHODIMP CSecurityDescriptor::get_Revision(THIS_ long FAR * retval) { *retval = _dwRevision; RRETURN(S_OK); } STDMETHODIMP CSecurityDescriptor::put_Revision(THIS_ long lnRevision) { _dwRevision = lnRevision; RRETURN(S_OK); } STDMETHODIMP CSecurityDescriptor::get_Control(THIS_ long FAR * retval) { *retval = _dwControl; RRETURN(S_OK); } STDMETHODIMP CSecurityDescriptor::put_Control(THIS_ long lnControl) { _dwControl = lnControl; RRETURN(S_OK); } STDMETHODIMP CSecurityDescriptor::get_Owner(THIS_ BSTR FAR * retval) { HRESULT hr = S_OK; hr = ADsAllocString(_lpOwner, retval); RRETURN_EXP_IF_ERR(hr); } STDMETHODIMP CSecurityDescriptor::put_Owner(THIS_ BSTR bstrOwner) { if (_lpOwner) { FreeADsStr(_lpOwner); } if (!bstrOwner) { _lpOwner = NULL; } else { _lpOwner = AllocADsStr(bstrOwner); if (!_lpOwner) { RRETURN(E_OUTOFMEMORY); } } RRETURN(S_OK); } STDMETHODIMP CSecurityDescriptor::get_Group(THIS_ BSTR FAR * retval) { HRESULT hr = S_OK; hr = ADsAllocString(_lpGroup, retval); RRETURN_EXP_IF_ERR(hr); } STDMETHODIMP CSecurityDescriptor::put_Group(THIS_ BSTR bstrGroup) { if (_lpGroup) { FreeADsStr(_lpGroup); } if (!bstrGroup) { _lpGroup = NULL; } else { _lpGroup = AllocADsStr(bstrGroup); if (!_lpGroup) { RRETURN_EXP_IF_ERR(E_OUTOFMEMORY); } } RRETURN(S_OK); } STDMETHODIMP CSecurityDescriptor::CopySecurityDescriptor(THIS_ IDispatch FAR * FAR * ppSecurityDescriptor) { HRESULT hr = S_OK; IADsSecurityDescriptor * pSecDes = NULL; IDispatch *pTargetDACL = NULL; IDispatch *pTargetSACL = NULL; IDispatch * pDisp = NULL; hr = CoCreateInstance( CLSID_SecurityDescriptor, NULL, CLSCTX_INPROC_SERVER, IID_IADsSecurityDescriptor, (void **)&pSecDes ); BAIL_ON_FAILURE(hr); if (_lpOwner) { hr = pSecDes->put_Owner(_lpOwner); BAIL_ON_FAILURE(hr); } if (_lpGroup) { hr = pSecDes->put_Group(_lpGroup); BAIL_ON_FAILURE(hr); } hr = pSecDes->put_Revision(_dwRevision); BAIL_ON_FAILURE(hr); hr = pSecDes->put_Control((DWORD)_dwControl); BAIL_ON_FAILURE(hr); if (_pDAcl) { hr = _pDAcl->CopyAccessList(&pTargetDACL); BAIL_ON_FAILURE(hr); hr = pSecDes->put_DiscretionaryAcl(pTargetDACL); BAIL_ON_FAILURE(hr); } if (_pSAcl) { hr = _pSAcl->CopyAccessList(&pTargetSACL); BAIL_ON_FAILURE(hr); hr = pSecDes->put_SystemAcl(pTargetSACL); BAIL_ON_FAILURE(hr); } hr = pSecDes->QueryInterface( IID_IDispatch, (void**)&pDisp ); BAIL_ON_FAILURE(hr); *ppSecurityDescriptor = pDisp; cleanup: if (pTargetSACL) { pTargetSACL->Release(); } if (pTargetDACL) { pTargetDACL->Release(); } if (pSecDes) { pSecDes->Release(); } RRETURN_EXP_IF_ERR(hr); error: *ppSecurityDescriptor = NULL; goto cleanup; } STDMETHODIMP CSecurityDescriptor::get_OwnerDefaulted(THIS_ VARIANT_BOOL FAR* retval) { if (_fOwnerDefaulted) { *retval = VARIANT_TRUE; }else{ *retval = VARIANT_FALSE; } RRETURN(S_OK); } STDMETHODIMP CSecurityDescriptor::put_OwnerDefaulted(THIS_ VARIANT_BOOL fOwnerDefaulted) { if (fOwnerDefaulted == VARIANT_TRUE) { _fOwnerDefaulted = TRUE; }else { _fOwnerDefaulted = FALSE; } RRETURN(S_OK); } STDMETHODIMP CSecurityDescriptor::get_GroupDefaulted(THIS_ VARIANT_BOOL FAR* retval) { if (_fGroupDefaulted) { *retval = VARIANT_TRUE; }else{ *retval = VARIANT_FALSE; } RRETURN(S_OK); } STDMETHODIMP CSecurityDescriptor::put_GroupDefaulted(THIS_ VARIANT_BOOL fGroupDefaulted) { if (fGroupDefaulted == VARIANT_TRUE) { _fGroupDefaulted = TRUE; }else { _fGroupDefaulted = FALSE; } RRETURN(S_OK); } STDMETHODIMP CSecurityDescriptor::get_DaclDefaulted(THIS_ VARIANT_BOOL FAR* retval) { if (_fDaclDefaulted) { *retval = VARIANT_TRUE; }else{ *retval = VARIANT_FALSE; } RRETURN(S_OK); } STDMETHODIMP CSecurityDescriptor::put_DaclDefaulted(THIS_ VARIANT_BOOL fDaclDefaulted) { if (fDaclDefaulted == VARIANT_TRUE) { _fDaclDefaulted = TRUE; }else { _fDaclDefaulted = FALSE; } RRETURN(S_OK); } STDMETHODIMP CSecurityDescriptor::get_SaclDefaulted(THIS_ VARIANT_BOOL FAR* retval) { if (_fSaclDefaulted) { *retval = VARIANT_TRUE; }else{ *retval = VARIANT_FALSE; } RRETURN(S_OK); } STDMETHODIMP CSecurityDescriptor::put_SaclDefaulted(THIS_ VARIANT_BOOL fSaclDefaulted) { if (fSaclDefaulted == VARIANT_TRUE) { _fSaclDefaulted = TRUE; }else { _fSaclDefaulted = FALSE; } RRETURN(S_OK); }