Skip to content

Commit 5bc321e

Browse files
harshavardhanaminio-trusted
authored andcommitted
fix: handle crash in retention handler for object locked buckets
1 parent 4e38a54 commit 5bc321e

File tree

1 file changed

+40
-22
lines changed

1 file changed

+40
-22
lines changed

restapi/user_buckets.go

Lines changed: 40 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ func registerBucketsHandlers(api *operations.ConsoleAPI) {
145145
})
146146
// get bucket object locking status
147147
api.UserAPIGetBucketObjectLockingStatusHandler = user_api.GetBucketObjectLockingStatusHandlerFunc(func(params user_api.GetBucketObjectLockingStatusParams, session *models.Principal) middleware.Responder {
148-
getBucketObjectLockingStatus, err := getBucketObLockingResponse(session, params.BucketName)
148+
getBucketObjectLockingStatus, err := getBucketObjectLockingResponse(session, params.BucketName)
149149
if err != nil {
150150
return user_api.NewGetBucketObjectLockingStatusDefault(500).WithPayload(&models.Error{Code: 500, Message: swag.String(err.Error())})
151151
}
@@ -710,30 +710,48 @@ func getBucketRetentionConfig(ctx context.Context, client MinioClient, bucketNam
710710
}
711711
return nil, err
712712
}
713+
714+
// These values can be empty when all are empty, it means
715+
// object was created with object locking enabled but
716+
// does not have any default object locking configuration.
717+
if m == nil && v == nil && u == nil {
718+
return &models.GetBucketRetentionConfig{}, nil
719+
}
720+
713721
var mode models.ObjectRetentionMode
714722
var unit models.ObjectRetentionUnit
715-
switch *m {
716-
case minio.Governance:
717-
mode = models.ObjectRetentionModeGovernance
718-
case minio.Compliance:
719-
mode = models.ObjectRetentionModeCompliance
720-
default:
721-
return nil, errors.New("invalid retention mode")
723+
724+
if m != nil {
725+
switch *m {
726+
case minio.Governance:
727+
mode = models.ObjectRetentionModeGovernance
728+
case minio.Compliance:
729+
mode = models.ObjectRetentionModeCompliance
730+
default:
731+
return nil, errors.New("invalid retention mode")
732+
}
722733
}
723734

724-
switch *u {
725-
case minio.Days:
726-
unit = models.ObjectRetentionUnitDays
727-
case minio.Years:
728-
unit = models.ObjectRetentionUnitYears
729-
default:
730-
return nil, errors.New("invalid retention unit")
735+
if u != nil {
736+
switch *u {
737+
case minio.Days:
738+
unit = models.ObjectRetentionUnitDays
739+
case minio.Years:
740+
unit = models.ObjectRetentionUnitYears
741+
default:
742+
return nil, errors.New("invalid retention unit")
743+
}
744+
}
745+
746+
var validity int32
747+
if v != nil {
748+
validity = int32(*v)
731749
}
732750

733751
config := &models.GetBucketRetentionConfig{
734752
Mode: mode,
735753
Unit: unit,
736-
Validity: int32(*v),
754+
Validity: validity,
737755
}
738756
return config, nil
739757
}
@@ -745,6 +763,7 @@ func getBucketRetentionConfigResponse(session *models.Principal, bucketName stri
745763
if err != nil {
746764
return nil, prepareError(err)
747765
}
766+
748767
// create a minioClient interface implementation
749768
// defining the client to be used
750769
minioClient := minioClient{client: mClient}
@@ -756,7 +775,7 @@ func getBucketRetentionConfigResponse(session *models.Principal, bucketName stri
756775
return config, nil
757776
}
758777

759-
func getBucketObLockingResponse(session *models.Principal, bucketName string) (*models.BucketObLockingResponse, error) {
778+
func getBucketObjectLockingResponse(session *models.Principal, bucketName string) (*models.BucketObLockingResponse, error) {
760779
ctx, cancel := context.WithTimeout(context.Background(), time.Second*20)
761780
defer cancel()
762781

@@ -772,19 +791,18 @@ func getBucketObLockingResponse(session *models.Principal, bucketName string) (*
772791
// we will tolerate this call failing
773792
_, _, _, _, err = minioClient.getObjectLockConfig(ctx, bucketName)
774793
if err != nil {
775-
if err.Error() == "Object Lock configuration does not exist for this bucket" {
794+
if minio.ToErrorResponse(err).Code == "ObjectLockConfigurationNotFoundError" {
776795
return &models.BucketObLockingResponse{
777796
ObjectLockingEnabled: false,
778797
}, nil
779798
}
780-
LogError("error object locking bucket: %v", err)
799+
return nil, err
781800
}
782801

783802
// serialize output
784-
listBucketsResponse := &models.BucketObLockingResponse{
803+
return &models.BucketObLockingResponse{
785804
ObjectLockingEnabled: true,
786-
}
787-
return listBucketsResponse, nil
805+
}, nil
788806
}
789807

790808
func getBucketRewindResponse(session *models.Principal, params user_api.GetBucketRewindParams) (*models.RewindResponse, *models.Error) {

0 commit comments

Comments
 (0)