Browse Source

Issue 2309 – Stall when switching from S3 to other protocol on Login dialog on some networks

https://winscp.net/tracker/2309

Source commit: 0ceea38d1676492d0af77660e5289e1f5bcead8e
Martin Prikryl 1 year ago
parent
commit
f008f112cb
4 changed files with 27 additions and 38 deletions
  1. 10 10
      source/core/S3FileSystem.cpp
  2. 4 4
      source/core/S3FileSystem.h
  3. 13 23
      source/forms/Login.cpp
  4. 0 1
      source/forms/Login.h

+ 10 - 10
source/core/S3FileSystem.cpp

@@ -232,7 +232,7 @@ static UnicodeString GetS3ConfigValue(
 //---------------------------------------------------------------------------
 static UnicodeString GetS3ConfigValue(
   const UnicodeString & Profile, const UnicodeString & EnvName, const UnicodeString & AConfigName,
-  const UnicodeString & CredentialsName, UnicodeString * Source)
+  const UnicodeString & CredentialsName, UnicodeString * Source, bool OnlyCached = false)
 {
   UnicodeString Result;
   UnicodeString ASource;
@@ -302,7 +302,7 @@ static UnicodeString GetS3ConfigValue(
       S3SecurityProfileChecked = false;
     }
 
-    if (!S3SecurityProfileChecked)
+    if (!S3SecurityProfileChecked && !OnlyCached)
     {
       S3Credentials.clear();
       S3SecurityProfile = EmptyStr;
@@ -386,24 +386,24 @@ static UnicodeString GetS3ConfigValue(
   return Result;
 }
 //---------------------------------------------------------------------------
-UnicodeString S3EnvUserName(const UnicodeString & Profile, UnicodeString * Source)
+UnicodeString S3EnvUserName(const UnicodeString & Profile, UnicodeString * Source, bool OnlyCached)
 {
-  return GetS3ConfigValue(Profile, AWS_ACCESS_KEY_ID, AWS_ACCESS_KEY_ID, L"AccessKeyId", Source);
+  return GetS3ConfigValue(Profile, AWS_ACCESS_KEY_ID, AWS_ACCESS_KEY_ID, L"AccessKeyId", Source, OnlyCached);
 }
 //---------------------------------------------------------------------------
-UnicodeString S3EnvPassword(const UnicodeString & Profile, UnicodeString * Source)
+UnicodeString S3EnvPassword(const UnicodeString & Profile, UnicodeString * Source, bool OnlyCached)
 {
-  return GetS3ConfigValue(Profile, AWS_SECRET_ACCESS_KEY, AWS_SECRET_ACCESS_KEY, L"SecretAccessKey", Source);
+  return GetS3ConfigValue(Profile, AWS_SECRET_ACCESS_KEY, AWS_SECRET_ACCESS_KEY, L"SecretAccessKey", Source, OnlyCached);
 }
 //---------------------------------------------------------------------------
-UnicodeString S3EnvSessionToken(const UnicodeString & Profile, UnicodeString * Source)
+UnicodeString S3EnvSessionToken(const UnicodeString & Profile, UnicodeString * Source, bool OnlyCached)
 {
-  return GetS3ConfigValue(Profile, AWS_SESSION_TOKEN, AWS_SESSION_TOKEN, L"Token", Source);
+  return GetS3ConfigValue(Profile, AWS_SESSION_TOKEN, AWS_SESSION_TOKEN, L"Token", Source, OnlyCached);
 }
 //---------------------------------------------------------------------------
-UnicodeString S3EnvRoleArn(const UnicodeString & Profile, UnicodeString * Source)
+UnicodeString S3EnvRoleArn(const UnicodeString & Profile, UnicodeString * Source, bool OnlyCached)
 {
-  return GetS3ConfigValue(Profile, AWS_ROLE_ARN, AWS_ROLE_ARN_KEY, EmptyStr, Source);
+  return GetS3ConfigValue(Profile, AWS_ROLE_ARN, AWS_ROLE_ARN_KEY, EmptyStr, Source, OnlyCached);
 }
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------

+ 4 - 4
source/core/S3FileSystem.h

@@ -198,9 +198,9 @@ UnicodeString __fastcall S3LibDefaultHostName();
 UnicodeString __fastcall S3LibDefaultRegion();
 bool IsAmazonS3SessionData(TSessionData * Data);
 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);
-UnicodeString S3EnvRoleArn(const UnicodeString & Profile, UnicodeString * Source = NULL);
+UnicodeString S3EnvUserName(const UnicodeString & Profile, UnicodeString * Source = NULL, bool OnlyCached = false);
+UnicodeString S3EnvPassword(const UnicodeString & Profile, UnicodeString * Source = NULL, bool OnlyCached = false);
+UnicodeString S3EnvSessionToken(const UnicodeString & Profile, UnicodeString * Source = NULL, bool OnlyCached = false);
+UnicodeString S3EnvRoleArn(const UnicodeString & Profile, UnicodeString * Source = NULL, bool OnlyCached = false);
 //------------------------------------------------------------------------------
 #endif

+ 13 - 23
source/forms/Login.cpp

@@ -77,7 +77,6 @@ __fastcall TLoginDialog::TLoginDialog(TComponent* AOwner)
   FLinkedForm = NULL;
   FRestoring = false;
   FPrevPos = TPoint(std::numeric_limits<LONG>::min(), std::numeric_limits<LONG>::min());
-  FWasEverS3 = false;
 
   // we need to make sure that window procedure is set asap
   // (so that CM_SHOWINGCHANGED handling is applied)
@@ -676,10 +675,6 @@ void __fastcall TLoginDialog::UpdateControls()
     bool FtpProtocol = (FSProtocol == fsFTP);
     bool WebDavProtocol = (FSProtocol == fsWebDAV);
     bool S3Protocol = (FSProtocol == fsS3);
-    if (S3Protocol)
-    {
-      FWasEverS3 = true;
-    }
 
     // session
     FtpsCombo->Visible = Editable && FtpProtocol;
@@ -2248,28 +2243,23 @@ void __fastcall TLoginDialog::TransferProtocolComboChange(TObject * Sender)
         {
           HostNameEdit->Clear();
         }
-        // Optimization to avoid querying AWS metadata service.
-        // Smarter would be to tell S3EnvXXX functions not to do expensive queries.
-        if (FWasEverS3)
+        if (UserNameEdit->Text == S3EnvUserName(S3Profile, NULL, true))
         {
-          if (UserNameEdit->Text == S3EnvUserName(S3Profile))
-          {
-            UserNameEdit->Clear();
-          }
-          if (PasswordEdit->Text == S3EnvPassword(S3Profile))
+          UserNameEdit->Clear();
+        }
+        if (PasswordEdit->Text == S3EnvPassword(S3Profile, NULL, true))
+        {
+          PasswordEdit->Clear();
+        }
+        if (FSessionData != NULL)
+        {
+          if (FSessionData->S3SessionToken == S3EnvSessionToken(S3Profile, NULL, true))
           {
-            PasswordEdit->Clear();
+            FSessionData->S3SessionToken = EmptyStr;
           }
-          if (FSessionData != NULL)
+          if (FSessionData->S3RoleArn == S3EnvRoleArn(S3Profile, NULL, true))
           {
-            if (FSessionData->S3SessionToken == S3EnvSessionToken(S3Profile))
-            {
-              FSessionData->S3SessionToken = EmptyStr;
-            }
-            if (FSessionData->S3RoleArn == S3EnvRoleArn(S3Profile))
-            {
-              FSessionData->S3RoleArn = EmptyStr;
-            }
+            FSessionData->S3RoleArn = EmptyStr;
           }
         }
       }

+ 0 - 1
source/forms/Login.h

@@ -339,7 +339,6 @@ private:
   UnicodeString FPasswordLabel;
   int FFixedSessionImages;
   bool FRestoring;
-  bool FWasEverS3;
 
   void __fastcall LoadSession(TSessionData * SessionData);
   void __fastcall LoadContents();