Move KeyStore into types
License: MIT Signed-off-by: Jakub Sztandera <kubuxu@protonmail.ch>
This commit is contained in:
parent
902ea18686
commit
cb9bf4200c
19
chain/types/keystore.go
Normal file
19
chain/types/keystore.go
Normal 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
|
||||||
|
}
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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")
|
||||||
|
Loading…
Reference in New Issue
Block a user