This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch CAMEL-20281-s3
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 3ce9bbe58fba59d17cefd5361ee9e8a9b5ba45e4
Author: Andrea Cosentino <[email protected]>
AuthorDate: Wed Jan 17 11:18:50 2024 +0100

    CAMEL-20281 - Camel-AWS Components: Make it possible to use 
AwsSessionCredentials to support temporary credentials - AWS S3
    
    Signed-off-by: Andrea Cosentino <[email protected]>
---
 .../aws2/s3/AWS2S3ComponentConfigurer.java         |  12 +++
 .../aws2/s3/AWS2S3EndpointConfigurer.java          |  12 +++
 .../aws2/s3/AWS2S3EndpointUriFactory.java          |   7 +-
 .../apache/camel/component/aws2/s3/aws2-s3.json    |  16 +--
 .../camel/component/aws2/s3/AWS2S3Component.java   |   3 +-
 .../component/aws2/s3/AWS2S3Configuration.java     |  27 +++++
 .../aws2/s3/client/AWS2S3ClientFactory.java        |   3 +
 .../client/impl/AWS2S3ClientSessionTokenImpl.java  | 113 +++++++++++++++++++++
 .../component/aws2/s3/AWSS3ClientFactoryTest.java  |   9 ++
 9 files changed, 193 insertions(+), 9 deletions(-)

diff --git 
a/components/camel-aws/camel-aws2-s3/src/generated/java/org/apache/camel/component/aws2/s3/AWS2S3ComponentConfigurer.java
 
b/components/camel-aws/camel-aws2-s3/src/generated/java/org/apache/camel/component/aws2/s3/AWS2S3ComponentConfigurer.java
index 81b59e85887..35deeea6eaa 100644
--- 
a/components/camel-aws/camel-aws2-s3/src/generated/java/org/apache/camel/component/aws2/s3/AWS2S3ComponentConfigurer.java
+++ 
b/components/camel-aws/camel-aws2-s3/src/generated/java/org/apache/camel/component/aws2/s3/AWS2S3ComponentConfigurer.java
@@ -116,6 +116,8 @@ public class AWS2S3ComponentConfigurer extends 
PropertyConfigurerSupport impleme
         case "restartingPolicy": 
getOrCreateConfiguration(target).setRestartingPolicy(property(camelContext, 
org.apache.camel.component.aws2.s3.stream.AWSS3RestartingPolicyEnum.class, 
value)); return true;
         case "secretkey":
         case "secretKey": 
getOrCreateConfiguration(target).setSecretKey(property(camelContext, 
java.lang.String.class, value)); return true;
+        case "sessiontoken":
+        case "sessionToken": 
getOrCreateConfiguration(target).setSessionToken(property(camelContext, 
java.lang.String.class, value)); return true;
         case "storageclass":
         case "storageClass": 
getOrCreateConfiguration(target).setStorageClass(property(camelContext, 
java.lang.String.class, value)); return true;
         case "streaminguploadmode":
@@ -136,6 +138,8 @@ public class AWS2S3ComponentConfigurer extends 
PropertyConfigurerSupport impleme
         case "useProfileCredentialsProvider": 
getOrCreateConfiguration(target).setUseProfileCredentialsProvider(property(camelContext,
 boolean.class, value)); return true;
         case "usesses3":
         case "useSSES3": 
getOrCreateConfiguration(target).setUseSSES3(property(camelContext, 
boolean.class, value)); return true;
+        case "usesessioncredentials":
+        case "useSessionCredentials": 
getOrCreateConfiguration(target).setUseSessionCredentials(property(camelContext,
 boolean.class, value)); return true;
         default: return false;
         }
     }
@@ -236,6 +240,8 @@ public class AWS2S3ComponentConfigurer extends 
PropertyConfigurerSupport impleme
         case "restartingPolicy": return 
org.apache.camel.component.aws2.s3.stream.AWSS3RestartingPolicyEnum.class;
         case "secretkey":
         case "secretKey": return java.lang.String.class;
+        case "sessiontoken":
+        case "sessionToken": return java.lang.String.class;
         case "storageclass":
         case "storageClass": return java.lang.String.class;
         case "streaminguploadmode":
@@ -256,6 +262,8 @@ public class AWS2S3ComponentConfigurer extends 
PropertyConfigurerSupport impleme
         case "useProfileCredentialsProvider": return boolean.class;
         case "usesses3":
         case "useSSES3": return boolean.class;
