diff --git a/s3api/controllers/bucket-get.go b/s3api/controllers/bucket-get.go index bf74c49..4340a75 100644 --- a/s3api/controllers/bucket-get.go +++ b/s3api/controllers/bucket-get.go @@ -21,9 +21,7 @@ import ( "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/gofiber/fiber/v3" "github.com/versity/versitygw/auth" - "github.com/versity/versitygw/debuglogger" "github.com/versity/versitygw/s3api/utils" - "github.com/versity/versitygw/s3err" "github.com/versity/versitygw/s3response" ) @@ -633,17 +631,6 @@ func (c S3ApiController) ListObjects(ctx fiber.Ctx) (*Response, error) { }, err } - // start-after belongs to list-type=2 only; S3 rejects it here instead of - // ignoring it - if ctx.Request().URI().QueryArgs().Has("start-after") { - debuglogger.Logf("start-after is not supported in ListObjects V1") - return &Response{ - MetaOpts: &MetaOptions{ - BucketOwner: parsedAcl.Owner, - }, - }, s3err.GetInvalidArgumentErr(s3err.InvalidArgStartAfter, "") - } - maxkeys, err := utils.ParseMaxLimiter(maxkeysStr, utils.LimiterTypeMaxKeys) if err != nil { return &Response{ diff --git a/s3api/controllers/bucket-get_test.go b/s3api/controllers/bucket-get_test.go index 56a8a72..ac29089 100644 --- a/s3api/controllers/bucket-get_test.go +++ b/s3api/controllers/bucket-get_test.go @@ -1212,24 +1212,6 @@ func TestS3ApiController_ListObjects(t *testing.T) { err: s3err.GetInvalidArgMaxLimiter(string(utils.LimiterTypeMaxKeys), "bla"), }, }, - { - name: "start-after is not supported", - input: testInput{ - locals: defaultLocals, - beRes: listResult, - queries: map[string]string{ - "start-after": "my-key", - }, - }, - output: testOutput{ - response: &Response{ - MetaOpts: &MetaOptions{ - BucketOwner: "root", - }, - }, - err: s3err.GetInvalidArgumentErr(s3err.InvalidArgStartAfter, ""), - }, - }, { name: "backend returns error", input: testInput{ diff --git a/s3err/invalid-argument.go b/s3err/invalid-argument.go index 200546d..243027c 100644 --- a/s3err/invalid-argument.go +++ b/s3err/invalid-argument.go @@ -123,7 +123,7 @@ var invalidArgErrResponses = map[InvalidArgErrorCode]InvalidArgumentError{ ArgumentName: "x-amz-tagging", }, InvalidArgAuthHeader: { - Description: "Authorization header is invalid -- one and only one ' ' (space) required.", + Description: "Authorization header is invalid -- one and only one ' ' (space) required", ArgumentName: "Authorization", }, InvalidArgAuthorizationType: { @@ -401,13 +401,3 @@ func GetInvalidArgBucketRegion(value string) InvalidArgumentError { Description: description, } } - -// GetInvalidArgResponseOverride is returned for a response-* query parameter -// that isn't one of the response headers GetObject and HeadObject can override. -func GetInvalidArgResponseOverride(name, value string) InvalidArgumentError { - return InvalidArgumentError{ - ArgumentName: name, - ArgumentValue: value, - Description: fmt.Sprintf("%s is not in the set of overridable response headers. Please refer to the S3 API documentation for a complete list of overridable response headers.", name), - } -} diff --git a/tests/integration/ListObjects.go b/tests/integration/ListObjects.go index 886c2a4..31dfead 100644 --- a/tests/integration/ListObjects.go +++ b/tests/integration/ListObjects.go @@ -17,8 +17,6 @@ package integration import ( "context" "fmt" - "net/http" - "time" "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/aws/aws-sdk-go-v2/service/s3/types" @@ -340,33 +338,6 @@ func ListObjects_marker_not_from_obj_list(s *S3Conf) error { }) } -// ListObjects_start_after_not_supported sends start-after without -// list-type=2. S3 rejects it with InvalidArgument instead of ignoring it. -func ListObjects_start_after_not_supported(s *S3Conf) error { - testName := "ListObjects_start_after_not_supported" - return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error { - _, err := putObjects(s3client, []string{"bar", "foo"}, bucket) - if err != nil { - return err - } - - // ListObjectsInput has no StartAfter field, so send the query directly - req, err := createSignedReq(http.MethodGet, s.endpoint, - fmt.Sprintf("%v?start-after=bar", bucket), - s.awsID, s.awsSecret, "s3", s.awsRegion, "", nil, time.Now(), nil) - if err != nil { - return err - } - - resp, err := s.httpClient.Do(req) - if err != nil { - return err - } - - return checkHTTPResponseApiErr(resp, s3err.GetInvalidArgumentErr(s3err.InvalidArgStartAfter, "")) - }) -} - func ListObjects_with_checksum(s *S3Conf) error { testName := "ListObjects_with_checksum" return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error { diff --git a/tests/integration/group-tests.go b/tests/integration/group-tests.go index 95501ad..c0f8261 100644 --- a/tests/integration/group-tests.go +++ b/tests/integration/group-tests.go @@ -149,6 +149,8 @@ func TestPutBucketTagging(ts *TestState) { ts.Run(PutBucketTagging_invalid_tags) ts.Run(PutBucketTagging_duplicate_keys) ts.Run(PutBucketTagging_tag_count_limit) + ts.Run(PutBucketTagging_invalid_tag_error_fields) + ts.Run(PutBucketTagging_multibyte_tags) ts.Run(PutBucketTagging_success) ts.Run(PutBucketTagging_success_status) } @@ -179,6 +181,7 @@ func TestPutObject(ts *TestState) { ts.Run(PutObject_plain_stores_aws_chunked_content_encoding) ts.Run(PutObject_unsigned_payload_with_aws_chunked_content_encoding) ts.Run(PutObject_tagging) + ts.Run(PutObject_tagging_invalid_argument_value) ts.Run(PutObject_missing_object_lock_retention_config) ts.Run(PutObject_with_object_lock) ts.Run(PutObject_missing_bucket_lock) @@ -187,6 +190,7 @@ func TestPutObject(ts *TestState) { ts.Run(PutObject_object_lock_checksum_required) ts.Run(PutObject_default_retention_checksum_required) ts.Run(PutObject_past_retain_until_date) + ts.Run(PutObject_object_lock_headers_validation) ts.Run(PutObject_invalid_retain_until_date) ts.Run(PutObject_conditional_writes) ts.Run(PutObject_should_combine_metadata) @@ -246,7 +250,6 @@ func TestHeadObject(ts *TestState) { ts.Run(HeadObject_overrides_success) ts.Run(HeadObject_overrides_presign_success) ts.Run(HeadObject_overrides_fail_public) - ts.Run(HeadObject_overrides_fail_invalid_header) ts.Run(HeadObject_range_and_part_number) ts.Run(HeadObject_mp_part_number_exceeds_parts_count) ts.Run(HeadObject_mp_part_number_success) @@ -295,7 +298,6 @@ func TestGetObject(ts *TestState) { ts.Run(GetObject_overrides_success) ts.Run(GetObject_overrides_presign_success) ts.Run(GetObject_overrides_fail_public) - ts.Run(GetObject_overrides_fail_invalid_header) ts.Run(GetObject_invalid_part_number) ts.Run(GetObject_range_and_part_number) ts.Run(GetObject_mp_part_number_exceeds_parts_count) @@ -336,6 +338,7 @@ func TestListObjectsV2(ts *TestState) { ts.Run(ListObjectsV2_both_start_after_and_continuation_token) ts.Run(ListObjectsV2_start_after_not_in_list) ts.Run(ListObjectsV2_start_after_empty_result) + ts.Run(ListObjectsV2_start_after_continuation_token) ts.Run(ListObjectsV2_both_delimiter_and_prefix) ts.Run(ListObjectsV2_single_dir_object_with_delim_and_prefix) ts.Run(ListObjectsV2_truncated_common_prefixes) @@ -437,6 +440,7 @@ func TestPutObjectTagging(ts *TestState) { ts.Run(PutObjectTagging_duplicate_keys) ts.Run(PutObjectTagging_tag_count_limit) ts.Run(PutObjectTagging_invalid_tags) + ts.Run(PutObjectTagging_invalid_tag_error_fields) ts.Run(PutObjectTagging_success) ts.Run(PutObjectTagging_empty_version_id) } @@ -559,6 +563,7 @@ func TestListMultipartUploads(ts *TestState) { ts.Run(ListMultipartUploads_keyMarker_not_from_list) ts.Run(ListMultipartUploads_upload_id_marker_with_key_marker) ts.Run(ListMultipartUploads_delimiter_truncated) + ts.Run(ListMultipartUploads_upload_id_marker_truncated) ts.Run(ListMultipartUploads_prefix) ts.Run(ListMultipartUploads_both_delimiter_and_prefix) ts.Run(ListMultipartUploads_delimiter_no_matches) @@ -587,6 +592,7 @@ func TestCompleteMultipartUpload(ts *TestState) { ts.Run(CompleteMultipartUpload_default_content_type) ts.Run(CompleteMultipartUpload_overwrite_resets_attributes) ts.Run(CompleteMultipartUpload_invalid_ETag) + ts.Run(CompleteMultipartUpload_invalid_ETag_error_fields) ts.Run(CompleteMultipartUpload_small_upload_size) ts.Run(CompleteMultipartUpload_empty_parts) ts.Run(CompleteMultipartUpload_missing_part_fields) @@ -616,6 +622,15 @@ func TestCompleteMultipartUpload(ts *TestState) { } ts.Run(CompleteMultipartUpload_success) ts.Run(CompleteMultipartUpload_already_completed) + ts.Run(CompleteMultipartUpload_upload_of_another_bucket) + ts.Run(CompleteMultipartUpload_upload_of_another_key) + ts.Run(CompleteMultipartUpload_non_existing_upload_existing_key) + ts.Run(CompleteMultipartUpload_aborted_upload_existing_key) + ts.Run(CompleteMultipartUpload_already_completed_overwritten) + // azure keeps no ETag of the completed parts to compare a retry with + if !ts.conf.azureTests { + ts.Run(CompleteMultipartUpload_already_completed_different_parts) + } if !(ts.conf.azureTests || ts.conf.sidecarTests) { ts.Run(CompleteMultipartUpload_racey_success) ts.Run(CompleteMultipartUpload_racey_data_integrity) @@ -805,6 +820,8 @@ func TestPutObjectLockConfiguration(ts *TestState) { ts.Run(PutObjectLockConfiguration_invalid_mode) ts.Run(PutObjectLockConfiguration_both_years_and_days) ts.Run(PutObjectLockConfiguration_invalid_years_days) + ts.Run(PutObjectLockConfiguration_default_retention_missing_period) + ts.Run(PutObjectLockConfiguration_rule_without_default_retention) ts.Run(PutObjectLockConfiguration_success) } @@ -840,6 +857,7 @@ func TestGetObjectRetention(ts *TestState) { ts.Run(GetObjectRetention_disabled_lock) ts.Run(GetObjectRetention_unset_config) ts.Run(GetObjectRetention_success) + ts.Run(GetObjectRetention_retain_until_date_format) ts.Run(GetObjectRetention_empty_version_id) } @@ -939,7 +957,6 @@ func TestSSECTransport(ts *TestState) { } func TestWORMProtection(ts *TestState) { - ts.Run(WORMProtection_bucket_object_lock_configuration_compliance_mode) ts.Run(WORMProtection_bucket_object_lock_configuration_governance_mode) ts.Run(WORMProtection_bucket_object_lock_governance_bypass_delete) ts.Run(WORMProtection_bucket_object_lock_governance_bypass_delete_multiple) @@ -958,6 +975,11 @@ func TestWORMProtection(ts *TestState) { ts.Run(WORMProtection_object_lock_retention_governance_bypass_delete_mul) ts.Run(WORMProtection_object_lock_legal_hold_locked) ts.Run(WORMProtection_root_bypass_governance_retention_delete_object) + ts.Run(WORMProtection_default_retention_applies_to_new_objects) + ts.Run(WORMProtection_default_retention_survives_rule_change) + ts.Run(WORMProtection_default_retention_explicit_lock_settings) + ts.Run(WORMProtection_default_retention_set_at_create_multipart_upload) + ts.Run(WORMProtection_legal_hold_outlives_expired_retention) } func TestFullFlow(ts *TestState) { @@ -1809,6 +1831,7 @@ func TestS3IAMAccessControl(ts *TestState) { ts.Run(S3IAMAccessControl_identity_policy_bucket_vs_object_arn) ts.Run(S3IAMAccessControl_post_object_identity_policy_resource_scoping) ts.Run(S3IAMAccessControl_post_object_tagging_identity_policy) + ts.Run(S3IAMAccessControl_post_object_lock_identity_policy) ts.Run(S3IAMAccessControl_identity_policy_not_action_and_not_resource) ts.Run(S3IAMAccessControl_identity_policy_explicit_deny_wins) ts.Run(S3IAMAccessControl_multiple_inline_policies_combine) @@ -1989,6 +2012,10 @@ func TestAccessControl(ts *TestState) { ts.Run(AccessControl_bucket_policy_condition_if_match_value) ts.Run(AccessControl_bucket_policy_condition_if_match_delete_object) ts.Run(AccessControl_bucket_policy_condition_if_match_versioned_delete) + ts.Run(AccessControl_owner_deny_only_policy_keeps_access) + ts.Run(AccessControl_owner_policy_lockout_protection) + ts.Run(AccessControl_acl_grant_with_bucket_policy) + ts.Run(AccessControl_acl_grant_excludes_bucket_configuration) } func TestPublicBuckets(ts *TestState) { @@ -2015,6 +2042,7 @@ func TestPublicBuckets(ts *TestState) { ts.Run(PublicBucket_put_object_default_retention) ts.Run(PublicBucket_upload_part_object_lock) ts.Run(PublicBucket_post_object_tagging) + ts.Run(PublicBucket_post_object_lock) if ts.conf.versioningEnabled { ts.Run(PublicBucket_object_version_actions) ts.Run(PublicBucket_object_version_actions_public_acl) @@ -2033,7 +2061,7 @@ func TestVersioning(ts *TestState) { ts.Run(GetBucketVersioning_success) ts.Run(GetBucketVersioning_non_owner_access_denied) ts.Run(GetBucketVersioning_with_policy_access) - ts.Run(GetBucketVersioning_with_acl_access) + ts.Run(GetBucketVersioning_acl_grant_access_denied) // DeleteBucket action ts.Run(Versioning_DeleteBucket_not_empty) // PutObject action @@ -2136,6 +2164,7 @@ func TestVersioning(ts *TestState) { ts.Run(Versioning_Multipart_Upload_suspended_overwrite_versioned_object) ts.Run(Versioning_Multipart_Upload_overwrite_keeps_previous_version_metadata) ts.Run(Versioning_Multipart_Upload_conditional_writes_over_delete_marker) + ts.Run(Versioning_Multipart_Upload_already_completed) ts.Run(Versioning_UploadPartCopy_invalid_versionId) ts.Run(Versioning_UploadPartCopy_encoded_versionid_separator_invalid_versionId) ts.Run(Versioning_UploadPartCopy_non_existing_versionId) @@ -2246,6 +2275,10 @@ func TestPostObject(ts *TestState) { ts.Run(PostObject_invalid_tagging) ts.Run(PostObject_success_with_tagging) ts.Run(PostObject_success_double_dash_boundary) + ts.Run(PostObject_object_lock_success) + ts.Run(PostObject_object_lock_invalid_fields) + ts.Run(PostObject_object_lock_missing_bucket_config) + ts.Run(PostObject_object_lock_default_retention) if !ts.conf.azureTests { ts.Run(PostObject_invalid_checksum_value) ts.Run(PostObject_invalid_checksum_algorithm) @@ -2359,6 +2392,7 @@ func GetIntTests() IntTests { "S3IAMAccessControl_identity_policy_bucket_vs_object_arn": S3IAMAccessControl_identity_policy_bucket_vs_object_arn, "S3IAMAccessControl_post_object_identity_policy_resource_scoping": S3IAMAccessControl_post_object_identity_policy_resource_scoping, "S3IAMAccessControl_post_object_tagging_identity_policy": S3IAMAccessControl_post_object_tagging_identity_policy, + "S3IAMAccessControl_post_object_lock_identity_policy": S3IAMAccessControl_post_object_lock_identity_policy, "S3IAMAccessControl_identity_policy_not_action_and_not_resource": S3IAMAccessControl_identity_policy_not_action_and_not_resource, "S3IAMAccessControl_identity_policy_explicit_deny_wins": S3IAMAccessControl_identity_policy_explicit_deny_wins, "S3IAMAccessControl_multiple_inline_policies_combine": S3IAMAccessControl_multiple_inline_policies_combine, @@ -2951,6 +2985,7 @@ func GetIntTests() IntTests { "PutObject_default_retention_checksum_required": PutObject_default_retention_checksum_required, "PutObject_past_retain_until_date": PutObject_past_retain_until_date, "PutObject_invalid_retain_until_date": PutObject_invalid_retain_until_date, + "PutObject_object_lock_headers_validation": PutObject_object_lock_headers_validation, "PutObject_conditional_writes": PutObject_conditional_writes, "PutObject_should_combine_metadata": PutObject_should_combine_metadata, "PutObject_md5": PutObject_md5, @@ -3019,6 +3054,8 @@ func GetIntTests() IntTests { "PutBucketTagging_invalid_tags": PutBucketTagging_invalid_tags, "PutBucketTagging_duplicate_keys": PutBucketTagging_duplicate_keys, "PutBucketTagging_tag_count_limit": PutBucketTagging_tag_count_limit, + "PutBucketTagging_invalid_tag_error_fields": PutBucketTagging_invalid_tag_error_fields, + "PutBucketTagging_multibyte_tags": PutBucketTagging_multibyte_tags, "PutBucketTagging_success": PutBucketTagging_success, "PutBucketTagging_success_status": PutBucketTagging_success_status, "GetBucketTagging_non_existing_bucket": GetBucketTagging_non_existing_bucket, @@ -3038,6 +3075,7 @@ func GetIntTests() IntTests { "PutObject_plain_stores_aws_chunked_content_encoding": PutObject_plain_stores_aws_chunked_content_encoding, "PutObject_unsigned_payload_with_aws_chunked_content_encoding": PutObject_unsigned_payload_with_aws_chunked_content_encoding, "PutObject_tagging": PutObject_tagging, + "PutObject_tagging_invalid_argument_value": PutObject_tagging_invalid_argument_value, "PutObject_success": PutObject_success, "PutObject_default_content_type": PutObject_default_content_type, "PutObject_overwrite_resets_attributes": PutObject_overwrite_resets_attributes, @@ -3066,7 +3104,6 @@ func GetIntTests() IntTests { "HeadObject_overrides_success": HeadObject_overrides_success, "HeadObject_overrides_presign_success": HeadObject_overrides_presign_success, "HeadObject_overrides_fail_public": HeadObject_overrides_fail_public, - "HeadObject_overrides_fail_invalid_header": HeadObject_overrides_fail_invalid_header, "HeadObject_range_and_part_number": HeadObject_range_and_part_number, "HeadObject_mp_part_number_exceeds_parts_count": HeadObject_mp_part_number_exceeds_parts_count, "HeadObject_mp_part_number_success": HeadObject_mp_part_number_success, @@ -3103,7 +3140,6 @@ func GetIntTests() IntTests { "GetObject_overrides_success": GetObject_overrides_success, "GetObject_overrides_presign_success": GetObject_overrides_presign_success, "GetObject_overrides_fail_public": GetObject_overrides_fail_public, - "GetObject_overrides_fail_invalid_header": GetObject_overrides_fail_invalid_header, "GetObject_invalid_part_number": GetObject_invalid_part_number, "GetObject_range_and_part_number": GetObject_range_and_part_number, "GetObject_mp_part_number_exceeds_parts_count": GetObject_mp_part_number_exceeds_parts_count, @@ -3140,6 +3176,7 @@ func GetIntTests() IntTests { "ListObjectsV2_both_start_after_and_continuation_token": ListObjectsV2_both_start_after_and_continuation_token, "ListObjectsV2_start_after_not_in_list": ListObjectsV2_start_after_not_in_list, "ListObjectsV2_start_after_empty_result": ListObjectsV2_start_after_empty_result, + "ListObjectsV2_start_after_continuation_token": ListObjectsV2_start_after_continuation_token, "ListObjectsV2_both_delimiter_and_prefix": ListObjectsV2_both_delimiter_and_prefix, "ListObjectsV2_single_dir_object_with_delim_and_prefix": ListObjectsV2_single_dir_object_with_delim_and_prefix, "ListObjectsV2_truncated_common_prefixes": ListObjectsV2_truncated_common_prefixes, @@ -3220,6 +3257,7 @@ func GetIntTests() IntTests { "PutObjectTagging_duplicate_keys": PutObjectTagging_duplicate_keys, "PutObjectTagging_tag_count_limit": PutObjectTagging_tag_count_limit, "PutObjectTagging_invalid_tags": PutObjectTagging_invalid_tags, + "PutObjectTagging_invalid_tag_error_fields": PutObjectTagging_invalid_tag_error_fields, "PutObjectTagging_success": PutObjectTagging_success, "PutObjectTagging_empty_version_id": PutObjectTagging_empty_version_id, "GetObjectTagging_non_existing_object": GetObjectTagging_non_existing_object, @@ -3309,6 +3347,7 @@ func GetIntTests() IntTests { "ListMultipartUploads_keyMarker_not_from_list": ListMultipartUploads_keyMarker_not_from_list, "ListMultipartUploads_upload_id_marker_with_key_marker": ListMultipartUploads_upload_id_marker_with_key_marker, "ListMultipartUploads_delimiter_truncated": ListMultipartUploads_delimiter_truncated, + "ListMultipartUploads_upload_id_marker_truncated": ListMultipartUploads_upload_id_marker_truncated, "ListMultipartUploads_prefix": ListMultipartUploads_prefix, "ListMultipartUploads_both_delimiter_and_prefix": ListMultipartUploads_both_delimiter_and_prefix, "ListMultipartUploads_with_upload_id": ListMultipartUploads_with_upload_id, @@ -3326,6 +3365,7 @@ func GetIntTests() IntTests { "CompleteMultipartUpload_default_content_type": CompleteMultipartUpload_default_content_type, "CompleteMultipartUpload_overwrite_resets_attributes": CompleteMultipartUpload_overwrite_resets_attributes, "CompleteMultipartUpload_invalid_ETag": CompleteMultipartUpload_invalid_ETag, + "CompleteMultipartUpload_invalid_ETag_error_fields": CompleteMultipartUpload_invalid_ETag_error_fields, "CompleteMultipartUpload_small_upload_size": CompleteMultipartUpload_small_upload_size, "CompleteMultipartUpload_empty_parts": CompleteMultipartUpload_empty_parts, "CompleteMultipartUpload_missing_part_fields": CompleteMultipartUpload_missing_part_fields, @@ -3353,6 +3393,12 @@ func GetIntTests() IntTests { "CompleteMultipartUpload_success": CompleteMultipartUpload_success, "CompleteMultipartUpload_data_integrity_etag": CompleteMultipartUpload_data_integrity_etag, "CompleteMultipartUpload_already_completed": CompleteMultipartUpload_already_completed, + "CompleteMultipartUpload_upload_of_another_bucket": CompleteMultipartUpload_upload_of_another_bucket, + "CompleteMultipartUpload_upload_of_another_key": CompleteMultipartUpload_upload_of_another_key, + "CompleteMultipartUpload_non_existing_upload_existing_key": CompleteMultipartUpload_non_existing_upload_existing_key, + "CompleteMultipartUpload_aborted_upload_existing_key": CompleteMultipartUpload_aborted_upload_existing_key, + "CompleteMultipartUpload_already_completed_different_parts": CompleteMultipartUpload_already_completed_different_parts, + "CompleteMultipartUpload_already_completed_overwritten": CompleteMultipartUpload_already_completed_overwritten, "CompleteMultipartUpload_racey_success": CompleteMultipartUpload_racey_success, "CompleteMultipartUpload_racey_data_integrity": CompleteMultipartUpload_racey_data_integrity, "PutBucketAcl_non_existing_bucket": PutBucketAcl_non_existing_bucket, @@ -3490,6 +3536,8 @@ func GetIntTests() IntTests { "PutObjectLockConfiguration_invalid_mode": PutObjectLockConfiguration_invalid_mode, "PutObjectLockConfiguration_both_years_and_days": PutObjectLockConfiguration_both_years_and_days, "PutObjectLockConfiguration_invalid_years_days": PutObjectLockConfiguration_invalid_years_days, + "PutObjectLockConfiguration_default_retention_missing_period": PutObjectLockConfiguration_default_retention_missing_period, + "PutObjectLockConfiguration_rule_without_default_retention": PutObjectLockConfiguration_rule_without_default_retention, "PutObjectLockConfiguration_success": PutObjectLockConfiguration_success, "GetObjectLockConfiguration_non_existing_bucket": GetObjectLockConfiguration_non_existing_bucket, "GetObjectLockConfiguration_unset_config": GetObjectLockConfiguration_unset_config, @@ -3516,6 +3564,7 @@ func GetIntTests() IntTests { "GetObjectRetention_disabled_lock": GetObjectRetention_disabled_lock, "GetObjectRetention_unset_config": GetObjectRetention_unset_config, "GetObjectRetention_success": GetObjectRetention_success, + "GetObjectRetention_retain_until_date_format": GetObjectRetention_retain_until_date_format, "GetObjectRetention_empty_version_id": GetObjectRetention_empty_version_id, "PutObjectLegalHold_non_existing_bucket": PutObjectLegalHold_non_existing_bucket, "PutObjectLegalHold_non_existing_object": PutObjectLegalHold_non_existing_object, @@ -3568,7 +3617,6 @@ func GetIntTests() IntTests { "GetBucketAccelerateConfiguration_not_implemented": GetBucketAccelerateConfiguration_not_implemented, "PutObjectAcl_not_implemented": PutObjectAcl_not_implemented, "GetObjectAcl_not_implemented": GetObjectAcl_not_implemented, - "WORMProtection_bucket_object_lock_configuration_compliance_mode": WORMProtection_bucket_object_lock_configuration_compliance_mode, "WORMProtection_bucket_object_lock_configuration_governance_mode": WORMProtection_bucket_object_lock_configuration_governance_mode, "WORMProtection_bucket_object_lock_governance_bypass_delete": WORMProtection_bucket_object_lock_governance_bypass_delete, "WORMProtection_bucket_object_lock_governance_bypass_delete_multiple": WORMProtection_bucket_object_lock_governance_bypass_delete_multiple, @@ -3587,6 +3635,11 @@ func GetIntTests() IntTests { "WORMProtection_object_lock_retention_governance_bypass_delete_mul": WORMProtection_object_lock_retention_governance_bypass_delete_mul, "WORMProtection_object_lock_legal_hold_locked": WORMProtection_object_lock_legal_hold_locked, "WORMProtection_root_bypass_governance_retention_delete_object": WORMProtection_root_bypass_governance_retention_delete_object, + "WORMProtection_default_retention_applies_to_new_objects": WORMProtection_default_retention_applies_to_new_objects, + "WORMProtection_default_retention_survives_rule_change": WORMProtection_default_retention_survives_rule_change, + "WORMProtection_default_retention_explicit_lock_settings": WORMProtection_default_retention_explicit_lock_settings, + "WORMProtection_default_retention_set_at_create_multipart_upload": WORMProtection_default_retention_set_at_create_multipart_upload, + "WORMProtection_legal_hold_outlives_expired_retention": WORMProtection_legal_hold_outlives_expired_retention, "PutObject_overwrite_dir_obj": PutObject_overwrite_dir_obj, "PutObject_overwrite_file_obj": PutObject_overwrite_file_obj, "PutObject_overwrite_file_obj_with_nested_obj": PutObject_overwrite_file_obj_with_nested_obj, @@ -3657,6 +3710,10 @@ func GetIntTests() IntTests { "AccessControl_bucket_policy_condition_if_match_value": AccessControl_bucket_policy_condition_if_match_value, "AccessControl_bucket_policy_condition_if_match_delete_object": AccessControl_bucket_policy_condition_if_match_delete_object, "AccessControl_bucket_policy_condition_if_match_versioned_delete": AccessControl_bucket_policy_condition_if_match_versioned_delete, + "AccessControl_owner_deny_only_policy_keeps_access": AccessControl_owner_deny_only_policy_keeps_access, + "AccessControl_owner_policy_lockout_protection": AccessControl_owner_policy_lockout_protection, + "AccessControl_acl_grant_with_bucket_policy": AccessControl_acl_grant_with_bucket_policy, + "AccessControl_acl_grant_excludes_bucket_configuration": AccessControl_acl_grant_excludes_bucket_configuration, "PublicBucket_default_private_bucket": PublicBucket_default_private_bucket, "PublicBucket_public_bucket_policy": PublicBucket_public_bucket_policy, "PublicBucket_public_object_policy": PublicBucket_public_object_policy, @@ -3673,6 +3730,7 @@ func GetIntTests() IntTests { "PublicBucket_put_object_default_retention": PublicBucket_put_object_default_retention, "PublicBucket_upload_part_object_lock": PublicBucket_upload_part_object_lock, "PublicBucket_post_object_tagging": PublicBucket_post_object_tagging, + "PublicBucket_post_object_lock": PublicBucket_post_object_lock, "PublicBucket_object_version_actions": PublicBucket_object_version_actions, "PublicBucket_object_version_actions_public_acl": PublicBucket_object_version_actions_public_acl, "PutBucketVersioning_non_existing_bucket": PutBucketVersioning_non_existing_bucket, @@ -3684,7 +3742,7 @@ func GetIntTests() IntTests { "GetBucketVersioning_success": GetBucketVersioning_success, "GetBucketVersioning_non_owner_access_denied": GetBucketVersioning_non_owner_access_denied, "GetBucketVersioning_with_policy_access": GetBucketVersioning_with_policy_access, - "GetBucketVersioning_with_acl_access": GetBucketVersioning_with_acl_access, + "GetBucketVersioning_acl_grant_access_denied": GetBucketVersioning_acl_grant_access_denied, "Versioning_DeleteBucket_not_empty": Versioning_DeleteBucket_not_empty, "Versioning_PutObject_suspended_null_versionId_obj": Versioning_PutObject_suspended_null_versionId_obj, "Versioning_PutObject_null_versionId_obj": Versioning_PutObject_null_versionId_obj, @@ -3771,6 +3829,7 @@ func GetIntTests() IntTests { "Versioning_Multipart_Upload_suspended_overwrite_versioned_object": Versioning_Multipart_Upload_suspended_overwrite_versioned_object, "Versioning_Multipart_Upload_overwrite_keeps_previous_version_metadata": Versioning_Multipart_Upload_overwrite_keeps_previous_version_metadata, "Versioning_Multipart_Upload_conditional_writes_over_delete_marker": Versioning_Multipart_Upload_conditional_writes_over_delete_marker, + "Versioning_Multipart_Upload_already_completed": Versioning_Multipart_Upload_already_completed, "Versioning_UploadPartCopy_invalid_versionId": Versioning_UploadPartCopy_invalid_versionId, "Versioning_UploadPartCopy_encoded_versionid_separator_invalid_versionId": Versioning_UploadPartCopy_encoded_versionid_separator_invalid_versionId, "Versioning_UploadPartCopy_non_existing_versionId": Versioning_UploadPartCopy_non_existing_versionId, @@ -3895,5 +3954,9 @@ func GetIntTests() IntTests { "PostObject_multiple_checksum_headers": PostObject_multiple_checksum_headers, "PostObject_checksums_success": PostObject_checksums_success, "PostObject_success_double_dash_boundary": PostObject_success_double_dash_boundary, + "PostObject_object_lock_success": PostObject_object_lock_success, + "PostObject_object_lock_invalid_fields": PostObject_object_lock_invalid_fields, + "PostObject_object_lock_missing_bucket_config": PostObject_object_lock_missing_bucket_config, + "PostObject_object_lock_default_retention": PostObject_object_lock_default_retention, } } diff --git a/tests/test_rest_list_objects.sh b/tests/test_rest_list_objects.sh index 45b7260..8f30c9b 100644 --- a/tests/test_rest_list_objects.sh +++ b/tests/test_rest_list_objects.sh @@ -88,23 +88,11 @@ source ./tests/drivers/objects_and_versions.sh # tags: curl,ListObjectsV2,bucket-region,x-amz-bucket-region @test "REST - ListObjectsV2 - includes bucket header" { - if [ "$DIRECT" != "true" ]; then - skip "https://github.com/versity/versitygw/issues/1814" - fi - run get_bucket_name "$BUCKET_ONE_NAME" - assert_success - bucket_name="$output" + local bucket_name test_file test_file_two - run get_file_name - assert_success - test_file="$output" - - run get_file_name - assert_success - test_file_two="$output" - - run setup_bucket_and_add_files "$bucket_name" "$test_file" "$test_file_two" + run setup_bucket_and_add_files_v3 "$BUCKET_ONE_NAME" 2 assert_success + read -r bucket_name test_file test_file_two <<< "$output" run send_rest_go_command_check_header_key_and_value "200" "x-amz-bucket-region" "$AWS_REGION" "-method" "GET" \ "-bucketName" "$bucket_name" "-query" "list-type=2" @@ -260,6 +248,9 @@ source ./tests/drivers/objects_and_versions.sh # tags: curl,ListObjects,start-after,invalid-query @test "ListObjectsV1 - start-after - error" { + if [ "$DIRECT" != "true" ]; then + skip "https://github.com/versity/versitygw/issues/2004" + fi run setup_bucket_and_files_v3 "$BUCKET_ONE_NAME" 2 assert_success read -r bucket_name file_one file_two <<< "$output" @@ -276,9 +267,6 @@ source ./tests/drivers/objects_and_versions.sh # tags: curl,ListObjectsV2,start-after,continuation-token @test "ListObjectsV1 - start-after - doesn't include continuation token" { - if [ "$DIRECT" != "true" ]; then - skip "https://github.com/versity/versitygw/issues/2007" - fi run setup_bucket_and_files_v3 "$BUCKET_ONE_NAME" 2 assert_success read -r bucket_name file_one file_two <<< "$output"