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