Преглед на файлове

Bug 1989: Allowed uploading edited files over encrypted session

https://winscp.net/tracker/1989
(cherry picked from commit a23b4caa8035c13994a29cb5b7b5755cd323e8d7)

Source commit: 74edd9f2783e47bda716c83ab43e86aa21564d9a
Martin Prikryl преди 3 години
родител
ревизия
d278c9ad18
променени са 4 файла, в които са добавени 40 реда и са изтрити 27 реда
  1. 29 22
      source/forms/CustomScpExplorer.cpp
  2. 2 2
      source/forms/CustomScpExplorer.h
  3. 8 2
      source/windows/EditorManager.cpp
  4. 1 1
      source/windows/EditorManager.h

+ 29 - 22
source/forms/CustomScpExplorer.cpp

@@ -3223,20 +3223,12 @@ void __fastcall TCustomScpExplorerForm::CustomExecuteFile(TOperationSide Side,
       TForm * Editor;
       try
       {
-        TNotifyEvent OnFileChanged = NULL;
-        TNotifyEvent OnSaveAll = NULL;
-        TAnyModifiedEvent OnAnyModified = NULL;
-        // Edited files are uploaded in background queue, what we do not support with encrypted files
-        if (Terminal->IsCapable[fcBackgroundTransfers])
-        {
-          OnFileChanged = FEditorManager->FileChanged;
-          OnSaveAll = SaveAllInternalEditors;
-          OnAnyModified = AnyInternalEditorModified;
-        }
-        Editor = ShowEditorForm(FileName, this, OnFileChanged,
-          FEditorManager->FileReload, FEditorManager->FileClosed,
-          OnSaveAll, OnAnyModified,
-          Caption, StandaloneOperation, SessionColor, Terminal->SessionData->InternalEditorEncoding, NewFile);
+        Editor =
+          ShowEditorForm(
+            FileName, this,
+            FEditorManager->FileChanged, FEditorManager->FileReload, FEditorManager->FileClosed,
+            SaveAllInternalEditors, AnyInternalEditorModified,
+            Caption, StandaloneOperation, SessionColor, Terminal->SessionData->InternalEditorEncoding, NewFile);
       }
       catch(...)
       {
@@ -3709,8 +3701,8 @@ void __fastcall TCustomScpExplorerForm::TemporaryFileCopyParam(TCopyParamType &
   CopyParam.FileMask = L"";
 }
 //---------------------------------------------------------------------------
-void __fastcall TCustomScpExplorerForm::ExecutedFileChanged(const UnicodeString FileName,
-  TEditedFileData * Data, HANDLE UploadCompleteEvent)
+void __fastcall TCustomScpExplorerForm::ExecutedFileChanged(
+  const UnicodeString & FileName, TEditedFileData * Data, HANDLE UploadCompleteEvent, bool & Retry)
 {
   TTerminalManager * Manager = TTerminalManager::Instance();
   if (!IsActiveTerminal(Data->Terminal))
@@ -3794,13 +3786,28 @@ void __fastcall TCustomScpExplorerForm::ExecutedFileChanged(const UnicodeString
       CopyParam.FileMask = DelimitFileNameMask(Data->OriginalFileName);
     }
 
-    DebugAssert(Data->Queue != NULL);
-
     int Params = cpNoConfirmation | cpTemporary;
-    TQueueItem * QueueItem = new TUploadQueueItem(Data->Terminal, FileList,
-      Data->RemoteDirectory, &CopyParam, Params, true, false);
-    QueueItem->CompleteEvent = UploadCompleteEvent;
-    AddQueueItem(Data->Queue, QueueItem, Data->Terminal);
+    if (Terminal->IsCapable[fcBackgroundTransfers])
+    {
+      DebugAssert(Data->Queue != NULL);
+
+      TQueueItem * QueueItem = new TUploadQueueItem(Data->Terminal, FileList,
+        Data->RemoteDirectory, &CopyParam, Params, true, false);
+      QueueItem->CompleteEvent = UploadCompleteEvent;
+      AddQueueItem(Data->Queue, QueueItem, Data->Terminal);
+    }
+    else
+    {
+      if (NonVisualDataModule->Busy)
+      {
+        Retry = true;
+      }
+      else
+      {
+        Terminal->CopyToRemote(FileList, Data->RemoteDirectory, &CopyParam, Params, NULL);
+        SetEvent(UploadCompleteEvent);
+      }
+    }
   }
   __finally
   {

+ 2 - 2
source/forms/CustomScpExplorer.h

@@ -443,8 +443,8 @@ protected:
   void __fastcall DestroyProgressForm();
   virtual void __fastcall FileOperationProgress(TFileOperationProgressType & ProgressData);
   void __fastcall OperationComplete(const TDateTime & StartTime);
-  void __fastcall ExecutedFileChanged(const UnicodeString FileName,
-    TEditedFileData * Data, HANDLE UploadCompleteEvent);
+  void __fastcall ExecutedFileChanged(
+    const UnicodeString & FileName, TEditedFileData * Data, HANDLE UploadCompleteEvent, bool & Retry);
   void __fastcall ExecutedFileReload(const UnicodeString FileName,
     const TEditedFileData * Data);
   void __fastcall ExecutedFileEarlyClosed(const TEditedFileData * Data,

+ 8 - 2
source/windows/EditorManager.cpp

@@ -527,6 +527,7 @@ void __fastcall TEditorManager::CheckFileChange(int Index, bool Force)
         FileData->UploadCompleteEvent = CreateEvent(NULL, false, false, NULL);
         FUploadCompleteEvents.push_back(FileData->UploadCompleteEvent);
 
+        TDateTime PrevTimestamp = FileData->Timestamp;
         FileData->Timestamp = NewTimestamp;
         FileData->Saves++;
         if (FileData->Saves == 1)
@@ -538,8 +539,13 @@ void __fastcall TEditorManager::CheckFileChange(int Index, bool Force)
         try
         {
           DebugAssert(OnFileChange != NULL);
-          OnFileChange(FileData->FileName, FileData->Data,
-            FileData->UploadCompleteEvent);
+          bool Retry = false;
+          OnFileChange(FileData->FileName, FileData->Data, FileData->UploadCompleteEvent, Retry);
+          if (Retry)
+          {
+            UploadComplete(Index);
+            FileData->Timestamp = PrevTimestamp;
+          }
         }
         catch(...)
         {

+ 1 - 1
source/windows/EditorManager.h

@@ -24,7 +24,7 @@ struct TEditedFileData
 };
 //---------------------------------------------------------------------------
 typedef void __fastcall (__closure * TEditedFileChangedEvent)
-  (const UnicodeString FileName, TEditedFileData * Data, HANDLE CompleteEvent);
+  (const UnicodeString & FileName, TEditedFileData * Data, HANDLE CompleteEvent, bool & Retry);
 typedef void __fastcall (__closure * TEditedFileReloadEvent)
   (const UnicodeString FileName, const TEditedFileData * Data);
 typedef void __fastcall (__closure * TEditedFileEarlyClosedEvent)