fix: corresponding keystore files are deleted when account is migrated to a keycard

This commit is contained in:
Sale Djenic 2022-11-08 14:30:33 +01:00 committed by saledjenic
parent fdf4c05968
commit 77b7ce5a09
3 changed files with 74 additions and 8 deletions

View File

@ -10,6 +10,7 @@ import (
"os" "os"
"path" "path"
"path/filepath" "path/filepath"
"strings"
"sync" "sync"
"testing" "testing"
@ -626,10 +627,11 @@ func TestConvertAccount(t *testing.T) {
err = backend.AccountManager().InitKeystore(keyStoreDir) err = backend.AccountManager().InitKeystore(keyStoreDir)
require.NoError(t, err) require.NoError(t, err)
const path = "m/44'/60'/0'/0"
backend.AccountManager() backend.AccountManager()
accs, err := backend.AccountManager(). accs, err := backend.AccountManager().
AccountsGenerator(). AccountsGenerator().
GenerateAndDeriveAddresses(12, 1, "", []string{"m/44'/60'/0'/0"}) GenerateAndDeriveAddresses(12, 1, "", []string{path})
require.NoError(t, err) require.NoError(t, err)
generateAccount := accs[0] generateAccount := accs[0]
@ -663,10 +665,22 @@ func TestConvertAccount(t *testing.T) {
SigningPhrase: "yurt joey vibe", SigningPhrase: "yurt joey vibe",
WalletRootAddress: types.HexToAddress(accountInfo.Address)} WalletRootAddress: types.HexToAddress(accountInfo.Address)}
acc := accounts.Account{
Address: types.HexToAddress(generateAccount.Address),
KeyUID: generateAccount.KeyUID,
Type: accounts.AccountTypeGenerated,
PublicKey: types.Hex2Bytes(generateAccount.PublicKey),
Path: path,
Wallet: false,
Chat: false,
Name: "GeneratedAccount",
}
accounts := []*accounts.Account{&acc}
err = backend.saveAccountsAndSettings( err = backend.saveAccountsAndSettings(
s, s,
&params.NodeConfig{}, &params.NodeConfig{},
nil) accounts)
require.NoError(t, err) require.NoError(t, err)
err = backend.OpenAccounts() err = backend.OpenAccounts()
@ -690,13 +704,36 @@ func TestConvertAccount(t *testing.T) {
KeycardPairing: "pairing", KeycardPairing: "pairing",
} }
_, keyStoreErrBefore := os.Stat(keyStoreDir) addrWithoutPrefix := strings.ToLower(generateAccount.Address[2:len(generateAccount.Address)])
found := false
err = filepath.Walk(keyStoreDir, func(path string, fileInfo os.FileInfo, err error) error {
if err != nil {
return err
}
if !fileInfo.IsDir() && strings.Contains(path, addrWithoutPrefix) {
found = true
}
return nil
})
require.NoError(t, err)
require.True(t, found)
err = backend.ConvertToKeycardAccount(keyStoreDir, keycardAccount, keycardSettings, password, keycardPassword) err = backend.ConvertToKeycardAccount(keyStoreDir, keycardAccount, keycardSettings, password, keycardPassword)
require.NoError(t, err) require.NoError(t, err)
_, keyStoreErrAfter := os.Stat(keyStoreDir) err = filepath.Walk(keyStoreDir, func(path string, fileInfo os.FileInfo, err error) error {
require.True(t, keyStoreErrBefore == keyStoreErrAfter) if err != nil {
return err
}
if !fileInfo.IsDir() && strings.Contains(path, addrWithoutPrefix) {
found = false
}
return nil
})
require.NoError(t, err)
require.True(t, found)
err = backend.ensureAppDBOpened(keycardAccount, keycardPassword) err = backend.ensureAppDBOpened(keycardAccount, keycardPassword)
require.NoError(t, err) require.NoError(t, err)

View File

@ -598,12 +598,30 @@ func (b *GethStatusBackend) ConvertToKeycardAccount(keyStoreDir string, account
return err return err
} }
knownAccounts, err := accountDB.GetAccounts()
if err != nil {
return err
}
err = b.closeAppDB() err = b.closeAppDB()
if err != nil { if err != nil {
return err return err
} }
return b.ChangeDatabasePassword(account.KeyUID, password, newPassword) err = b.ChangeDatabasePassword(account.KeyUID, password, newPassword)
if err != nil {
return err
}
for _, acc := range knownAccounts {
if account.KeyUID == acc.KeyUID {
// This action deletes an account from the keystore, no need to check for error in this context here, cause if this
// action fails from whichever reason the account is still successfully migrated since keystore won't be used any more.
_ = b.accountManager.DeleteAccount(keyStoreDir, acc.Address)
}
}
return nil
} }
func (b *GethStatusBackend) VerifyDatabasePassword(keyUID string, password string) error { func (b *GethStatusBackend) VerifyDatabasePassword(keyUID string, password string) error {

View File

@ -425,13 +425,24 @@ func (api *API) VerifyPassword(password string) bool {
return err == nil return err == nil
} }
func (api *API) AddMigratedKeyPair(ctx context.Context, kcUID string, kpName string, keyUID string, accountAddresses []string) error { func (api *API) AddMigratedKeyPair(ctx context.Context, kcUID string, kpName string, keyUID string, accountAddresses []string, keyStoreDir string) error {
var addresses []types.Address var addresses []types.Address
for _, addr := range accountAddresses { for _, addr := range accountAddresses {
addresses = append(addresses, types.Address(common.HexToAddress(addr))) addresses = append(addresses, types.Address(common.HexToAddress(addr)))
} }
return api.db.AddMigratedKeyPair(kcUID, kpName, keyUID, addresses) err := api.db.AddMigratedKeyPair(kcUID, kpName, keyUID, addresses)
if err != nil {
return err
}
// Once we migrate a keypair, corresponding keystore files need to be deleted.
for _, addr := range addresses {
// This action deletes an account from the keystore, no need to check for error in this context here, cause if this
// action fails from whichever reason the account is still successfully migrated since keystore won't be used any more.
_ = api.manager.DeleteAccount(keyStoreDir, addr)
}
return nil
} }
func (api *API) GetAllMigratedKeyPairs(ctx context.Context) ([]*keypairs.KeyPair, error) { func (api *API) GetAllMigratedKeyPairs(ctx context.Context) ([]*keypairs.KeyPair, error) {