+        case "usesessioncredentials":
+        case "useSessionCredentials": return boolean.class;
         default: return null;
         }
     }
@@ -352,6 +360,8 @@ public class AWS2S3ComponentConfigurer extends 
PropertyConfigurerSupport impleme
         case "restartingPolicy": return 
getOrCreateConfiguration(target).getRestartingPolicy();
         case "secretkey":
         case "secretKey": return 
getOrCreateConfiguration(target).getSecretKey();
+        case "sessiontoken":
+        case "sessionToken": return 
getOrCreateConfiguration(target).getSessionToken();
         case "storageclass":
         case "storageClass": return 
getOrCreateConfiguration(target).getStorageClass();
         case "streaminguploadmode":
@@ -372,6 +382,8 @@ public class AWS2S3ComponentConfigurer extends 
PropertyConfigurerSupport impleme
         case "useProfileCredentialsProvider": return 
getOrCreateConfiguration(target).isUseProfileCredentialsProvider();
         case "usesses3":
         case "useSSES3": return getOrCreateConfiguration(target).isUseSSES3();
+        case "usesessioncredentials":
+        case "useSessionCredentials": return 
getOrCreateConfiguration(target).isUseSessionCredentials();
         default: return null;
         }
     }
diff --git 
a/components/camel-aws/camel-aws2-s3/src/generated/java/org/apache/camel/component/aws2/s3/AWS2S3EndpointConfigurer.java
 
b/components/camel-aws/camel-aws2-s3/src/generated/java/org/apache/camel/component/aws2/s3/AWS2S3EndpointConfigurer.java
index 2b040c6327c..dadba625d37 100644
--- 
a/components/camel-aws/camel-aws2-s3/src/generated/java/org/apache/camel/component/aws2/s3/AWS2S3EndpointConfigurer.java
+++ 
b/components/camel-aws/camel-aws2-s3/src/generated/java/org/apache/camel/component/aws2/s3/AWS2S3EndpointConfigurer.java
@@ -133,6 +133,8 @@ public class AWS2S3EndpointConfigurer extends 
PropertyConfigurerSupport implemen
         case "secretKey": 
target.getConfiguration().setSecretKey(property(camelContext, 
java.lang.String.class, value)); return true;
         case "sendemptymessagewhenidle":
         case "sendEmptyMessageWhenIdle": 
target.setSendEmptyMessageWhenIdle(property(camelContext, boolean.class, 
value)); return true;
+        case "sessiontoken":
+        case "sessionToken": 
target.getConfiguration().setSessionToken(property(camelContext, 
java.lang.String.class, value)); return true;
         case "startscheduler":
         case "startScheduler": target.setStartScheduler(property(camelContext, 
boolean.class, value)); return true;
         case "storageclass":
@@ -159,6 +161,8 @@ public class AWS2S3EndpointConfigurer extends 
PropertyConfigurerSupport implemen
         case "useProfileCredentialsProvider": 
target.getConfiguration().setUseProfileCredentialsProvider(property(camelContext,
 boolean.class, value)); return true;
         case "usesses3":
         case "useSSES3": 
target.getConfiguration().setUseSSES3(property(camelContext, boolean.class, 
value)); return true;
+        case "usesessioncredentials":
+        case "useSessionCredentials": 
target.getConfiguration().setUseSessionCredentials(property(camelContext, 
boolean.class, value)); return true;
         default: return false;
         }
     }
@@ -283,6 +287,8 @@ public class AWS2S3EndpointConfigurer extends 
PropertyConfigurerSupport implemen
         case "secretKey": return java.lang.String.class;
         case "sendemptymessagewhenidle":
         case "sendEmptyMessageWhenIdle": return boolean.class;
+        case "sessiontoken":
+        case "sessionToken": return java.lang.String.class;
         case "startscheduler":
         case "startScheduler": return boolean.class;
         case "storageclass":
@@ -309,6 +315,8 @@ public class AWS2S3EndpointConfigurer extends 
PropertyConfigurerSupport implemen
         case "useProfileCredentialsProvider": return boolean.class;
         case "usesses3":
         case "useSSES3": return boolean.class;
+        case "usesessioncredentials":
+        case "useSessionCredentials": return boolean.class;
         default: return null;
         }
     }
