1
0
mirror of https://github.com/winscp/winscp.git synced 2026-10-24 02:28:55 +03:00

Bug 1712: It was not possible to access a bucket, if the user does not have permissions to list its root folder

https://winscp.net/tracker/1712

Source commit: 865d2f68a484fa7395ccef76b6dc0960f70bf21a
This commit is contained in:
Martin Prikryl
2018-12-19 17:21:45 +00:00
parent f33d9b2db5
commit cfe78bd91d
2 changed files with 17 additions and 22 deletions

View File

@@ -126,18 +126,11 @@ void __fastcall TS3FileSystem::Open()
FActive = false;
try
{
UnicodeString Path;
if (IsUnixRootPath(Data->RemoteDirectory))
UnicodeString Path = Data->RemoteDirectory;
if (IsUnixRootPath(Path))
{
Path = ROOTDIRECTORY;
}
else
{
UnicodeString BucketName;
UnicodeString UnusedKey;
ParsePath(Data->RemoteDirectory, BucketName, UnusedKey);
Path = LibS3Delimiter + BucketName;
}
TryOpenDirectory(Path);
}
catch (Exception & E)
@@ -457,7 +450,7 @@ struct TLibS3ListBucketCallbackData : TLibS3CallbackData
bool IsTruncated;
};
//---------------------------------------------------------------------------
TLibS3BucketContext TS3FileSystem::GetBucketContext(const UnicodeString & BucketName)
TLibS3BucketContext TS3FileSystem::GetBucketContext(const UnicodeString & BucketName, const UnicodeString & Prefix)
{
TLibS3BucketContext Result;
@@ -510,7 +503,8 @@ TLibS3BucketContext TS3FileSystem::GetBucketContext(const UnicodeString & Bucket
{
std::unique_ptr<TRemoteFileList> FileList(new TRemoteFileList());
TLibS3ListBucketCallbackData Data;
DoListBucket(UnicodeString(), FileList.get(), 1, Result, Data);
// Using prefix for which we need the bucket, as the account may have access to that prefix only (using "Condition" in policy)
DoListBucket(Prefix, FileList.get(), 1, Result, Data);
Retry = false;
UnicodeString EndpointDetail = Data.EndpointDetail;
@@ -875,7 +869,7 @@ void TS3FileSystem::ReadDirectoryInternal(
Prefix = GetFolderKey(Prefix);
}
Prefix += FileName;
TLibS3BucketContext BucketContext = GetBucketContext(BucketName);
TLibS3BucketContext BucketContext = GetBucketContext(BucketName, Prefix);
TLibS3ListBucketCallbackData Data;
bool Continue;
@@ -967,7 +961,12 @@ void __fastcall TS3FileSystem::DeleteFile(const UnicodeString AFileName,
UnicodeString BucketName, Key;
ParsePath(FileName, BucketName, Key);
TLibS3BucketContext BucketContext = GetBucketContext(BucketName);
if (!Key.IsEmpty() && Dir)
{
Key = GetFolderKey(Key);
}
TLibS3BucketContext BucketContext = GetBucketContext(BucketName, Key);
S3ResponseHandler ResponseHandler = CreateResponseHandler();
@@ -983,10 +982,6 @@ void __fastcall TS3FileSystem::DeleteFile(const UnicodeString AFileName,
}
else
{
if (Dir)
{
Key = GetFolderKey(Key);
}
S3_delete_object(&BucketContext, StrToS3(Key), FRequestContext, FTimeout, &ResponseHandler, &Data);
}
@@ -1029,7 +1024,7 @@ void __fastcall TS3FileSystem::CopyFile(const UnicodeString AFileName, const TRe
throw Exception(LoadStr(MISSING_TARGET_BUCKET));
}
TLibS3BucketContext BucketContext = GetBucketContext(DestBucketName);
TLibS3BucketContext BucketContext = GetBucketContext(DestBucketName, DestKey);
BucketContext.BucketNameBuf = SourceBucketName;
BucketContext.bucketName = BucketContext.BucketNameBuf.c_str();
@@ -1094,7 +1089,7 @@ void __fastcall TS3FileSystem::CreateDirectory(const UnicodeString & ADirName, b
Key = GetFolderKey(Key);
TLibS3BucketContext BucketContext = GetBucketContext(BucketName);
TLibS3BucketContext BucketContext = GetBucketContext(BucketName, Key);
S3PutObjectHandler PutObjectHandler = { CreateResponseHandler(), NULL };
@@ -1369,7 +1364,7 @@ void __fastcall TS3FileSystem::Source(
throw Exception(LoadStr(MISSING_TARGET_BUCKET));
}
TLibS3BucketContext BucketContext = GetBucketContext(BucketName);
TLibS3BucketContext BucketContext = GetBucketContext(BucketName, Key);
UTF8String ContentType = UTF8String(FTerminal->Configuration->GetFileMimeType(Handle.FileName));
S3PutProperties PutProperties =
@@ -1618,7 +1613,7 @@ void __fastcall TS3FileSystem::Sink(
UnicodeString BucketName, Key;
ParsePath(FileName, BucketName, Key);
TLibS3BucketContext BucketContext = GetBucketContext(BucketName);
TLibS3BucketContext BucketContext = GetBucketContext(BucketName, Key);
UnicodeString ExpandedDestFullName = ExpandUNCFileName(DestFullName);
Action.Destination(ExpandedDestFullName);