|
|
@ -53,8 +53,8 @@ func (s3a *S3ApiServer) DeleteObjectHandler(w http.ResponseWriter, r *http.Reque |
|
|
// Handle versioned delete
|
|
|
// Handle versioned delete
|
|
|
if versionId != "" { |
|
|
if versionId != "" { |
|
|
// Check object lock permissions before deleting specific version
|
|
|
// Check object lock permissions before deleting specific version
|
|
|
bypassGovernance := s3a.validateGovernanceBypass(r, bucket, object) |
|
|
|
|
|
if err := s3a.checkObjectLockPermissions(r, bucket, object, versionId, bypassGovernance); err != nil { |
|
|
|
|
|
|
|
|
governanceBypassAllowed := s3a.evaluateGovernanceBypassRequest(r, bucket, object) |
|
|
|
|
|
if err := s3a.enforceObjectLockProtections(r, bucket, object, versionId, governanceBypassAllowed); err != nil { |
|
|
glog.V(2).Infof("DeleteObjectHandler: object lock check failed for %s/%s: %v", bucket, object, err) |
|
|
glog.V(2).Infof("DeleteObjectHandler: object lock check failed for %s/%s: %v", bucket, object, err) |
|
|
s3err.WriteErrorResponse(w, r, s3err.ErrAccessDenied) |
|
|
s3err.WriteErrorResponse(w, r, s3err.ErrAccessDenied) |
|
|
return |
|
|
return |
|
|
@ -73,8 +73,8 @@ func (s3a *S3ApiServer) DeleteObjectHandler(w http.ResponseWriter, r *http.Reque |
|
|
} else { |
|
|
} else { |
|
|
// Check object lock permissions before creating delete marker
|
|
|
// Check object lock permissions before creating delete marker
|
|
|
// AWS S3 behavior: delete operations fail if latest version has retention protection
|
|
|
// AWS S3 behavior: delete operations fail if latest version has retention protection
|
|
|
bypassGovernance := s3a.validateGovernanceBypass(r, bucket, object) |
|
|
|
|
|
if err := s3a.checkObjectLockPermissions(r, bucket, object, "", bypassGovernance); err != nil { |
|
|
|
|
|
|
|
|
governanceBypassAllowed := s3a.evaluateGovernanceBypassRequest(r, bucket, object) |
|
|
|
|
|
if err := s3a.enforceObjectLockProtections(r, bucket, object, "", governanceBypassAllowed); err != nil { |
|
|
glog.V(2).Infof("DeleteObjectHandler: object lock check failed for %s/%s: %v", bucket, object, err) |
|
|
glog.V(2).Infof("DeleteObjectHandler: object lock check failed for %s/%s: %v", bucket, object, err) |
|
|
s3err.WriteErrorResponse(w, r, s3err.ErrAccessDenied) |
|
|
s3err.WriteErrorResponse(w, r, s3err.ErrAccessDenied) |
|
|
return |
|
|
return |
|
|
@ -95,8 +95,8 @@ func (s3a *S3ApiServer) DeleteObjectHandler(w http.ResponseWriter, r *http.Reque |
|
|
} else { |
|
|
} else { |
|
|
// Handle regular delete (non-versioned)
|
|
|
// Handle regular delete (non-versioned)
|
|
|
// Check object lock permissions before deleting object
|
|
|
// Check object lock permissions before deleting object
|
|
|
bypassGovernance := s3a.validateGovernanceBypass(r, bucket, object) |
|
|
|
|
|
if err := s3a.checkObjectLockPermissions(r, bucket, object, "", bypassGovernance); err != nil { |
|
|
|
|
|
|
|
|
governanceBypassAllowed := s3a.evaluateGovernanceBypassRequest(r, bucket, object) |
|
|
|
|
|
if err := s3a.enforceObjectLockProtections(r, bucket, object, "", governanceBypassAllowed); err != nil { |
|
|
glog.V(2).Infof("DeleteObjectHandler: object lock check failed for %s/%s: %v", bucket, object, err) |
|
|
glog.V(2).Infof("DeleteObjectHandler: object lock check failed for %s/%s: %v", bucket, object, err) |
|
|
s3err.WriteErrorResponse(w, r, s3err.ErrAccessDenied) |
|
|
s3err.WriteErrorResponse(w, r, s3err.ErrAccessDenied) |
|
|
return |
|
|
return |
|
|
@ -231,8 +231,8 @@ func (s3a *S3ApiServer) DeleteMultipleObjectsHandler(w http.ResponseWriter, r *h |
|
|
// Check object lock permissions before deletion (only for versioned buckets)
|
|
|
// Check object lock permissions before deletion (only for versioned buckets)
|
|
|
if versioningEnabled { |
|
|
if versioningEnabled { |
|
|
// Validate governance bypass for this specific object
|
|
|
// Validate governance bypass for this specific object
|
|
|
bypassGovernance := s3a.validateGovernanceBypass(r, bucket, object.Key) |
|
|
|
|
|
if err := s3a.checkObjectLockPermissions(r, bucket, object.Key, object.VersionId, bypassGovernance); err != nil { |
|
|
|
|
|
|
|
|
governanceBypassAllowed := s3a.evaluateGovernanceBypassRequest(r, bucket, object.Key) |
|
|
|
|
|
if err := s3a.enforceObjectLockProtections(r, bucket, object.Key, object.VersionId, governanceBypassAllowed); err != nil { |
|
|
glog.V(2).Infof("DeleteMultipleObjectsHandler: object lock check failed for %s/%s (version: %s): %v", bucket, object.Key, object.VersionId, err) |
|
|
glog.V(2).Infof("DeleteMultipleObjectsHandler: object lock check failed for %s/%s (version: %s): %v", bucket, object.Key, object.VersionId, err) |
|
|
deleteErrors = append(deleteErrors, DeleteError{ |
|
|
deleteErrors = append(deleteErrors, DeleteError{ |
|
|
Code: s3err.GetAPIError(s3err.ErrAccessDenied).Code, |
|
|
Code: s3err.GetAPIError(s3err.ErrAccessDenied).Code, |
|
|
|