JAMES-2525 implements swift auth protocol config readers

Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/a4872d69
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/a4872d69
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/a4872d69

Branch: refs/heads/master
Commit: a4872d69a9d62aad11fb3331e7daa192536ebd04
Parents: 7bb6e80
Author: Jean Helou <j...@codamens.fr>
Authored: Wed Sep 5 12:00:01 2018 +0200
Committer: Benoit Tellier <btell...@linagora.com>
Committed: Thu Oct 11 09:26:14 2018 +0700

----------------------------------------------------------------------
 .../swift/SwiftKeystone2ObjectStorage.java      |   4 +-
 .../swift/SwiftKeystone3ObjectStorage.java      |  14 +-
 .../swift/SwiftTempAuthObjectStorage.java       |  15 ++
 .../objectstorage/SwiftConfigurationReader.java |  26 ++
 .../SwiftKeystone2ConfigurationReader.java      |  74 ++++++
 .../SwiftKeystone3ConfigurationReader.java      | 134 ++++++++++
 .../SwiftTmpAuthConfigurationReader.java        |  90 +++++++
 .../SwiftKeystone2ConfigurationReaderTest.java  | 150 +++++++++++
 .../SwiftKeystone3ConfigurationReaderTest.java  | 254 +++++++++++++++++++
 .../SwiftTmpAuthConfigurationReaderTest.java    | 183 +++++++++++++
 10 files changed, 940 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/a4872d69/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/swift/SwiftKeystone2ObjectStorage.java
----------------------------------------------------------------------
diff --git 
a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/swift/SwiftKeystone2ObjectStorage.java
 
b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/swift/SwiftKeystone2ObjectStorage.java
index 5ace285..bf75bcd 100644
--- 
a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/swift/SwiftKeystone2ObjectStorage.java
+++ 
b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/swift/SwiftKeystone2ObjectStorage.java
@@ -114,8 +114,8 @@ public class SwiftKeystone2ObjectStorage {
                 return this;
             }
 
