فهرست منبع

Bug 1929: Preserve file permissions when overwritten files are recycled and transfer resume is disabled

https://winscp.net/tracker/1929

Source commit: 77270baeca4917879b09e52d36d068f7984d090e
Martin Prikryl 4 سال پیش
والد
کامیت
988d011a7b
1فایلهای تغییر یافته به همراه17 افزوده شده و 2 حذف شده
  1. 17 2
      source/core/SftpFileSystem.cpp

+ 17 - 2
source/core/SftpFileSystem.cpp

@@ -1866,6 +1866,8 @@ struct TOpenRemoteFileParams
   TOverwriteFileParams * FileParams;
   TOverwriteFileParams * FileParams;
   bool Confirmed;
   bool Confirmed;
   bool DontRecycle;
   bool DontRecycle;
+  bool Recycled;
+  TRights RecycledRights;
 };
 };
 //===========================================================================
 //===========================================================================
 __fastcall TSFTPFileSystem::TSFTPFileSystem(TTerminal * ATerminal,
 __fastcall TSFTPFileSystem::TSFTPFileSystem(TTerminal * ATerminal,
@@ -4633,6 +4635,7 @@ void __fastcall TSFTPFileSystem::Source(
   OpenParams.FileParams = &FileParams;
   OpenParams.FileParams = &FileParams;
   OpenParams.Confirmed = (CopyParam->OnTransferIn != NULL);
   OpenParams.Confirmed = (CopyParam->OnTransferIn != NULL);
   OpenParams.DontRecycle = false;
   OpenParams.DontRecycle = false;
+  OpenParams.Recycled = false;
 
 
   FTerminal->LogEvent(0, L"Opening remote file.");
   FTerminal->LogEvent(0, L"Opening remote file.");
   FTerminal->FileOperationLoop(SFTPOpenRemote, OperationProgress, folAllowSkip,
   FTerminal->FileOperationLoop(SFTPOpenRemote, OperationProgress, folAllowSkip,
@@ -4656,7 +4659,7 @@ void __fastcall TSFTPFileSystem::Source(
   __int64 DestWriteOffset = 0;
   __int64 DestWriteOffset = 0;
   TSFTPPacket CloseRequest;
   TSFTPPacket CloseRequest;
   bool PreserveRights = CopyParam->PreserveRights && (CopyParam->OnTransferIn == NULL);
   bool PreserveRights = CopyParam->PreserveRights && (CopyParam->OnTransferIn == NULL);
-  bool PreserveExistingRights = DoResume && DestFileExists;
+  bool PreserveExistingRights = (DoResume && DestFileExists) || OpenParams.Recycled;
   bool SetRights = (PreserveExistingRights || PreserveRights);
   bool SetRights = (PreserveExistingRights || PreserveRights);
   bool PreserveTime = CopyParam->PreserveTime && (CopyParam->OnTransferIn == NULL);
   bool PreserveTime = CopyParam->PreserveTime && (CopyParam->OnTransferIn == NULL);
   bool SetProperties = (PreserveTime || SetRights);
   bool SetProperties = (PreserveTime || SetRights);
@@ -4672,7 +4675,14 @@ void __fastcall TSFTPFileSystem::Source(
     }
     }
     else if (PreserveExistingRights)
     else if (PreserveExistingRights)
     {
     {
-      Rights = DestRights;
+      if (DestFileExists)
+      {
+        Rights = DestRights;
+      }
+      else
+      {
+        Rights = OpenParams.RecycledRights;
+      }
     }
     }
     else
     else
     {
     {
@@ -5100,6 +5110,11 @@ int __fastcall TSFTPFileSystem::SFTPOpenRemote(void * AOpenParams, void * /*Para
               // Allow normal overwrite
               // Allow normal overwrite
               OpenParams->DontRecycle = true;
               OpenParams->DontRecycle = true;
             }
             }
+            else
+            {
+              OpenParams->Recycled = true;
+              OpenParams->RecycledRights = *File->Rights;
+            }
           }
           }
         }
         }
       }
       }