int CLuaXMLDefs::xmlCopyFile ( lua_State* luaVM ) { #ifndef MTA_CLIENT if ( lua_type ( luaVM, 3 ) == LUA_TLIGHTUSERDATA ) m_pScriptDebugging->LogCustom ( luaVM, "xmlCopyFile may be using an outdated syntax. Please check and update." ); #endif // !MTA_CLIENT // Grab our resource CLuaMain* pLUA = m_pLuaManager->GetVirtualMachine ( luaVM ); if ( pLUA ) { SString strFile; CXMLNode* pSourceNode; CScriptArgReader argStream ( luaVM ); argStream.ReadUserData ( pSourceNode ); argStream.ReadString ( strFile ); if ( !argStream.HasErrors () ) { SString strPath; CResource* pThisResource = pLUA->GetResource (); CResource* pOtherResource = pThisResource; // Resolve other resource from name if ( CResourceManager::ParseResourcePathInput ( strFile, pOtherResource, &strPath, NULL ) ) { #ifndef MTA_CLIENT // We have access to modify other resource? if ( pOtherResource == pThisResource || m_pACLManager->CanObjectUseRight ( pThisResource->GetName ().c_str (), CAccessControlListGroupObject::OBJECT_TYPE_RESOURCE, "ModifyOtherObjects", CAccessControlListRight::RIGHT_TYPE_GENERAL, false ) ) #endif // !MTA_CLIENT { if ( pSourceNode ) { // Make sure the dir exists so we can successfully make the file MakeSureDirExists ( strPath ); // Grab the roots tag name std::string strRootTagName; strRootTagName = pSourceNode->GetTagName (); // Create the new XML file and its root node CXMLFile* pNewXML = pLUA->CreateXML ( strPath.c_str () ); if ( pNewXML ) { // Grab the root of the new XML CXMLNode* pNewRoot = pNewXML->CreateRootNode ( strRootTagName ); if ( pNewRoot ) { // Copy over the attributes from the root int iAttributeCount = pSourceNode->GetAttributes ().Count (); int i = 0; CXMLAttribute* pAttribute; for ( ; i < iAttributeCount; i++ ) { pAttribute = pSourceNode->GetAttributes ().Get ( i ); if ( pAttribute ) pNewRoot->GetAttributes ().Create ( *pAttribute ); } // Copy the stuff from the given source node to the destination root if ( pSourceNode->CopyChildrenInto ( pNewRoot, true ) ) { lua_pushxmlnode ( luaVM, pNewRoot ); return 1; } } // Delete the XML again pLUA->DestroyXML ( pNewXML ); } } else argStream.SetCustomError ( SString ( "Unable to copy XML file %s", strFile.c_str () ), "Bad filepath" ); } #ifndef MTA_CLIENT else argStream.SetCustomError ( SString ( "ModifyOtherObjects in ACL denied resource '%s' to access '%s'", pThisResource->GetName ().c_str (), pOtherResource->GetName ().c_str () ), "Access denied" ); #endif } } if ( argStream.HasErrors () ) m_pScriptDebugging->LogCustom ( luaVM, argStream.GetFullErrorMessage () ); } // Error lua_pushboolean ( luaVM, false ); return 1; }
int CLuaFunctionDefs::XMLCopyFile ( lua_State* luaVM ) { // xmlnode xmlCopyFile ( xmlnode nodeToCopy, string newFilePath ) CXMLNode* pSourceNode; SString newFilePath; CScriptArgReader argStream ( luaVM ); argStream.ReadUserData ( pSourceNode ); argStream.ReadString ( newFilePath ); if ( !argStream.HasErrors () ) { // Grab the virtual machine for this luastate CLuaMain* pLUA = m_pLuaManager->GetVirtualMachine ( luaVM ); if ( pLUA ) { CResource* pResource = pLUA->GetResource(); SString strFilename; if ( CResourceManager::ParseResourcePathInput( newFilePath, pResource, strFilename ) ) { if ( pSourceNode ) { // Grab the roots tag name std::string strRootTagName; strRootTagName = pSourceNode->GetTagName (); // Grab our lua VM CLuaMain* pLUA = m_pLuaManager->GetVirtualMachine ( luaVM ); // Create the new XML file and its root node CXMLFile* pNewXML = pLUA->CreateXML ( strFilename ); if ( pNewXML ) { // Create root for new XML CXMLNode* pNewRoot = pNewXML->CreateRootNode ( strRootTagName ); if ( pNewRoot ) { // Copy over the attributes from the root int iAttributeCount = pSourceNode->GetAttributes ().Count (); int i = 0; CXMLAttribute* pAttribute; for ( ; i < iAttributeCount; i++ ) { pAttribute = pSourceNode->GetAttributes ().Get ( i ); if ( pAttribute ) pNewRoot->GetAttributes ().Create ( *pAttribute ); } // Copy the stuff from the given source node to the destination root if ( pSourceNode->CopyChildrenInto ( pNewRoot, true ) ) { lua_pushxmlnode ( luaVM, pNewRoot ); return 1; } } // Delete the XML again pLUA->DestroyXML ( pNewXML ); } } } else CLogger::ErrorPrintf ( "Unable to copy xml file; bad filepath" ); } } else m_pScriptDebugging->LogCustom ( luaVM, argStream.GetFullErrorMessage() ); // Error lua_pushboolean ( luaVM, false ); return 1; }
bool CXMLNodeImpl::CopyChildrenInto ( CXMLNode* pDestination, bool bRecursive ) { // Delete all the children of the target pDestination->DeleteAllSubNodes (); // Iterate through our children if we have. Otherwize just copy the content if ( m_Children.size () > 0 ) { std::list < CXMLNode* > ::iterator iter = m_Children.begin (); CXMLNode* pMyChildNode; CXMLNode* pNewChildNode; for ( ; iter != m_Children.end (); iter++ ) { // Grab its tag name pMyChildNode = *iter; const std::string& strTagName = pMyChildNode->GetTagName (); // Create at the destination pNewChildNode = pDestination->CreateSubNode ( strTagName.c_str () ); if ( pNewChildNode ) { // Copy our child's attributes into it int iAttributeCount = pMyChildNode->GetAttributes ().Count (); int i = 0; CXMLAttribute* pAttribute; for ( ; i < iAttributeCount; i++ ) { // Create a copy of every attribute into our destination pAttribute = pMyChildNode->GetAttributes ().Get ( i ); if ( pAttribute ) { pNewChildNode->GetAttributes ().Create ( *pAttribute ); } } // Run it recursively if asked to. Copy child child nodes etc.. if ( bRecursive ) { if ( !pMyChildNode->CopyChildrenInto ( pNewChildNode, true ) ) { pDestination->DeleteAllSubNodes (); return false; } } } else { pDestination->DeleteAllSubNodes (); return false; } } } else { const char* szText = m_pNode->GetText (); if ( szText ) pDestination->SetTagContent ( szText ); } // Success return true; }
int CLuaXMLDefs::xmlCopyFile ( lua_State* luaVM ) { if ( lua_type ( luaVM, 3 ) == LUA_TLIGHTUSERDATA ) m_pScriptDebugging->LogCustom ( luaVM, "xmlCopyFile may be using an outdated syntax. Please check and update." ); // Grab our resource CLuaMain* pLUA = m_pLuaManager->GetVirtualMachine ( luaVM ); if ( pLUA ) { CResource* pThisResource = pLUA->GetResource (); CResource* pResource = pThisResource; // Verify the argument types passed if ( lua_type ( luaVM, 1 ) == LUA_TLIGHTUSERDATA && lua_type ( luaVM, 2 ) == LUA_TSTRING ) { // Grab the filename passed std::string strFile = lua_tostring ( luaVM, 2 ); std::string strPath; if ( CResourceManager::ParseResourcePathInput ( strFile, pResource, &strPath, NULL ) ) { // We have access to modify this resource? if ( pResource == pThisResource || m_pACLManager->CanObjectUseRight ( pThisResource->GetName ().c_str (), CAccessControlListGroupObject::OBJECT_TYPE_RESOURCE, "ModifyOtherObjects", CAccessControlListRight::RIGHT_TYPE_GENERAL, false ) ) { // Make sure the dir exists so we can successfully make the file MakeSureDirExists ( strPath.c_str () ); // Grab the source node CXMLNode* pSourceNode = lua_toxmlnode ( luaVM, 1 ); if ( pSourceNode ) { // Grab the roots tag name std::string strRootTagName; strRootTagName = pSourceNode->GetTagName (); // Create the new XML file and its root node CXMLFile* pNewXML = pLUA->CreateXML ( strPath.c_str () ); if ( pNewXML ) { // Grab the root of the new XML CXMLNode* pNewRoot = pNewXML->CreateRootNode ( strRootTagName ); if ( pNewRoot ) { // Copy over the attributes from the root int iAttributeCount = pSourceNode->GetAttributes ().Count (); int i = 0; CXMLAttribute* pAttribute; for ( ; i < iAttributeCount; i++ ) { pAttribute = pSourceNode->GetAttributes ().Get ( i ); if ( pAttribute ) pNewRoot->GetAttributes ().Create ( *pAttribute ); } // Copy the stuff from the given source node to the destination root if ( pSourceNode->CopyChildrenInto ( pNewRoot, true ) ) { lua_pushxmlnode ( luaVM, pNewRoot ); return 1; } } // Delete the XML again pLUA->DestroyXML ( pNewXML ); } } else CLogger::ErrorPrintf ( "Unable to copy xml file; bad filepath" ); } else m_pScriptDebugging->LogError ( luaVM,"xmlCopyFile failed; ModifyOtherObjects in ACL denied resource %s to access %s", pThisResource->GetName ().c_str (), pResource->GetName ().c_str () ); } } else m_pScriptDebugging->LogBadType ( luaVM, "xmlCopyFile" ); } // Error lua_pushboolean ( luaVM, false ); return 1; }