Parcourir la source

Bug 1395: When FTP server does not provide precise timestamp, but the timestamp otherwise matches timestamp of the last uploaded version of the file, using precise timestamp of the uploaded version instead

https://winscp.net/tracker/1395

Source commit: 826551d8f310d264718d925ee305247982ebaebb
Martin Prikryl il y a 9 ans
Parent
commit
68dae07d6e
2 fichiers modifiés avec 28 ajouts et 0 suppressions
  1. 26 0
      source/core/FtpFileSystem.cpp
  2. 2 0
      source/core/FtpFileSystem.h

+ 26 - 0
source/core/FtpFileSystem.cpp

@@ -1987,6 +1987,11 @@ void __fastcall TFTPFileSystem::Source(const UnicodeString FileName,
          ((FServerCapabilities->GetCapability(mdtm_command) == yes))))
     {
       TTouchSessionAction TouchAction(FTerminal->ActionLog, DestFullName, Modification);
+
+      if (!FFileZillaIntf->UsingMlsd())
+      {
+        FUploadedTimes[DestFullName] = Modification;
+      }
     }
 
     FTerminal->LogFileDone(OperationProgress);
@@ -4487,6 +4492,27 @@ bool __fastcall TFTPFileSystem::HandleListData(const wchar_t * Path,
         TDateTime Modification;
         TModificationFmt ModificationFmt;
         RemoteFileTimeToDateTimeAndPrecision(Entry->Time, Modification, ModificationFmt);
+
+        if (ModificationFmt != mfFull)
+        {
+          UnicodeString FullPath = UnixIncludeTrailingBackslash(Path) + File->FileName;
+          TUploadedTimes::iterator Iterator = FUploadedTimes.find(FullPath);
+          if (Iterator != FUploadedTimes.end())
+          {
+            TDateTime UploadModification = Iterator->second;
+            TDateTime UploadModificationReduced = ReduceDateTimePrecision(UploadModification, ModificationFmt);
+            if (UploadModificationReduced == Modification)
+            {
+              Modification = UploadModification;
+              ModificationFmt = mfFull;
+            }
+            else
+            {
+              FUploadedTimes.erase(Iterator);
+            }
+          }
+        }
+
         File->Modification = Modification;
         File->ModificationFmt = ModificationFmt;
         File->LastAccess = File->Modification;

+ 2 - 0
source/core/FtpFileSystem.h

@@ -268,6 +268,8 @@ private:
   std::unique_ptr<TStrings> FSupportedCommands;
   std::unique_ptr<TStrings> FSupportedSiteCommands;
   std::unique_ptr<TStrings> FHashAlgs;
+  typedef std::map<UnicodeString, TDateTime> TUploadedTimes;
+  TUploadedTimes FUploadedTimes;
   bool FSupportsAnyChecksumFeature;
   UnicodeString FLastCommandSent;
   X509 * FCertificate;