Compare commits

...

1 commit

Author SHA1 Message Date
45f8630deb [#1109] object: Validate attribute EXPIRATION_EPOCH on put
All checks were successful
Build / Build Components (1.21) (pull_request) Successful in 1m54s
DCO action / DCO (pull_request) Successful in 2m33s
Vulncheck / Vulncheck (pull_request) Successful in 3m5s
Build / Build Components (1.22) (pull_request) Successful in 4m10s
Tests and linters / gopls check (pull_request) Successful in 6m3s
Tests and linters / Lint (pull_request) Successful in 6m28s
Tests and linters / Staticcheck (pull_request) Successful in 6m9s
Pre-commit hooks / Pre-commit (pull_request) Successful in 9m49s
Tests and linters / Tests (1.21) (pull_request) Successful in 12m1s
Tests and linters / Tests with -race (pull_request) Successful in 12m11s
Tests and linters / Tests (1.22) (pull_request) Successful in 12m43s
Signed-off-by: Anton Nikiforov <an.nikiforov@yadro.com>
2024-06-18 17:34:53 +03:00
2 changed files with 28 additions and 30 deletions

View file

@ -124,15 +124,22 @@ func (v *FormatValidator) Validate(ctx context.Context, obj *objectSDK.Object, u
return fmt.Errorf("invalid attributes: %w", err)
}
exp, err := expirationEpochAttribute(obj)
if err != nil {
if !errors.Is(err, errNoExpirationEpoch) {
return fmt.Errorf("object did not pass expiration check: %w", err)
}
} else if !unprepared && exp < v.netState.CurrentEpoch() {
if err := v.checkIfExpired(ctx, obj); err != nil {
return fmt.Errorf("object did not pass expiration check: %w", err)
}
}
if !unprepared {
if err := v.validateSignatureKey(obj); err != nil {
return fmt.Errorf("(%T) could not validate signature key: %w", v, err)
}
if err := v.checkExpiration(ctx, obj); err != nil {
return fmt.Errorf("object did not pass expiration check: %w", err)
}
if err := objectSDK.CheckHeaderVerificationFields(obj); err != nil {
return fmt.Errorf("(%T) could not validate header fields: %w", v, err)
}
@ -348,35 +355,24 @@ func (v *FormatValidator) fillAndValidateTombstoneMeta(o *objectSDK.Object, meta
var errExpired = errors.New("object has expired")
func (v *FormatValidator) checkExpiration(ctx context.Context, obj *objectSDK.Object) error {
exp, err := expirationEpochAttribute(obj)
if err != nil {
if errors.Is(err, errNoExpirationEpoch) {
return nil // objects without expiration attribute are valid
}
func (v *FormatValidator) checkIfExpired(ctx context.Context, obj *objectSDK.Object) error {
// an object could be expired but locked;
// put such an object is a correct operation
return err
cID, _ := obj.ContainerID()
oID, _ := obj.ID()
var addr oid.Address
addr.SetContainer(cID)
addr.SetObject(oID)
locked, err := v.e.IsLocked(ctx, addr)
if err != nil {
return fmt.Errorf("locking status check for an expired object: %w", err)
}
if exp < v.netState.CurrentEpoch() {
// an object could be expired but locked;
// put such an object is a correct operation
cID, _ := obj.ContainerID()
oID, _ := obj.ID()
var addr oid.Address
addr.SetContainer(cID)
addr.SetObject(oID)
locked, err := v.e.IsLocked(ctx, addr)
if err != nil {
return fmt.Errorf("locking status check for an expired object: %w", err)
}
if !locked {
return errExpired
}
if !locked {
return errExpired
}
return nil

View file

@ -195,6 +195,8 @@ func TestFormatValidator_Validate(t *testing.T) {
val := "text"
err := v.Validate(context.Background(), fn(val), false)
require.Error(t, err)
err = v.Validate(context.Background(), fn(val), true)
require.Error(t, err)
})
t.Run("expired object", func(t *testing.T) {