S3FileSystem.h 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. //------------------------------------------------------------------------------
  2. #ifndef S3FileSystemH
  3. #define S3FileSystemH
  4. //------------------------------------------------------------------------------
  5. #include <FileSystems.h>
  6. //------------------------------------------------------------------------------
  7. struct TNeonCertificateData;
  8. struct TLibS3CallbackData;
  9. struct ssl_st;
  10. #ifdef NEED_LIBS3
  11. // resolve clash
  12. #define S3Protocol _S3Protocol
  13. #include "libs3.h"
  14. #undef S3Protocol
  15. #else
  16. struct ne_session_s;
  17. struct ne_ssl_certificate_s;
  18. struct S3ResponseProperties;
  19. struct S3RequestContext;
  20. struct S3ErrorDetails;
  21. struct S3ListBucketContent;
  22. enum S3Status { };
  23. enum _S3Protocol { };
  24. #endif
  25. //------------------------------------------------------------------------------
  26. class TS3FileSystem : public TCustomFileSystem
  27. {
  28. public:
  29. explicit TS3FileSystem(TTerminal * ATerminal);
  30. virtual __fastcall ~TS3FileSystem();
  31. virtual void __fastcall Open();
  32. virtual void __fastcall Close();
  33. virtual bool __fastcall GetActive();
  34. virtual void __fastcall CollectUsage();
  35. virtual void __fastcall Idle();
  36. virtual UnicodeString __fastcall AbsolutePath(UnicodeString Path, bool Local);
  37. virtual void __fastcall AnyCommand(const UnicodeString Command,
  38. TCaptureOutputEvent OutputEvent);
  39. virtual void __fastcall ChangeDirectory(const UnicodeString Directory);
  40. virtual void __fastcall CachedChangeDirectory(const UnicodeString Directory);
  41. virtual void __fastcall AnnounceFileListOperation();
  42. virtual void __fastcall ChangeFileProperties(const UnicodeString FileName,
  43. const TRemoteFile * File, const TRemoteProperties * Properties,
  44. TChmodSessionAction & Action);
  45. virtual bool __fastcall LoadFilesProperties(TStrings * FileList);
  46. virtual void __fastcall CalculateFilesChecksum(const UnicodeString & Alg,
  47. TStrings * FileList, TStrings * Checksums,
  48. TCalculatedChecksumEvent OnCalculatedChecksum);
  49. virtual void __fastcall CopyToLocal(TStrings * FilesToCopy,
  50. const UnicodeString TargetDir, const TCopyParamType * CopyParam,
  51. int Params, TFileOperationProgressType * OperationProgress,
  52. TOnceDoneOperation & OnceDoneOperation);
  53. virtual void __fastcall CopyToRemote(TStrings * FilesToCopy,
  54. const UnicodeString TargetDir, const TCopyParamType * CopyParam,
  55. int Params, TFileOperationProgressType * OperationProgress,
  56. TOnceDoneOperation & OnceDoneOperation);
  57. virtual void __fastcall CreateDirectory(const UnicodeString DirName);
  58. virtual void __fastcall CreateLink(const UnicodeString FileName, const UnicodeString PointTo, bool Symbolic);
  59. virtual void __fastcall DeleteFile(const UnicodeString FileName,
  60. const TRemoteFile * File, int Params,
  61. TRmSessionAction & Action);
  62. virtual void __fastcall CustomCommandOnFile(const UnicodeString FileName,
  63. const TRemoteFile * File, UnicodeString Command, int Params, TCaptureOutputEvent OutputEvent);
  64. virtual void __fastcall DoStartup();
  65. virtual void __fastcall HomeDirectory();
  66. virtual bool __fastcall IsCapable(int Capability) const;
  67. virtual void __fastcall LookupUsersGroups();
  68. virtual void __fastcall ReadCurrentDirectory();
  69. virtual void __fastcall ReadDirectory(TRemoteFileList * FileList);
  70. virtual void __fastcall ReadFile(const UnicodeString FileName,
  71. TRemoteFile *& File);
  72. virtual void __fastcall ReadSymlink(TRemoteFile * SymLinkFile,
  73. TRemoteFile *& File);
  74. virtual void __fastcall RenameFile(const UnicodeString FileName,
  75. const UnicodeString NewName);
  76. virtual void __fastcall CopyFile(const UnicodeString FileName,
  77. const UnicodeString NewName);
  78. virtual TStrings * __fastcall GetFixedPaths();
  79. virtual void __fastcall SpaceAvailable(const UnicodeString Path,
  80. TSpaceAvailable & ASpaceAvailable);
  81. virtual const TSessionInfo & __fastcall GetSessionInfo();
  82. virtual const TFileSystemInfo & __fastcall GetFileSystemInfo(bool Retrieve);
  83. virtual bool __fastcall TemporaryTransferFile(const UnicodeString & FileName);
  84. virtual bool __fastcall GetStoredCredentialsTried();
  85. virtual UnicodeString __fastcall GetUserName();
  86. virtual void __fastcall GetSupportedChecksumAlgs(TStrings * Algs);
  87. virtual void __fastcall LockFile(const UnicodeString & FileName, const TRemoteFile * File);
  88. virtual void __fastcall UnlockFile(const UnicodeString & FileName, const TRemoteFile * File);
  89. virtual void __fastcall UpdateFromMain(TCustomFileSystem * MainFileSystem);
  90. virtual void __fastcall ClearCaches();
  91. protected:
  92. bool FActive;
  93. TFileSystemInfo FFileSystemInfo;
  94. UnicodeString FCurrentDirectory;
  95. UnicodeString FCachedDirectoryChange;
  96. TSessionInfo FSessionInfo;
  97. UTF8String FAccessKeyId;
  98. UTF8String FSecretAccessKey;
  99. UTF8String FHostName;
  100. int FTimeout;
  101. S3RequestContext * FRequestContext;
  102. _S3Protocol FLibS3Protocol;
  103. ne_session_s * FNeonSession;
  104. UnicodeString FTlsVersionStr;
  105. UnicodeString FResponse;
  106. typedef std::map<UnicodeString, UnicodeString> TRegions;
  107. TRegions FRegions;
  108. TRegions FHostNames;
  109. virtual UnicodeString __fastcall GetCurrentDirectory();
  110. void LibS3Deinitialize();
  111. bool VerifyCertificate(TNeonCertificateData Data);
  112. void CollectTLSSessionInfo();
  113. void CheckLibS3Error(const TLibS3CallbackData & Data);
  114. void InitSslSession(ssl_st * Ssl, ne_session_s * Session);
  115. void RequestInit();
  116. void TryOpenDirectory(const UnicodeString & Directory);
  117. void ReadDirectoryInternal(const UnicodeString & Path, TRemoteFileList * FileList, int MaxKeys, const UnicodeString & FileName);
  118. void ParsePath(UnicodeString Path, UnicodeString & BucketName, UnicodeString & Prefix);
  119. UnicodeString GetBucketRegion(const UnicodeString & BucketName);
  120. UnicodeString GetBucketHostName(const UnicodeString & BucketName);
  121. bool RetryBucket(const TLibS3CallbackData & Data, const UnicodeString & BucketName);
  122. TRemoteToken MakeRemoteToken(const char * OwnerId, const char * OwnerDisplayName);
  123. static TS3FileSystem * GetFileSystem(void * CallbackData);
  124. static void LibS3SessionCallback(ne_session_s * Session, void * CallbackData);
  125. static S3Status LibS3ResponsePropertiesCallback(const S3ResponseProperties * Properties, void * CallbackData);
  126. static void LibS3ResponseCompleteCallback(S3Status Status, const S3ErrorDetails * Error, void * CallbackData);
  127. static int LibS3SslCallback(int Failures, const ne_ssl_certificate_s * Certificate, void * CallbackData);
  128. static void LibS3ResponseDataCallback(const char * Data, size_t Size, void * CallbackData);
  129. static S3Status LibS3ListServiceCallback(
  130. const char * OwnerId, const char * OwnerDisplayName, const char * BucketName,
  131. int64_t CreationDate, void * CallbackData);
  132. static S3Status LibS3ListBucketCallback(
  133. int IsTruncated, const char * NextMarker, int ContentsCount, const S3ListBucketContent * Contents,
  134. int CommonPrefixesCount, const char ** CommonPrefixes, void * CallbackData);
  135. };
  136. //------------------------------------------------------------------------------
  137. UnicodeString __fastcall S3LibVersion();
  138. UnicodeString __fastcall S3LibDefaultHostName();
  139. //------------------------------------------------------------------------------
  140. #endif