Skip to content

Commit 996b1ea

Browse files
authored
node: Support wildcard for container sessions (#2741)
2 parents d54311b + 21e78b1 commit 996b1ea

File tree

3 files changed

+71
-11
lines changed

3 files changed

+71
-11
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ Changelog for NeoFS Node
66
### Added
77

88
### Fixed
9-
- Inability to deploy contract with non-standard zone via neofs-adm
9+
- Inability to deploy contract with non-standard zone via neofs-adm (#2740)
10+
- Container session token's `wildcard` field support (#2741)
1011

1112
### Changed
1213

pkg/services/container/morph/executor.go

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package container
33
import (
44
"bytes"
55
"context"
6+
"crypto/ecdsa"
67
"errors"
78
"fmt"
89

@@ -14,6 +15,7 @@ import (
1415
containercore "github.com/nspcc-dev/neofs-node/pkg/core/container"
1516
containerSvc "github.com/nspcc-dev/neofs-node/pkg/services/container"
1617
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
18+
neofsecdsa "github.com/nspcc-dev/neofs-sdk-go/crypto/ecdsa"
1719
eaclSDK "github.com/nspcc-dev/neofs-sdk-go/eacl"
1820
"github.com/nspcc-dev/neofs-sdk-go/session"
1921
"github.com/nspcc-dev/neofs-sdk-go/user"
@@ -335,22 +337,18 @@ func (s *morphExecutor) validateToken(t *sessionV2.Token, cIDV2 *refs.ContainerI
335337
return fmt.Errorf("incorrect token signature: %w", err)
336338
}
337339

338-
if cIDV2 == nil { // can be nil for PUT or wildcard may be true
340+
if cIDV2 == nil { // can be nil for PUT
339341
return nil
340342
}
341343

342-
if sessionCID := cc.ContainerID().GetValue(); !bytes.Equal(sessionCID, cIDV2.GetValue()) {
343-
return fmt.Errorf("wrong container: %s", base58.Encode(sessionCID))
344-
}
345-
346-
var cID cid.ID
344+
var cIDRequested cid.ID
347345

348-
err = cID.ReadFromV2(*cIDV2)
346+
err = cIDRequested.ReadFromV2(*cIDV2)
349347
if err != nil {
350348
return fmt.Errorf("invalid container ID: %w", err)
351349
}
352350

353-
cnr, err := s.rdr.Get(cID)
351+
cnr, err := s.rdr.Get(cIDRequested)
354352
if err != nil {
355353
return fmt.Errorf("reading container from the network: %w", err)
356354
}
@@ -359,5 +357,23 @@ func (s *morphExecutor) validateToken(t *sessionV2.Token, cIDV2 *refs.ContainerI
359357
return fmt.Errorf("session was not issued by the container owner, issuer: %q", issuer)
360358
}
361359

360+
var keyFromToken neofsecdsa.PublicKey
361+
362+
err = keyFromToken.Decode(t.GetSignature().GetKey())
363+
if err != nil {
364+
return errors.New("error while decoding public key from the token's signer")
365+
}
366+
367+
userFromToken := user.ResolveFromECDSAPublicKey(ecdsa.PublicKey(keyFromToken))
368+
if !cnr.Value.Owner().Equals(userFromToken) {
369+
return fmt.Errorf("session token signer differs container owner: signer: %s, owner: %s", userFromToken, cnr.Value.Owner())
370+
}
371+
372+
if !cc.Wildcard() {
373+
if sessionCID := cc.ContainerID().GetValue(); !bytes.Equal(sessionCID, cIDV2.GetValue()) {
374+
return fmt.Errorf("wrong container: %s", base58.Encode(sessionCID))
375+
}
376+
}
377+
362378
return nil
363379
}

pkg/services/container/morph/executor_test.go

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,13 @@ package container_test
22

33
import (
44
"context"
5+
"crypto/ecdsa"
6+
"crypto/elliptic"
7+
"crypto/rand"
58
"crypto/sha256"
69
"testing"
710

11+
"github.com/google/uuid"
812
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
913
"github.com/nspcc-dev/neofs-api-go/v2/container"
1014
"github.com/nspcc-dev/neofs-api-go/v2/refs"
@@ -17,6 +21,7 @@ import (
1721
cidtest "github.com/nspcc-dev/neofs-sdk-go/container/id/test"
1822
containertest "github.com/nspcc-dev/neofs-sdk-go/container/test"
1923
neofscrypto "github.com/nspcc-dev/neofs-sdk-go/crypto"
24+
neofsecdsa "github.com/nspcc-dev/neofs-sdk-go/crypto/ecdsa"
2025
sessionsdk "github.com/nspcc-dev/neofs-sdk-go/session"
2126
sessiontest "github.com/nspcc-dev/neofs-sdk-go/session/test"
2227
"github.com/nspcc-dev/neofs-sdk-go/user"
@@ -32,11 +37,11 @@ func (m mock) Get(_ cid.ID) (*containerCore.Container, error) {
3237
return &containerCore.Container{Value: m.cnr}, nil
3338
}
3439

35-
func (m mock) GetEACL(id cid.ID) (*containerCore.EACL, error) {
40+
func (m mock) GetEACL(_ cid.ID) (*containerCore.EACL, error) {
3641
return nil, nil
3742
}
3843

39-
func (m mock) List(id *user.ID) ([]cid.ID, error) {
44+
func (m mock) List(_ *user.ID) ([]cid.ID, error) {
4045
return nil, nil
4146
}
4247

@@ -279,6 +284,44 @@ func TestValidateToken(t *testing.T) {
279284
_, err = e.Delete(context.TODO(), &tokV2, &reqBody)
280285
require.Error(t, err)
281286
})
287+
288+
t.Run("wildcard support", func(t *testing.T) {
289+
var reqBody container.DeleteRequestBody
290+
reqBody.SetContainerID(&cIDV2)
291+
292+
var tok sessionsdk.Container
293+
294+
priv, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
295+
require.NoError(t, err)
296+
297+
tok.SetExp(11)
298+
tok.SetNbf(22)
299+
tok.SetIat(33)
300+
tok.ForVerb(sessionsdk.VerbContainerDelete)
301+
tok.SetID(uuid.New())
302+
tok.SetAuthKey((*neofsecdsa.PublicKey)(&priv.PublicKey))
303+
require.NoError(t, tok.Sign(signer))
304+
305+
var tokV2 session.Token
306+
tok.WriteToV2(&tokV2)
307+
308+
m := &mock{cnr: cnr}
309+
e := containerSvcMorph.NewExecutor(m, m)
310+
311+
t.Run("wrong owner", func(t *testing.T) {
312+
m.cnr = containertest.Container(t)
313+
314+
_, err := e.Delete(context.TODO(), &tokV2, &reqBody)
315+
require.Error(t, err)
316+
})
317+
318+
t.Run("correct owner", func(t *testing.T) {
319+
m.cnr = cnr
320+
321+
_, err := e.Delete(context.TODO(), &tokV2, &reqBody)
322+
require.NoError(t, err)
323+
})
324+
})
282325
}
283326

284327
func generateToken(t *testing.T, ctx session.TokenContext, signer user.Signer) *session.Token {

0 commit comments

Comments
 (0)