From e0e4cbf7e2cd8649307dc81e191591a8889abcce Mon Sep 17 00:00:00 2001 From: Philipp Bandow Date: Thu, 27 May 2021 23:03:52 +0200 Subject: [PATCH] Add support for AWS STS Tokens in S3 Backend --- src/duplicacy_s3storage.go | 7 ++++++- src/duplicacy_storage.go | 9 +++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/duplicacy_s3storage.go b/src/duplicacy_s3storage.go index f205d8f..de82b08 100644 --- a/src/duplicacy_s3storage.go +++ b/src/duplicacy_s3storage.go @@ -33,8 +33,13 @@ type S3Storage struct { func CreateS3Storage(regionName string, endpoint string, bucketName string, storageDir string, accessKey string, secretKey string, threads int, isSSLSupported bool, isMinioCompatible bool) (storage *S3Storage, err error) { + return CreateS3StorageWithToken(regionName, endpoint, bucketName, storageDir, accessKey, secretKey, "", threads, isSSLSupported, isMinioCompatible) +} - token := "" +// CreatesS3StorageWithToken create an amazon s3 storage object using an optional security token. +func CreateS3StorageWithToken(regionName string, endpoint string, bucketName string, storageDir string, + accessKey string, secretKey string, token string, threads int, + isSSLSupported bool, isMinioCompatible bool) (storage *S3Storage, err error) { auth := credentials.NewStaticCredentials(accessKey, secretKey, token) diff --git a/src/duplicacy_storage.go b/src/duplicacy_storage.go index e098026..3980207 100644 --- a/src/duplicacy_storage.go +++ b/src/duplicacy_storage.go @@ -455,7 +455,7 @@ func CreateStorage(preference Preference, resetPassword bool, threads int) (stor SavePassword(preference, "ssh_password", password) } return sftpStorage - } else if matched[1] == "s3" || matched[1] == "s3c" || matched[1] == "minio" || matched[1] == "minios" { + } else if matched[1] == "s3" || matched[1] == "s3c" || matched[1] == "minio" || matched[1] == "minios" || matched[1] == "s3-token" { // urlRegex := regexp.MustCompile(`^(\w+)://([\w\-]+@)?([^/]+)(/(.+))?`) @@ -492,7 +492,12 @@ func CreateStorage(preference Preference, resetPassword bool, threads int) (stor } else { isMinioCompatible := (matched[1] == "minio" || matched[1] == "minios") isSSLSupported := (matched[1] == "s3" || matched[1] == "minios") - storage, err = CreateS3Storage(region, endpoint, bucket, storageDir, accessKey, secretKey, threads, isSSLSupported, isMinioCompatible) + if matched[1] == "s3-token" { + token := GetPassword(preference, "s3_token", "Enter S3 Token (Optional):", true, resetPassword) + storage, err = CreateS3StorageWithToken(region, endpoint, bucket, storageDir, accessKey, secretKey, token, threads, isSSLSupported, isMinioCompatible) + } else { + storage, err = CreateS3Storage(region, endpoint, bucket, storageDir, accessKey, secretKey, threads, isSSLSupported, isMinioCompatible) + } if err != nil { LOG_ERROR("STORAGE_CREATE", "Failed to load the S3 storage at %s: %v", storageURL, err) return nil