From 7f9143d33c92793ab9353fbb158443aef12c1b39 Mon Sep 17 00:00:00 2001 From: Andrea Cosentino Date: Fri, 21 Aug 2026 19:14:47 +0200 Subject: [PATCH] CAMEL-16809: camel-aws2-s3 - support ACL grant headers on putObject and multipart upload Adds the CamelAwsS3GrantFullControl, CamelAwsS3GrantRead, CamelAwsS3GrantReadACP and CamelAwsS3GrantWriteACP producer headers, wired to the grantFullControl / grantRead / grantReadACP / grantWriteACP options of PutObjectRequest and CreateMultipartUploadRequest. This complements the existing canned-ACL support (CamelAwsS3CannedAcl / CamelAwsS3Acl) so a route can set explicit grantee-based ACLs when uploading objects. Co-Authored-By: Claude Opus 4.8 Signed-off-by: Andrea Cosentino --- .../camel/catalog/components/aws2-s3.json | 66 +++++----- .../camel/component/aws2/s3/aws2-s3.json | 66 +++++----- .../component/aws2/s3/AWS2S3Constants.java | 20 +++ .../component/aws2/s3/AWS2S3Producer.java | 40 ++++++ .../aws2/s3/AWS2S3ProducerAclGrantTest.java | 118 ++++++++++++++++++ .../dsl/AWS2S3EndpointBuilderFactory.java | 53 ++++++++ 6 files changed, 301 insertions(+), 62 deletions(-) create mode 100644 components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/AWS2S3ProducerAclGrantTest.java diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-s3.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-s3.json index 214925e76b610..a89aec93b28dd 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-s3.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-s3.json @@ -109,37 +109,41 @@ "CamelAwsS3VersionId": { "index": 16, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "(producer) The optional version ID of the newly uploaded object. (consumer) The version ID of the associated Amazon S3 object if available. Version IDs are only assigned to objects when an object is uploaded to an Amazon S3 bucket that has object versioning enabled.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#VERSION_ID" }, "CamelAwsS3CannedAcl": { "index": 17, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The canned acl that will be applied to the object. see software.amazon.awssdk.services.s3.model.ObjectCannedACL for allowed values.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#CANNED_ACL" }, "CamelAwsS3Acl": { "index": 18, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "software.amazon.awssdk.services.s3.model.BucketCannedACL", "enum": [ "private", "public-read", "public-read-write", "authenticated-read", "null" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "A well constructed Amazon S3 Access Control List object.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#ACL" }, - "CamelAwsS3Operation": { "index": 19, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform. Permitted values are copyObject, deleteObject, listBuckets, deleteBucket, listObjects", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#S3_OPERATION" }, - "CamelAwsS3ServerSideEncryption": { "index": 20, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Sets the server-side encryption algorithm when encrypting the object using AWS-managed keys. For example use AES256.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#SERVER_SIDE_ENCRYPTION" }, - "CamelAwsS3ExpirationTime": { "index": 21, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "If the object expiration is configured (see PUT Bucket lifecycle), the response includes this header.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#EXPIRATION_TIME" }, - "CamelAwsS3ReplicationStatus": { "index": 22, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "software.amazon.awssdk.services.s3.model.ReplicationStatus", "enum": [ "COMPLETE", "PENDING", "FAILED", "REPLICA", "COMPLETED", "null" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Amazon S3 can return this if your request involves a bucket that is either a source or destination in a replication rule.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#REPLICATION_STATUS" }, - "CamelAwsS3RangeStart": { "index": 23, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The position of the first byte to get", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#RANGE_START" }, - "CamelAwsS3RangeEnd": { "index": 24, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The position of the last byte to get", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#RANGE_END" }, - "CamelAwsS3DowloadLinkExpirationTime": { "index": 25, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The expiration time of the download link in milliseconds", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_EXPIRATION_TIME" }, - "CamelAwsS3DownloadLinkBrowserCompatible": { "index": 26, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Whether the download link is browser compatible", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_BROWSER_COMPATIBLE" }, - "CamelAwsS3DownloadLinkHttpRequestHeaders": { "index": 27, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The headers that are needed by the service (not needed when BrowserCompatible is true)", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_HTTP_REQUEST_HEADERS" }, - "CamelAwsS3DownloadLinkSignedPayload": { "index": 28, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The request payload that is needed by the service (not needed when BrowserCompatible is true)", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_SIGNED_PAYLOAD" }, - "CamelAwsS3Metadata": { "index": 29, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Map", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "A map of metadata to be stored or stored with the object in S3. More details about metadata https:\/\/docs.aws.amazon.com\/AmazonS3\/latest\/userguide\/UsingMetadata.htmlhere.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#METADATA" }, - "CamelMessageTimestamp": { "index": 30, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The timestamp of the message", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#MESSAGE_TIMESTAMP" }, - "CamelAwsS3Prefix": { "index": 31, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The prefix which is used in the com.amazonaws.services.s3.model.ListObjectsRequest to only list objects we are interested in", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#PREFIX" }, - "CamelAwsS3Delimiter": { "index": 32, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The delimiter which is used in the com.amazonaws.services.s3.model.ListObjectsRequest to only list objects we are interested in", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#DELIMITER" }, - "CamelAwsS3IfMatchCondition": { "index": 33, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Return\/copy the object only if its entity tag (ETag) is the same as the one specified in this header.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_MATCH_CONDITION" }, - "CamelAwsS3IfModifiedSinceCondition": { "index": 34, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Return\/copy the object only if it has been modified since the specified time; otherwise, return a 304 Not Modified error.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_MODIFIED_SINCE_CONDITION" }, - "CamelAwsS3IfNoneMatchCondition": { "index": 35, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Return\/copy the object only if its entity tag (ETag) is different from the one specified in this header.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_NONE_MATCH_CONDITION" }, - "CamelAwsS3IfUnmodifiedSinceCondition": { "index": 36, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Return\/copy the object only if it has not been modified since the specified time.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_UNMODIFIED_SINCE_CONDITION" }, - "CamelAwsS3OverrideBucketName": { "index": 37, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The bucket Name to override (can be dynamic using the simple language in the producer) 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#OVERRIDE_BUCKET_NAME" }, - "CamelAwsS3KeysToDelete": { "index": 38, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "List", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "A list of keys to delete when using deleteObjects operation", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#KEYS_TO_DELETE" }, - "CamelAwsS3RestoreDays": { "index": 39, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The number of days for which the restore request will remain active when using restoreObject operation", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#RESTORE_DAYS" }, - "CamelAwsS3RestoreTier": { "index": 40, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The tier at which the restore will be processed when using restoreObject operation (e.g., Standard, Bulk, Expedited)", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#RESTORE_TIER" }, - "CamelAwsS3ObjectTags": { "index": 41, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The object tags to set when using putObjectTagging operation", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#OBJECT_TAGS" }, - "CamelAwsS3BucketTags": { "index": 42, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The bucket tags to set when using putBucketTagging operation", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#BUCKET_TAGS" }, - "CamelAwsS3BucketPolicy": { "index": 43, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The bucket policy as JSON string when using putBucketPolicy operation", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#BUCKET_POLICY" }, - "CamelAwsS3VersioningStatus": { "index": 44, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The versioning status (Enabled or Suspended) when using putBucketVersioning operation", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#VERSIONING_STATUS" }, - "CamelAwsS3MfaDelete": { "index": 45, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Whether to enable MFA delete when using putBucketVersioning operation", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#MFA_DELETE" }, - "CamelAwsS3UploadLinkExpirationTime": { "index": 46, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The expiration time of the upload link in milliseconds", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_EXPIRATION_TIME" }, - "CamelAwsS3UploadLinkBrowserCompatible": { "index": 47, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Whether the upload link is browser compatible", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_BROWSER_COMPATIBLE" }, - "CamelAwsS3UploadLinkHttpRequestHeaders": { "index": 48, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The headers that are needed by the service for upload (not needed when BrowserCompatible is true)", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_HTTP_REQUEST_HEADERS" }, - "CamelAwsS3UploadLinkSignedPayload": { "index": 49, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The request payload that is needed by the service for upload (not needed when BrowserCompatible is true)", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_SIGNED_PAYLOAD" } + "CamelAwsS3GrantFullControl": { "index": 19, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Gives the grantee READ, READ_ACP, and WRITE_ACP permissions on the object. The value is a grantee expression such as id=, emailAddress= or uri=.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#GRANT_FULL_CONTROL" }, + "CamelAwsS3GrantRead": { "index": 20, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Allows the grantee to read the object data and its metadata. The value is a grantee expression such as id=, emailAddress= or uri=.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#GRANT_READ" }, + "CamelAwsS3GrantReadACP": { "index": 21, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Allows the grantee to read the object ACL. The value is a grantee expression such as id=, emailAddress= or uri=.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#GRANT_READ_ACP" }, + "CamelAwsS3GrantWriteACP": { "index": 22, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Allows the grantee to write the ACL for the object. The value is a grantee expression such as id=, emailAddress= or uri=.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#GRANT_WRITE_ACP" }, + "CamelAwsS3Operation": { "index": 23, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform. Permitted values are copyObject, deleteObject, listBuckets, deleteBucket, listObjects", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#S3_OPERATION" }, + "CamelAwsS3ServerSideEncryption": { "index": 24, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Sets the server-side encryption algorithm when encrypting the object using AWS-managed keys. For example use AES256.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#SERVER_SIDE_ENCRYPTION" }, + "CamelAwsS3ExpirationTime": { "index": 25, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "If the object expiration is configured (see PUT Bucket lifecycle), the response includes this header.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#EXPIRATION_TIME" }, + "CamelAwsS3ReplicationStatus": { "index": 26, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "software.amazon.awssdk.services.s3.model.ReplicationStatus", "enum": [ "COMPLETE", "PENDING", "FAILED", "REPLICA", "COMPLETED", "null" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Amazon S3 can return this if your request involves a bucket that is either a source or destination in a replication rule.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#REPLICATION_STATUS" }, + "CamelAwsS3RangeStart": { "index": 27, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The position of the first byte to get", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#RANGE_START" }, + "CamelAwsS3RangeEnd": { "index": 28, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The position of the last byte to get", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#RANGE_END" }, + "CamelAwsS3DowloadLinkExpirationTime": { "index": 29, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The expiration time of the download link in milliseconds", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_EXPIRATION_TIME" }, + "CamelAwsS3DownloadLinkBrowserCompatible": { "index": 30, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Whether the download link is browser compatible", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_BROWSER_COMPATIBLE" }, + "CamelAwsS3DownloadLinkHttpRequestHeaders": { "index": 31, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The headers that are needed by the service (not needed when BrowserCompatible is true)", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_HTTP_REQUEST_HEADERS" }, + "CamelAwsS3DownloadLinkSignedPayload": { "index": 32, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The request payload that is needed by the service (not needed when BrowserCompatible is true)", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_SIGNED_PAYLOAD" }, + "CamelAwsS3Metadata": { "index": 33, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Map", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "A map of metadata to be stored or stored with the object in S3. More details about metadata https:\/\/docs.aws.amazon.com\/AmazonS3\/latest\/userguide\/UsingMetadata.htmlhere.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#METADATA" }, + "CamelMessageTimestamp": { "index": 34, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The timestamp of the message", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#MESSAGE_TIMESTAMP" }, + "CamelAwsS3Prefix": { "index": 35, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The prefix which is used in the com.amazonaws.services.s3.model.ListObjectsRequest to only list objects we are interested in", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#PREFIX" }, + "CamelAwsS3Delimiter": { "index": 36, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The delimiter which is used in the com.amazonaws.services.s3.model.ListObjectsRequest to only list objects we are interested in", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#DELIMITER" }, + "CamelAwsS3IfMatchCondition": { "index": 37, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Return\/copy the object only if its entity tag (ETag) is the same as the one specified in this header.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_MATCH_CONDITION" }, + "CamelAwsS3IfModifiedSinceCondition": { "index": 38, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Return\/copy the object only if it has been modified since the specified time; otherwise, return a 304 Not Modified error.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_MODIFIED_SINCE_CONDITION" }, + "CamelAwsS3IfNoneMatchCondition": { "index": 39, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Return\/copy the object only if its entity tag (ETag) is different from the one specified in this header.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_NONE_MATCH_CONDITION" }, + "CamelAwsS3IfUnmodifiedSinceCondition": { "index": 40, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Return\/copy the object only if it has not been modified since the specified time.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_UNMODIFIED_SINCE_CONDITION" }, + "CamelAwsS3OverrideBucketName": { "index": 41, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The bucket Name to override (can be dynamic using the simple language in the producer) 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#OVERRIDE_BUCKET_NAME" }, + "CamelAwsS3KeysToDelete": { "index": 42, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "List", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "A list of keys to delete when using deleteObjects operation", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#KEYS_TO_DELETE" }, + "CamelAwsS3RestoreDays": { "index": 43, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The number of days for which the restore request will remain active when using restoreObject operation", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#RESTORE_DAYS" }, + "CamelAwsS3RestoreTier": { "index": 44, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The tier at which the restore will be processed when using restoreObject operation (e.g., Standard, Bulk, Expedited)", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#RESTORE_TIER" }, + "CamelAwsS3ObjectTags": { "index": 45, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The object tags to set when using putObjectTagging operation", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#OBJECT_TAGS" }, + "CamelAwsS3BucketTags": { "index": 46, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The bucket tags to set when using putBucketTagging operation", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#BUCKET_TAGS" }, + "CamelAwsS3BucketPolicy": { "index": 47, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The bucket policy as JSON string when using putBucketPolicy operation", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#BUCKET_POLICY" }, + "CamelAwsS3VersioningStatus": { "index": 48, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The versioning status (Enabled or Suspended) when using putBucketVersioning operation", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#VERSIONING_STATUS" }, + "CamelAwsS3MfaDelete": { "index": 49, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Whether to enable MFA delete when using putBucketVersioning operation", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#MFA_DELETE" }, + "CamelAwsS3UploadLinkExpirationTime": { "index": 50, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The expiration time of the upload link in milliseconds", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_EXPIRATION_TIME" }, + "CamelAwsS3UploadLinkBrowserCompatible": { "index": 51, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Whether the upload link is browser compatible", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_BROWSER_COMPATIBLE" }, + "CamelAwsS3UploadLinkHttpRequestHeaders": { "index": 52, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The headers that are needed by the service for upload (not needed when BrowserCompatible is true)", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_HTTP_REQUEST_HEADERS" }, + "CamelAwsS3UploadLinkSignedPayload": { "index": 53, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The request payload that is needed by the service for upload (not needed when BrowserCompatible is true)", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_SIGNED_PAYLOAD" } }, "properties": { "bucketNameOrArn": { "index": 0, "kind": "path", "displayName": "Bucket Name Or Arn", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Bucket name or ARN" }, diff --git a/components/camel-aws/camel-aws2-s3/src/generated/resources/META-INF/org/apache/camel/component/aws2/s3/aws2-s3.json b/components/camel-aws/camel-aws2-s3/src/generated/resources/META-INF/org/apache/camel/component/aws2/s3/aws2-s3.json index 214925e76b610..a89aec93b28dd 100644 --- a/components/camel-aws/camel-aws2-s3/src/generated/resources/META-INF/org/apache/camel/component/aws2/s3/aws2-s3.json +++ b/components/camel-aws/camel-aws2-s3/src/generated/resources/META-INF/org/apache/camel/component/aws2/s3/aws2-s3.json @@ -109,37 +109,41 @@ "CamelAwsS3VersionId": { "index": 16, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "(producer) The optional version ID of the newly uploaded object. (consumer) The version ID of the associated Amazon S3 object if available. Version IDs are only assigned to objects when an object is uploaded to an Amazon S3 bucket that has object versioning enabled.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#VERSION_ID" }, "CamelAwsS3CannedAcl": { "index": 17, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The canned acl that will be applied to the object. see software.amazon.awssdk.services.s3.model.ObjectCannedACL for allowed values.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#CANNED_ACL" }, "CamelAwsS3Acl": { "index": 18, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "software.amazon.awssdk.services.s3.model.BucketCannedACL", "enum": [ "private", "public-read", "public-read-write", "authenticated-read", "null" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "A well constructed Amazon S3 Access Control List object.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#ACL" }, - "CamelAwsS3Operation": { "index": 19, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform. Permitted values are copyObject, deleteObject, listBuckets, deleteBucket, listObjects", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#S3_OPERATION" }, - "CamelAwsS3ServerSideEncryption": { "index": 20, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Sets the server-side encryption algorithm when encrypting the object using AWS-managed keys. For example use AES256.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#SERVER_SIDE_ENCRYPTION" }, - "CamelAwsS3ExpirationTime": { "index": 21, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "If the object expiration is configured (see PUT Bucket lifecycle), the response includes this header.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#EXPIRATION_TIME" }, - "CamelAwsS3ReplicationStatus": { "index": 22, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "software.amazon.awssdk.services.s3.model.ReplicationStatus", "enum": [ "COMPLETE", "PENDING", "FAILED", "REPLICA", "COMPLETED", "null" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Amazon S3 can return this if your request involves a bucket that is either a source or destination in a replication rule.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#REPLICATION_STATUS" }, - "CamelAwsS3RangeStart": { "index": 23, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The position of the first byte to get", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#RANGE_START" }, - "CamelAwsS3RangeEnd": { "index": 24, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The position of the last byte to get", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#RANGE_END" }, - "CamelAwsS3DowloadLinkExpirationTime": { "index": 25, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The expiration time of the download link in milliseconds", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_EXPIRATION_TIME" }, - "CamelAwsS3DownloadLinkBrowserCompatible": { "index": 26, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Whether the download link is browser compatible", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_BROWSER_COMPATIBLE" }, - "CamelAwsS3DownloadLinkHttpRequestHeaders": { "index": 27, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The headers that are needed by the service (not needed when BrowserCompatible is true)", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_HTTP_REQUEST_HEADERS" }, - "CamelAwsS3DownloadLinkSignedPayload": { "index": 28, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The request payload that is needed by the service (not needed when BrowserCompatible is true)", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_SIGNED_PAYLOAD" }, - "CamelAwsS3Metadata": { "index": 29, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Map", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "A map of metadata to be stored or stored with the object in S3. More details about metadata https:\/\/docs.aws.amazon.com\/AmazonS3\/latest\/userguide\/UsingMetadata.htmlhere.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#METADATA" }, - "CamelMessageTimestamp": { "index": 30, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The timestamp of the message", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#MESSAGE_TIMESTAMP" }, - "CamelAwsS3Prefix": { "index": 31, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The prefix which is used in the com.amazonaws.services.s3.model.ListObjectsRequest to only list objects we are interested in", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#PREFIX" }, - "CamelAwsS3Delimiter": { "index": 32, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The delimiter which is used in the com.amazonaws.services.s3.model.ListObjectsRequest to only list objects we are interested in", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#DELIMITER" }, - "CamelAwsS3IfMatchCondition": { "index": 33, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Return\/copy the object only if its entity tag (ETag) is the same as the one specified in this header.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_MATCH_CONDITION" }, - "CamelAwsS3IfModifiedSinceCondition": { "index": 34, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Return\/copy the object only if it has been modified since the specified time; otherwise, return a 304 Not Modified error.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_MODIFIED_SINCE_CONDITION" }, - "CamelAwsS3IfNoneMatchCondition": { "index": 35, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Return\/copy the object only if its entity tag (ETag) is different from the one specified in this header.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_NONE_MATCH_CONDITION" }, - "CamelAwsS3IfUnmodifiedSinceCondition": { "index": 36, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Return\/copy the object only if it has not been modified since the specified time.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_UNMODIFIED_SINCE_CONDITION" }, - "CamelAwsS3OverrideBucketName": { "index": 37, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The bucket Name to override (can be dynamic using the simple language in the producer) 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#OVERRIDE_BUCKET_NAME" }, - "CamelAwsS3KeysToDelete": { "index": 38, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "List", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "A list of keys to delete when using deleteObjects operation", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#KEYS_TO_DELETE" }, - "CamelAwsS3RestoreDays": { "index": 39, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The number of days for which the restore request will remain active when using restoreObject operation", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#RESTORE_DAYS" }, - "CamelAwsS3RestoreTier": { "index": 40, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The tier at which the restore will be processed when using restoreObject operation (e.g., Standard, Bulk, Expedited)", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#RESTORE_TIER" }, - "CamelAwsS3ObjectTags": { "index": 41, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The object tags to set when using putObjectTagging operation", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#OBJECT_TAGS" }, - "CamelAwsS3BucketTags": { "index": 42, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The bucket tags to set when using putBucketTagging operation", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#BUCKET_TAGS" }, - "CamelAwsS3BucketPolicy": { "index": 43, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The bucket policy as JSON string when using putBucketPolicy operation", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#BUCKET_POLICY" }, - "CamelAwsS3VersioningStatus": { "index": 44, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The versioning status (Enabled or Suspended) when using putBucketVersioning operation", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#VERSIONING_STATUS" }, - "CamelAwsS3MfaDelete": { "index": 45, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Whether to enable MFA delete when using putBucketVersioning operation", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#MFA_DELETE" }, - "CamelAwsS3UploadLinkExpirationTime": { "index": 46, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The expiration time of the upload link in milliseconds", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_EXPIRATION_TIME" }, - "CamelAwsS3UploadLinkBrowserCompatible": { "index": 47, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Whether the upload link is browser compatible", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_BROWSER_COMPATIBLE" }, - "CamelAwsS3UploadLinkHttpRequestHeaders": { "index": 48, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The headers that are needed by the service for upload (not needed when BrowserCompatible is true)", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_HTTP_REQUEST_HEADERS" }, - "CamelAwsS3UploadLinkSignedPayload": { "index": 49, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The request payload that is needed by the service for upload (not needed when BrowserCompatible is true)", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_SIGNED_PAYLOAD" } + "CamelAwsS3GrantFullControl": { "index": 19, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Gives the grantee READ, READ_ACP, and WRITE_ACP permissions on the object. The value is a grantee expression such as id=, emailAddress= or uri=.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#GRANT_FULL_CONTROL" }, + "CamelAwsS3GrantRead": { "index": 20, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Allows the grantee to read the object data and its metadata. The value is a grantee expression such as id=, emailAddress= or uri=.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#GRANT_READ" }, + "CamelAwsS3GrantReadACP": { "index": 21, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Allows the grantee to read the object ACL. The value is a grantee expression such as id=, emailAddress= or uri=.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#GRANT_READ_ACP" }, + "CamelAwsS3GrantWriteACP": { "index": 22, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Allows the grantee to write the ACL for the object. The value is a grantee expression such as id=, emailAddress= or uri=.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#GRANT_WRITE_ACP" }, + "CamelAwsS3Operation": { "index": 23, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The operation to perform. Permitted values are copyObject, deleteObject, listBuckets, deleteBucket, listObjects", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#S3_OPERATION" }, + "CamelAwsS3ServerSideEncryption": { "index": 24, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Sets the server-side encryption algorithm when encrypting the object using AWS-managed keys. For example use AES256.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#SERVER_SIDE_ENCRYPTION" }, + "CamelAwsS3ExpirationTime": { "index": 25, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "If the object expiration is configured (see PUT Bucket lifecycle), the response includes this header.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#EXPIRATION_TIME" }, + "CamelAwsS3ReplicationStatus": { "index": 26, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "software.amazon.awssdk.services.s3.model.ReplicationStatus", "enum": [ "COMPLETE", "PENDING", "FAILED", "REPLICA", "COMPLETED", "null" ], "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Amazon S3 can return this if your request involves a bucket that is either a source or destination in a replication rule.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#REPLICATION_STATUS" }, + "CamelAwsS3RangeStart": { "index": 27, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The position of the first byte to get", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#RANGE_START" }, + "CamelAwsS3RangeEnd": { "index": 28, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The position of the last byte to get", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#RANGE_END" }, + "CamelAwsS3DowloadLinkExpirationTime": { "index": 29, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The expiration time of the download link in milliseconds", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_EXPIRATION_TIME" }, + "CamelAwsS3DownloadLinkBrowserCompatible": { "index": 30, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Whether the download link is browser compatible", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_BROWSER_COMPATIBLE" }, + "CamelAwsS3DownloadLinkHttpRequestHeaders": { "index": 31, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The headers that are needed by the service (not needed when BrowserCompatible is true)", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_HTTP_REQUEST_HEADERS" }, + "CamelAwsS3DownloadLinkSignedPayload": { "index": 32, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The request payload that is needed by the service (not needed when BrowserCompatible is true)", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_SIGNED_PAYLOAD" }, + "CamelAwsS3Metadata": { "index": 33, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "Map", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "A map of metadata to be stored or stored with the object in S3. More details about metadata https:\/\/docs.aws.amazon.com\/AmazonS3\/latest\/userguide\/UsingMetadata.htmlhere.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#METADATA" }, + "CamelMessageTimestamp": { "index": 34, "kind": "header", "displayName": "", "group": "consumer", "label": "consumer", "required": false, "javaType": "long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The timestamp of the message", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#MESSAGE_TIMESTAMP" }, + "CamelAwsS3Prefix": { "index": 35, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The prefix which is used in the com.amazonaws.services.s3.model.ListObjectsRequest to only list objects we are interested in", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#PREFIX" }, + "CamelAwsS3Delimiter": { "index": 36, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The delimiter which is used in the com.amazonaws.services.s3.model.ListObjectsRequest to only list objects we are interested in", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#DELIMITER" }, + "CamelAwsS3IfMatchCondition": { "index": 37, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Return\/copy the object only if its entity tag (ETag) is the same as the one specified in this header.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_MATCH_CONDITION" }, + "CamelAwsS3IfModifiedSinceCondition": { "index": 38, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Return\/copy the object only if it has been modified since the specified time; otherwise, return a 304 Not Modified error.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_MODIFIED_SINCE_CONDITION" }, + "CamelAwsS3IfNoneMatchCondition": { "index": 39, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Return\/copy the object only if its entity tag (ETag) is different from the one specified in this header.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_NONE_MATCH_CONDITION" }, + "CamelAwsS3IfUnmodifiedSinceCondition": { "index": 40, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Return\/copy the object only if it has not been modified since the specified time.", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_UNMODIFIED_SINCE_CONDITION" }, + "CamelAwsS3OverrideBucketName": { "index": 41, "kind": "header", "displayName": "", "group": "common", "label": "", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The bucket Name to override (can be dynamic using the simple language in the producer) 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#OVERRIDE_BUCKET_NAME" }, + "CamelAwsS3KeysToDelete": { "index": 42, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "List", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "A list of keys to delete when using deleteObjects operation", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#KEYS_TO_DELETE" }, + "CamelAwsS3RestoreDays": { "index": 43, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Integer", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The number of days for which the restore request will remain active when using restoreObject operation", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#RESTORE_DAYS" }, + "CamelAwsS3RestoreTier": { "index": 44, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The tier at which the restore will be processed when using restoreObject operation (e.g., Standard, Bulk, Expedited)", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#RESTORE_TIER" }, + "CamelAwsS3ObjectTags": { "index": 45, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The object tags to set when using putObjectTagging operation", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#OBJECT_TAGS" }, + "CamelAwsS3BucketTags": { "index": 46, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The bucket tags to set when using putBucketTagging operation", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#BUCKET_TAGS" }, + "CamelAwsS3BucketPolicy": { "index": 47, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The bucket policy as JSON string when using putBucketPolicy operation", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#BUCKET_POLICY" }, + "CamelAwsS3VersioningStatus": { "index": 48, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The versioning status (Enabled or Suspended) when using putBucketVersioning operation", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#VERSIONING_STATUS" }, + "CamelAwsS3MfaDelete": { "index": 49, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Whether to enable MFA delete when using putBucketVersioning operation", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#MFA_DELETE" }, + "CamelAwsS3UploadLinkExpirationTime": { "index": 50, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The expiration time of the upload link in milliseconds", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_EXPIRATION_TIME" }, + "CamelAwsS3UploadLinkBrowserCompatible": { "index": 51, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Whether the upload link is browser compatible", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_BROWSER_COMPATIBLE" }, + "CamelAwsS3UploadLinkHttpRequestHeaders": { "index": 52, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "Map>", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The headers that are needed by the service for upload (not needed when BrowserCompatible is true)", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_HTTP_REQUEST_HEADERS" }, + "CamelAwsS3UploadLinkSignedPayload": { "index": 53, "kind": "header", "displayName": "", "group": "producer", "label": "producer", "required": false, "javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "The request payload that is needed by the service for upload (not needed when BrowserCompatible is true)", "constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_SIGNED_PAYLOAD" } }, "properties": { "bucketNameOrArn": { "index": 0, "kind": "path", "displayName": "Bucket Name Or Arn", "group": "common", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "autowired": false, "secret": false, "description": "Bucket name or ARN" }, diff --git a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Constants.java b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Constants.java index 9d80234ed82de..ee9690a0b62a5 100644 --- a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Constants.java +++ b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Constants.java @@ -112,6 +112,26 @@ public interface AWS2S3Constants { @Metadata(label = "producer", description = "A well constructed Amazon S3 Access Control List object.", javaType = "software.amazon.awssdk.services.s3.model.BucketCannedACL") String ACL = "CamelAwsS3Acl"; + @Metadata(label = "producer", description = """ + Gives the grantee READ, READ_ACP, and WRITE_ACP permissions on the object. The value is a grantee + expression such as `id=`, `emailAddress=` or `uri=`.""", + javaType = "String") + String GRANT_FULL_CONTROL = "CamelAwsS3GrantFullControl"; + @Metadata(label = "producer", description = """ + Allows the grantee to read the object data and its metadata. The value is a grantee expression such as + `id=`, `emailAddress=` or `uri=`.""", + javaType = "String") + String GRANT_READ = "CamelAwsS3GrantRead"; + @Metadata(label = "producer", description = """ + Allows the grantee to read the object ACL. The value is a grantee expression such as + `id=`, `emailAddress=` or `uri=`.""", + javaType = "String") + String GRANT_READ_ACP = "CamelAwsS3GrantReadACP"; + @Metadata(label = "producer", description = """ + Allows the grantee to write the ACL for the object. The value is a grantee expression such as + `id=`, `emailAddress=` or `uri=`.""", + javaType = "String") + String GRANT_WRITE_ACP = "CamelAwsS3GrantWriteACP"; @Metadata(description = "The operation to perform. Permitted values are copyObject, deleteObject, listBuckets, deleteBucket, listObjects", javaType = "String") String S3_OPERATION = "CamelAwsS3Operation"; diff --git a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Producer.java b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Producer.java index 4b9bd26c7b5e0..da44011edbe56 100644 --- a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Producer.java +++ b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Producer.java @@ -241,6 +241,26 @@ public void processMultiPart(final Exchange exchange) throws Exception { createMultipartUploadRequest.acl(objectAcl); } + String grantFullControl = exchange.getIn().getHeader(AWS2S3Constants.GRANT_FULL_CONTROL, String.class); + if (ObjectHelper.isNotEmpty(grantFullControl)) { + createMultipartUploadRequest.grantFullControl(grantFullControl); + } + + String grantRead = exchange.getIn().getHeader(AWS2S3Constants.GRANT_READ, String.class); + if (ObjectHelper.isNotEmpty(grantRead)) { + createMultipartUploadRequest.grantRead(grantRead); + } + + String grantReadACP = exchange.getIn().getHeader(AWS2S3Constants.GRANT_READ_ACP, String.class); + if (ObjectHelper.isNotEmpty(grantReadACP)) { + createMultipartUploadRequest.grantReadACP(grantReadACP); + } + + String grantWriteACP = exchange.getIn().getHeader(AWS2S3Constants.GRANT_WRITE_ACP, String.class); + if (ObjectHelper.isNotEmpty(grantWriteACP)) { + createMultipartUploadRequest.grantWriteACP(grantWriteACP); + } + BucketCannedACL acl = exchange.getIn().getHeader(AWS2S3Constants.ACL, BucketCannedACL.class); if (ObjectHelper.isNotEmpty(acl)) { // note: if cannedacl and acl are both specified the last one will @@ -396,6 +416,26 @@ private void doPutObject( putObjectRequest.acl(objectAcl); } + String grantFullControl = exchange.getIn().getHeader(AWS2S3Constants.GRANT_FULL_CONTROL, String.class); + if (ObjectHelper.isNotEmpty(grantFullControl)) { + putObjectRequest.grantFullControl(grantFullControl); + } + + String grantRead = exchange.getIn().getHeader(AWS2S3Constants.GRANT_READ, String.class); + if (ObjectHelper.isNotEmpty(grantRead)) { + putObjectRequest.grantRead(grantRead); + } + + String grantReadACP = exchange.getIn().getHeader(AWS2S3Constants.GRANT_READ_ACP, String.class); + if (ObjectHelper.isNotEmpty(grantReadACP)) { + putObjectRequest.grantReadACP(grantReadACP); + } + + String grantWriteACP = exchange.getIn().getHeader(AWS2S3Constants.GRANT_WRITE_ACP, String.class); + if (ObjectHelper.isNotEmpty(grantWriteACP)) { + putObjectRequest.grantWriteACP(grantWriteACP); + } + String contentType = exchange.getIn().getHeader(AWS2S3Constants.CONTENT_TYPE, String.class); if (ObjectHelper.isNotEmpty(contentType)) { putObjectRequest.contentType(contentType); diff --git a/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/AWS2S3ProducerAclGrantTest.java b/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/AWS2S3ProducerAclGrantTest.java new file mode 100644 index 0000000000000..8843b0093225c --- /dev/null +++ b/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/AWS2S3ProducerAclGrantTest.java @@ -0,0 +1,118 @@ +/* + * 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; + +import org.apache.camel.Exchange; +import org.apache.camel.impl.DefaultCamelContext; +import org.apache.camel.support.DefaultExchange; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import software.amazon.awssdk.core.sync.RequestBody; +import software.amazon.awssdk.http.SdkHttpResponse; +import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.model.PutObjectRequest; +import software.amazon.awssdk.services.s3.model.PutObjectResponse; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +/** + * Verifies that the {@code CamelAwsS3Grant*} headers are applied as explicit ACL grants on the {@code PutObject} + * request (CAMEL-16809). + */ +class AWS2S3ProducerAclGrantTest { + + @Mock + private AWS2S3Endpoint endpoint; + + @Mock + private AWS2S3Configuration configuration; + + @Mock + private S3Client s3Client; + + private AWS2S3Producer producer; + private DefaultCamelContext camelContext; + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + camelContext = new DefaultCamelContext(); + when(endpoint.getConfiguration()).thenReturn(configuration); + when(endpoint.getCamelContext()).thenReturn(camelContext); + when(endpoint.getS3Client()).thenReturn(s3Client); + when(configuration.getBucketName()).thenReturn("test-bucket"); + producer = new AWS2S3Producer(endpoint); + } + + private void mockPutObject() { + when(s3Client.putObject(any(PutObjectRequest.class), any(RequestBody.class))) + .thenReturn((PutObjectResponse) PutObjectResponse.builder() + .sdkHttpResponse(SdkHttpResponse.builder().statusCode(200).build()) + .build()); + } + + private PutObjectRequest capturePutObjectRequest() { + ArgumentCaptor captor = ArgumentCaptor.forClass(PutObjectRequest.class); + verify(s3Client).putObject(captor.capture(), any(RequestBody.class)); + return captor.getValue(); + } + + @Test + void putObjectShouldApplyAclGrantHeaders() throws Exception { + mockPutObject(); + + Exchange exchange = new DefaultExchange(camelContext); + exchange.getIn().setHeader(AWS2S3Constants.KEY, "my-key"); + exchange.getIn().setHeader(AWS2S3Constants.GRANT_FULL_CONTROL, "id=canonical-full"); + exchange.getIn().setHeader(AWS2S3Constants.GRANT_READ, "id=canonical-read"); + exchange.getIn().setHeader(AWS2S3Constants.GRANT_READ_ACP, "emailAddress=readacp@example.com"); + exchange.getIn().setHeader(AWS2S3Constants.GRANT_WRITE_ACP, + "uri=http://acs.amazonaws.com/groups/global/AllUsers"); + exchange.getIn().setBody("hello grant"); + + producer.process(exchange); + + PutObjectRequest request = capturePutObjectRequest(); + assertThat(request.grantFullControl()).isEqualTo("id=canonical-full"); + assertThat(request.grantRead()).isEqualTo("id=canonical-read"); + assertThat(request.grantReadACP()).isEqualTo("emailAddress=readacp@example.com"); + assertThat(request.grantWriteACP()).isEqualTo("uri=http://acs.amazonaws.com/groups/global/AllUsers"); + } + + @Test + void putObjectWithoutGrantHeadersLeavesGrantsUnset() throws Exception { + mockPutObject(); + + Exchange exchange = new DefaultExchange(camelContext); + exchange.getIn().setHeader(AWS2S3Constants.KEY, "my-key"); + exchange.getIn().setBody("hello"); + + producer.process(exchange); + + PutObjectRequest request = capturePutObjectRequest(); + assertThat(request.grantFullControl()).isNull(); + assertThat(request.grantRead()).isNull(); + assertThat(request.grantReadACP()).isNull(); + assertThat(request.grantWriteACP()).isNull(); + } +} diff --git a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/AWS2S3EndpointBuilderFactory.java b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/AWS2S3EndpointBuilderFactory.java index dee1c1366d97f..4b877c350eb5c 100644 --- a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/AWS2S3EndpointBuilderFactory.java +++ b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/AWS2S3EndpointBuilderFactory.java @@ -3982,6 +3982,59 @@ public String awsS3CannedAcl() { public String awsS3Acl() { return "CamelAwsS3Acl"; } + /** + * Gives the grantee READ, READ_ACP, and WRITE_ACP permissions on the + * object. The value is a grantee expression such as id=, emailAddress= + * or uri=. + * + * The option is a: {@code String} type. + * + * Group: producer + * + * @return the name of the header {@code AwsS3GrantFullControl}. + */ + public String awsS3GrantFullControl() { + return "CamelAwsS3GrantFullControl"; + } + /** + * Allows the grantee to read the object data and its metadata. The + * value is a grantee expression such as id=, emailAddress= or uri=. + * + * The option is a: {@code String} type. + * + * Group: producer + * + * @return the name of the header {@code AwsS3GrantRead}. + */ + public String awsS3GrantRead() { + return "CamelAwsS3GrantRead"; + } + /** + * Allows the grantee to read the object ACL. The value is a grantee + * expression such as id=, emailAddress= or uri=. + * + * The option is a: {@code String} type. + * + * Group: producer + * + * @return the name of the header {@code AwsS3GrantReadACP}. + */ + public String awsS3GrantReadACP() { + return "CamelAwsS3GrantReadACP"; + } + /** + * Allows the grantee to write the ACL for the object. The value is a + * grantee expression such as id=, emailAddress= or uri=. + * + * The option is a: {@code String} type. + * + * Group: producer + * + * @return the name of the header {@code AwsS3GrantWriteACP}. + */ + public String awsS3GrantWriteACP() { + return "CamelAwsS3GrantWriteACP"; + } /** * The operation to perform. Permitted values are copyObject, * deleteObject, listBuckets, deleteBucket, listObjects.