diff --git a/keystore/admin_test.go b/keystore/admin_test.go index 27d7ad9cc..efe67261e 100644 --- a/keystore/admin_test.go +++ b/keystore/admin_test.go @@ -7,10 +7,10 @@ import ( "sync" "testing" - "github.com/smartcontractkit/chainlink-common/keystore" - "github.com/smartcontractkit/chainlink-common/keystore/storage" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink-common/keystore" ) func TestKeystore_CreateDeleteReadKeys(t *testing.T) { @@ -110,7 +110,7 @@ func TestKeystore_CreateDeleteReadKeys(t *testing.T) { for _, tt := range tt { t.Run(tt.name, func(t *testing.T) { - storage := storage.NewMemoryStorage() + storage := keystore.NewMemoryStorage() ks, err := keystore.LoadKeystore(ctx, storage, keystore.EncryptionParams{ Password: "test-password", ScryptParams: keystore.FastScryptParams, @@ -162,7 +162,7 @@ func TestKeystore_ConcurrentCreateAndRead(t *testing.T) { t.Parallel() ctx := context.Background() - st := storage.NewMemoryStorage() + st := keystore.NewMemoryStorage() ks, err := keystore.LoadKeystore(ctx, st, keystore.EncryptionParams{ Password: "test", ScryptParams: keystore.FastScryptParams, diff --git a/keystore/file.go b/keystore/file.go new file mode 100644 index 000000000..d92f5f781 --- /dev/null +++ b/keystore/file.go @@ -0,0 +1,29 @@ +package keystore + +import ( + "context" + "os" +) + +const readWritePerms = os.FileMode(0600) + +var _ Storage = &FileStorage{} + +// FileStorage implements Storage using a file +type FileStorage struct { + name string +} + +func NewFileStorage(name string) *FileStorage { + return &FileStorage{ + name: name, + } +} + +func (f *FileStorage) GetEncryptedKeystore(ctx context.Context) ([]byte, error) { + return os.ReadFile(f.name) +} + +func (f *FileStorage) PutEncryptedKeystore(ctx context.Context, encryptedKeystore []byte) error { + return os.WriteFile(f.name, encryptedKeystore, readWritePerms) +} diff --git a/keystore/file_test.go b/keystore/file_test.go new file mode 100644 index 000000000..a788ae9dc --- /dev/null +++ b/keystore/file_test.go @@ -0,0 +1,21 @@ +package keystore_test + +import ( + "path/filepath" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink-common/keystore" +) + +func TestFileStorage(t *testing.T) { + t.Parallel() + storage := keystore.NewFileStorage(filepath.Join(t.TempDir(), "out.txt")) + _, err := storage.GetEncryptedKeystore(t.Context()) + require.ErrorContains(t, err, "no such file or directory") + require.NoError(t, storage.PutEncryptedKeystore(t.Context(), []byte("test"))) + got, err := storage.GetEncryptedKeystore(t.Context()) + require.NoError(t, err) + require.Equal(t, []byte("test"), got) +} diff --git a/keystore/keystore.go b/keystore/keystore.go index bbb808e76..f5307c7bd 100644 --- a/keystore/keystore.go +++ b/keystore/keystore.go @@ -13,10 +13,10 @@ import ( gethkeystore "github.com/ethereum/go-ethereum/accounts/keystore" gethcrypto "github.com/ethereum/go-ethereum/crypto" + "google.golang.org/protobuf/proto" + "github.com/smartcontractkit/chainlink-common/keystore/internal" "github.com/smartcontractkit/chainlink-common/keystore/serialization" - "github.com/smartcontractkit/chainlink-common/keystore/storage" - "google.golang.org/protobuf/proto" ) type KeyType string @@ -162,11 +162,11 @@ func publicKeyFromPrivateKey(privateKeyBytes internal.Raw, keyType KeyType) ([]b type keystore struct { mu sync.RWMutex keystore map[string]key - storage storage.Storage + storage Storage enc EncryptionParams } -func LoadKeystore(ctx context.Context, storage storage.Storage, enc EncryptionParams) (Keystore, error) { +func LoadKeystore(ctx context.Context, storage Storage, enc EncryptionParams) (Keystore, error) { ks := &keystore{ storage: storage, enc: enc, diff --git a/keystore/storage/memory.go b/keystore/memory.go similarity index 94% rename from keystore/storage/memory.go rename to keystore/memory.go index ce578e12f..124d42f12 100644 --- a/keystore/storage/memory.go +++ b/keystore/memory.go @@ -1,10 +1,12 @@ -package storage +package keystore import ( "context" "sync" ) +var _ Storage = &MemoryStorage{} + // MemoryStorage implements Storage using in-memory storage type MemoryStorage struct { mu sync.RWMutex diff --git a/keystore/memory_test.go b/keystore/memory_test.go new file mode 100644 index 000000000..2104d8b66 --- /dev/null +++ b/keystore/memory_test.go @@ -0,0 +1,18 @@ +package keystore_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink-common/keystore" +) + +func TestMemoryStorage(t *testing.T) { + t.Parallel() + storage := keystore.NewMemoryStorage() + require.NoError(t, storage.PutEncryptedKeystore(t.Context(), []byte("test"))) + got, err := storage.GetEncryptedKeystore(t.Context()) + require.NoError(t, err) + require.Equal(t, []byte("test"), got) +} diff --git a/keystore/storage/storage.go b/keystore/storage.go similarity index 94% rename from keystore/storage/storage.go rename to keystore/storage.go index 66c01e13d..8496a25fd 100644 --- a/keystore/storage/storage.go +++ b/keystore/storage.go @@ -1,4 +1,4 @@ -package storage +package keystore import "context" diff --git a/keystore/storage/memory_test.go b/keystore/storage/memory_test.go deleted file mode 100644 index e83fba60b..000000000 --- a/keystore/storage/memory_test.go +++ /dev/null @@ -1,17 +0,0 @@ -package storage_test - -import ( - "context" - "testing" - - "github.com/smartcontractkit/chainlink-common/keystore/storage" - "github.com/stretchr/testify/require" -) - -func TestMemoryStorage(t *testing.T) { - storage := storage.NewMemoryStorage() - require.NoError(t, storage.PutEncryptedKeystore(context.Background(), []byte("test"))) - got, err := storage.GetEncryptedKeystore(context.Background()) - require.NoError(t, err) - require.Equal(t, []byte("test"), got) -}