@@ -429,6 +437,8 @@ public class AWS2S3EndpointConfigurer extends 
PropertyConfigurerSupport implemen
         case "secretKey": return target.getConfiguration().getSecretKey();
         case "sendemptymessagewhenidle":
         case "sendEmptyMessageWhenIdle": return 
target.isSendEmptyMessageWhenIdle();
+        case "sessiontoken":
+        case "sessionToken": return 
target.getConfiguration().getSessionToken();
         case "startscheduler":
         case "startScheduler": return target.isStartScheduler();
         case "storageclass":
@@ -455,6 +465,8 @@ public class AWS2S3EndpointConfigurer extends 
PropertyConfigurerSupport implemen
         case "useProfileCredentialsProvider": return 
target.getConfiguration().isUseProfileCredentialsProvider();
         case "usesses3":
         case "useSSES3": return target.getConfiguration().isUseSSES3();
+        case "usesessioncredentials":
+        case "useSessionCredentials": return 
target.getConfiguration().isUseSessionCredentials();
         default: return null;
         }
     }
diff --git 
a/components/camel-aws/camel-aws2-s3/src/generated/java/org/apache/camel/component/aws2/s3/AWS2S3EndpointUriFactory.java
 
b/components/camel-aws/camel-aws2-s3/src/generated/java/org/apache/camel/component/aws2/s3/AWS2S3EndpointUriFactory.java
index c8c5f334dcb..124382bd471 100644
--- 
a/components/camel-aws/camel-aws2-s3/src/generated/java/org/apache/camel/component/aws2/s3/AWS2S3EndpointUriFactory.java
+++ 
b/components/camel-aws/camel-aws2-s3/src/generated/java/org/apache/camel/component/aws2/s3/AWS2S3EndpointUriFactory.java
@@ -21,7 +21,7 @@ public class AWS2S3EndpointUriFactory extends 
org.apache.camel.support.component
     private static final Set<String> SECRET_PROPERTY_NAMES;
     private static final Set<String> MULTI_VALUE_PREFIXES;
     static {
-        Set<String> props = new HashSet<>(74);
+        Set<String> props = new HashSet<>(76);
         props.add("accessKey");
         props.add("amazonS3Client");
         props.add("amazonS3Presigner");
@@ -83,6 +83,7 @@ public class AWS2S3EndpointUriFactory extends 
org.apache.camel.support.component
         props.add("schedulerProperties");
         props.add("secretKey");
         props.add("sendEmptyMessageWhenIdle");
+        props.add("sessionToken");
         props.add("startScheduler");
         props.add("storageClass");
         props.add("streamingUploadMode");
@@ -96,10 +97,12 @@ public class AWS2S3EndpointUriFactory extends 
org.apache.camel.support.component
         props.add("useFixedDelay");
         props.add("useProfileCredentialsProvider");
         props.add("useSSES3");
+        props.add("useSessionCredentials");
         PROPERTY_NAMES = Collections.unmodifiableSet(props);
-        Set<String> secretProps = new HashSet<>(2);
+        Set<String> secretProps = new HashSet<>(3);
         secretProps.add("accessKey");
         secretProps.add("secretKey");
+        secretProps.add("sessionToken");
         SECRET_PROPERTY_NAMES = Collections.unmodifiableSet(secretProps);
         Set<String> prefixes = new HashSet<>(1);
         prefixes.add("scheduler.");
diff --git 
a/components/camel-aws/camel-aws2-s3/src/generated/resources/org/apache/camel/component/aws2/s3/aws2-s3.json
 
b/components/camel-aws/camel-aws2-s3/src/generated/resources/org/apache/camel/component/aws2/s3/aws2-s3.json
index c0218718c11..a5f6499577f 100644
--- 
a/components/camel-aws/camel-aws2-s3/src/generated/resources/org/apache/camel/component/aws2/s3/aws2-s3.json
+++ 
b/components/camel-aws/camel-aws2-s3/src/generated/resources/org/apache/camel/component/aws2/s3/aws2-s3.json
@@ -77,9 +77,11 @@
     "accessKey": { "index": 51, "kind": "property", "displayName": "Access 
Key", "group": "security", "label": "security", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": true, "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"configuration", "description": "Amazon AWS Access Key" },
     "profileCredentialsName": { "index": 52, "kind": "property", 
"displayName": "Profile Credentials Name", "group": "security", "label": 
"security", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"configurationClass": "org.apache.camel.component.aws2.s3.AWS2S3Configuration", 
"configurationField": "configuration", "description": "If using a profile 
credentials provider this parameter will set the profile name" },
     "secretKey": { "index": 53, "kind": "property", "displayName": "Secret 
Key", "group": "security", "label": "security", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": true, "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"configuration", "description": "Amazon AWS Secret Key" },
-    "trustAllCertificates": { "index": 54, "kind": "property", "displayName": 
"Trust All Certificates", "group": "security", "label": "security", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, 
"configurationClass": "org.apache.camel.component.aws2.s3.AWS2S3Configuration", 
"configurationField": "configuration", "description": "If we want to trust all 
certificates in case of overriding the endpoint" },
-    "useDefaultCredentialsProvider": { "index": 55, "kind": "property", 
"displayName": "Use Default Credentials Provider", "group": "security", 
"label": "security", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"configuration", "description": "Set whether the S3 client should expect to 
load cr [...]
-    "useProfileCredentialsProvider": { "index": 56, "kind": "property", 
"displayName": "Use Profile Credentials Provider", "group": "security", 
"label": "security", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"configuration", "description": "Set whether the S3 client should expect to 
load cr [...]
+    "sessionToken": { "index": 54, "kind": "property", "displayName": "Session 
Token", "group": "security", "label": "security", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": true, "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"configuration", "description": "Amazon AWS Session Token used when the user 
needs to assume a IAM role" },
+    "trustAllCertificates": { "index": 55, "kind": "property", "displayName": 
"Trust All Certificates", "group": "security", "label": "security", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, 
"configurationClass": "org.apache.camel.component.aws2.s3.AWS2S3Configuration", 
"configurationField": "configuration", "description": "If we want to trust all 
certificates in case of overriding the endpoint" },
+    "useDefaultCredentialsProvider": { "index": 56, "kind": "property", 
"displayName": "Use Default Credentials Provider", "group": "security", 
"label": "security", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"configuration", "description": "Set whether the S3 client should expect to 
load cr [...]
+    "useProfileCredentialsProvider": { "index": 57, "kind": "property", 
"displayName": "Use Profile Credentials Provider", "group": "security", 
"label": "security", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"configuration", "description": "Set whether the S3 client should expect to 
load cr [...]
+    "useSessionCredentials": { "index": 58, "kind": "property", "displayName": 
"Use Session Credentials", "group": "security", "label": "security", 
"required": false, "type": "boolean", "javaType": "boolean", "deprecated": 
false, "autowired": false, "secret": false, "defaultValue": false, 
"configurationClass": "org.apache.camel.component.aws2.s3.AWS2S3Configuration", 
"configurationField": "configuration", "description": "Set whether the S3 
client should expect to use Session Credentials. [...]
   },
   "headers": {
     "CamelAwsS3BucketName": { "index": 0, "kind": "header", "displayName": "", 
"group": "common", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The bucket Name which this object will be stored or 
which will be used for the current operation or in which this object is 
contained.", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#BUCKET_NAME" },
@@ -185,8 +187,10 @@
     "accessKey": { "index": 68, "kind": "parameter", "displayName": "Access 
Key", "group": "security", "label": "security", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": true, "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"configuration", "description": "Amazon AWS Access Key" },
     "profileCredentialsName": { "index": 69, "kind": "parameter", 
"displayName": "Profile Credentials Name", "group": "security", "label": 
"security", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"configurationClass": "org.apache.camel.component.aws2.s3.AWS2S3Configuration", 
"configurationField": "configuration", "description": "If using a profile 
credentials provider this parameter will set the profile name" },
     "secretKey": { "index": 70, "kind": "parameter", "displayName": "Secret 
Key", "group": "security", "label": "security", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": true, "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"configuration", "description": "Amazon AWS Secret Key" },
-    "trustAllCertificates": { "index": 71, "kind": "parameter", "displayName": 
"Trust All Certificates", "group": "security", "label": "security", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, 
"configurationClass": "org.apache.camel.component.aws2.s3.AWS2S3Configuration", 
"configurationField": "configuration", "description": "If we want to trust all 
certificates in case of overriding the endpoint" },
-    "useDefaultCredentialsProvider": { "index": 72, "kind": "parameter", 
"displayName": "Use Default Credentials Provider", "group": "security", 
"label": "security", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"configuration", "description": "Set whether the S3 client should expect to 
load c [...]
-    "useProfileCredentialsProvider": { "index": 73, "kind": "parameter", 
"displayName": "Use Profile Credentials Provider", "group": "security", 
"label": "security", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"configuration", "description": "Set whether the S3 client should expect to 
load c [...]
+    "sessionToken": { "index": 71, "kind": "parameter", "displayName": 
"Session Token", "group": "security", "label": "security", "required": false, 
"type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": true, "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"configuration", "description": "Amazon AWS Session Token used when the user 
needs to assume a IAM role" },
+    "trustAllCertificates": { "index": 72, "kind": "parameter", "displayName": 
"Trust All Certificates", "group": "security", "label": "security", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, 
"configurationClass": "org.apache.camel.component.aws2.s3.AWS2S3Configuration", 
"configurationField": "configuration", "description": "If we want to trust all 
certificates in case of overriding the endpoint" },
+    "useDefaultCredentialsProvider": { "index": 73, "kind": "parameter", 
"displayName": "Use Default Credentials Provider", "group": "security", 
"label": "security", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"configuration", "description": "Set whether the S3 client should expect to 
load c [...]
+    "useProfileCredentialsProvider": { "index": 74, "kind": "parameter", 
"displayName": "Use Profile Credentials Provider", "group": "security", 
"label": "security", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"configuration", "description": "Set whether the S3 client should expect to 
load c [...]
+    "useSessionCredentials": { "index": 75, "kind": "parameter", 
"displayName": "Use Session Credentials", "group": "security", "label": 
"security", "required": false, "type": "boolean", "javaType": "boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "configurationClass": 
"org.apache.camel.component.aws2.s3.AWS2S3Configuration", "configurationField": 
"configuration", "description": "Set whether the S3 client should expect to use 
Session Credentials [...]
   }
 }
diff --git 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Component.java
 
b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Component.java
index 39c0ae52466..18421446d01 100644
--- 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Component.java
+++ 
b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Component.java
@@ -53,10 +53,11 @@ public class AWS2S3Component extends HealthCheckComponent {
         setProperties(endpoint, parameters);
         if 
(Boolean.FALSE.equals(configuration.isUseDefaultCredentialsProvider())
                 && 
Boolean.FALSE.equals(configuration.isUseProfileCredentialsProvider())
+                && 
Boolean.FALSE.equals(configuration.isUseSessionCredentials())
                 && configuration.getAmazonS3Client() == null
                 && (configuration.getAccessKey() == null || 
configuration.getSecretKey() == null)) {
             throw new IllegalArgumentException(
-                    "useDefaultCredentialsProvider is set to false, 
useProfileCredentialsProvider is set to false, AmazonS3Client or accessKey and 
secretKey must be specified");
+                    "useDefaultCredentialsProvider is set to false, 
useProfileCredentialsProvider is set to false, useSessionCredentials is set to 
false, AmazonS3Client or accessKey and secretKey must be specified");
         }
 
         return endpoint;
diff --git 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Configuration.java
 
b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Configuration.java
index 0cf7d6b81e4..039c6a8ce9b 100644
--- 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Configuration.java
+++ 
b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Configuration.java
@@ -40,6 +40,8 @@ public class AWS2S3Configuration implements Cloneable {
     private String accessKey;
     @UriParam(label = "security", secret = true)
     private String secretKey;
+    @UriParam(label = "security", secret = true)
+    private String sessionToken;
     @UriParam(label = "consumer")
     private String fileName;
     @UriParam
@@ -111,6 +113,8 @@ public class AWS2S3Configuration implements Cloneable {
     @UriParam(label = "security")
     private boolean useProfileCredentialsProvider;
     @UriParam(label = "security")
+    private boolean useSessionCredentials;
+    @UriParam(label = "security")
     private String profileCredentialsName;
     @UriParam(label = "producer")
     private String keyName;
@@ -188,6 +192,17 @@ public class AWS2S3Configuration implements Cloneable {
         this.secretKey = secretKey;
     }
 
+    public String getSessionToken() {
+        return sessionToken;
+    }
+
+    /**
+     * Amazon AWS Session Token used when the user needs to assume a IAM role
+     */
+    public void setSessionToken(String sessionToken) {
+        this.sessionToken = sessionToken;
+    }
+
     public S3Client getAmazonS3Client() {
         return amazonS3Client;
     }
@@ -561,6 +576,18 @@ public class AWS2S3Configuration implements Cloneable {
         return useProfileCredentialsProvider;
     }
 
+    public boolean isUseSessionCredentials() {
+        return useSessionCredentials;
+    }
+
+    /**
+     * Set whether the S3 client should expect to use Session Credentials. 
This is useful in situation in which the user
+     * needs to assume a IAM role for doing operations in S3.
+     */
+    public void setUseSessionCredentials(boolean useSessionCredentials) {
+        this.useSessionCredentials = useSessionCredentials;
+    }
+
     public boolean isAutoCreateBucket() {
         return autoCreateBucket;
     }
diff --git 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/client/AWS2S3ClientFactory.java
 
b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/client/AWS2S3ClientFactory.java
index 744e337820a..80c48033d0c 100644
--- 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/client/AWS2S3ClientFactory.java
+++ 
b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/client/AWS2S3ClientFactory.java
@@ -19,6 +19,7 @@ package org.apache.camel.component.aws2.s3.client;
 import org.apache.camel.component.aws2.s3.AWS2S3Configuration;
 import 
org.apache.camel.component.aws2.s3.client.impl.AWS2S3ClientIAMOptimizedImpl;
 import 
org.apache.camel.component.aws2.s3.client.impl.AWS2S3ClientIAMProfileOptimizedImpl;
+import 
org.apache.camel.component.aws2.s3.client.impl.AWS2S3ClientSessionTokenImpl;
 import org.apache.camel.component.aws2.s3.client.impl.AWS2S3ClientStandardImpl;
 
 /**
@@ -40,6 +41,8 @@ public final class AWS2S3ClientFactory {
             return new AWS2S3ClientIAMOptimizedImpl(configuration);
         } else if 
(Boolean.TRUE.equals(configuration.isUseProfileCredentialsProvider())) {
             return new AWS2S3ClientIAMProfileOptimizedImpl(configuration);
+        } else if 
(Boolean.TRUE.equals(configuration.isUseSessionCredentials())) {
+            return new AWS2S3ClientSessionTokenImpl(configuration);
         } else {
             return new AWS2S3ClientStandardImpl(configuration);
         }
diff --git 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/client/impl/AWS2S3ClientSessionTokenImpl.java
 
b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/client/impl/AWS2S3ClientSessionTokenImpl.java
new file mode 100644
index 00000000000..6e6b324c07f
--- /dev/null
+++ 
b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/client/impl/AWS2S3ClientSessionTokenImpl.java
@@ -0,0 +1,113 @@
+/*
+ * 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.camel.component.aws2.s3.client.impl;
+
+import java.net.URI;
+
+import org.apache.camel.component.aws2.s3.AWS2S3Configuration;
+import org.apache.camel.component.aws2.s3.client.AWS2CamelS3InternalClient;
+import org.apache.camel.util.ObjectHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import software.amazon.awssdk.auth.credentials.AwsSessionCredentials;
+import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
+import software.amazon.awssdk.http.SdkHttpClient;
+import software.amazon.awssdk.http.SdkHttpConfigurationOption;
+import software.amazon.awssdk.http.apache.ApacheHttpClient;
+import software.amazon.awssdk.http.apache.ProxyConfiguration;
+import software.amazon.awssdk.regions.Region;
+import software.amazon.awssdk.services.s3.S3Client;
+import software.amazon.awssdk.services.s3.S3ClientBuilder;
+import software.amazon.awssdk.utils.AttributeMap;
+
+/**
+ * Manage an AWS s3 client for all users to use. This implementation is for 
local instances to use a static and solid
+ * credential set.
+ */
+public class AWS2S3ClientSessionTokenImpl implements AWS2CamelS3InternalClient 
{
+    private static final Logger LOG = 
LoggerFactory.getLogger(AWS2S3ClientSessionTokenImpl.class);
+    private AWS2S3Configuration configuration;
+
+    /**
+     * Constructor that uses the config file.
+     */
+    public AWS2S3ClientSessionTokenImpl(AWS2S3Configuration configuration) {
+        LOG.trace("Creating an AWS S3 manager using static credentials.");
+        this.configuration = configuration;
+    }
+
+    /**
+     * Getting the s3 aws client that is used.
+     *
+     * @return Amazon S3 Client.
+     */
+    @Override
+    public S3Client getS3Client() {
+        S3Client client = null;
+        S3ClientBuilder clientBuilder = S3Client.builder();
+        ProxyConfiguration.Builder proxyConfig = null;
+        ApacheHttpClient.Builder httpClientBuilder = null;
+        boolean isClientConfigFound = false;
+        if (ObjectHelper.isNotEmpty(configuration.getProxyHost()) && 
ObjectHelper.isNotEmpty(configuration.getProxyPort())) {
+            proxyConfig = ProxyConfiguration.builder();
+            URI proxyEndpoint = URI.create(configuration.getProxyProtocol() + 
"://" + configuration.getProxyHost() + ":"
+                                           + configuration.getProxyPort());
+            proxyConfig.endpoint(proxyEndpoint);
+            httpClientBuilder = 
ApacheHttpClient.builder().proxyConfiguration(proxyConfig.build());
+            isClientConfigFound = true;
+        }
+        if (configuration.getAccessKey() != null && 
configuration.getSecretKey() != null) {
+            AwsSessionCredentials cred = 
AwsSessionCredentials.create(configuration.getAccessKey(),
+                    configuration.getSecretKey(), 
configuration.getSessionToken());
+            if (isClientConfigFound) {
+                clientBuilder = 
clientBuilder.httpClientBuilder(httpClientBuilder)
+                        
.credentialsProvider(StaticCredentialsProvider.create(cred));
+            } else {
+                clientBuilder = 
clientBuilder.credentialsProvider(StaticCredentialsProvider.create(cred));
+            }
+        } else {
+            if (!isClientConfigFound) {
+                clientBuilder = 
clientBuilder.httpClientBuilder(httpClientBuilder);
+            }
+        }
+        if (ObjectHelper.isNotEmpty(configuration.getRegion())) {
+            clientBuilder = 
clientBuilder.region(Region.of(configuration.getRegion()));
+        }
+        if (configuration.isOverrideEndpoint()) {
+            
clientBuilder.endpointOverride(URI.create(configuration.getUriEndpointOverride()));
+        }
+        if (configuration.isForcePathStyle()) {
+            clientBuilder.forcePathStyle(true);
+        }
+        if (configuration.isTrustAllCertificates()) {
+            if (httpClientBuilder == null) {
+                httpClientBuilder = ApacheHttpClient.builder();
+            }
+            SdkHttpClient ahc = 
httpClientBuilder.buildWithDefaults(AttributeMap
+                    .builder()
+                    .put(
+                            SdkHttpConfigurationOption.TRUST_ALL_CERTIFICATES,
+                            Boolean.TRUE)
+                    .build());
+            // set created http client to use instead of builder
+            clientBuilder.httpClient(ahc);
+            clientBuilder.httpClientBuilder(null);
+        }
+        client = clientBuilder.build();
+        return client;
+    }
+}
diff --git 
a/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/AWSS3ClientFactoryTest.java
 
b/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/AWSS3ClientFactoryTest.java
index 2c748cfe9f8..7a35a0282a7 100644
--- 
a/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/AWSS3ClientFactoryTest.java
+++ 
b/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/AWSS3ClientFactoryTest.java
@@ -20,6 +20,7 @@ import 
org.apache.camel.component.aws2.s3.client.AWS2CamelS3InternalClient;
 import org.apache.camel.component.aws2.s3.client.AWS2S3ClientFactory;
 import 
org.apache.camel.component.aws2.s3.client.impl.AWS2S3ClientIAMOptimizedImpl;
 import 
org.apache.camel.component.aws2.s3.client.impl.AWS2S3ClientIAMProfileOptimizedImpl;
+import 
org.apache.camel.component.aws2.s3.client.impl.AWS2S3ClientSessionTokenImpl;
 import org.apache.camel.component.aws2.s3.client.impl.AWS2S3ClientStandardImpl;
 import org.junit.jupiter.api.Test;
 
@@ -57,4 +58,12 @@ public class AWSS3ClientFactoryTest {
         AWS2CamelS3InternalClient awss3Client = 
AWS2S3ClientFactory.getAWSS3Client(s3Configuration);
         assertTrue(awss3Client instanceof AWS2S3ClientIAMProfileOptimizedImpl);
     }
+
+    @Test
+    public void getSessionTokenS3Client() {
+        AWS2S3Configuration s3Configuration = new AWS2S3Configuration();
+        s3Configuration.setUseSessionCredentials(true);
+        AWS2CamelS3InternalClient awss3Client = 
AWS2S3ClientFactory.getAWSS3Client(s3Configuration);
+        assertTrue(awss3Client instanceof AWS2S3ClientSessionTokenImpl);
+    }
 }


Reply via email to