S3FileSystem.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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 TLibS3TransferObjectDataCallbackData;
  13. struct TLibS3PutObjectDataCallbackData;
  14. struct TLibS3GetObjectDataCallbackData;
  15. struct ssl_st;
  16. struct TS3FileProperties;
  17. #ifdef NEED_LIBS3
  18. // resolve clash
  19. #define S3Protocol _S3Protocol
  20. #pragma clang diagnostic push
  21. #pragma clang diagnostic ignored "-Wdocumentation"
  22. #include "libs3.h"
  23. #pragma clang diagnostic pop
  24. #undef S3Protocol
  25. #else
  26. struct ne_session_s;
  27. struct ne_ssl_certificate_s;
  28. struct S3ResponseProperties;
  29. struct S3RequestContext;
  30. struct S3ErrorDetails;
  31. struct S3ListBucketContent;
  32. struct S3ResponseHandler;
  33. struct S3AclGrant;
  34. enum S3Status { };
  35. enum _S3Protocol { };
  36. enum S3Permission { };
  37. #endif
  38. //------------------------------------------------------------------------------
  39. class TS3FileSystem : public TCustomFileSystem
  40. {
  41. public:
  42. explicit TS3FileSystem(TTerminal * ATerminal);
  43. virtual __fastcall ~TS3FileSystem();
  44. virtual void __fastcall Open();
  45. virtual void __fastcall Close();
  46. virtual bool __fastcall GetActive();
  47. virtual void __fastcall CollectUsage();
  48. virtual void __fastcall Idle();
  49. virtual UnicodeString __fastcall AbsolutePath(UnicodeString Path, bool Local);
  50. virtual void __fastcall AnyCommand(const UnicodeString Command,
  51. TCaptureOutputEvent OutputEvent);
  52. virtual void __fastcall ChangeDirectory(const UnicodeString Directory);
  53. virtual void __fastcall CachedChangeDirectory(const UnicodeString Directory);
  54. virtual void __fastcall AnnounceFileListOperation();
  55. virtual void __fastcall ChangeFileProperties(const UnicodeString FileName,
  56. const TRemoteFile * File, const TRemoteProperties * Properties,
  57. TChmodSessionAction & Action);
  58. virtual bool __fastcall LoadFilesProperties(TStrings * FileList);
  59. virtual void __fastcall CalculateFilesChecksum(
  60. const UnicodeString & Alg, TStrings * FileList, TCalculatedChecksumEvent OnCalculatedChecksum,
  61. TFileOperationProgressType * OperationProgress, bool FirstLevel);
  62. virtual void __fastcall CopyToLocal(TStrings * FilesToCopy,
  63. const UnicodeString TargetDir, const TCopyParamType * CopyParam,
  64. int Params, TFileOperationProgressType * OperationProgress,
  65. TOnceDoneOperation & OnceDoneOperation);
  66. virtual void __fastcall CopyToRemote(TStrings * FilesToCopy,
  67. const UnicodeString TargetDir, const TCopyParamType * CopyParam,
  68. int Params, TFileOperationProgressType * OperationProgress,
  69. TOnceDoneOperation & OnceDoneOperation);
  70. virtual void __fastcall Source(
  71. TLocalFileHandle & Handle, const UnicodeString & TargetDir, UnicodeString & DestFileName,
  72. const TCopyParamType * CopyParam, int Params,
  73. TFileOperationProgressType * OperationProgress, unsigned int Flags,
  74. TUploadSessionAction & Action, bool & ChildError);
  75. virtual void __fastcall Sink(
  76. const UnicodeString & FileName, const TRemoteFile * File,
  77. const UnicodeString & TargetDir, UnicodeString & DestFileName, int Attrs,
  78. const TCopyParamType * CopyParam, int Params, TFileOperationProgressType * OperationProgress,
  79. unsigned int Flags, TDownloadSessionAction & Action);
  80. virtual void __fastcall CreateDirectory(const UnicodeString & DirName, bool Encrypt);
  81. virtual void __fastcall CreateLink(const UnicodeString FileName, const UnicodeString PointTo, bool Symbolic);
  82. virtual void __fastcall DeleteFile(const UnicodeString FileName,
  83. const TRemoteFile * File, int Params,
  84. TRmSessionAction & Action);
  85. virtual void __fastcall CustomCommandOnFile(const UnicodeString FileName,
  86. const TRemoteFile * File, UnicodeString Command, int Params, TCaptureOutputEvent OutputEvent);
  87. virtual void __fastcall DoStartup();
  88. virtual void __fastcall HomeDirectory();
  89. virtual bool __fastcall IsCapable(int Capability) const;
  90. virtual void __fastcall LookupUsersGroups();
  91. virtual void __fastcall ReadCurrentDirectory();
  92. virtual void __fastcall ReadDirectory(TRemoteFileList * FileList);
  93. virtual void __fastcall ReadFile(const UnicodeString FileName,
  94. TRemoteFile *& File);
  95. virtual void __fastcall ReadSymlink(TRemoteFile * SymLinkFile,
  96. TRemoteFile *& File);
  97. virtual void __fastcall RenameFile(
  98. const UnicodeString & FileName, const TRemoteFile * File, const UnicodeString & NewName, bool Overwrite);
  99. virtual void __fastcall CopyFile(
  100. const UnicodeString & FileName, const TRemoteFile * File, const UnicodeString & NewName, bool Overwrite);
  101. virtual TStrings * __fastcall GetFixedPaths();
  102. virtual void __fastcall SpaceAvailable(const UnicodeString Path,
  103. TSpaceAvailable & ASpaceAvailable);
  104. virtual const TSessionInfo & __fastcall GetSessionInfo();
  105. virtual const TFileSystemInfo & __fastcall GetFileSystemInfo(bool Retrieve);
  106. virtual bool __fastcall TemporaryTransferFile(const UnicodeString & FileName);
  107. virtual bool __fastcall GetStoredCredentialsTried();
  108. virtual UnicodeString __fastcall GetUserName();
  109. virtual void __fastcall GetSupportedChecksumAlgs(TStrings * Algs);
  110. virtual void __fastcall LockFile(const UnicodeString & FileName, const TRemoteFile * File);
  111. virtual void __fastcall UnlockFile(const UnicodeString & FileName, const TRemoteFile * File);
  112. virtual void __fastcall UpdateFromMain(TCustomFileSystem * MainFileSystem);
  113. virtual void __fastcall ClearCaches();
  114. protected:
  115. bool FActive;
  116. TFileSystemInfo FFileSystemInfo;
  117. UnicodeString FCurrentDirectory;
  118. UnicodeString FCachedDirectoryChange;
  119. TSessionInfo FSessionInfo;
  120. UTF8String FAccessKeyId;
  121. UTF8String FSecretAccessKey;
  122. UTF8String FSecurityTokenBuf;
  123. const char * FSecurityToken;
  124. UTF8String FHostName;
  125. UTF8String FPortSuffix;
  126. int FTimeout;
  127. S3RequestContext * FRequestContext;
  128. _S3Protocol FLibS3Protocol;
  129. ne_session_s * FNeonSession;
  130. UnicodeString FTlsVersionStr;
  131. UnicodeString FResponse;
  132. bool FResponseIgnore;
  133. typedef std::map<UnicodeString, UnicodeString> TRegions;
  134. TRegions FRegions;
  135. TRegions FHostNames;
  136. UnicodeString FAuthRegion;
  137. virtual UnicodeString __fastcall GetCurrentDirectory();
  138. void LibS3Deinitialize();
  139. bool VerifyCertificate(TNeonCertificateData Data);
  140. void CollectTLSSessionInfo();
  141. void CheckLibS3Error(const TLibS3CallbackData & Data, bool FatalOnConnectError = false);
  142. void InitSslSession(ssl_st * Ssl, ne_session_s * Session);
  143. void RequestInit(TLibS3CallbackData & Data);
  144. void TryOpenDirectory(const UnicodeString & Directory);
  145. void ReadDirectoryInternal(const UnicodeString & Path, TRemoteFileList * FileList, int MaxKeys, const UnicodeString & FileName);
  146. void ParsePath(UnicodeString Path, UnicodeString & BucketName, UnicodeString & Key);
  147. TRemoteToken MakeRemoteToken(const char * OwnerId, const char * OwnerDisplayName);
  148. TLibS3BucketContext GetBucketContext(const UnicodeString & BucketName, const UnicodeString & Prefix);
  149. void DoListBucket(
  150. const UnicodeString & Prefix, TRemoteFileList * FileList, int MaxKeys, const TLibS3BucketContext & BucketContext,
  151. TLibS3ListBucketCallbackData & Data);
  152. UnicodeString GetFolderKey(const UnicodeString & Key);
  153. void HandleNonBucketStatus(TLibS3CallbackData & Data, bool & Retry);
  154. void DoReadFile(const UnicodeString & FileName, TRemoteFile *& File);
  155. void ConfirmOverwrite(
  156. const UnicodeString & SourceFullFileName, UnicodeString & TargetFileName,
  157. TFileOperationProgressType * OperationProgress, const TOverwriteFileParams * FileParams,
  158. const TCopyParamType * CopyParam, int Params);
  159. int PutObjectData(int BufferSize, char * Buffer, TLibS3PutObjectDataCallbackData & Data);
  160. S3Status GetObjectData(int BufferSize, const char * Buffer, TLibS3GetObjectDataCallbackData & Data);
  161. bool ShouldCancelTransfer(TLibS3TransferObjectDataCallbackData & Data);
  162. bool IsGoogleCloud();
  163. void __fastcall LoadFileProperties(const UnicodeString AFileName, const TRemoteFile * File, void * Param);
  164. bool DoLoadFileProperties(
  165. const UnicodeString & AFileName, const TRemoteFile * File, TS3FileProperties & Properties, bool LoadTags);
  166. unsigned short AclGrantToPermissions(S3AclGrant & AclGrant, const TS3FileProperties & Properties);
  167. bool ParsePathForPropertiesRequests(
  168. const UnicodeString & Path, const TRemoteFile * File, UnicodeString & BucketName, UnicodeString & Key);
  169. void AssumeRole(const UnicodeString & RoleArn);
  170. void SetCredentials(const UnicodeString & AccessKeyId, const UnicodeString & SecretAccessKey, const UnicodeString & SessionToken);
  171. static TS3FileSystem * GetFileSystem(void * CallbackData);
  172. static void LibS3SessionCallback(ne_session_s * Session, void * CallbackData);
  173. static S3Status LibS3ResponsePropertiesCallback(const S3ResponseProperties * Properties, void * CallbackData);
  174. static void LibS3ResponseCompleteCallback(S3Status Status, const S3ErrorDetails * Error, void * CallbackData);
  175. static int LibS3SslCallback(int Failures, const ne_ssl_certificate_s * Certificate, void * CallbackData);
  176. static void LibS3ResponseDataCallback(const char * Data, size_t Size, void * CallbackData);
  177. static S3Status LibS3ListServiceCallback(
  178. const char * OwnerId, const char * OwnerDisplayName, const char * BucketName,
  179. int64_t CreationDate, void * CallbackData);
  180. static S3Status LibS3ListBucketCallback(
  181. int IsTruncated, const char * NextMarker, int ContentsCount, const S3ListBucketContent * Contents,
  182. int CommonPrefixesCount, const char ** CommonPrefixes, void * CallbackData);
  183. static int LibS3PutObjectDataCallback(int BufferSize, char * Buffer, void * CallbackData);
  184. static S3Status LibS3MultipartInitialCallback(const char * UploadId, void * CallbackData);
  185. static int LibS3MultipartCommitPutObjectDataCallback(int BufferSize, char * Buffer, void * CallbackData);
  186. static S3Status LibS3MultipartResponsePropertiesCallback(const S3ResponseProperties * Properties, void * CallbackData);
  187. static S3Status LibS3GetObjectDataCallback(int BufferSize, const char * Buffer, void * CallbackData);
  188. static S3Status LibS3XmlDataCallback(int BufferSize, const char * Buffer, void * CallbackData);
  189. static int LibS3XmlDataToCallback(int BufferSize, char * Buffer, void * CallbackData);
  190. static const int S3MinMultiPartChunkSize;
  191. static const int S3MaxMultiPartChunks;
  192. };
  193. //------------------------------------------------------------------------------
  194. UnicodeString __fastcall S3LibVersion();
  195. UnicodeString __fastcall S3LibDefaultHostName();
  196. UnicodeString __fastcall S3LibDefaultRegion();
  197. bool IsAmazonS3SessionData(TSessionData * Data);
  198. TStrings * GetS3Profiles();
  199. UnicodeString S3EnvUserName(const UnicodeString & Profile, UnicodeString * Source = NULL, bool OnlyCached = false);
  200. UnicodeString S3EnvPassword(const UnicodeString & Profile, UnicodeString * Source = NULL, bool OnlyCached = false);
  201. UnicodeString S3EnvSessionToken(const UnicodeString & Profile, UnicodeString * Source = NULL, bool OnlyCached = false);
  202. UnicodeString S3EnvRoleArn(const UnicodeString & Profile, UnicodeString * Source = NULL, bool OnlyCached = false);
  203. //------------------------------------------------------------------------------
  204. #endif