diff --git a/master/api_service.go b/master/api_service.go index dabe9949f..164f7de1c 100644 --- a/master/api_service.go +++ b/master/api_service.go @@ -7199,6 +7199,8 @@ func (m *Server) SetBucketLifecycle(w http.ResponseWriter, r *http.Request) { } err = m.cluster.SetBucketLifecycle(&req) + b, _ := json.Marshal(req) + auditlog.LogMasterOp("SetBucketLifecycle", fmt.Sprintf("LcConfiguration(%v)", string(b)), err) if err != nil { sendErrReply(w, r, &proto.HTTPReply{Code: proto.ErrCodeInternalError, Msg: err.Error()}) return @@ -7261,6 +7263,7 @@ func (m *Server) DelBucketLifecycle(w http.ResponseWriter, r *http.Request) { return } err = m.cluster.DelBucketLifecycle(name) + auditlog.LogMasterOp("DelBucketLifecycle", fmt.Sprintf("vol(%v)", name), err) if err != nil { sendErrReply(w, r, &proto.HTTPReply{Code: proto.ErrCodeInternalError, Msg: err.Error()}) return diff --git a/objectnode/lifecycle_test.go b/objectnode/lifecycle_test.go index 829e01006..fbe1208a9 100644 --- a/objectnode/lifecycle_test.go +++ b/objectnode/lifecycle_test.go @@ -337,3 +337,72 @@ func TestLifecycleConfigurationTransition3(t *testing.T) { err = proto.ValidRules(l2.Rules) require.NoError(t, err) } + +func TestValidRulePrefix(t *testing.T) { + rules := []*proto.Rule{ + { + ID: "a", + }, + } + require.NoError(t, proto.ValidRulePrefix(rules)) + + rules = []*proto.Rule{ + { + ID: "a", + Filter: &proto.Filter{}, + }, + } + require.NoError(t, proto.ValidRulePrefix(rules)) + + rules = []*proto.Rule{ + { + ID: "a", + Filter: &proto.Filter{Prefix: ""}, + }, + } + require.NoError(t, proto.ValidRulePrefix(rules)) + + rules = []*proto.Rule{ + { + ID: "a", + Filter: &proto.Filter{Prefix: "/"}, + }, + } + require.Equal(t, proto.LifeCycleErrRulePrefix, proto.ValidRulePrefix(rules)) + + rules = []*proto.Rule{ + { + ID: "a", + Filter: &proto.Filter{Prefix: "/"}, + }, + { + ID: "a", + Filter: &proto.Filter{Prefix: "a/"}, + }, + } + require.Equal(t, proto.LifeCycleErrRulePrefix, proto.ValidRulePrefix(rules)) + + rules = []*proto.Rule{ + { + ID: "a", + Filter: &proto.Filter{Prefix: ""}, + }, + { + ID: "a", + Filter: &proto.Filter{Prefix: "a/"}, + }, + } + require.Equal(t, proto.LifeCycleErrConflictRules, proto.ValidRulePrefix(rules)) + + rules = []*proto.Rule{ + { + ID: "a", + Filter: &proto.Filter{Prefix: "b/"}, + }, + { + ID: "a", + Filter: &proto.Filter{Prefix: "a/"}, + }, + } + require.NoError(t, proto.ValidRulePrefix(rules)) +} diff --git a/proto/lifecycle.go b/proto/lifecycle.go index aa9546e11..4fff71791 100644 --- a/proto/lifecycle.go +++ b/proto/lifecycle.go @@ -119,6 +119,9 @@ func ValidRules(Rules []*Rule) error { func ValidRulePrefix(Rules []*Rule) error { if len(Rules) == 1 { + if strings.HasPrefix(Rules[0].GetPrefix(), "/") { + return LifeCycleErrRulePrefix + } return nil } var prefixes []string @@ -127,13 +130,13 @@ func ValidRulePrefix(Rules []*Rule) error { return LifeCycleErrConflictRules } if rule.Filter != nil { - if rule.Filter.Prefix == "" { + if rule.GetPrefix() == "" { return LifeCycleErrConflictRules } else { - if strings.HasPrefix(rule.Filter.Prefix, "/") { + if strings.HasPrefix(rule.GetPrefix(), "/") { return LifeCycleErrRulePrefix } - prefixes = append(prefixes, rule.Filter.Prefix) + prefixes = append(prefixes, rule.GetPrefix()) } } }