From 8f6c5fea5fc0150de4c0fca5f777a11564bcec24 Mon Sep 17 00:00:00 2001 From: Zdenek Topic Date: Wed, 17 Oct 2018 09:45:14 +0200 Subject: [PATCH] Create S3AdapterConfig --- .../Adapters/S3/S3Adapter+Writing.swift | 4 +- .../Adapters/S3/S3Adapter.swift | 55 ++++++++++++++++--- .../VaporFilesystemTests/S3AdapterTests.swift | 11 ++-- 3 files changed, 57 insertions(+), 13 deletions(-) diff --git a/Sources/VaporFilesystem/Adapters/S3/S3Adapter+Writing.swift b/Sources/VaporFilesystem/Adapters/S3/S3Adapter+Writing.swift index 1f1c8a9..41d8c0a 100644 --- a/Sources/VaporFilesystem/Adapters/S3/S3Adapter+Writing.swift +++ b/Sources/VaporFilesystem/Adapters/S3/S3Adapter+Writing.swift @@ -5,13 +5,13 @@ extension S3Adapter: FilesystemWriting { public func write(data: Data, to: String, on worker: Container, options: FileOptions?) -> EventLoopFuture<()> { return run(path: to, on: worker) { - #warning("FIXME: access") + #warning("FIXME: access overriding") #warning("FIXME: Region is not passed anywhere to upload!") let upload = File.Upload( data: data, bucket: $0.bucket, destination: $0.path, - access: .privateAccess, + access: self.config.defaultAccess, mime: try self.mediaType(of: to).description ) diff --git a/Sources/VaporFilesystem/Adapters/S3/S3Adapter.swift b/Sources/VaporFilesystem/Adapters/S3/S3Adapter.swift index e9134cd..9cd01cb 100644 --- a/Sources/VaporFilesystem/Adapters/S3/S3Adapter.swift +++ b/Sources/VaporFilesystem/Adapters/S3/S3Adapter.swift @@ -4,18 +4,59 @@ import Foundation open class S3Adapter { + public struct Auth { + + /// AWS Access Key + let accessKey: String + + /// AWS Secret Key + let secretKey: String + + /// AWS Security Token. Used to validate temporary credentials, such as those from an EC2 Instance's IAM role + let securityToken : String? + + public init(accessKey: String, secretKey: String, securityToken : String? = nil) { + self.accessKey = accessKey + self.secretKey = secretKey + self.securityToken = securityToken + } + + } + + public struct Config { + + let auth: Auth + + /// The region where S3 bucket is located. + public let region: Region + + public let defaultAccess: AccessControlList + + public init(auth: Auth, region: Region, defaultAccess: AccessControlList = .privateAccess) { + self.auth = auth + self.region = region + self.defaultAccess = defaultAccess + } + + } + public let bucket: String public let client: S3 public let signer: S3Signer - public let region: Region + public let config: Config - #warning("TODO: abstract away S3Signer.Config?") - #warning("TODO: default config for access and other properties and metadata") - public init(bucket: String, config: S3Signer.Config) throws { + public init(bucket: String, config: Config) throws { self.bucket = bucket - self.region = config.region + self.config = config - self.signer = try S3Signer(config) + let signerConfig = S3Signer.Config( + accessKey: config.auth.accessKey, + secretKey: config.auth.secretKey, + region: config.region, + securityToken: config.auth.securityToken + ) + + self.signer = try S3Signer(signerConfig) self.client = try S3(defaultBucket: bucket, signer: self.signer) } @@ -23,7 +64,7 @@ open class S3Adapter { return File.Location( path: path, bucket: bucket, - region: region + region: config.region ) } diff --git a/Tests/VaporFilesystemTests/S3AdapterTests.swift b/Tests/VaporFilesystemTests/S3AdapterTests.swift index 26e1b1e..e7ddcb7 100644 --- a/Tests/VaporFilesystemTests/S3AdapterTests.swift +++ b/Tests/VaporFilesystemTests/S3AdapterTests.swift @@ -106,10 +106,13 @@ fileprivate extension S3AdapterTests { func createAdapter() throws -> S3Adapter { return try S3Adapter( bucket: "", - config: S3Signer.Config( - accessKey: "", - secretKey: "", - region: .euCentral1 // your region + config: S3Adapter.Config( + auth: S3Adapter.Auth( + accessKey: "", + secretKey: "" + ), + region: .euCentral1, + defaultAccess: .publicRead ) ) }