|
|
// cacls.cpp: implementation of the CADsAccessControlEntry class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "objects.h"
#include "maindoc.h"
#include "cacls.h"
#include "newquery.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//***********************************************************
// Function:
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
//***********************************************************
// Function:
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
CADsAccessControlEntry::CADsAccessControlEntry() { InitializeMembers( ); }
//***********************************************************
// Function:
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
CADsAccessControlEntry::CADsAccessControlEntry( IUnknown* pIUnk) :COleDsObject( pIUnk ) { InitializeMembers( ); }
//***********************************************************
// Function:
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
CADsAccessControlEntry::~CADsAccessControlEntry( ) { }
//***********************************************************
// Function: CADsAccessControlEntry::PutProperty
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
HRESULT CADsAccessControlEntry::PutProperty ( int nProp, CString& rValue, long lCode ) { BOOL bOldUseGeneric; HRESULT hResult;
bOldUseGeneric = m_pDoc->GetUseGeneric( );
m_pDoc->SetUseGeneric( FALSE );
hResult = COleDsObject::PutProperty( nProp, rValue, lCode );
m_pDoc->SetUseGeneric( bOldUseGeneric );
return hResult; }
//***********************************************************
// Function:
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
HRESULT CADsAccessControlEntry::GetProperty ( int nProp, CString& rValue ) { BOOL bOldUseGeneric; HRESULT hResult;
bOldUseGeneric = m_pDoc->GetUseGeneric( );
m_pDoc->SetUseGeneric( FALSE );
hResult = COleDsObject::GetProperty( nProp, rValue );
m_pDoc->SetUseGeneric( bOldUseGeneric );
return hResult; }
//***********************************************************
// Function:
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
IDispatch* CADsAccessControlEntry::GetACE( ) { IDispatch* pDispatch = NULL;
if( NULL != m_pIUnk ) { m_pIUnk->QueryInterface( IID_IDispatch, (void**)&pDispatch ); }
return pDispatch; }
//***********************************************************
// Function:
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
IDispatch* CADsAccessControlEntry::CreateACE( ) { IDispatch* pDispatch = NULL; IADsAccessControlEntry* pNewACE = NULL; HRESULT hResult = NULL; DWORD dwAceType = 0; CACEDialog aDialog; BSTR bstrTrustee;
if( IDOK != aDialog.DoModal( ) ) return NULL;
hResult = CoCreateInstance( CLSID_AccessControlEntry, NULL, CLSCTX_INPROC_SERVER, IID_IADsAccessControlEntry, (void **)&pNewACE ); if( SUCCEEDED( hResult ) ) { bstrTrustee = AllocBSTR( aDialog.m_strTrustee.GetBuffer( 128 ) );
pNewACE->put_Trustee( bstrTrustee ); hResult = pNewACE->QueryInterface( IID_IDispatch, (void**)&pDispatch ); SysFreeString( bstrTrustee ); pNewACE->Release( ); }
return pDispatch; return NULL; }
//***********************************************************
// Function:
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
void CADsAccessControlEntry::InitializeMembers ( ) { IADsAccessControlEntry* pEntry; HRESULT hResult;
if( NULL != m_pIUnk ) { hResult = m_pIUnk->QueryInterface( IID_IADsAccessControlEntry, (void**)&pEntry ); if( SUCCEEDED( hResult ) ) { BSTR bstrTrustee = NULL; TCHAR szTrustee[ 256 ];
pEntry->get_Trustee( &bstrTrustee ); if( NULL != bstrTrustee ) { Convert( szTrustee, bstrTrustee ); m_strItemName = szTrustee; } SysFreeString( bstrTrustee ); pEntry->Release( ); } } m_strSchemaPath = _T("ACE"); }
//***********************************************************
// Function:
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
CADsSecurityDescriptor::CADsSecurityDescriptor() { InitializeMembers( ); }
//***********************************************************
// Function:
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
CADsSecurityDescriptor::CADsSecurityDescriptor( IUnknown* pIUnk ) :COleDsObject( pIUnk ) { /*IADsSecurityDescriptor* pSecD;
IDispatch* pCopy; HRESULT hResult;
hResult = m_pIUnk->QueryInterface( IID_IADsSecurityDescriptor, (void**)&pSecD );
hResult = pSecD->CopySecurityDescriptor( &pCopy );
if( SUCCEEDED( hResult ) ) { m_pIUnk->Release( ); hResult = pCopy->QueryInterface( IID_IUnknown,(void**)&m_pIUnk ); pCopy->Release( ); }
pSecD->Release( );*/
InitializeMembers( ); }
//***********************************************************
// Function:
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
CADsSecurityDescriptor::~CADsSecurityDescriptor() { for( int nIdx = 0; nIdx < (int) acl_Limit ; nIdx++ ) { if( NULL != pACLObj[ nIdx ] ) delete pACLObj[ nIdx ]; } }
//***********************************************************
// Function:
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
HRESULT CADsSecurityDescriptor::PutProperty ( int nProp, CString& rValue, long lCode ) { BOOL bOldUseGeneric; HRESULT hResult;
bOldUseGeneric = m_pDoc->GetUseGeneric( );
m_pDoc->SetUseGeneric( FALSE );
hResult = COleDsObject::PutProperty( nProp, rValue, lCode );
m_pDoc->SetUseGeneric( bOldUseGeneric );
return hResult; }
//***********************************************************
// Function:
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
HRESULT CADsSecurityDescriptor::GetProperty ( int nProp, CString& rValue ) { BOOL bOldUseGeneric; HRESULT hResult;
bOldUseGeneric = m_pDoc->GetUseGeneric( );
m_pDoc->SetUseGeneric( FALSE );
hResult = COleDsObject::GetProperty( nProp, rValue );
m_pDoc->SetUseGeneric( bOldUseGeneric );
return hResult; }
//***********************************************************
// Function:
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
void CADsSecurityDescriptor::InitializeMembers ( ) { HRESULT hResult; IADsSecurityDescriptor* pDescriptor = NULL; IDispatch* pDispACL;
m_strSchemaPath = _T("SecurityDescriptor");
pACLObj[ acl_SACL ] = NULL; pACLObj[ acl_DACL ] = NULL; pACLObj[ acl_Invalid ] = NULL;
if( NULL == m_pIUnk ) return;
while( TRUE ) { hResult = m_pIUnk->QueryInterface( IID_IADsSecurityDescriptor, (void**)&pDescriptor );
ASSERT( SUCCEEDED( hResult ) ); if( FAILED( hResult ) ) break;
pDispACL = GetACL( acl_DACL ); ASSERT( NULL != pDispACL );
if( NULL != pDispACL ) { pACLObj[ acl_DACL ] = new CADsAccessControlList( pDispACL ); pDispACL->Release( ); }
pDispACL = GetACL( acl_SACL ); ASSERT( NULL != pDispACL );
if( NULL != pDispACL ) { pACLObj[ acl_SACL ] = new CADsAccessControlList( pDispACL ); pDispACL->Release( ); }
break; }
if( NULL != pDescriptor ) { pDescriptor->Release( ); } }
//***********************************************************
// Function:
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
IDispatch* CADsSecurityDescriptor::GetACL( ACLTYPE eType ) { HRESULT hResult; IDispatch* pACL = NULL; IDispatch* pCopyACL = NULL; IADsSecurityDescriptor* pSecDescr = NULL;
while( TRUE ) { if( NULL == m_pIUnk ) break;
//QI for IID_IADsSecurityDescriptor interface
hResult = m_pIUnk->QueryInterface( IID_IADsSecurityDescriptor, (void**)&pSecDescr ); ASSERT( SUCCEEDED( hResult ) ); if( FAILED( hResult ) ) { break; }
hResult = E_FAIL;
if( acl_DACL == eType ) { hResult = pSecDescr->get_DiscretionaryAcl( &pACL ); } if( acl_SACL == eType ) { hResult = pSecDescr->get_SystemAcl( &pACL ); } pSecDescr->Release( );
ASSERT( SUCCEEDED( hResult ) ); break; }
if( NULL != pACL ) { //pCopyACL = CopyACL( pACL );
//pACL->Release( );
pACL->QueryInterface( IID_IDispatch, (void**)&pCopyACL ); pACL->Release( ); }
return pCopyACL; }
//***********************************************************
// Function:
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
HRESULT CADsSecurityDescriptor::PutACL( IDispatch * pACL, ACLTYPE eACL ) { HRESULT hResult; IADsSecurityDescriptor* pSecDescr = NULL;
while( TRUE ) { if( NULL == m_pIUnk ) break;
//QI for IID_IADsSecurityDescriptor interface
hResult = m_pIUnk->QueryInterface( IID_IADsSecurityDescriptor, (void**)&pSecDescr ); ASSERT( SUCCEEDED( hResult ) ); if( FAILED( hResult ) ) { break; }
hResult = E_FAIL;
if( acl_DACL == eACL ) { hResult = pSecDescr->put_DiscretionaryAcl( pACL ); } if( acl_SACL == eACL ) { hResult = pSecDescr->put_SystemAcl( pACL ); }
pSecDescr->Release( ); break; }
return hResult; }
//***********************************************************
// Function:
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
HRESULT CADsSecurityDescriptor::AddACE( ACLTYPE eACL, IUnknown* pNewACE ) { ASSERT( acl_DACL == eACL || acl_SACL == eACL );
if( acl_DACL != eACL && acl_SACL != eACL ) return -1;
if( NULL == pACLObj[ (int)eACL ] ) return -1;
return ((CADsAccessControlList*)(pACLObj[ (int)eACL ]))->AddACE( pNewACE ); }
//***********************************************************
// Function:
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
HRESULT CADsSecurityDescriptor::RemoveACE( ACLTYPE eACL, IUnknown* pRemoveACE ) { ASSERT( acl_DACL == eACL || acl_SACL == eACL );
if( acl_DACL != eACL && acl_SACL != eACL ) return -1;
if( NULL == pACLObj[ (int)eACL ] ) return -1;
return ((CADsAccessControlList*)(pACLObj[ (int)eACL ]))->RemoveACE( pRemoveACE ); }
//***********************************************************
// Function:
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
void CADsSecurityDescriptor::SetDocument( CMainDoc* pDoc ) { int nIdx;
COleDsObject::SetDocument ( pDoc );
for( nIdx = 0 ; nIdx < (int)acl_Limit ; nIdx++ ) { if( NULL != pACLObj[ nIdx ] ) pACLObj[ nIdx ]->SetDocument( pDoc ); } }
//***********************************************************
// Function:
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
void CADsSecurityDescriptor::RemoveAllACE( ACLTYPE eACL ) { ASSERT( acl_DACL == eACL || acl_SACL == eACL );
if( acl_DACL != eACL && acl_SACL != eACL ) return;
if( NULL == pACLObj[ (int)eACL ] ) return; }
//***********************************************************
// Function:
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
CADsAccessControlList* CADsSecurityDescriptor::GetACLObject( ACLTYPE eACL ) { CADsAccessControlList* pACL;
ASSERT( acl_DACL == eACL || acl_SACL == eACL );
if( acl_DACL != eACL && acl_SACL != eACL ) return NULL;
pACL = (CADsAccessControlList*) (pACLObj[ (int)eACL ]);
return pACL; }
//***********************************************************
// Function:
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
CADsAccessControlList::CADsAccessControlList() { InitializeMembers( ); }
//***********************************************************
// Function:
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
CADsAccessControlList::CADsAccessControlList( IUnknown* pUnk ): COleDsObject( pUnk ) { InitializeMembers( ); }
//***********************************************************
// Function: CADsAccessControlList::AddACE
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
HRESULT CADsAccessControlList::AddACE( IUnknown* pNewACE ) { IDispatch* pDisp = NULL; HRESULT hResult; IADsAccessControlList* pACL = NULL;
if( NULL == m_pIUnk ) { return E_FAIL; }
hResult = m_pIUnk->QueryInterface( IID_IADsAccessControlList, (void**)&pACL );
if( FAILED( hResult ) ) return hResult;
hResult = pNewACE->QueryInterface( IID_IDispatch, (void**)&pDisp ); if( SUCCEEDED( hResult ) ) { hResult = pACL->AddAce( pDisp );
if( SUCCEEDED( hResult ) ) InitializeMembers( );
pDisp->Release( ); }
pACL->Release( );
return hResult; }
//***********************************************************
// Function: CADsAccessControlList::AddACE
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
HRESULT CADsAccessControlList::RemoveACE( IUnknown* pRemoveACE ) { IDispatch* pDisp = NULL; HRESULT hResult; IADsAccessControlList* pACL = NULL;
if( NULL == m_pIUnk ) { return E_FAIL; }
hResult = m_pIUnk->QueryInterface( IID_IADsAccessControlList, (void**)&pACL );
if( FAILED( hResult ) ) return hResult;
hResult = pRemoveACE->QueryInterface( IID_IDispatch, (void**)&pDisp ); if( SUCCEEDED( hResult ) ) { hResult = pACL->RemoveAce( pDisp );
if( SUCCEEDED( hResult ) ) InitializeMembers( );
pDisp->Release( ); }
pACL->Release( );
return hResult; }
//***********************************************************
// Function: CADsAccessControlList::~CADsAccessControlList
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
CADsAccessControlList::~CADsAccessControlList() { for( int nIdx = 0 ; nIdx < m_arrACE.GetSize( ) ; nIdx++ ) { delete m_arrACE.GetAt( nIdx ); }
m_arrACE.RemoveAll( ); }
//***********************************************************
// Function: CADsAccessControlList::GetACL
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
IDispatch* CADsAccessControlList::GetACL( ) { IDispatch* pDispatch = NULL;
if( NULL != m_pIUnk ) { m_pIUnk->QueryInterface( IID_IDispatch, (void**)&pDispatch ); }
return pDispatch; }
//***********************************************************
// Function:
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
IDispatch* CADsAccessControlList::CreateACL( ) { IDispatch* pDispatch = NULL; IADsAccessControlList* pNewACL = NULL; HRESULT hResult = NULL; DWORD dwAceType = 0;
hResult = CoCreateInstance( CLSID_AccessControlList, NULL, CLSCTX_INPROC_SERVER, IID_IADsAccessControlList, (void **)&pNewACL ); if( SUCCEEDED( hResult ) ) { hResult = pNewACL->QueryInterface( IID_IDispatch, (void**)&pDispatch ); pNewACL->Release( ); }
return pDispatch; }
//***********************************************************
// Function: CADsAccessControlList::PutProperty
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
HRESULT CADsAccessControlList::PutProperty ( int nACE, int nProp, CString& rVal, long lCode ) { HRESULT hResult; COleDsObject* pACE;
ASSERT( nACE < m_arrACE.GetSize( ) );
if( nACE < m_arrACE.GetSize( ) ) { pACE = (COleDsObject*) m_arrACE.GetAt( nACE );
hResult = pACE->PutProperty ( nProp, rVal, lCode ); }
return hResult; }
//***********************************************************
// Function: CADsAccessControlList::GetProperty
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
HRESULT CADsAccessControlList::GetProperty ( int nACE, int nProp, CString& rVal ) { HRESULT hResult; COleDsObject* pACE;
ASSERT( nACE < m_arrACE.GetSize( ) );
if( nACE < m_arrACE.GetSize( ) ) { pACE = (COleDsObject*) m_arrACE.GetAt( nACE );
hResult = pACE->GetProperty ( nProp, rVal ); }
return hResult; }
//***********************************************************
// Function: CADsAccessControlList::InitializeMembers
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
void CADsAccessControlList::InitializeMembers( ) { IADsAccessControlList* pACList = NULL; IUnknown* pIUnk; HRESULT hResult; IEnumVARIANT* pEnum = NULL; VARIANT aVariant; IUnknown* pACE; ULONG ulGet;
if( !m_pIUnk ) return;
for( int nIdx = 0 ; nIdx < m_arrACE.GetSize( ) ; nIdx++ ) { delete m_arrACE.GetAt( nIdx ); }
m_arrACE.RemoveAll( );
while( TRUE ) { //hResult = m_pIUnk->QueryInterface( IID_IEnumVARIANT,
// (void**)&pEnum );
hResult = m_pIUnk->QueryInterface( IID_IADsAccessControlList, (void**)&pACList ); ASSERT( SUCCEEDED( hResult ) ); if( FAILED( hResult ) ) break;
hResult = pACList->get__NewEnum( &pIUnk ); ASSERT( SUCCEEDED( hResult ) ); if( FAILED( hResult ) ) break;
hResult = pIUnk->QueryInterface( IID_IEnumVARIANT, (void**)&pEnum );
pIUnk->Release( ); pACList->Release( );
ASSERT( SUCCEEDED( hResult ) ); if( FAILED( hResult ) ) break;
while( TRUE ) { CADsAccessControlEntry* pNewACE;
ulGet = 0L; hResult = pEnum->Next( 1, &aVariant, &ulGet ); if( FAILED( hResult ) ) break;
if( 0 == ulGet ) break;
hResult = V_DISPATCH( &aVariant )->QueryInterface( IID_IUnknown, (void**)&pACE ); VariantClear( &aVariant ); pNewACE = new CADsAccessControlEntry( pACE );
if( NULL != m_pDoc ) { pNewACE->SetDocument( m_pDoc ); }
m_arrACE.Add( pNewACE );
pACE->Release( ); } pEnum->Release( ); break; } }
//***********************************************************
// Function:
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
void CADsAccessControlList::SetDocument ( CMainDoc* pDoc ) { COleDsObject* pObject; int nSize, nIdx;
COleDsObject::SetDocument ( pDoc );
nSize = (int)m_arrACE.GetSize( ); for( nIdx = 0; nIdx < nSize ; nIdx++ ) { pObject = (COleDsObject*)m_arrACE.GetAt( nIdx ); pObject->SetDocument( pDoc ); } }
//***********************************************************
// Function: CADsAccessControlList::GetACECount
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
int CADsAccessControlList::GetACECount ( void ) { return (int)m_arrACE.GetSize( ); }
//***********************************************************
// Function: CADsAccessControlList::GetACEObject
// Arguments:
// Return:
// Purpose:
// Author(s):
// Revision:
// Date:
//***********************************************************
CADsAccessControlEntry* CADsAccessControlList::GetACEObject ( int nACE ) { CADsAccessControlEntry* pACE;
//ASSERT( nACE < GetACECount( ) );
if( nACE >= GetACECount( ) ) return NULL;
pACE = (CADsAccessControlEntry*) (m_arrACE.GetAt( nACE ) );
return pACE; }
|