Skip to content

Commit

Permalink
acl: Perceive tombstone saving as delete operation (#2748)
Browse files Browse the repository at this point in the history
  • Loading branch information
roman-khimov authored Feb 27, 2024
2 parents 0f81d20 + a7eb6ec commit 080a35d
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 3 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ Changelog for NeoFS Node
### Added

### Fixed
- Access to `PUT` objects no longer grants `DELETE` rights (#2261)

### Changed

Expand Down
19 changes: 18 additions & 1 deletion pkg/services/object/acl/v2/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -511,11 +511,28 @@ func (p putStreamBasicChecker) Send(request *objectV2.PutRequest) error {
src: request,
}

reqInfo, err := p.source.findRequestInfo(req, cnr, acl.OpObjectPut)
verb := acl.OpObjectPut
tombstone := part.GetHeader().GetObjectType() == objectV2.TypeTombstone
if tombstone {
// such objects are specific - saving them is essentially the removal of other
// objects
verb = acl.OpObjectDelete
}

reqInfo, err := p.source.findRequestInfo(req, cnr, verb)
if err != nil {
return err
}

if tombstone {
// the only exception when writing tombstone should not be treated as deletion
// is intra-container replication: container nodes must be able to replicate
// such objects while deleting is prohibited
if reqInfo.requestRole == acl.RoleContainer && request.GetMetaHeader().GetTTL() == 1 {
reqInfo.operation = acl.OpObjectPut
}
}

reqInfo.obj = obj

if !p.source.checker.CheckBasicACL(reqInfo) || !p.source.checker.StickyBitCheck(reqInfo, idOwner) {
Expand Down
2 changes: 1 addition & 1 deletion pkg/services/object/acl/v2/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ func assertVerb(tok sessionSDK.Object, op acl.Op) bool {
//nolint:exhaustive
switch op {
case acl.OpObjectPut:
return tok.AssertVerb(sessionSDK.VerbObjectPut, sessionSDK.VerbObjectDelete)
return tok.AssertVerb(sessionSDK.VerbObjectPut)
case acl.OpObjectDelete:
return tok.AssertVerb(sessionSDK.VerbObjectDelete)
case acl.OpObjectGet:
Expand Down
2 changes: 1 addition & 1 deletion pkg/services/object/acl/v2/util_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ func testGenerateMetaHeader(depth uint32, b *acl.BearerToken, s *session.Token)
func TestIsVerbCompatible(t *testing.T) {
// Source: https://nspcc.ru/upload/neofs-spec-latest.pdf#page=28
table := map[aclsdk.Op][]sessionSDK.ObjectVerb{
aclsdk.OpObjectPut: {sessionSDK.VerbObjectPut, sessionSDK.VerbObjectDelete},
aclsdk.OpObjectPut: {sessionSDK.VerbObjectPut},
aclsdk.OpObjectDelete: {sessionSDK.VerbObjectDelete},
aclsdk.OpObjectGet: {sessionSDK.VerbObjectGet},
aclsdk.OpObjectHead: {
Expand Down

0 comments on commit 080a35d

Please sign in to comment.