Browse Source

fix many issues

pull/6997/head
chrislu 5 months ago
parent
commit
8121fdeec3
  1. 10
      weed/s3api/s3api_object_handlers_delete.go
  2. 6
      weed/s3api/s3api_object_handlers_put.go
  3. 13
      weed/s3api/s3api_object_retention_test.go

10
weed/s3api/s3api_object_handlers_delete.go

@ -49,19 +49,17 @@ func (s3a *S3ApiServer) DeleteObjectHandler(w http.ResponseWriter, r *http.Reque
auditLog = s3err.GetAccessLog(r, http.StatusNoContent, s3err.ErrNone)
}
// Check object lock permissions before deletion (only for versioned buckets)
if versioningEnabled {
// Handle versioned delete
if versionId != "" {
// Check object lock permissions before deleting specific version
bypassGovernance := r.Header.Get("x-amz-bypass-governance-retention") == "true"
if err := s3a.checkObjectLockPermissions(r, bucket, object, versionId, bypassGovernance); err != nil {
glog.V(2).Infof("DeleteObjectHandler: object lock check failed for %s/%s: %v", bucket, object, err)
s3err.WriteErrorResponse(w, r, s3err.ErrAccessDenied)
return
}
}
if versioningEnabled {
// Handle versioned delete
if versionId != "" {
// Delete specific version
err := s3a.deleteSpecificObjectVersion(bucket, object, versionId)
if err != nil {
@ -73,7 +71,7 @@ func (s3a *S3ApiServer) DeleteObjectHandler(w http.ResponseWriter, r *http.Reque
// Set version ID in response header
w.Header().Set("x-amz-version-id", versionId)
} else {
// Create delete marker (logical delete)
// Create delete marker (logical delete) - this is NOT blocked by object lock retention
deleteMarkerVersionId, err := s3a.createDeleteMarker(bucket, object)
if err != nil {
glog.Errorf("Failed to create delete marker: %v", err)

6
weed/s3api/s3api_object_handlers_put.go

@ -573,9 +573,9 @@ func mapValidationErrorToS3Error(err error) s3err.ErrorCode {
// This matches the test expectations
return s3err.ErrInvalidRequest
case errors.Is(err, ErrInvalidLegalHoldStatus):
// For invalid legal hold status, return InvalidRequest
// This matches the test expectations
return s3err.ErrInvalidRequest
// For invalid legal hold status, return MalformedXML
// AWS S3 returns MalformedXML for invalid legal hold status values
return s3err.ErrMalformedXML
case errors.Is(err, ErrInvalidRetentionDateFormat):
// For malformed retention date format, return MalformedDate
// This matches the test expectations

13
weed/s3api/s3api_object_retention_test.go

@ -500,6 +500,7 @@ func TestValidateObjectLockConfiguration(t *testing.T) {
DefaultRetention: &DefaultRetention{
Mode: "GOVERNANCE",
Days: 30,
DaysSet: true,
},
},
},
@ -513,6 +514,7 @@ func TestValidateObjectLockConfiguration(t *testing.T) {
DefaultRetention: &DefaultRetention{
Mode: "COMPLIANCE",
Years: 1,
YearsSet: true,
},
},
},
@ -548,6 +550,8 @@ func TestValidateObjectLockConfiguration(t *testing.T) {
Mode: "GOVERNANCE",
Days: 30,
Years: 1,
DaysSet: true,
YearsSet: true,
},
},
},
@ -575,6 +579,7 @@ func TestValidateObjectLockConfiguration(t *testing.T) {
DefaultRetention: &DefaultRetention{
Mode: "INVALID_MODE",
Days: 30,
DaysSet: true,
},
},
},
@ -589,6 +594,7 @@ func TestValidateObjectLockConfiguration(t *testing.T) {
DefaultRetention: &DefaultRetention{
Mode: "GOVERNANCE",
Days: 50000,
DaysSet: true,
},
},
},
@ -603,6 +609,7 @@ func TestValidateObjectLockConfiguration(t *testing.T) {
DefaultRetention: &DefaultRetention{
Mode: "GOVERNANCE",
Years: 200,
YearsSet: true,
},
},
},
@ -653,6 +660,7 @@ func TestValidateDefaultRetention(t *testing.T) {
retention: &DefaultRetention{
Mode: "GOVERNANCE",
Days: 30,
DaysSet: true,
},
expectError: false,
},
@ -661,6 +669,7 @@ func TestValidateDefaultRetention(t *testing.T) {
retention: &DefaultRetention{
Mode: "COMPLIANCE",
Years: 1,
YearsSet: true,
},
expectError: false,
},
@ -668,6 +677,7 @@ func TestValidateDefaultRetention(t *testing.T) {
name: "Missing mode",
retention: &DefaultRetention{
Days: 30,
DaysSet: true,
},
expectError: true,
errorMsg: "default retention must specify Mode",
@ -677,6 +687,7 @@ func TestValidateDefaultRetention(t *testing.T) {
retention: &DefaultRetention{
Mode: "INVALID",
Days: 30,
DaysSet: true,
},
expectError: true,
errorMsg: "invalid default retention mode",
@ -687,6 +698,8 @@ func TestValidateDefaultRetention(t *testing.T) {
Mode: "GOVERNANCE",
Days: 30,
Years: 1,
DaysSet: true,
YearsSet: true,
},
expectError: true,
errorMsg: "default retention cannot specify both Days and Years",

Loading…
Cancel
Save