Просмотр исходного кода

Bug 1780: Allow use of non standard port numbers with S3 protocol

https://winscp.net/tracker/1780

Source commit: 1d5a463328f1c7fc08d55e3f3887eb268dbbef53
Martin Prikryl 6 лет назад
Родитель
Сommit
60ffc87ab8

+ 1 - 0
libs/libs3/inc/libs3.h

@@ -703,6 +703,7 @@ typedef struct S3BucketContext
      * The name of the host to connect to when making S3 requests.  If set to
      * NULL, the default S3 hostname passed in to S3_initialize will be used.
      **/
+    // WINSCP: Can contain port number
     const char *hostName;
 
     /**

+ 9 - 1
libs/libs3/src/request.c

@@ -1279,7 +1279,15 @@ static S3Status setup_neon(Request *request,
 
     // WINSCP (hostHeader is added implicitly by neon based on uri, but for certificate check, we use base hostname
     // as the bucket name can contain dots, for which the certificate check would fail)
-    ne_set_realhost(request->NeonSession, params->bucketContext.hostName ? params->bucketContext.hostName : defaultHostNameG);
+    char * hostName = strdup(params->bucketContext.hostName ? params->bucketContext.hostName : defaultHostNameG);
+    char * colon = strchr(hostName, ':');
+    if (colon != NULL)
+    {
+        *colon = '\0';
+    }
+    ne_set_realhost(request->NeonSession, hostName);
+    free(hostName);
+
     append_standard_header(cacheControlHeader);
     append_standard_header(contentTypeHeader);
     append_standard_header(md5Header);

+ 10 - 3
source/core/S3FileSystem.cpp

@@ -114,6 +114,13 @@ void __fastcall TS3FileSystem::Open()
   FSecretAccessKey = UTF8String(SecretAccessKey);
 
   FHostName = UTF8String(Data->HostNameExpanded);
+  FPortSuffix = UTF8String();
+  int ADefaultPort = DefaultPort(FTerminal->SessionData->FSProtocol, FTerminal->SessionData->Ftps);
+  DebugAssert(ADefaultPort == HTTPSPortNumber);
+  if (FTerminal->SessionData->PortNumber != ADefaultPort)
+  {
+    FPortSuffix = UTF8String(FORMAT(L":%d", (FTerminal->SessionData->PortNumber)));
+  }
   FTimeout = Data->Timeout;
 
   RegisterForNeonDebug(FTerminal);
@@ -488,7 +495,7 @@ TLibS3BucketContext TS3FileSystem::GetBucketContext(const UnicodeString & Bucket
       HostName = UnicodeString(FHostName);
     }
 
-    Result.HostNameBuf = UTF8String(HostName);
+    Result.HostNameBuf = UTF8String(HostName + UnicodeString(FPortSuffix));
     Result.hostName = Result.HostNameBuf.c_str();
     Result.BucketNameBuf = UTF8String(BucketName);
     Result.bucketName = Result.BucketNameBuf.c_str();
@@ -852,7 +859,7 @@ void TS3FileSystem::ReadDirectoryInternal(
       Retry = false;
 
       S3_list_service(
-        FLibS3Protocol, FAccessKeyId.c_str(), FSecretAccessKey.c_str(), 0, FHostName.c_str(),
+        FLibS3Protocol, FAccessKeyId.c_str(), FSecretAccessKey.c_str(), 0, (FHostName + FPortSuffix).c_str(),
         StrToS3(FAuthRegion), MaxKeys, FRequestContext, FTimeout, &ListServiceHandler, &Data);
 
       HandleNonBucketStatus(Data, Retry);
@@ -1074,7 +1081,7 @@ void __fastcall TS3FileSystem::CreateDirectory(const UnicodeString & ADirName, b
       Retry = false;
 
       S3_create_bucket(
-        FLibS3Protocol, FAccessKeyId.c_str(), FSecretAccessKey.c_str(), NULL, FHostName.c_str(), StrToS3(BucketName),
+        FLibS3Protocol, FAccessKeyId.c_str(), FSecretAccessKey.c_str(), NULL, (FHostName + FPortSuffix).c_str(), StrToS3(BucketName),
         StrToS3(FAuthRegion), S3CannedAclPrivate, Region, FRequestContext, FTimeout, &ResponseHandler, &Data);
 
       HandleNonBucketStatus(Data, Retry);

+ 1 - 0
source/core/S3FileSystem.h

@@ -116,6 +116,7 @@ protected:
   UTF8String FAccessKeyId;
   UTF8String FSecretAccessKey;
   UTF8String FHostName;
+  UTF8String FPortSuffix;
   int FTimeout;
   S3RequestContext * FRequestContext;
   _S3Protocol FLibS3Protocol;

+ 0 - 2
source/forms/Login.cpp

@@ -606,8 +606,6 @@ void __fastcall TLoginDialog::UpdateControls()
     bool S3Protocol = (FSProtocol == fsS3);
 
     // session
-    PortNumberEdit->Visible = !S3Protocol;
-    Label2->Visible = PortNumberEdit->Visible;
     FtpsCombo->Visible = Editable && FtpProtocol;
     FtpsLabel->Visible = FtpProtocol;
     WebDavsCombo->Visible = Editable && WebDavProtocol;