S3FileSystem.h 9.0 KB

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