/****************************************************************************** Copyright (c) 2000 Microsoft Corporation Module Name: AccessControlEntry.cpp Abstract: This file contains the implementation of the CPCHAccessControlEntry class, which is used to represent an access control entry. Revision History: Davide Massarenti (Dmassare) 03/22/2000 created ******************************************************************************/ #include "StdAfx.h" //////////////////////////////////////////////////////////////////////////////// // // AccessControlEntry [@AccessMask // @AceFlags // @AceType // @Flags] // // Trustee // ObjectType // InheritedOjectType // //////////////////////////////////////////////////////////////////////////////// static const CComBSTR s_TAG_ACE ( L"AccessControlEntry" ); static const CComBSTR s_ATTR_ACE_AccessMask ( L"AccessMask" ); static const CComBSTR s_ATTR_ACE_AceFlags ( L"AceFlags" ); static const CComBSTR s_ATTR_ACE_AceType ( L"AceType" ); static const CComBSTR s_ATTR_ACE_Flags ( L"Flags" ); static const CComBSTR s_TAG_Trustee ( L"Trustee" ); static const CComBSTR s_TAG_ObjectType ( L"ObjectType" ); static const CComBSTR s_TAG_InheritedObjectType( L"InheritedObjectType" ); //////////////////////////////////////////////////////////////////////////////// CPCHAccessControlEntry::CPCHAccessControlEntry() { m_dwAccessMask = 0; // DWORD m_dwAccessMask; m_dwAceFlags = 0; // DWORD m_dwAceFlags; m_dwAceType = 0; // DWORD m_dwAceType; m_dwFlags = 0; // DWORD m_dwFlags; // // CComBSTR m_bstrTrustee; // CComBSTR m_bstrObjectType; // CComBSTR m_bstrInheritedObjectType; } CPCHAccessControlEntry::~CPCHAccessControlEntry() { } //////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CPCHAccessControlEntry::get_AccessMask( /*[out, retval]*/ long *pVal ) { __HCP_BEGIN_PROPERTY_GET("CPCHAccessControlEntry::get_AccessMask",hr,pVal); *pVal = m_dwAccessMask; __HCP_END_PROPERTY(hr); } STDMETHODIMP CPCHAccessControlEntry::put_AccessMask( /*[in]*/ long newVal ) { __HCP_BEGIN_PROPERTY_PUT("CPCHAccessControlEntry::put_AccessMask",hr); m_dwAccessMask = newVal; __HCP_END_PROPERTY(hr); } //////////////////// STDMETHODIMP CPCHAccessControlEntry::get_AceType( /*[out, retval]*/ long *pVal ) { __HCP_BEGIN_PROPERTY_GET("CPCHAccessControlEntry::get_AceType",hr,pVal); *pVal = m_dwAceType; __HCP_END_PROPERTY(hr); } STDMETHODIMP CPCHAccessControlEntry::put_AceType( /*[in]*/ long newVal ) { __HCP_BEGIN_PROPERTY_PUT("CPCHAccessControlEntry::put_AceType",hr); m_dwAceType = newVal; __HCP_END_PROPERTY(hr); } //////////////////// STDMETHODIMP CPCHAccessControlEntry::get_AceFlags( /*[out, retval]*/ long *pVal ) { __HCP_BEGIN_PROPERTY_GET("CPCHAccessControlEntry::get_AceFlags",hr,pVal); *pVal = m_dwAceFlags; __HCP_END_PROPERTY(hr); } STDMETHODIMP CPCHAccessControlEntry::put_AceFlags( /*[in]*/ long newVal ) { __HCP_BEGIN_PROPERTY_PUT("CPCHAccessControlEntry::put_AceFlags",hr); m_dwAceFlags = newVal; __HCP_END_PROPERTY(hr); } //////////////////// STDMETHODIMP CPCHAccessControlEntry::get_Flags( /*[out, retval]*/ long *pVal ) { __HCP_BEGIN_PROPERTY_GET("CPCHAccessControlEntry::get_Flags",hr,pVal); *pVal = m_dwFlags; __HCP_END_PROPERTY(hr); } STDMETHODIMP CPCHAccessControlEntry::put_Flags( /*[in]*/ long newVal ) { __HCP_BEGIN_PROPERTY_PUT("CPCHAccessControlEntry::put_Flags",hr); m_dwFlags = newVal; __HCP_END_PROPERTY(hr); } //////////////////// STDMETHODIMP CPCHAccessControlEntry::get_Trustee( /*[out, retval]*/ BSTR *pVal ) { __HCP_BEGIN_PROPERTY_GET("CPCHAccessControlEntry::get_Trustee",hr,pVal); __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::GetBSTR( m_bstrTrustee, pVal )); __HCP_END_PROPERTY(hr); } STDMETHODIMP CPCHAccessControlEntry::put_Trustee( /*[in]*/ BSTR newVal ) { __HCP_BEGIN_PROPERTY_PUT("CPCHAccessControlEntry::put_Trustee",hr); if(newVal) { __MPC_EXIT_IF_METHOD_FAILS(hr, CPCHSecurityDescriptorDirect::VerifyPrincipal( newVal )); } __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::PutBSTR( m_bstrTrustee, newVal, false )); __HCP_END_PROPERTY(hr); } //////////////////// STDMETHODIMP CPCHAccessControlEntry::get_ObjectType( /*[out, retval]*/ BSTR *pVal ) { __HCP_BEGIN_PROPERTY_GET("CPCHAccessControlEntry::get_ObjectType",hr,pVal); __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::GetBSTR( m_bstrObjectType, pVal )); __HCP_END_PROPERTY(hr); } STDMETHODIMP CPCHAccessControlEntry::put_ObjectType( /*[in]*/ BSTR newVal ) { __HCP_BEGIN_PROPERTY_PUT("CPCHAccessControlEntry::put_ObjectType",hr); __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::PutBSTR( m_bstrObjectType, newVal )); __HCP_END_PROPERTY(hr); } //////////////////// STDMETHODIMP CPCHAccessControlEntry::get_InheritedObjectType( /*[out, retval]*/ BSTR *pVal ) { __HCP_BEGIN_PROPERTY_GET("CPCHAccessControlEntry::get_InheritedObjectType",hr,pVal); __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::GetBSTR( m_bstrInheritedObjectType, pVal )); __HCP_END_PROPERTY(hr); } STDMETHODIMP CPCHAccessControlEntry::put_InheritedObjectType( /*[in]*/ BSTR newVal ) { __HCP_BEGIN_PROPERTY_PUT("CPCHAccessControlEntry::put_InheritedObjectType",hr); __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::PutBSTR( m_bstrInheritedObjectType, newVal )); __HCP_END_PROPERTY(hr); } //////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CPCHAccessControlEntry::IsEquivalent( /*[in ]*/ IPCHAccessControlEntry* pAce , /*[out, retval]*/ VARIANT_BOOL *pVal ) { __HCP_FUNC_ENTRY( "CPCHAccessControlEntry::IsEquivalent" ); HRESULT hr; long lAccessMask; long lAceFlags; long lAceType; long lFlags; CComBSTR bstrTrustee; CComBSTR bstrObjectType; CComBSTR bstrInheritedObjectType; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_NOTNULL(pAce); __MPC_PARAMCHECK_POINTER_AND_SET(pVal,VARIANT_FALSE); __MPC_PARAMCHECK_END(); __MPC_EXIT_IF_METHOD_FAILS(hr, pAce->get_AccessMask( &lAccessMask )); if(m_dwAccessMask != lAccessMask) { __MPC_SET_ERROR_AND_EXIT(hr, S_OK); } __MPC_EXIT_IF_METHOD_FAILS(hr, pAce->get_AceFlags( &lAceFlags )); if(m_dwAceFlags != lAceFlags) { __MPC_SET_ERROR_AND_EXIT(hr, S_OK); } __MPC_EXIT_IF_METHOD_FAILS(hr, pAce->get_AceType( &lAceType )); if(m_dwAceType != lAceType) { __MPC_SET_ERROR_AND_EXIT(hr, S_OK); } __MPC_EXIT_IF_METHOD_FAILS(hr, pAce->get_Flags( &lFlags )); if(m_dwFlags != lFlags) { __MPC_SET_ERROR_AND_EXIT(hr, S_OK); } __MPC_EXIT_IF_METHOD_FAILS(hr, pAce->get_Trustee( &bstrTrustee )); if(MPC::StrICmp( m_bstrTrustee, bstrTrustee )) { __MPC_SET_ERROR_AND_EXIT(hr, S_OK); } __MPC_EXIT_IF_METHOD_FAILS(hr, pAce->get_ObjectType( &bstrObjectType )); if(MPC::StrICmp( m_bstrObjectType, bstrObjectType )) { __MPC_SET_ERROR_AND_EXIT(hr, S_OK); } __MPC_EXIT_IF_METHOD_FAILS(hr, pAce->get_InheritedObjectType( &bstrInheritedObjectType )); if(MPC::StrICmp( m_bstrInheritedObjectType, bstrInheritedObjectType )) { __MPC_SET_ERROR_AND_EXIT(hr, S_OK); } *pVal = VARIANT_TRUE; hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } STDMETHODIMP CPCHAccessControlEntry::Clone( /*[out, retval]*/ IPCHAccessControlEntry* *pVal ) { __HCP_FUNC_ENTRY( "CPCHAccessControlEntry::Clone" ); HRESULT hr; MPC::SmartLock<_ThreadModel> lock( this ); CComPtr pNew; CPCHAccessControlEntry* pPtr; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_POINTER_AND_SET(pVal,NULL); __MPC_PARAMCHECK_END(); __MPC_EXIT_IF_METHOD_FAILS(hr, MPC::CreateInstance( &pNew )); pPtr = pNew; pPtr->m_dwAccessMask = m_dwAccessMask; pPtr->m_dwAceFlags = m_dwAceFlags; pPtr->m_dwAceType = m_dwAceType; pPtr->m_dwFlags = m_dwFlags; pPtr->m_bstrTrustee = m_bstrTrustee; pPtr->m_bstrObjectType = m_bstrObjectType; pPtr->m_bstrInheritedObjectType = m_bstrInheritedObjectType; __MPC_EXIT_IF_METHOD_FAILS(hr, pNew.QueryInterface( pVal )); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } //////////////////////////////////////////////////////////////////////////////// HRESULT CPCHAccessControlEntry::LoadPost( /*[in]*/ MPC::XmlUtil& xml ) { __HCP_FUNC_ENTRY( "CPCHAccessControlEntry::LoadPost" ); HRESULT hr; MPC::SmartLock<_ThreadModel> lock( this ); CComPtr xdnNode; CComBSTR bstrValue; LONG lValue; bool fFound; // // Make sure we have something to parse.... // __MPC_EXIT_IF_METHOD_FAILS(hr, xml.GetRoot( &xdnNode )); xdnNode.Release(); // // Clean up before loading. // m_dwAccessMask = 0; m_dwAceFlags = 0; m_dwAceType = 0; m_dwFlags = 0; m_bstrTrustee .Empty(); m_bstrObjectType .Empty(); m_bstrInheritedObjectType.Empty(); // // Read attributes. // __MPC_EXIT_IF_METHOD_FAILS(hr, xml.GetAttribute( NULL, s_ATTR_ACE_AccessMask, lValue, fFound )); if(fFound) m_dwAccessMask = lValue; __MPC_EXIT_IF_METHOD_FAILS(hr, xml.GetAttribute( NULL, s_ATTR_ACE_AceFlags , lValue, fFound )); if(fFound) m_dwAceFlags = lValue; __MPC_EXIT_IF_METHOD_FAILS(hr, xml.GetAttribute( NULL, s_ATTR_ACE_AceType , lValue, fFound )); if(fFound) m_dwAceType = lValue; __MPC_EXIT_IF_METHOD_FAILS(hr, xml.GetAttribute( NULL, s_ATTR_ACE_Flags , lValue, fFound )); if(fFound) m_dwFlags = lValue; // // Read values. // __MPC_EXIT_IF_METHOD_FAILS(hr, xml.GetValue( s_TAG_Trustee , bstrValue, fFound )); if(fFound) m_bstrTrustee .Attach( bstrValue.Detach() ); __MPC_EXIT_IF_METHOD_FAILS(hr, xml.GetValue( s_TAG_ObjectType , bstrValue, fFound )); if(fFound) m_bstrObjectType .Attach( bstrValue.Detach() ); __MPC_EXIT_IF_METHOD_FAILS(hr, xml.GetValue( s_TAG_InheritedObjectType, bstrValue, fFound )); if(fFound) m_bstrInheritedObjectType.Attach( bstrValue.Detach() ); if(m_bstrTrustee.Length()) { __MPC_EXIT_IF_METHOD_FAILS(hr, CPCHSecurityDescriptorDirect::VerifyPrincipal( m_bstrTrustee )); } hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } STDMETHODIMP CPCHAccessControlEntry::LoadXML( /*[in]*/ IXMLDOMNode* xdnNode ) { __HCP_FUNC_ENTRY( "CPCHAccessControlEntry::LoadXML" ); HRESULT hr; MPC::XmlUtil xml( xdnNode ); __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_NOTNULL(xdnNode); __MPC_PARAMCHECK_END(); __MPC_EXIT_IF_METHOD_FAILS(hr, LoadPost( xml )); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } STDMETHODIMP CPCHAccessControlEntry::LoadXMLAsString( /*[in]*/ BSTR bstrVal ) { __HCP_FUNC_ENTRY( "CPCHAccessControlEntry::LoadXMLAsString" ); HRESULT hr; MPC::XmlUtil xml; bool fLoaded; bool fFound; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_STRING_NOT_EMPTY(bstrVal); __MPC_PARAMCHECK_END(); __MPC_EXIT_IF_METHOD_FAILS(hr, xml.LoadAsString( bstrVal, s_TAG_ACE, fLoaded, &fFound )); if(fLoaded == false || fFound == false) { __MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_BAD_FORMAT); } __MPC_EXIT_IF_METHOD_FAILS(hr, LoadPost( xml )); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } STDMETHODIMP CPCHAccessControlEntry::LoadXMLAsStream( /*[in]*/ IUnknown* pStream ) { __HCP_FUNC_ENTRY( "CPCHAccessControlEntry::LoadXMLAsStream" ); HRESULT hr; MPC::XmlUtil xml; bool fLoaded; bool fFound; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_NOTNULL(pStream); __MPC_PARAMCHECK_END(); __MPC_EXIT_IF_METHOD_FAILS(hr, xml.LoadAsStream( pStream, s_TAG_ACE, fLoaded, &fFound )); if(fLoaded == false || fFound == false) { __MPC_SET_WIN32_ERROR_AND_EXIT(hr, ERROR_BAD_FORMAT); } __MPC_EXIT_IF_METHOD_FAILS(hr, LoadPost( xml )); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } //////////////////////////////////////////////////////////////////////////////// HRESULT CPCHAccessControlEntry::SavePre( /*[in]*/ MPC::XmlUtil& xml ) { __HCP_FUNC_ENTRY( "CPCHAccessControlEntry::SavePre" ); HRESULT hr; MPC::SmartLock<_ThreadModel> lock( this ); CComPtr xdnNode; bool fFound; __MPC_EXIT_IF_METHOD_FAILS(hr, xml.CreateNode( s_TAG_ACE, &xdnNode )); // // Write attributes. // __MPC_EXIT_IF_METHOD_FAILS(hr, xml.PutAttribute( NULL, s_ATTR_ACE_AccessMask, m_dwAccessMask, fFound, xdnNode )); __MPC_EXIT_IF_METHOD_FAILS(hr, xml.PutAttribute( NULL, s_ATTR_ACE_AceFlags , m_dwAceFlags , fFound, xdnNode )); __MPC_EXIT_IF_METHOD_FAILS(hr, xml.PutAttribute( NULL, s_ATTR_ACE_AceType , m_dwAceType , fFound, xdnNode )); __MPC_EXIT_IF_METHOD_FAILS(hr, xml.PutAttribute( NULL, s_ATTR_ACE_Flags , m_dwFlags , fFound, xdnNode )); // // Write values. // if(m_bstrTrustee ) __MPC_EXIT_IF_METHOD_FAILS(hr, xml.PutValue( s_TAG_Trustee , m_bstrTrustee , fFound, xdnNode )); if(m_bstrObjectType ) __MPC_EXIT_IF_METHOD_FAILS(hr, xml.PutValue( s_TAG_ObjectType , m_bstrObjectType , fFound, xdnNode )); if(m_bstrInheritedObjectType) __MPC_EXIT_IF_METHOD_FAILS(hr, xml.PutValue( s_TAG_InheritedObjectType, m_bstrInheritedObjectType, fFound, xdnNode )); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } STDMETHODIMP CPCHAccessControlEntry::SaveXML( /*[in ]*/ IXMLDOMNode* xdnRoot , /*[out, retval]*/ IXMLDOMNode* *pxdnNode ) { __HCP_FUNC_ENTRY( "CPCHAccessControlEntry::SaveXML" ); HRESULT hr; MPC::XmlUtil xml( xdnRoot ); __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_NOTNULL(xdnRoot); __MPC_PARAMCHECK_POINTER_AND_SET(pxdnNode,NULL); __MPC_PARAMCHECK_END(); __MPC_EXIT_IF_METHOD_FAILS(hr, SavePre( xml )); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } STDMETHODIMP CPCHAccessControlEntry::SaveXMLAsString( /*[out, retval]*/ BSTR *bstrVal ) { __HCP_FUNC_ENTRY( "CPCHAccessControlEntry::SaveXMLAsString" ); HRESULT hr; MPC::XmlUtil xml; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_POINTER_AND_SET(bstrVal,NULL); __MPC_PARAMCHECK_END(); __MPC_EXIT_IF_METHOD_FAILS(hr, SavePre( xml )); __MPC_EXIT_IF_METHOD_FAILS(hr, xml.SaveAsString( bstrVal )); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); } STDMETHODIMP CPCHAccessControlEntry::SaveXMLAsStream( /*[out, retval]*/ IUnknown* *pStream ) { __HCP_FUNC_ENTRY( "CPCHAccessControlEntry::SaveXMLAsStream" ); HRESULT hr; MPC::XmlUtil xml; __MPC_PARAMCHECK_BEGIN(hr) __MPC_PARAMCHECK_POINTER_AND_SET(pStream,NULL); __MPC_PARAMCHECK_END(); __MPC_EXIT_IF_METHOD_FAILS(hr, SavePre( xml )); __MPC_EXIT_IF_METHOD_FAILS(hr, xml.SaveAsStream( pStream )); hr = S_OK; __HCP_FUNC_CLEANUP; __HCP_FUNC_EXIT(hr); }