Skip to content

Commit ea12b52

Browse files
committed
session: access session keys by account only
There is no need to store session information in two formats in session key storage. An ID is not required, as it can be retrieved using the public key account of the open session. Closes #3793. Signed-off-by: Andrey Butusov <andrey@nspcc.io>
1 parent cfbad1a commit ea12b52

23 files changed

Lines changed: 453 additions & 276 deletions

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Changelog for NeoFS Node
1212

1313
### Changed
1414
- SN returns unsigned responses to requests with API >= `v2.22` (#3785)
15+
- Session key storage access session keys by account only (#3817)
1516

1617
### Removed
1718

cmd/neofs-node/config.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,9 @@ func initCfg(appCfg *config.Config) *cfg {
407407
fatalOnErr(err)
408408
}
409409

410+
err = persistate.MigrateSessionTokensToAccounts()
411+
fatalOnErr(err)
412+
410413
basicSharedConfig := initBasics(c, key, persistate)
411414
streamTimeout := appCfg.APIClient.StreamTimeout
412415
minConnTimeout := appCfg.APIClient.MinConnectionTime

cmd/neofs-node/object.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
"sync/atomic"
1212
"time"
1313

14-
"github.com/google/uuid"
1514
lru "github.com/hashicorp/golang-lru/v2"
1615
iec "github.com/nspcc-dev/neofs-node/internal/ec"
1716
coreclient "github.com/nspcc-dev/neofs-node/pkg/core/client"
@@ -627,16 +626,16 @@ func (x storageForObjectService) VerifyAndStoreObjectLocally(obj object.Object)
627626
return x.putSvc.ValidateAndStoreObjectLocally(obj)
628627
}
629628

630-
func (x storageForObjectService) GetSessionPrivateKey(usr user.ID, uid uuid.UUID) (ecdsa.PrivateKey, error) {
631-
k, err := x.keys.GetKey(&util.SessionInfo{ID: uid, Owner: usr})
629+
func (x storageForObjectService) GetSessionPrivateKey(account user.ID) (ecdsa.PrivateKey, error) {
630+
k, err := x.keys.GetKey(&account)
632631
if err != nil {
633632
return ecdsa.PrivateKey{}, err
634633
}
635634
return *k, nil
636635
}
637636

638-
func (x storageForObjectService) GetSessionV2PrivateKey(issuer user.ID, subjects []sessionv2.Target) (ecdsa.PrivateKey, error) {
639-
k, err := x.keys.GetKeyBySubjects(issuer, subjects)
637+
func (x storageForObjectService) GetSessionV2PrivateKey(subjects []sessionv2.Target) (ecdsa.PrivateKey, error) {
638+
k, err := x.keys.GetKeyBySubjects(subjects)
640639
if err != nil {
641640
return ecdsa.PrivateKey{}, err
642641
}

cmd/neofs-node/session.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ import (
1212

1313
type sessionStorage interface {
1414
sessionSvc.KeyStorage
15-
GetToken(ownerID user.ID, tokenID []byte) *session.PrivateToken
16-
FindTokenBySubjects(owner user.ID, subjects []sessionv2.Target) *session.PrivateToken
15+
GetToken(account user.ID) *session.PrivateToken
16+
FindTokenBySubjects(subjects []sessionv2.Target) *session.PrivateToken
1717
RemoveOldTokens(epoch uint64)
1818

1919
Close() error

pkg/services/object/delete/delete.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ package deletesvc
22

33
import (
44
"context"
5+
"fmt"
56

6-
"github.com/nspcc-dev/neofs-node/pkg/services/object/util"
77
"github.com/nspcc-dev/neofs-sdk-go/user"
88
"go.uber.org/zap"
99
)
@@ -13,7 +13,7 @@ func (s *Service) Delete(ctx context.Context, prm Prm) error {
1313
// If session token is not found we will fail during tombstone PUT.
1414
// Here we fail immediately to ensure no unnecessary network communication is done.
1515
if tokV2 := prm.common.SessionTokenV2(); tokV2 != nil {
16-
if _, err := s.keyStorage.GetKeyBySubjects(tokV2.Issuer(), tokV2.Subjects()); err != nil {
16+
if _, err := s.keyStorage.GetKeyBySubjects(tokV2.Subjects()); err != nil {
1717
if s.nnsResolver == nil {
1818
return err
1919
}
@@ -31,10 +31,11 @@ func (s *Service) Delete(ctx context.Context, prm Prm) error {
3131
}
3232
}
3333
} else if tok := prm.common.SessionToken(); tok != nil {
34-
_, err := s.keyStorage.GetKey(&util.SessionInfo{
35-
ID: tok.ID(),
36-
Owner: tok.Issuer(),
37-
})
34+
authUser, err := tok.AuthUser()
35+
if err != nil {
36+
return fmt.Errorf("can't get auth user from token: %w", err)
37+
}
38+
_, err = s.keyStorage.GetKey(&authUser)
3839
if err != nil {
3940
return err
4041
}

pkg/services/object/get/exec.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"io"
99

1010
clientcore "github.com/nspcc-dev/neofs-node/pkg/core/client"
11-
"github.com/nspcc-dev/neofs-node/pkg/services/object/util"
1211
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
1312
"github.com/nspcc-dev/neofs-sdk-go/netmap"
1413
"github.com/nspcc-dev/neofs-sdk-go/object"
@@ -172,7 +171,7 @@ func (exec execCtx) key() (*ecdsa.PrivateKey, error) {
172171
}
173172
if tokV2 := exec.prm.common.SessionTokenV2(); tokV2 != nil {
174173
// For V2 tokens, the key is stored as the subjects
175-
if keyForSession, err := exec.svc.keyStore.GetKeyBySubjects(tokV2.Issuer(), tokV2.Subjects()); err == nil {
174+
if keyForSession, err := exec.svc.keyStore.GetKeyBySubjects(tokV2.Subjects()); err == nil {
176175
key = keyForSession
177176
} else if exec.svc.nnsResolver != nil {
178177
nodeUser := user.NewFromECDSAPublicKey(key.PublicKey)
@@ -188,10 +187,11 @@ func (exec execCtx) key() (*ecdsa.PrivateKey, error) {
188187
return nil, fmt.Errorf("get key for session v2 token: %w", err)
189188
}
190189
} else if tok := exec.prm.common.SessionToken(); tok != nil {
191-
key, err = exec.svc.keyStore.GetKey(&util.SessionInfo{
192-
ID: tok.ID(),
193-
Owner: tok.Issuer(),
194-
})
190+
authUser, err := tok.AuthUser()
191+
if err != nil {
192+
return nil, fmt.Errorf("could not get session auth user: %w", err)
193+
}
194+
key, err = exec.svc.keyStore.GetKey(&authUser)
195195
if err != nil {
196196
return nil, err
197197
}

pkg/services/object/get/service.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,8 @@ type cfg struct {
105105
}
106106

107107
keyStore interface {
108-
GetKey(*util.SessionInfo) (*ecdsa.PrivateKey, error)
109-
GetKeyBySubjects(user.ID, []sessionv2.Target) (*ecdsa.PrivateKey, error)
108+
GetKey(*user.ID) (*ecdsa.PrivateKey, error)
109+
GetKeyBySubjects([]sessionv2.Target) (*ecdsa.PrivateKey, error)
110110
}
111111

112112
nnsResolver sessionv2.NNSResolver

pkg/services/object/get/service_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,11 +144,11 @@ type mockKeyStorage struct {
144144
privKey ecdsa.PrivateKey
145145
}
146146

147-
func (x *mockKeyStorage) GetKey(*util.SessionInfo) (*ecdsa.PrivateKey, error) {
147+
func (x *mockKeyStorage) GetKey(*user.ID) (*ecdsa.PrivateKey, error) {
148148
return &x.privKey, nil
149149
}
150150

151-
func (x *mockKeyStorage) GetKeyBySubjects(user.ID, []sessionv2.Target) (*ecdsa.PrivateKey, error) {
151+
func (x *mockKeyStorage) GetKeyBySubjects([]sessionv2.Target) (*ecdsa.PrivateKey, error) {
152152
return &x.privKey, nil
153153
}
154154

pkg/services/object/put/remote.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,16 @@ func putObjectToNode(ctx context.Context, nodeInfo clientcore.NodeInfo, obj *obj
4343

4444
if tokV2 := commonPrm.SessionTokenV2(); tokV2 != nil {
4545
// For V2 tokens, the key is stored as the subjects
46-
if keyForSession, err := keyStorage.GetKeyBySubjects(tokV2.Issuer(), tokV2.Subjects()); err == nil {
46+
if keyForSession, err := keyStorage.GetKeyBySubjects(tokV2.Subjects()); err == nil {
4747
key = keyForSession
4848
}
4949
opts.WithinSessionV2(*tokV2)
5050
} else if tok := commonPrm.SessionToken(); tok != nil {
51-
sessionInfo := &util.SessionInfo{
52-
ID: tok.ID(),
53-
Owner: tok.Issuer(),
51+
authUser, err := tok.AuthUser()
52+
if err != nil {
53+
return fmt.Errorf("could not get session auth user: %w", err)
5454
}
55-
key, err = keyStorage.GetKey(sessionInfo)
55+
key, err = keyStorage.GetKey(&authUser)
5656
if err != nil {
5757
return fmt.Errorf("could not receive private key: %w", err)
5858
}

pkg/services/object/put/service_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -893,11 +893,11 @@ type mockNodeSession struct {
893893
expiresAt uint64
894894
}
895895

896-
func (x mockNodeSession) FindTokenBySubjects(user.ID, []sessionv2.Target) *storage.PrivateToken {
896+
func (x mockNodeSession) FindTokenBySubjects([]sessionv2.Target) *storage.PrivateToken {
897897
return storage.NewPrivateToken(&x.signer.ECDSAPrivateKey, x.expiresAt)
898898
}
899899

900-
func (x mockNodeSession) GetToken(user.ID, []byte) *storage.PrivateToken {
900+
func (x mockNodeSession) GetToken(user.ID) *storage.PrivateToken {
901901
return storage.NewPrivateToken(&x.signer.ECDSAPrivateKey, x.expiresAt)
902902
}
903903

0 commit comments

Comments
 (0)