浏览代码

Bug 1403: Do not list remote directory when uploading file using FTP protocol with overwrite confirmations off

https://winscp.net/tracker/1403

Source commit: 7936345a4e6c4f89afe8f2d9814ba292d71b93a5
Martin Prikryl 9 年之前
父节点
当前提交
61320ef766

+ 16 - 0
source/core/FtpFileSystem.cpp

@@ -1715,6 +1715,7 @@ void __fastcall TFTPFileSystem::Sink(const UnicodeString FileName,
       FFileTransferPreserveTime = CopyParam->PreserveTime;
       // not used for downloads anyway
       FFileTransferRemoveBOM = CopyParam->RemoveBOM;
+      FFileTransferNoList = CanTransferSkipList(Params, Flags);
       UserData.FileName = DestFileName;
       UserData.Params = Params;
       UserData.AutoResume = FLAGSET(Flags, tfAutoResume);
@@ -1882,6 +1883,16 @@ void __fastcall TFTPFileSystem::SourceRobust(const UnicodeString FileName,
   while (RobustLoop.Retry());
 }
 //---------------------------------------------------------------------------
+bool __fastcall TFTPFileSystem::CanTransferSkipList(int Params, unsigned int Flags)
+{
+  return
+    FLAGSET(Params, cpNoConfirmation) &&
+    // cpAppend is not supported with FTP
+    DebugAlwaysTrue(FLAGCLEAR(Params, cpAppend)) &&
+    FLAGCLEAR(Params, cpResume) &&
+    FLAGCLEAR(Flags, tfAutoResume);
+}
+//---------------------------------------------------------------------------
 void __fastcall TFTPFileSystem::Source(const UnicodeString FileName,
   const UnicodeString TargetDir, const TCopyParamType * CopyParam, int Params,
   TFileOperationProgressType * OperationProgress, unsigned int Flags,
@@ -1965,6 +1976,7 @@ void __fastcall TFTPFileSystem::Source(const UnicodeString FileName,
       // not used for uploads anyway
       FFileTransferPreserveTime = CopyParam->PreserveTime;
       FFileTransferRemoveBOM = CopyParam->RemoveBOM;
+      FFileTransferNoList = CanTransferSkipList(Params, Flags);
       // not used for uploads, but we get new name (if any) back in this field
       UserData.FileName = DestFileName;
       UserData.Params = Params;
@@ -3110,6 +3122,10 @@ int __fastcall TFTPFileSystem::GetOptionVal(int OptionID) const
       Result = Data->TcpNoDelay;
       break;
 
+    case OPTION_MPEXT_NOLIST:
+      Result = FFileTransferNoList ? TRUE : FALSE;
+      break;
+
     default:
       DebugFail();
       Result = FALSE;

+ 2 - 0
source/core/FtpFileSystem.h

@@ -201,6 +201,7 @@ protected:
   bool __fastcall SupportsCommand(const UnicodeString & Command) const;
   void __fastcall RegisterChecksumAlgCommand(const UnicodeString & Alg, const UnicodeString & Command);
   void __fastcall SendCommand(const UnicodeString & Command);
+  bool __fastcall CanTransferSkipList(int Params, unsigned int Flags);
 
   static bool __fastcall Unquote(UnicodeString & Str);
 
@@ -253,6 +254,7 @@ private:
   __int64 FFileTransferResumed;
   bool FFileTransferPreserveTime;
   bool FFileTransferRemoveBOM;
+  bool FFileTransferNoList;
   unsigned long FFileTransferCPSLimit;
   bool FAwaitingProgress;
   TCaptureOutputEvent FOnCaptureOutput;

+ 1 - 0
source/filezilla/FileZillaOpt.h

@@ -51,5 +51,6 @@
 #define OPTION_MPEXT_LOG_SENSITIVE 1008
 #define OPTION_MPEXT_HOST 1009
 #define OPTION_MPEXT_NODELAY 1010
+#define OPTION_MPEXT_NOLIST 1011
 //---------------------------------------------------------------------------
 #endif // FileZillaOptH

+ 18 - 4
source/filezilla/FtpControlSocket.cpp

@@ -2831,7 +2831,7 @@ void CFtpControlSocket::FileTransfer(t_transferfile *transferfile/*=0*/,BOOL bFi
           {
             delete m_pDirectoryListing;
             m_pDirectoryListing=0;
-            m_Operation.nOpState = NeedModeCommand() ? FILETRANSFER_LIST_MODE : (NeedOptsCommand() ? FILETRANSFER_LIST_OPTS : FILETRANSFER_LIST_TYPE);
+            m_Operation.nOpState = FileTransferListState(transferfile->get);
             break;
           }
         }
@@ -2860,7 +2860,7 @@ void CFtpControlSocket::FileTransfer(t_transferfile *transferfile/*=0*/,BOOL bFi
       }
       else
       {
-        m_Operation.nOpState = NeedModeCommand() ? FILETRANSFER_LIST_MODE : (NeedOptsCommand() ? FILETRANSFER_LIST_OPTS : FILETRANSFER_LIST_TYPE);
+        m_Operation.nOpState = FileTransferListState(transferfile->get);
       }
     }
     else
@@ -2905,7 +2905,7 @@ void CFtpControlSocket::FileTransfer(t_transferfile *transferfile/*=0*/,BOOL bFi
 
       if (m_pOwner->GetCurrentPath() == pData->transferfile.remotepath)
       {
-        m_Operation.nOpState = NeedModeCommand() ? FILETRANSFER_LIST_MODE : (NeedOptsCommand() ? FILETRANSFER_LIST_OPTS : FILETRANSFER_LIST_TYPE);
+        m_Operation.nOpState = FileTransferListState(pData->transferfile.get);
       }
       else
         m_Operation.nOpState = LIST_CWD;
@@ -3089,7 +3089,7 @@ void CFtpControlSocket::FileTransfer(t_transferfile *transferfile/*=0*/,BOOL bFi
         }
         else
         {
-          m_Operation.nOpState = NeedModeCommand() ? FILETRANSFER_LIST_MODE : (NeedOptsCommand() ? FILETRANSFER_LIST_OPTS : FILETRANSFER_LIST_TYPE);
+          m_Operation.nOpState = FileTransferListState(pData->transferfile.get);
         }
       }
       break;
@@ -6099,6 +6099,20 @@ void CFtpControlSocket::DiscardLine(CStringA line)
   }
 }
 
+int CFtpControlSocket::FileTransferListState(bool get)
+{
+  int Result;
+  if (GetOptionVal(OPTION_MPEXT_NOLIST) && !get)
+  {
+    Result = FILETRANSFER_TYPE;
+  }
+  else
+  {
+    Result = NeedModeCommand() ? FILETRANSFER_LIST_MODE : (NeedOptsCommand() ? FILETRANSFER_LIST_OPTS : FILETRANSFER_LIST_TYPE);
+  }
+  return Result;
+}
+
 bool CFtpControlSocket::NeedModeCommand()
 {
 #ifdef MPEXT_NO_ZLIB

+ 1 - 0
source/filezilla/FtpControlSocket.h

@@ -128,6 +128,7 @@ protected:
   BOOL SendAuthSsl();
 
   void DiscardLine(CStringA line);
+  int FileTransferListState(bool get);
   bool NeedModeCommand();
   bool NeedOptsCommand();
   CString GetListingCmd();