-            public Builder region(Region region) {
-                this.region = Optional.of(region);
+            public Builder region(Optional<Region> region) {
+                this.region = region;
                 return this;
             }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/a4872d69/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/swift/SwiftKeystone3ObjectStorage.java
----------------------------------------------------------------------
diff --git 
a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/swift/SwiftKeystone3ObjectStorage.java
 
b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/swift/SwiftKeystone3ObjectStorage.java
index f5e7272..c0dcee3 100644
--- 
a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/swift/SwiftKeystone3ObjectStorage.java
+++ 
b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/swift/SwiftKeystone3ObjectStorage.java
@@ -110,8 +110,13 @@ public class SwiftKeystone3ObjectStorage {
                 return this;
             }
 
-            public Builder region(Region region) {
-                this.region = Optional.of(region);
+            public Builder region(Optional<Region> region) {
+                this.region = region;
+                return this;
+            }
+
+            public Builder domainId(Optional<DomainId> domainId) {
+                this.domainId = domainId;
                 return this;
             }
 
@@ -120,6 +125,11 @@ public class SwiftKeystone3ObjectStorage {
                 return this;
             }
 
+            public Builder project(Optional<Project> project) {
+                this.project = project;
+                return this;
+            }
+
             public Builder project(Project project) {
                 this.project = Optional.of(project);
                 return this;

http://git-wip-us.apache.org/repos/asf/james-project/blob/a4872d69/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/swift/SwiftTempAuthObjectStorage.java
----------------------------------------------------------------------
diff --git 
a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/swift/SwiftTempAuthObjectStorage.java
 
b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/swift/SwiftTempAuthObjectStorage.java
index e8f1129..b5b1c22 100644
--- 
a/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/swift/SwiftTempAuthObjectStorage.java
+++ 
b/server/blob/blob-objectstorage/src/main/java/org/apache/james/blob/objectstorage/swift/SwiftTempAuthObjectStorage.java
@@ -123,6 +123,11 @@ public class SwiftTempAuthObjectStorage {
                 return this;
             }
 
+            public Builder region(Optional<Region> region) {
+                this.region = region;
+                return this;
+            }
+
             public Builder tempAuthHeaderUserName(UserHeaderName 
tmpAuthHeaderUser) {
                 userHeaderName = Optional.of(tmpAuthHeaderUser);
                 return this;
@@ -133,6 +138,16 @@ public class SwiftTempAuthObjectStorage {
                 return this;
             }
 
+            public Builder tempAuthHeaderUserName(Optional<UserHeaderName> 
tmpAuthHeaderUser) {
+                userHeaderName = tmpAuthHeaderUser;
+                return this;
+            }
+
+            public Builder tempAuthHeaderPassName(Optional<PassHeaderName> 
tmpAuthHeaderPass) {
+                passHeaderName = tmpAuthHeaderPass;
+                return this;
+            }
+
             public Configuration build() {
                 Preconditions.checkState(endpoint != null);
                 Preconditions.checkState(tenantName != null);

http://git-wip-us.apache.org/repos/asf/james-project/blob/a4872d69/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/SwiftConfigurationReader.java
----------------------------------------------------------------------
diff --git 
a/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/SwiftConfigurationReader.java
 
b/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/SwiftConfigurationReader.java
new file mode 100644
index 0000000..662a894
--- /dev/null
+++ 
b/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/SwiftConfigurationReader.java
@@ -0,0 +1,26 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.modules.objectstorage;
+
+public interface SwiftConfigurationReader {
+    String OBJECTSTORAGE_SWIFT_ENDPOINT = "objectstorage.swift.endpoint";
+    String OBJECTSTORAGE_SWIFT_CREDENTIALS = "objectstorage.swift.credentials";
+    String OBJECTSTORAGE_SWIFT_REGION = "objectstorage.swift.region";
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/a4872d69/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/SwiftKeystone2ConfigurationReader.java
----------------------------------------------------------------------
diff --git 
a/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/SwiftKeystone2ConfigurationReader.java
 
b/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/SwiftKeystone2ConfigurationReader.java
new file mode 100644
index 0000000..d2f1d03
--- /dev/null
+++ 
b/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/SwiftKeystone2ConfigurationReader.java
@@ -0,0 +1,74 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.modules.objectstorage;
+
+import java.net.URI;
+import java.util.Optional;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.james.blob.objectstorage.swift.Credentials;
+import org.apache.james.blob.objectstorage.swift.Identity;
+import org.apache.james.blob.objectstorage.swift.Region;
+import org.apache.james.blob.objectstorage.swift.SwiftKeystone2ObjectStorage;
+import org.apache.james.blob.objectstorage.swift.TenantName;
+import org.apache.james.blob.objectstorage.swift.UserName;
+
+import com.google.common.base.Preconditions;
+
+public class SwiftKeystone2ConfigurationReader implements 
SwiftConfigurationReader {
+
+    private static final String OBJECTSTORAGE_SWIFT_KEYSTONE_2_USERNAME =
+        "objectstorage.swift.keystone2.username";
+    private static final String OBJECTSTORAGE_SWIFT_KEYSTONE_2_TENANTNAME =
+        "objectstorage.swift.keystone2.tenantname";
+
+    public static SwiftKeystone2ObjectStorage.Configuration 
readSwiftConfiguration(Configuration configuration) {
+        String endpointStr = 
configuration.getString(OBJECTSTORAGE_SWIFT_ENDPOINT, null);
+        String crendentialsStr = 
configuration.getString(OBJECTSTORAGE_SWIFT_CREDENTIALS, null);
+        String userNameStr = 
configuration.getString(OBJECTSTORAGE_SWIFT_KEYSTONE_2_USERNAME, null);
+        String tenantNameStr = 
configuration.getString(OBJECTSTORAGE_SWIFT_KEYSTONE_2_TENANTNAME, null);
+
+        Preconditions.checkArgument(endpointStr != null,
+            OBJECTSTORAGE_SWIFT_ENDPOINT + " is a mandatory configuration 
value");
+        Preconditions.checkArgument(crendentialsStr != null,
+            OBJECTSTORAGE_SWIFT_CREDENTIALS + " is a mandatory configuration 
value");
+        Preconditions.checkArgument(userNameStr != null,
+            OBJECTSTORAGE_SWIFT_KEYSTONE_2_USERNAME + " is a mandatory 
configuration value");
+        Preconditions.checkArgument(tenantNameStr != null,
+            OBJECTSTORAGE_SWIFT_KEYSTONE_2_TENANTNAME + " is a mandatory 
configuration value");
+
+        URI endpoint = URI.create(endpointStr);
+        Credentials credentials = Credentials.of(crendentialsStr);
+        UserName userName = UserName.of(userNameStr);
+        TenantName tenantName = TenantName.of(tenantNameStr);
+        Identity identity = Identity.of(tenantName, userName);
+
+        Optional<Region> region = Optional.ofNullable(
+            configuration.getString(OBJECTSTORAGE_SWIFT_REGION, null))
+            .map(Region::of);
+
+        return SwiftKeystone2ObjectStorage.configBuilder()
+            .endpoint(endpoint)
+            .credentials(credentials)
+            .region(region)
+            .identity(identity)
+            .build();
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/a4872d69/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/SwiftKeystone3ConfigurationReader.java
----------------------------------------------------------------------
diff --git 
a/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/SwiftKeystone3ConfigurationReader.java
 
b/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/SwiftKeystone3ConfigurationReader.java
new file mode 100644
index 0000000..bc51a89
--- /dev/null
+++ 
b/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/SwiftKeystone3ConfigurationReader.java
@@ -0,0 +1,134 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.modules.objectstorage;
+
+import java.net.URI;
+import java.util.Optional;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.james.blob.objectstorage.swift.Credentials;
+import org.apache.james.blob.objectstorage.swift.DomainId;
+import org.apache.james.blob.objectstorage.swift.DomainName;
+import org.apache.james.blob.objectstorage.swift.IdentityV3;
+import org.apache.james.blob.objectstorage.swift.Project;
+import org.apache.james.blob.objectstorage.swift.ProjectName;
+import org.apache.james.blob.objectstorage.swift.Region;
+import org.apache.james.blob.objectstorage.swift.SwiftKeystone3ObjectStorage;
+import org.apache.james.blob.objectstorage.swift.UserName;
+import org.apache.james.util.OptionalUtils;
+
+import com.google.common.base.Preconditions;
+
+/**
+ * See openstack identity V3 documentation
+ *
+ * @link 
https://developer.openstack.org/api-ref/identity/v3/#authentication-and-token-management
+ */
+public class SwiftKeystone3ConfigurationReader implements 
SwiftConfigurationReader {
+
+    private static final String OBJECTSTORAGE_SWIFT_KEYSTONE_3_USER_NAME =
+        "objectstorage.swift.keystone3.user.name";
+
+    private static final String OBJECTSTORAGE_SWIFT_KEYSTONE_3_USER_DOMAIN =
+        "objectstorage.swift.keystone3.user.domain";
+
+    private static final String OBJECTSTORAGE_SWIFT_KEYSTONE_3_DOMAIN_ID =
+        "objectstorage.swift.keystone3.scope.domainid";
+
+    private static final String OBJECTSTORAGE_SWIFT_KEYSTONE_3_PROJECT_NAME =
+        "objectstorage.swift.keystone3.scope.project.name";
+
+    private static final String 
OBJECTSTORAGE_SWIFT_KEYSTONE_3_PROJECT_DOMAIN_NAME =
+        "objectstorage.swift.keystone3.scope.project.domainname";
+
+    private static final String 
OBJECTSTORAGE_SWIFT_KEYSTONE_3_PROJECT_DOMAIN_ID =
+        "objectstorage.swift.keystone3.scope.project.domainid";
+
+    public static SwiftKeystone3ObjectStorage.Configuration 
readSwiftConfiguration(Configuration configuration) {
+        String endpointStr = 
configuration.getString(OBJECTSTORAGE_SWIFT_ENDPOINT, null);
+        String crendentialsStr = 
configuration.getString(OBJECTSTORAGE_SWIFT_CREDENTIALS, null);
+
+        Preconditions.checkArgument(endpointStr != null,
+            OBJECTSTORAGE_SWIFT_ENDPOINT + " is a mandatory configuration 
value");
+        Preconditions.checkArgument(crendentialsStr != null,
+            OBJECTSTORAGE_SWIFT_CREDENTIALS + " is a mandatory configuration 
value");
+
+        URI endpoint = URI.create(endpointStr);
+        Credentials credentials = Credentials.of(crendentialsStr);
+
+        IdentityV3 identity = readIdentity(configuration);
+
+        Optional<DomainId> domainScope = Optional.ofNullable(
+            configuration.getString(OBJECTSTORAGE_SWIFT_KEYSTONE_3_DOMAIN_ID, 
null))
+            .map(DomainId::of);
+
+        Optional<Project> projectScope = readProjectScope(configuration);
+
+        Optional<Region> region = Optional.ofNullable(
+            configuration.getString(OBJECTSTORAGE_SWIFT_REGION, null))
+            .map(Region::of);
+
+        return SwiftKeystone3ObjectStorage.configBuilder()
+            .endpoint(endpoint)
+            .credentials(credentials)
+            .region(region)
+            .identity(identity)
+            .domainId(domainScope)
+            .project(projectScope)
+            .build();
+    }
+
+    private static IdentityV3 readIdentity(Configuration configuration) {
+        String userNameStr = 
configuration.getString(OBJECTSTORAGE_SWIFT_KEYSTONE_3_USER_NAME, null);
+        String domainNameStr = 
configuration.getString(OBJECTSTORAGE_SWIFT_KEYSTONE_3_USER_DOMAIN, null);
+
+        Preconditions.checkArgument(userNameStr != null,
+            OBJECTSTORAGE_SWIFT_KEYSTONE_3_USER_NAME + " is a mandatory 
configuration value");
+        Preconditions.checkArgument(domainNameStr != null,
+            OBJECTSTORAGE_SWIFT_KEYSTONE_3_USER_DOMAIN + " is a mandatory 
configuration value");
+
+        UserName userName =
+            UserName.of(userNameStr);
+
+        DomainName userDomain =
+            DomainName.of(domainNameStr);
+        return IdentityV3.of(userDomain, userName);
+    }
+
+    private static Optional<Project> readProjectScope(Configuration 
configuration) {
+        Optional<ProjectName> projectName = Optional.ofNullable(
+            
configuration.getString(OBJECTSTORAGE_SWIFT_KEYSTONE_3_PROJECT_NAME, null))
+            .map(ProjectName::of);
+
+        Optional<DomainName> projectDomainName = Optional.ofNullable(
+            
configuration.getString(OBJECTSTORAGE_SWIFT_KEYSTONE_3_PROJECT_DOMAIN_NAME, 
null))
+            .map(DomainName::of);
+
+        Optional<DomainId> projectDomainId = Optional.ofNullable(
+            
configuration.getString(OBJECTSTORAGE_SWIFT_KEYSTONE_3_PROJECT_DOMAIN_ID, null))
+            .map(DomainId::of);
+
+        return OptionalUtils.or(
+            projectName.flatMap(project -> projectDomainName.map(domain -> 
Project.of(project, domain))),
+            projectName.flatMap(project -> projectDomainId.map(domain -> 
Project.of(project, domain))),
+            projectName.map(Project::of)
+        );
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/a4872d69/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/SwiftTmpAuthConfigurationReader.java
----------------------------------------------------------------------
diff --git 
a/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/SwiftTmpAuthConfigurationReader.java
 
b/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/SwiftTmpAuthConfigurationReader.java
new file mode 100644
index 0000000..467fa42
--- /dev/null
+++ 
b/server/container/guice/blob-objectstorage-guice/src/main/java/org/apache/james/modules/objectstorage/SwiftTmpAuthConfigurationReader.java
@@ -0,0 +1,90 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.modules.objectstorage;
+
+import java.net.URI;
+import java.util.Optional;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.james.blob.objectstorage.swift.Credentials;
+import org.apache.james.blob.objectstorage.swift.Identity;
+import org.apache.james.blob.objectstorage.swift.PassHeaderName;
+import org.apache.james.blob.objectstorage.swift.Region;
+import org.apache.james.blob.objectstorage.swift.SwiftTempAuthObjectStorage;
+import org.apache.james.blob.objectstorage.swift.TenantName;
+import org.apache.james.blob.objectstorage.swift.UserHeaderName;
+import org.apache.james.blob.objectstorage.swift.UserName;
+
+import com.google.common.base.Preconditions;
+
+public class SwiftTmpAuthConfigurationReader implements 
SwiftConfigurationReader {
+
+    private static final String OBJECTSTORAGE_SWIFT_TEMPAUTH_USERNAME =
+        "objectstorage.swift.tempauth.username";
+    private static final String OBJECTSTORAGE_SWIFT_TEMPAUTH_TENANTNAME =
+        "objectstorage.swift.tempauth.tenantname";
+    private static final String OBJECTSTORAGE_SWIFT_TEMPAUTH_PASS_HEADER_NAME =
+        "objectstorage.swift.tempauth.passheadername";
+    private static final String OBJECTSTORAGE_SWIFT_TEMPAUTH_USER_HEADER_NAME =
+        "objectstorage.swift.tempauth.userheadername";
+
+    public static SwiftTempAuthObjectStorage.Configuration 
readSwiftConfiguration(Configuration configuration) {
+        String endpointStr = 
configuration.getString(OBJECTSTORAGE_SWIFT_ENDPOINT, null);
+        String crendentialsStr = 
configuration.getString(OBJECTSTORAGE_SWIFT_CREDENTIALS, null);
+        String userNameStr = 
configuration.getString(OBJECTSTORAGE_SWIFT_TEMPAUTH_USERNAME, null);
+        String tenantNameStr = 
configuration.getString(OBJECTSTORAGE_SWIFT_TEMPAUTH_TENANTNAME, null);
+
+        Preconditions.checkArgument(endpointStr != null,
+            OBJECTSTORAGE_SWIFT_ENDPOINT + " is a mandatory configuration 
value");
+        Preconditions.checkArgument(crendentialsStr != null,
+            OBJECTSTORAGE_SWIFT_CREDENTIALS + " is a mandatory configuration 
value");
+        Preconditions.checkArgument(userNameStr != null,
+            OBJECTSTORAGE_SWIFT_TEMPAUTH_USERNAME + " is a mandatory 
configuration value");
+        Preconditions.checkArgument(tenantNameStr != null,
+            OBJECTSTORAGE_SWIFT_TEMPAUTH_TENANTNAME + " is a mandatory 
configuration value");
+
+        URI endpoint = URI.create(endpointStr);
+        Credentials credentials = Credentials.of(crendentialsStr);
+        UserName userName = UserName.of(userNameStr);
+        TenantName tenantName = TenantName.of(tenantNameStr);
+        Identity identity = Identity.of(tenantName, userName);
+
+        Optional<Region> region = Optional.ofNullable(
+            
configuration.getString(SwiftConfigurationReader.OBJECTSTORAGE_SWIFT_REGION, 
null))
+            .map(Region::of);
+
+        Optional<PassHeaderName> passHeaderName = Optional.ofNullable(
+            
configuration.getString(OBJECTSTORAGE_SWIFT_TEMPAUTH_PASS_HEADER_NAME, null))
+            .map(PassHeaderName::of);
+
+        Optional<UserHeaderName> userHeaderName = Optional.ofNullable(
+            
configuration.getString(OBJECTSTORAGE_SWIFT_TEMPAUTH_USER_HEADER_NAME, null))
+            .map(UserHeaderName::of);
+
+        return SwiftTempAuthObjectStorage.configBuilder()
+            .endpoint(endpoint)
+            .credentials(credentials)
+            .region(region)
+            .identity(identity)
+            .tempAuthHeaderPassName(passHeaderName)
+            .tempAuthHeaderUserName(userHeaderName)
+            .build();
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/a4872d69/server/container/guice/blob-objectstorage-guice/src/test/java/org/apache/james/modules/objectstorage/SwiftKeystone2ConfigurationReaderTest.java
----------------------------------------------------------------------
diff --git 
a/server/container/guice/blob-objectstorage-guice/src/test/java/org/apache/james/modules/objectstorage/SwiftKeystone2ConfigurationReaderTest.java
 
b/server/container/guice/blob-objectstorage-guice/src/test/java/org/apache/james/modules/objectstorage/SwiftKeystone2ConfigurationReaderTest.java
new file mode 100644
index 0000000..2b6f81b
--- /dev/null
+++ 
b/server/container/guice/blob-objectstorage-guice/src/test/java/org/apache/james/modules/objectstorage/SwiftKeystone2ConfigurationReaderTest.java
@@ -0,0 +1,150 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.modules.objectstorage;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import java.io.StringReader;
+import java.net.URI;
+import java.util.Optional;
+
+import org.apache.commons.configuration.PropertiesConfiguration;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.james.blob.objectstorage.swift.Credentials;
+import org.apache.james.blob.objectstorage.swift.Region;
+import org.apache.james.blob.objectstorage.swift.SwiftKeystone2ObjectStorage;
+import org.apache.james.blob.objectstorage.swift.TenantName;
+import org.apache.james.blob.objectstorage.swift.UserName;
+import org.junit.jupiter.api.Test;
+
+class SwiftKeystone2ConfigurationReaderTest {
+    private static final String ENDPOINT = "http://auth.example.com/v2.0";;
+    private static final String CONFIG_ENDPOINT =
+        "objectstorage.swift.endpoint=" + ENDPOINT;
+
+    private static final String CREDENTIALS = "this_is_a_secret";
+    private static final String CONFIG_CREDENTIALS =
+        "objectstorage.swift.credentials=" + CREDENTIALS;
+
+    private static final String REGION = "EMEA";
+    private static final String CONFIG_REGION =
+        "objectstorage.swift.region=" + REGION;
+
+    private static final String USER_NAME = "user";
+    private static final String CONFIG_USER_NAME =
+        "objectstorage.swift.keystone2.username=" + USER_NAME;
+
+    private static final String TENANT_NAME = "tenant";
+    private static final String CONFIG_TENANT_NAME =
+        "objectstorage.swift.keystone2.tenantname=" + TENANT_NAME;
+
+    @Test
+    void readBasicKeystone2Configuration() throws Exception {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.load(new StringReader(StringUtils.joinWith("\n",
+            CONFIG_ENDPOINT,
+            CONFIG_CREDENTIALS,
+            CONFIG_USER_NAME,
+            CONFIG_TENANT_NAME)));
+        
assertThat(SwiftKeystone2ConfigurationReader.readSwiftConfiguration(configuration))
+            .isEqualTo(
+                SwiftKeystone2ObjectStorage.configBuilder()
+                    .endpoint(URI.create(ENDPOINT))
+                    .credentials(Credentials.of(CREDENTIALS))
+                    .tenantName(TenantName.of(TENANT_NAME))
+                    .userName(UserName.of(USER_NAME))
+                    .build()
+            );
+    }
+
+    @Test
+    void readKeystone2ConfigurationWithRegion() throws Exception {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.load(new StringReader(StringUtils.joinWith("\n",
+            CONFIG_ENDPOINT,
+            CONFIG_CREDENTIALS,
+            CONFIG_USER_NAME,
+            CONFIG_TENANT_NAME,
+            CONFIG_REGION)));
+        
assertThat(SwiftKeystone2ConfigurationReader.readSwiftConfiguration(configuration))
+            .isEqualTo(
+                SwiftKeystone2ObjectStorage.configBuilder()
+                    .endpoint(URI.create(ENDPOINT))
+                    .credentials(Credentials.of(CREDENTIALS))
+                    .tenantName(TenantName.of(TENANT_NAME))
+                    .userName(UserName.of(USER_NAME))
+                    .region(Optional.of(Region.of(REGION)))
+                    .build()
+            );
+    }
+
+    @Test
+    void failToReadSwiftKeyston2ConfigurationWhenMissingEndpoint() throws 
Exception {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.load(new StringReader(StringUtils.joinWith("\n",
+            CONFIG_CREDENTIALS,
+            CONFIG_USER_NAME,
+            CONFIG_TENANT_NAME,
+            CONFIG_REGION)));
+        assertThatThrownBy(() ->
+            
SwiftKeystone2ConfigurationReader.readSwiftConfiguration(configuration))
+            .isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    void failToReadSwiftKeyston2ConfigurationWhenMissingCrendentials() throws 
Exception {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.load(new StringReader(StringUtils.joinWith("\n",
+            CONFIG_ENDPOINT,
+            CONFIG_USER_NAME,
+            CONFIG_TENANT_NAME,
+            CONFIG_REGION)));
+        assertThatThrownBy(() ->
+            
SwiftKeystone2ConfigurationReader.readSwiftConfiguration(configuration))
+            .isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    void failToReadSwiftKeyston2ConfigurationWhenMissingUserName() throws 
Exception {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.load(new StringReader(StringUtils.joinWith("\n",
+            CONFIG_ENDPOINT,
+            CONFIG_CREDENTIALS,
+            CONFIG_TENANT_NAME,
+            CONFIG_REGION)));
+        assertThatThrownBy(() ->
+            
SwiftKeystone2ConfigurationReader.readSwiftConfiguration(configuration))
+            .isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    void failToReadSwiftKeyston2ConfigurationWhenMissingTenantName() throws 
Exception {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.load(new StringReader(StringUtils.joinWith("\n",
+            CONFIG_ENDPOINT,
+            CONFIG_CREDENTIALS,
+            CONFIG_USER_NAME,
+            CONFIG_REGION)));
+        assertThatThrownBy(() ->
+            
SwiftKeystone2ConfigurationReader.readSwiftConfiguration(configuration))
+            .isInstanceOf(IllegalArgumentException.class);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/a4872d69/server/container/guice/blob-objectstorage-guice/src/test/java/org/apache/james/modules/objectstorage/SwiftKeystone3ConfigurationReaderTest.java
----------------------------------------------------------------------
diff --git 
a/server/container/guice/blob-objectstorage-guice/src/test/java/org/apache/james/modules/objectstorage/SwiftKeystone3ConfigurationReaderTest.java
 
b/server/container/guice/blob-objectstorage-guice/src/test/java/org/apache/james/modules/objectstorage/SwiftKeystone3ConfigurationReaderTest.java
new file mode 100644
index 0000000..0d1dbf0
--- /dev/null
+++ 
b/server/container/guice/blob-objectstorage-guice/src/test/java/org/apache/james/modules/objectstorage/SwiftKeystone3ConfigurationReaderTest.java
@@ -0,0 +1,254 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.modules.objectstorage;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import java.io.StringReader;
+import java.net.URI;
+import java.util.Optional;
+
+import org.apache.commons.configuration.PropertiesConfiguration;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.james.blob.objectstorage.swift.Credentials;
+import org.apache.james.blob.objectstorage.swift.DomainId;
+import org.apache.james.blob.objectstorage.swift.DomainName;
+import org.apache.james.blob.objectstorage.swift.IdentityV3;
+import org.apache.james.blob.objectstorage.swift.Project;
+import org.apache.james.blob.objectstorage.swift.ProjectName;
+import org.apache.james.blob.objectstorage.swift.Region;
+import org.apache.james.blob.objectstorage.swift.SwiftKeystone3ObjectStorage;
+import org.apache.james.blob.objectstorage.swift.UserName;
+import org.junit.jupiter.api.Test;
+
+class SwiftKeystone3ConfigurationReaderTest {
+    private static final String ENDPOINT = "http://auth.example.com/v2.0";;
+    private static final String CONFIG_ENDPOINT =
+        "objectstorage.swift.endpoint=" + ENDPOINT;
+
+    private static final String CREDENTIALS = "this_is_a_secret";
+    private static final String CONFIG_CREDENTIALS =
+        "objectstorage.swift.credentials=" + CREDENTIALS;
+
+    private static final String REGION = "EMEA";
+    private static final String CONFIG_REGION =
+        "objectstorage.swift.region=" + REGION;
+
+    private static final String USER_NAME = "user";
+    private static final String CONFIG_USER_NAME =
+        "objectstorage.swift.keystone3.user.name=" + USER_NAME;
+
+    private static final String USER_DOMAIN_NAME = "user_domain";
+    private static final String CONFIG_USER_DOMAIN_NAME =
+        "objectstorage.swift.keystone3.user.domain=" + USER_DOMAIN_NAME;
+
+    private static final String SCOPE_DOMAIN_ID = "scope_domain";
+    private static final String CONFIG_SCOPE_DOMAIN_ID =
+        "objectstorage.swift.keystone3.scope.domainid=" + SCOPE_DOMAIN_ID;
+
+    private static final String SCOPE_PROJECT_NAME = "scope_project_name";
+    private static final String CONFIG_SCOPE_PROJECT_NAME =
+        "objectstorage.swift.keystone3.scope.project.name=" + 
SCOPE_PROJECT_NAME;
+    private static final String SCOPE_PROJECT_DOMAIN_NAME = 
"scope_project_domain_name";
+    private static final String CONFIG_SCOPE_PROJECT_DOMAIN_NAME =
+        "objectstorage.swift.keystone3.scope.project.domainname=" + 
SCOPE_PROJECT_DOMAIN_NAME;
+    private static final String SCOPE_PROJECT_DOMAIN_ID = 
"scope_project_domain_id";
+    private static final String CONFIG_SCOPE_PROJECT_DOMAIN_ID =
+        "objectstorage.swift.keystone3.scope.project.domainid=" + 
SCOPE_PROJECT_DOMAIN_ID;
+
+    @Test
+    void readUnscopedKeystone3Configuration() throws Exception {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.load(new StringReader(StringUtils.joinWith("\n",
+            CONFIG_ENDPOINT,
+            CONFIG_CREDENTIALS,
+            CONFIG_USER_NAME,
+            CONFIG_USER_DOMAIN_NAME)));
+        
assertThat(SwiftKeystone3ConfigurationReader.readSwiftConfiguration(configuration))
+            .isEqualTo(
+                SwiftKeystone3ObjectStorage.configBuilder()
+                    .endpoint(URI.create(ENDPOINT))
+                    .credentials(Credentials.of(CREDENTIALS))
+                    .identity(IdentityV3.of(DomainName.of(USER_DOMAIN_NAME), 
UserName.of(USER_NAME)))
+                    .build()
+            );
+    }
+
+    @Test
+    void readUnscopedKeystone3ConfigurationWithRegion() throws Exception {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.load(new StringReader(StringUtils.joinWith("\n",
+            CONFIG_ENDPOINT,
+            CONFIG_CREDENTIALS,
+            CONFIG_USER_NAME,
+            CONFIG_USER_DOMAIN_NAME,
+            CONFIG_REGION)));
+        
assertThat(SwiftKeystone3ConfigurationReader.readSwiftConfiguration(configuration))
+            .isEqualTo(
+                SwiftKeystone3ObjectStorage.configBuilder()
+                    .endpoint(URI.create(ENDPOINT))
+                    .credentials(Credentials.of(CREDENTIALS))
+                    .identity(IdentityV3.of(DomainName.of(USER_DOMAIN_NAME), 
UserName.of(USER_NAME)))
+                    .region(Optional.of(Region.of(REGION)))
+                    .build()
+            );
+    }
+
+    @Test
+    void failsToReadKeystone3ConfigurationWithoutEndpoint() throws Exception {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.load(new StringReader(StringUtils.joinWith("\n",
+            CONFIG_CREDENTIALS,
+            CONFIG_USER_NAME,
+            CONFIG_USER_DOMAIN_NAME)));
+        assertThatThrownBy(() -> 
SwiftKeystone3ConfigurationReader.readSwiftConfiguration(configuration))
+            .isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    void failsToReadKeystone3ConfigurationWithoutCredentials() throws 
Exception {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.load(new StringReader(StringUtils.joinWith("\n",
+            CONFIG_ENDPOINT,
+            CONFIG_USER_NAME,
+            CONFIG_USER_DOMAIN_NAME)));
+        assertThatThrownBy(() -> 
SwiftKeystone3ConfigurationReader.readSwiftConfiguration(configuration))
+            .isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    void failsToReadKeystone3ConfigurationWithoutUserName() throws Exception {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.load(new StringReader(StringUtils.joinWith("\n",
+            CONFIG_ENDPOINT,
+            CONFIG_CREDENTIALS,
+            CONFIG_USER_DOMAIN_NAME)));
+        assertThatThrownBy(() -> 
SwiftKeystone3ConfigurationReader.readSwiftConfiguration(configuration))
+            .isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    void failsToReadKeystone3ConfigurationWithoutUserDomainName() throws 
Exception {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.load(new StringReader(StringUtils.joinWith("\n",
+            CONFIG_ENDPOINT,
+            CONFIG_CREDENTIALS,
+            CONFIG_USER_NAME)));
+        assertThatThrownBy(() -> 
SwiftKeystone3ConfigurationReader.readSwiftConfiguration(configuration))
+            .isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    void readDomainScopedKeystone3Configuration() throws Exception {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.load(new StringReader(StringUtils.joinWith("\n",
+            CONFIG_ENDPOINT,
+            CONFIG_CREDENTIALS,
+            CONFIG_USER_NAME,
+            CONFIG_USER_DOMAIN_NAME,
+            CONFIG_SCOPE_DOMAIN_ID)));
+        
assertThat(SwiftKeystone3ConfigurationReader.readSwiftConfiguration(configuration))
+            .isEqualTo(
+                SwiftKeystone3ObjectStorage.configBuilder()
+                    .endpoint(URI.create(ENDPOINT))
+                    .credentials(Credentials.of(CREDENTIALS))
+                    .identity(IdentityV3.of(DomainName.of(USER_DOMAIN_NAME), 
UserName.of(USER_NAME)))
+                    .domainId(DomainId.of(SCOPE_DOMAIN_ID))
+                    .build()
+            );
+    }
+
+    @Test
+    void readProjectScopedKeystone3Configuration() throws Exception {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.load(new StringReader(StringUtils.joinWith("\n",
+            CONFIG_ENDPOINT,
+            CONFIG_CREDENTIALS,
+            CONFIG_USER_NAME,
+            CONFIG_USER_DOMAIN_NAME,
+            CONFIG_SCOPE_PROJECT_NAME,
+            CONFIG_REGION)));
+        
assertThat(SwiftKeystone3ConfigurationReader.readSwiftConfiguration(configuration))
+            .isEqualTo(
+                SwiftKeystone3ObjectStorage.configBuilder()
+                    .endpoint(URI.create(ENDPOINT))
+                    .credentials(Credentials.of(CREDENTIALS))
+                    .identity(IdentityV3.of(DomainName.of(USER_DOMAIN_NAME), 
UserName.of(USER_NAME)))
+                    .region(Optional.of(Region.of(REGION)))
+                    .project(Project.of(ProjectName.of(SCOPE_PROJECT_NAME)))
+                    .build()
+            );
+    }
+
+    @Test
+    void readProjectOfDomainNameScopedKeystone3Configuration() throws 
Exception {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.load(new StringReader(StringUtils.joinWith("\n",
+            CONFIG_ENDPOINT,
+            CONFIG_CREDENTIALS,
+            CONFIG_USER_NAME,
+            CONFIG_USER_DOMAIN_NAME,
+            CONFIG_SCOPE_PROJECT_NAME,
+            CONFIG_SCOPE_PROJECT_DOMAIN_NAME,
+            CONFIG_REGION)));
+        
assertThat(SwiftKeystone3ConfigurationReader.readSwiftConfiguration(configuration))
+            .isEqualTo(
+                SwiftKeystone3ObjectStorage.configBuilder()
+                    .endpoint(URI.create(ENDPOINT))
+                    .credentials(Credentials.of(CREDENTIALS))
+                    .identity(IdentityV3.of(
+                        DomainName.of(USER_DOMAIN_NAME),
+                        UserName.of(USER_NAME)))
+                    .region(Optional.of(Region.of(REGION)))
+                    .project(Project.of(
+                        ProjectName.of(SCOPE_PROJECT_NAME),
+                        DomainName.of(SCOPE_PROJECT_DOMAIN_NAME)))
+                    .build()
+            );
+    }
+
+    @Test
+    void readProjectOfDomainIdScopedKeystone3Configuration() throws Exception {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.load(new StringReader(StringUtils.joinWith("\n",
+            CONFIG_ENDPOINT,
+            CONFIG_CREDENTIALS,
+            CONFIG_USER_NAME,
+            CONFIG_USER_DOMAIN_NAME,
+            CONFIG_SCOPE_PROJECT_NAME,
+            CONFIG_SCOPE_PROJECT_DOMAIN_ID,
+            CONFIG_REGION)));
+        
assertThat(SwiftKeystone3ConfigurationReader.readSwiftConfiguration(configuration))
+            .isEqualTo(
+                SwiftKeystone3ObjectStorage.configBuilder()
+                    .endpoint(URI.create(ENDPOINT))
+                    .credentials(Credentials.of(CREDENTIALS))
+                    .identity(IdentityV3.of(
+                        DomainName.of(USER_DOMAIN_NAME),
+                        UserName.of(USER_NAME)))
+                    .region(Optional.of(Region.of(REGION)))
+                    .project(Project.of(
+                        ProjectName.of(SCOPE_PROJECT_NAME),
+                        DomainId.of(SCOPE_PROJECT_DOMAIN_ID)))
+                    .build()
+            );
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/a4872d69/server/container/guice/blob-objectstorage-guice/src/test/java/org/apache/james/modules/objectstorage/SwiftTmpAuthConfigurationReaderTest.java
----------------------------------------------------------------------
diff --git 
a/server/container/guice/blob-objectstorage-guice/src/test/java/org/apache/james/modules/objectstorage/SwiftTmpAuthConfigurationReaderTest.java
 
b/server/container/guice/blob-objectstorage-guice/src/test/java/org/apache/james/modules/objectstorage/SwiftTmpAuthConfigurationReaderTest.java
new file mode 100644
index 0000000..f5c2b7e
--- /dev/null
+++ 
b/server/container/guice/blob-objectstorage-guice/src/test/java/org/apache/james/modules/objectstorage/SwiftTmpAuthConfigurationReaderTest.java
@@ -0,0 +1,183 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.modules.objectstorage;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+import java.io.StringReader;
+import java.net.URI;
+import java.util.Optional;
+
+import org.apache.commons.configuration.PropertiesConfiguration;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.james.blob.objectstorage.swift.Credentials;
+import org.apache.james.blob.objectstorage.swift.PassHeaderName;
+import org.apache.james.blob.objectstorage.swift.Region;
+import org.apache.james.blob.objectstorage.swift.SwiftTempAuthObjectStorage;
+import org.apache.james.blob.objectstorage.swift.TenantName;
+import org.apache.james.blob.objectstorage.swift.UserHeaderName;
+import org.apache.james.blob.objectstorage.swift.UserName;
+import org.junit.jupiter.api.Test;
+
+class SwiftTmpAuthConfigurationReaderTest {
+    private static final String ENDPOINT = "http://auth.example.com/v2.0";;
+    private static final String CONFIG_ENDPOINT =
+        "objectstorage.swift.endpoint=" + ENDPOINT;
+
+    private static final String CREDENTIALS = "this_is_a_secret";
+    private static final String CONFIG_CREDENTIALS =
+        "objectstorage.swift.credentials=" + CREDENTIALS;
+
+    private static final String REGION = "EMEA";
+    private static final String CONFIG_REGION =
+        "objectstorage.swift.region=" + REGION;
+
+    private static final String USER_NAME = "user";
+    private static final String CONFIG_USER_NAME =
+        "objectstorage.swift.tempauth.username=" + USER_NAME;
+
+    private static final String TENANT_NAME = "tenant";
+    private static final String CONFIG_TENANT_NAME =
+        "objectstorage.swift.tempauth.tenantname=" + TENANT_NAME;
+
+    private static final String PASS_HEADER_NAME = "X-Pass-Header";
+    private static final String CONFIG_PASS_HEADER_NAME =
+        "objectstorage.swift.tempauth.passheadername=" + PASS_HEADER_NAME;
+
+    private static final String USER_HEADER_NAME = "X-User-Header";
+    private static final String CONFIG_USER_HEADER_NAME =
+        "objectstorage.swift.tempauth.userheadername=" + USER_HEADER_NAME;
+
+    @Test
+    void readBasicTempAuthConfiguration() throws Exception {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.load(new StringReader(StringUtils.joinWith("\n",
+            CONFIG_ENDPOINT,
+            CONFIG_CREDENTIALS,
+            CONFIG_USER_NAME,
+            CONFIG_TENANT_NAME)));
+        
assertThat(SwiftTmpAuthConfigurationReader.readSwiftConfiguration(configuration))
+            .isEqualTo(
+                SwiftTempAuthObjectStorage.configBuilder()
+                    .endpoint(URI.create(ENDPOINT))
+                    .credentials(Credentials.of(CREDENTIALS))
+                    .tenantName(TenantName.of(TENANT_NAME))
+                    .userName(UserName.of(USER_NAME))
+                    .build()
+            );
+    }
+
+    @Test
+    void readKeystone2ConfigurationWithRegion() throws Exception {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.load(new StringReader(StringUtils.joinWith("\n",
+            CONFIG_ENDPOINT,
+            CONFIG_CREDENTIALS,
+            CONFIG_USER_NAME,
+            CONFIG_TENANT_NAME,
+            CONFIG_REGION)));
+        
assertThat(SwiftTmpAuthConfigurationReader.readSwiftConfiguration(configuration))
+            .isEqualTo(
+                SwiftTempAuthObjectStorage.configBuilder()
+                    .endpoint(URI.create(ENDPOINT))
+                    .credentials(Credentials.of(CREDENTIALS))
+                    .tenantName(TenantName.of(TENANT_NAME))
+                    .userName(UserName.of(USER_NAME))
+                    .region(Optional.of(Region.of(REGION)))
+                    .build()
+            );
+    }
+
+    @Test
+    void readKeystone2ConfigurationWithCustomTempAuthHeaders() throws 
Exception {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.load(new StringReader(StringUtils.joinWith("\n",
+            CONFIG_ENDPOINT,
+            CONFIG_CREDENTIALS,
+            CONFIG_USER_NAME,
+            CONFIG_TENANT_NAME,
+            CONFIG_USER_HEADER_NAME,
+            CONFIG_PASS_HEADER_NAME)));
+        
assertThat(SwiftTmpAuthConfigurationReader.readSwiftConfiguration(configuration))
+            .isEqualTo(
+                SwiftTempAuthObjectStorage.configBuilder()
+                    .endpoint(URI.create(ENDPOINT))
+                    .credentials(Credentials.of(CREDENTIALS))
+                    .tenantName(TenantName.of(TENANT_NAME))
+                    .userName(UserName.of(USER_NAME))
+                    
.tempAuthHeaderUserName(UserHeaderName.of(USER_HEADER_NAME))
+                    
.tempAuthHeaderPassName(PassHeaderName.of(PASS_HEADER_NAME))
+                    .build()
+            );
+    }
+
+    @Test
+    void failToReadSwiftKeyston2ConfigurationWhenMissingEndpoint() throws 
Exception {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.load(new StringReader(StringUtils.joinWith("\n",
+            CONFIG_CREDENTIALS,
+            CONFIG_USER_NAME,
+            CONFIG_TENANT_NAME,
+            CONFIG_REGION)));
+        assertThatThrownBy(() ->
+            
SwiftTmpAuthConfigurationReader.readSwiftConfiguration(configuration))
+            .isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    void failToReadSwiftKeyston2ConfigurationWhenMissingCrendentials() throws 
Exception {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.load(new StringReader(StringUtils.joinWith("\n",
+            CONFIG_ENDPOINT,
+            CONFIG_USER_NAME,
+            CONFIG_TENANT_NAME,
+            CONFIG_REGION)));
+        assertThatThrownBy(() ->
+            
SwiftTmpAuthConfigurationReader.readSwiftConfiguration(configuration))
+            .isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    void failToReadSwiftKeyston2ConfigurationWhenMissingUserName() throws 
Exception {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.load(new StringReader(StringUtils.joinWith("\n",
+            CONFIG_ENDPOINT,
+            CONFIG_CREDENTIALS,
+            CONFIG_TENANT_NAME,
+            CONFIG_REGION)));
+        assertThatThrownBy(() ->
+            
SwiftTmpAuthConfigurationReader.readSwiftConfiguration(configuration))
+            .isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    void failToReadSwiftKeyston2ConfigurationWhenMissingTenantName() throws 
Exception {
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        configuration.load(new StringReader(StringUtils.joinWith("\n",
+            CONFIG_ENDPOINT,
+            CONFIG_CREDENTIALS,
+            CONFIG_USER_NAME,
+            CONFIG_REGION)));
+        assertThatThrownBy(() ->
+            
SwiftTmpAuthConfigurationReader.readSwiftConfiguration(configuration))
+            .isInstanceOf(IllegalArgumentException.class);
+    }
+}
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org
For additional commands, e-mail: server-dev-h...@james.apache.org

Reply via email to