Move KeyStore into types

License: MIT
Signed-off-by: Jakub Sztandera <kubuxu@protonmail.ch>
This commit is contained in:
Jakub Sztandera 2019-07-18 16:57:49 +02:00
parent 902ea18686
commit cb9bf4200c
5 changed files with 47 additions and 40 deletions

19
chain/types/keystore.go Normal file
View File

@ -0,0 +1,19 @@
package types
// KeyInfo is used for storying keys in KeyStore
type KeyInfo struct {
Type string
PrivateKey []byte
}
// KeyStore is used for storying secret keys
type KeyStore interface {
// List lists all the keys stored in the KeyStore
List() ([]string, error)
// Get gets a key out of keystore and returns KeyInfo coresponding to named key
Get(string) (KeyInfo, error)
// Put saves a key info under given name
Put(string, KeyInfo) error
// Delete removes a key from keystore
Delete(string) error
}

View File

@ -21,6 +21,7 @@ import (
"github.com/pkg/errors" "github.com/pkg/errors"
"golang.org/x/xerrors" "golang.org/x/xerrors"
"github.com/filecoin-project/go-lotus/chain/types"
"github.com/filecoin-project/go-lotus/node/config" "github.com/filecoin-project/go-lotus/node/config"
) )
@ -244,7 +245,7 @@ func (fsr *fsLockedRepo) SetAPIEndpoint(ma multiaddr.Multiaddr) error {
return ioutil.WriteFile(fsr.join(fsAPI), []byte(ma.String()), 0644) return ioutil.WriteFile(fsr.join(fsAPI), []byte(ma.String()), 0644)
} }
func (fsr *fsLockedRepo) KeyStore() (KeyStore, error) { func (fsr *fsLockedRepo) KeyStore() (types.KeyStore, error) {
if err := fsr.stillValid(); err != nil { if err := fsr.stillValid(); err != nil {
return nil, err return nil, err
} }
@ -283,10 +284,10 @@ func (fsr *fsLockedRepo) List() ([]string, error) {
return keys, nil return keys, nil
} }
// Get gets a key out of keystore and returns KeyInfo coresponding to named key // Get gets a key out of keystore and returns types.KeyInfo coresponding to named key
func (fsr *fsLockedRepo) Get(name string) (KeyInfo, error) { func (fsr *fsLockedRepo) Get(name string) (types.KeyInfo, error) {
if err := fsr.stillValid(); err != nil { if err := fsr.stillValid(); err != nil {
return KeyInfo{}, err return types.KeyInfo{}, err
} }
encName := base32.RawStdEncoding.EncodeToString([]byte(name)) encName := base32.RawStdEncoding.EncodeToString([]byte(name))
@ -294,37 +295,37 @@ func (fsr *fsLockedRepo) Get(name string) (KeyInfo, error) {
fstat, err := os.Stat(keyPath) fstat, err := os.Stat(keyPath)
if os.IsNotExist(err) { if os.IsNotExist(err) {
return KeyInfo{}, xerrors.Errorf("opening key '%s': %w", name, ErrKeyNotFound) return types.KeyInfo{}, xerrors.Errorf("opening key '%s': %w", name, ErrKeyNotFound)
} else if err != nil { } else if err != nil {
return KeyInfo{}, xerrors.Errorf("opening key '%s': %w", name, err) return types.KeyInfo{}, xerrors.Errorf("opening key '%s': %w", name, err)
} }
if fstat.Mode()&0077 != 0 { if fstat.Mode()&0077 != 0 {
return KeyInfo{}, xerrors.Errorf(kstrPermissionMsg, name, err) return types.KeyInfo{}, xerrors.Errorf(kstrPermissionMsg, name, err)
} }
file, err := os.Open(keyPath) file, err := os.Open(keyPath)
if err != nil { if err != nil {
return KeyInfo{}, xerrors.Errorf("opening key '%s': %w", name, err) return types.KeyInfo{}, xerrors.Errorf("opening key '%s': %w", name, err)
} }
defer file.Close() //nolint: errcheck // read only op defer file.Close() //nolint: errcheck // read only op
data, err := ioutil.ReadAll(file) data, err := ioutil.ReadAll(file)
if err != nil { if err != nil {
return KeyInfo{}, xerrors.Errorf("reading key '%s': %w", name, err) return types.KeyInfo{}, xerrors.Errorf("reading key '%s': %w", name, err)
} }
var res KeyInfo var res types.KeyInfo
err = json.Unmarshal(data, &res) err = json.Unmarshal(data, &res)
if err != nil { if err != nil {
return KeyInfo{}, xerrors.Errorf("decoding key '%s': %w", name, err) return types.KeyInfo{}, xerrors.Errorf("decoding key '%s': %w", name, err)
} }
return res, nil return res, nil
} }
// Put saves key info under given name // Put saves key info under given name
func (fsr *fsLockedRepo) Put(name string, info KeyInfo) error { func (fsr *fsLockedRepo) Put(name string, info types.KeyInfo) error {
if err := fsr.stillValid(); err != nil { if err := fsr.stillValid(); err != nil {
return err return err
} }

View File

@ -7,6 +7,7 @@ import (
"github.com/libp2p/go-libp2p-core/crypto" "github.com/libp2p/go-libp2p-core/crypto"
"github.com/multiformats/go-multiaddr" "github.com/multiformats/go-multiaddr"
"github.com/filecoin-project/go-lotus/chain/types"
"github.com/filecoin-project/go-lotus/node/config" "github.com/filecoin-project/go-lotus/node/config"
) )
@ -27,22 +28,6 @@ type Repo interface {
Lock() (LockedRepo, error) Lock() (LockedRepo, error)
} }
type KeyInfo struct {
Type string
PrivateKey []byte
}
type KeyStore interface {
// List lists all the keys stored in the KeyStore
List() ([]string, error)
// Get gets a key out of keystore and returns KeyInfo coresponding to named key
Get(string) (KeyInfo, error)
// Put saves a key info under given name
Put(string, KeyInfo) error
// Delete removes a key from keystore
Delete(string) error
}
type LockedRepo interface { type LockedRepo interface {
// Close closes repo and removes lock. // Close closes repo and removes lock.
Close() error Close() error
@ -61,7 +46,7 @@ type LockedRepo interface {
SetAPIEndpoint(multiaddr.Multiaddr) error SetAPIEndpoint(multiaddr.Multiaddr) error
// KeyStore returns store of private keys for Filecoin transactions // KeyStore returns store of private keys for Filecoin transactions
KeyStore() (KeyStore, error) KeyStore() (types.KeyStore, error)
// Path returns absolute path of the repo (or empty string if in-memory) // Path returns absolute path of the repo (or empty string if in-memory)
Path() string Path() string

View File

@ -11,6 +11,7 @@ import (
"github.com/multiformats/go-multiaddr" "github.com/multiformats/go-multiaddr"
"golang.org/x/xerrors" "golang.org/x/xerrors"
"github.com/filecoin-project/go-lotus/chain/types"
"github.com/filecoin-project/go-lotus/node/config" "github.com/filecoin-project/go-lotus/node/config"
) )
@ -26,7 +27,7 @@ type MemRepo struct {
datastore datastore.Datastore datastore datastore.Datastore
configF func() *config.Root configF func() *config.Root
libp2pKey crypto.PrivKey libp2pKey crypto.PrivKey
keystore map[string]KeyInfo keystore map[string]types.KeyInfo
} }
type lockedMemRepo struct { type lockedMemRepo struct {
@ -47,7 +48,7 @@ type MemRepoOptions struct {
Ds datastore.Datastore Ds datastore.Datastore
ConfigF func() *config.Root ConfigF func() *config.Root
Libp2pKey crypto.PrivKey Libp2pKey crypto.PrivKey
KeyStore map[string]KeyInfo KeyStore map[string]types.KeyInfo
} }
func genLibp2pKey() (crypto.PrivKey, error) { func genLibp2pKey() (crypto.PrivKey, error) {
@ -79,7 +80,7 @@ func NewMemory(opts *MemRepoOptions) *MemRepo {
opts.Libp2pKey = pk opts.Libp2pKey = pk
} }
if opts.KeyStore == nil { if opts.KeyStore == nil {
opts.KeyStore = make(map[string]KeyInfo) opts.KeyStore = make(map[string]types.KeyInfo)
} }
return &MemRepo{ return &MemRepo{
@ -176,7 +177,7 @@ func (lmem *lockedMemRepo) SetAPIEndpoint(ma multiaddr.Multiaddr) error {
return nil return nil
} }
func (lmem *lockedMemRepo) KeyStore() (KeyStore, error) { func (lmem *lockedMemRepo) KeyStore() (types.KeyStore, error) {
if err := lmem.checkToken(); err != nil { if err := lmem.checkToken(); err != nil {
return nil, err return nil, err
} }
@ -200,23 +201,23 @@ func (lmem *lockedMemRepo) List() ([]string, error) {
return res, nil return res, nil
} }
// Get gets a key out of keystore and returns KeyInfo coresponding to named key // Get gets a key out of keystore and returns types.KeyInfo coresponding to named key
func (lmem *lockedMemRepo) Get(name string) (KeyInfo, error) { func (lmem *lockedMemRepo) Get(name string) (types.KeyInfo, error) {
if err := lmem.checkToken(); err != nil { if err := lmem.checkToken(); err != nil {
return KeyInfo{}, err return types.KeyInfo{}, err
} }
lmem.RLock() lmem.RLock()
defer lmem.RUnlock() defer lmem.RUnlock()
key, ok := lmem.mem.keystore[name] key, ok := lmem.mem.keystore[name]
if !ok { if !ok {
return KeyInfo{}, xerrors.Errorf("getting key '%s': %w", name, ErrKeyNotFound) return types.KeyInfo{}, xerrors.Errorf("getting key '%s': %w", name, ErrKeyNotFound)
} }
return key, nil return key, nil
} }
// Put saves key info under given name // Put saves key info under given name
func (lmem *lockedMemRepo) Put(name string, key KeyInfo) error { func (lmem *lockedMemRepo) Put(name string, key types.KeyInfo) error {
if err := lmem.checkToken(); err != nil { if err := lmem.checkToken(); err != nil {
return err return err
} }

View File

@ -7,6 +7,7 @@ import (
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"golang.org/x/xerrors" "golang.org/x/xerrors"
"github.com/filecoin-project/go-lotus/chain/types"
"github.com/filecoin-project/go-lotus/node/config" "github.com/filecoin-project/go-lotus/node/config"
) )
@ -64,8 +65,8 @@ func basicTest(t *testing.T, repo Repo) {
} }
assert.Nil(t, apima, "with closed repo, apima should be set back to nil") assert.Nil(t, apima, "with closed repo, apima should be set back to nil")
k1 := KeyInfo{Type: "foo"} k1 := types.KeyInfo{Type: "foo"}
k2 := KeyInfo{Type: "bar"} k2 := types.KeyInfo{Type: "bar"}
lrepo, err = repo.Lock() lrepo, err = repo.Lock()
assert.NoError(t, err, "should be able to relock") assert.NoError(t, err, "should be able to relock")