2019-11-18 13:34:06 +00:00
|
|
|
package session
|
|
|
|
|
|
|
|
import (
|
|
|
|
"crypto/ecdsa"
|
|
|
|
"crypto/elliptic"
|
|
|
|
"crypto/rand"
|
|
|
|
"sync"
|
|
|
|
|
2020-03-31 07:05:26 +00:00
|
|
|
"github.com/nspcc-dev/neofs-api-go/refs"
|
2019-11-18 13:34:06 +00:00
|
|
|
crypto "github.com/nspcc-dev/neofs-crypto"
|
|
|
|
)
|
|
|
|
|
|
|
|
type simpleStore struct {
|
|
|
|
*sync.RWMutex
|
|
|
|
|
|
|
|
tokens map[TokenID]*PToken
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO get curve from neofs-crypto
|
|
|
|
func defaultCurve() elliptic.Curve {
|
|
|
|
return elliptic.P256()
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewSimpleStore creates simple token storage
|
|
|
|
func NewSimpleStore() TokenStore {
|
|
|
|
return &simpleStore{
|
|
|
|
RWMutex: new(sync.RWMutex),
|
|
|
|
tokens: make(map[TokenID]*PToken),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// New returns new token with specified parameters.
|
|
|
|
func (s *simpleStore) New(p TokenParams) *PToken {
|
|
|
|
tid, err := refs.NewUUID()
|
|
|
|
if err != nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
key, err := ecdsa.GenerateKey(defaultCurve(), rand.Reader)
|
|
|
|
if err != nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
if p.FirstEpoch > p.LastEpoch || p.OwnerID.Empty() {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2020-04-28 15:40:21 +00:00
|
|
|
token := new(Token)
|
|
|
|
token.SetID(tid)
|
|
|
|
token.SetOwnerID(p.OwnerID)
|
|
|
|
token.SetVerb(p.Verb)
|
|
|
|
token.SetAddress(p.Address)
|
|
|
|
token.SetCreationEpoch(p.FirstEpoch)
|
|
|
|
token.SetExpirationEpoch(p.LastEpoch)
|
|
|
|
token.SetSessionKey(crypto.MarshalPublicKey(&key.PublicKey))
|
|
|
|
|
2019-11-18 13:34:06 +00:00
|
|
|
t := &PToken{
|
2020-04-28 15:40:21 +00:00
|
|
|
mtx: new(sync.Mutex),
|
|
|
|
Token: *token,
|
2019-11-18 13:34:06 +00:00
|
|
|
PrivateKey: key,
|
|
|
|
}
|
|
|
|
|
|
|
|
s.Lock()
|
2020-04-28 15:40:21 +00:00
|
|
|
s.tokens[tid] = t
|
2019-11-18 13:34:06 +00:00
|
|
|
s.Unlock()
|
|
|
|
|
|
|
|
return t
|
|
|
|
}
|
|
|
|
|
|
|
|
// Fetch tries to fetch a token with specified id.
|
|
|
|
func (s *simpleStore) Fetch(id TokenID) *PToken {
|
|
|
|
s.RLock()
|
|
|
|
defer s.RUnlock()
|
|
|
|
|
|
|
|
return s.tokens[id]
|
|
|
|
}
|
|
|
|
|
|
|
|
// Remove removes token with id from store.
|
|
|
|
func (s *simpleStore) Remove(id TokenID) {
|
|
|
|
s.Lock()
|
|
|
|
delete(s.tokens, id)
|
|
|
|
s.Unlock()
|
|
|
|
}
|