Skip to content

Commit ab70f74

Browse files
TingDaoKwaahm7
andauthored
supports copy object for same directory bucket (#455)
Co-authored-by: Waqar Ahmed Khan <waahm7@gmail.com>
1 parent aede1d8 commit ab70f74

11 files changed

Lines changed: 435 additions & 246 deletions

File tree

include/aws/s3/private/s3_meta_request_impl.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,14 @@ void aws_s3_meta_request_init_signing_date_time_default(
350350
struct aws_s3_meta_request *meta_request,
351351
struct aws_date_time *date_time);
352352

353+
AWS_S3_API
354+
void aws_s3_meta_request_sign_request_default_impl(
355+
struct aws_s3_meta_request *meta_request,
356+
struct aws_s3_request *request,
357+
aws_signing_complete_fn *on_signing_complete,
358+
void *user_data,
359+
bool disable_s3_express_signing);
360+
353361
AWS_S3_API
354362
void aws_s3_meta_request_sign_request_default(
355363
struct aws_s3_meta_request *meta_request,

include/aws/s3/s3_client.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ enum aws_s3_meta_request_type {
8282
* - only {bucket}/{key} format is supported for source and passing arn as
8383
* source will not work
8484
* - source bucket is assumed to be in the same region as dest
85+
* - source bucket and dest bucket must both be either directory buckets or regular buckets.
8586
*/
8687
AWS_S3_META_REQUEST_TYPE_COPY_OBJECT,
8788

source/s3_copy_object.c

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,18 @@ static void s_s3_copy_object_request_finished(
3737
struct aws_s3_request *request,
3838
int error_code);
3939

40+
static void s_s3_copy_object_sign_request(
41+
struct aws_s3_meta_request *meta_request,
42+
struct aws_s3_request *request,
43+
aws_signing_complete_fn *on_signing_complete,
44+
void *user_data);
45+
4046
static struct aws_s3_meta_request_vtable s_s3_copy_object_vtable = {
4147
.update = s_s3_copy_object_update,
4248
.send_request_finish = aws_s3_meta_request_send_request_finish_default,
4349
.prepare_request = s_s3_copy_object_prepare_request,
4450
.init_signing_date_time = aws_s3_meta_request_init_signing_date_time_default,
45-
.sign_request = aws_s3_meta_request_sign_request_default,
51+
.sign_request = s_s3_copy_object_sign_request,
4652
.finished_request = s_s3_copy_object_request_finished,
4753
.destroy = s_s3_meta_request_copy_object_destroy,
4854
.finish = aws_s3_meta_request_finish_default,
@@ -796,3 +802,21 @@ static void s_s3_copy_object_request_finished(
796802

797803
aws_s3_meta_request_unlock_synced_data(meta_request);
798804
}
805+
806+
static void s_s3_copy_object_sign_request(
807+
struct aws_s3_meta_request *meta_request,
808+
struct aws_s3_request *request,
809+
aws_signing_complete_fn *on_signing_complete,
810+
void *user_data) {
811+
812+
/**
813+
* https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html
814+
* https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html
815+
* For CopyObject and UploadPartCopy, the request has to be signed with IAM credentials for directory buckets.
816+
* Disable S3 express signing for those types.
817+
*/
818+
bool disable_s3_express_signing = request->request_tag == AWS_S3_COPY_OBJECT_REQUEST_TAG_BYPASS ||
819+
request->request_tag == AWS_S3_COPY_OBJECT_REQUEST_TAG_MULTIPART_COPY;
820+
aws_s3_meta_request_sign_request_default_impl(
821+
meta_request, request, on_signing_complete, user_data, disable_s3_express_signing);
822+
}

source/s3_meta_request.c

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -900,12 +900,12 @@ static int s_meta_request_resolve_signing_config(
900900
return AWS_OP_SUCCESS;
901901
}
902902

903-
/* Handles signing a message for the caller. */
904-
void aws_s3_meta_request_sign_request_default(
903+
void aws_s3_meta_request_sign_request_default_impl(
905904
struct aws_s3_meta_request *meta_request,
906905
struct aws_s3_request *request,
907906
aws_signing_complete_fn *on_signing_complete,
908-
void *user_data) {
907+
void *user_data,
908+
bool disable_s3_express_signing) {
909909
AWS_PRECONDITION(meta_request);
910910
AWS_PRECONDITION(request);
911911
AWS_PRECONDITION(on_signing_complete);
@@ -947,7 +947,7 @@ void aws_s3_meta_request_sign_request_default(
947947
return;
948948
}
949949

950-
if (signing_config.algorithm == AWS_SIGNING_ALGORITHM_V4_S3EXPRESS) {
950+
if (signing_config.algorithm == AWS_SIGNING_ALGORITHM_V4_S3EXPRESS && !disable_s3_express_signing) {
951951
/* Fetch credentials from S3 Express provider. */
952952
struct aws_get_s3express_credentials_user_data *context =
953953
aws_mem_calloc(meta_request->allocator, 1, sizeof(struct aws_get_s3express_credentials_user_data));
@@ -998,6 +998,9 @@ void aws_s3_meta_request_sign_request_default(
998998
}
999999
} else {
10001000
/* Regular signing. */
1001+
if (disable_s3_express_signing) {
1002+
signing_config.algorithm = AWS_SIGNING_ALGORITHM_V4;
1003+
}
10011004
s_s3_meta_request_init_signing_date_time(meta_request, &signing_config.date);
10021005
if (aws_sign_request_aws(
10031006
meta_request->allocator,
@@ -1015,6 +1018,15 @@ void aws_s3_meta_request_sign_request_default(
10151018
}
10161019
}
10171020

1021+
/* Handles signing a message for the caller. */
1022+
void aws_s3_meta_request_sign_request_default(
1023+
struct aws_s3_meta_request *meta_request,
1024+
struct aws_s3_request *request,
1025+
aws_signing_complete_fn *on_signing_complete,
1026+
void *user_data) {
1027+
aws_s3_meta_request_sign_request_default_impl(meta_request, request, on_signing_complete, user_data, false);
1028+
}
1029+
10181030
/* Handle the signing result */
10191031
static void s_s3_meta_request_request_on_signed(
10201032
struct aws_signing_result *signing_result,

tests/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,8 @@ add_net_test_case(s3express_client_put_object_long_running_session_refresh)
348348
add_net_test_case(s3express_client_get_object)
349349
add_net_test_case(s3express_client_get_object_multiple)
350350
add_net_test_case(s3express_client_get_object_create_session_error)
351+
add_net_test_case(s3express_client_copy_object)
352+
add_net_test_case(s3express_client_copy_object_multipart)
351353

352354
add_net_test_case(meta_request_auto_ranged_get_new_error_handling)
353355
add_net_test_case(meta_request_auto_ranged_put_new_error_handling)

0 commit comments

Comments
 (0)