//--------------------------------------------------------------------------- // // 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); }