Переглянути джерело

Reloading AWS credentials file when it changes

Source commit: 9d8fc42780130141c9da1d29e746378e1a500cfe
Martin Prikryl 2 роки тому
батько
коміт
7cc3d46aeb
1 змінених файлів з 18 додано та 8 видалено
  1. 18 8
      source/core/S3FileSystem.cpp

+ 18 - 8
source/core/S3FileSystem.cpp

@@ -53,32 +53,42 @@ UnicodeString __fastcall S3LibDefaultRegion()
   return StrFromS3(S3_DEFAULT_REGION);
 }
 //---------------------------------------------------------------------------
-bool S3ConfigFileTried = false;
+UnicodeString S3ConfigFileName;
+TDateTime S3ConfigTimestamp;
 std::unique_ptr<TCustomIniFile> S3ConfigFile;
 UnicodeString S3Profile;
 //---------------------------------------------------------------------------
 static void NeedS3Config()
 {
-  if (!S3ConfigFileTried)
+  TGuard Guard(LibS3Section.get());
+  if (S3Profile.IsEmpty())
   {
-    S3ConfigFileTried = true;
-
     S3Profile = GetEnvironmentVariable(AWS_PROFILE);
     if (S3Profile.IsEmpty())
     {
       S3Profile = AWS_PROFILE_DEFAULT;
     }
+  }
 
-    UnicodeString ConfigFileName = GetEnvironmentVariable(AWS_CONFIG_FILE);
+  if (S3ConfigFileName.IsEmpty())
+  {
+    S3ConfigFileName = GetEnvironmentVariable(AWS_CONFIG_FILE);
     UnicodeString ProfilePath = GetShellFolderPath(CSIDL_PROFILE);
     UnicodeString DefaultConfigFileName = IncludeTrailingBackslash(ProfilePath) + L".aws\\credentials";
-    // "aws" cli really prefers the default location over location specificed by AWS_CONFIG_FILE
+    // "aws" cli really prefers the default location over location specified by AWS_CONFIG_FILE
     if (FileExists(DefaultConfigFileName))
     {
-      ConfigFileName = DefaultConfigFileName;
+      S3ConfigFileName = DefaultConfigFileName;
     }
+  }
 
-    S3ConfigFile.reset(new TMemIniFile(ConfigFileName));
+  TDateTime Timestamp;
+  FileAge(S3ConfigFileName, Timestamp);
+  if (S3ConfigTimestamp != Timestamp)
+  {
+    S3ConfigTimestamp = Timestamp;
+    // TMemIniFile silently ignores empty paths or non-existing files
+    S3ConfigFile.reset(new TMemIniFile(S3ConfigFileName));
   }
 }
 //---------------------------------------------------------------------------