feat: new endpoints added

- `HasPairedDevices`
- `MakePrivateKeyKeypairFullyOperable`
- `MakeSeedPhraseKeypairFullyOperable`
This commit is contained in:
Sale Djenic 2023-08-07 17:03:08 +02:00 committed by saledjenic
parent 688fb333a0
commit 70c29a828e
2 changed files with 96 additions and 2 deletions

View File

@ -1266,8 +1266,38 @@ func (db *Database) GetNodeConfig() (*params.NodeConfig, error) {
return nodecfg.GetNodeConfigFromDB(db.db)
}
// This function should not update the clock, cause it marks accounts locally.
func (db *Database) SetAccountOperability(address types.Address, operable AccountOperable) (err error) {
// This function should not update the clock, cause it marks keypair/accounts locally.
func (db *Database) MarkKeypairFullyOperable(keyUID string) (err error) {
tx, err := db.db.Begin()
if err != nil {
return err
}
defer func() {
if err == nil {
err = tx.Commit()
return
}
_ = tx.Rollback()
}()
kp, err := db.getKeypairByKeyUID(tx, keyUID, false)
if err != nil {
return err
}
for _, acc := range kp.Accounts {
_, err = tx.Exec(`UPDATE keypairs_accounts SET operable = ? WHERE address = ?`, AccountFullyOperable, acc.Address)
if err != nil {
return err
}
}
_, err = tx.Exec(`UPDATE keypairs SET synced_from = "" WHERE key_uid = ?`, keyUID)
return err
}
// This function should not update the clock, cause it marks a keypair locally.
func (db *Database) SetKeypairSyncedFrom(address types.Address, operable AccountOperable) (err error) {
tx, err := db.db.Begin()
if err != nil {
return err

View File

@ -71,6 +71,10 @@ func (api *API) SaveKeypair(ctx context.Context, keypair *accounts.Keypair) erro
return nil
}
func (api *API) HasPairedDevices(ctx context.Context) bool {
return (*api.messenger).HasPairedDevices()
}
// Setting `Keypair` without `Accounts` will update keypair only.
func (api *API) UpdateKeypairName(ctx context.Context, keyUID string, name string) error {
return (*api.messenger).UpdateKeypairName(keyUID, name)
@ -312,6 +316,30 @@ func (api *API) ImportPrivateKey(ctx context.Context, privateKey string, passwor
return err
}
// Creates all keystore files for a keypair and mark it in db as fully operable.
func (api *API) MakePrivateKeyKeypairFullyOperable(ctx context.Context, privateKey string, password string) error {
info, err := api.manager.AccountsGenerator().ImportPrivateKey(privateKey)
if err != nil {
return err
}
kp, err := api.db.GetKeypairByKeyUID(info.KeyUID)
if err != nil {
return err
}
if kp == nil {
return errors.New("keypair for the provided private key is not known")
}
_, err = api.manager.AccountsGenerator().StoreAccount(info.ID, password)
if err != nil {
return err
}
return api.db.MarkKeypairFullyOperable(info.KeyUID)
}
// Imports a new mnemonic and creates local keystore file.
func (api *API) ImportMnemonic(ctx context.Context, mnemonic string, password string) error {
mnemonicNoExtraSpaces := strings.Join(strings.Fields(mnemonic), " ")
@ -334,6 +362,42 @@ func (api *API) ImportMnemonic(ctx context.Context, mnemonic string, password st
return err
}
// Creates all keystore files for a keypair and mark it in db as fully operable.
func (api *API) MakeSeedPhraseKeypairFullyOperable(ctx context.Context, mnemonic string, password string) error {
mnemonicNoExtraSpaces := strings.Join(strings.Fields(mnemonic), " ")
generatedAccountInfo, err := api.manager.AccountsGenerator().ImportMnemonic(mnemonicNoExtraSpaces, "")
if err != nil {
return err
}
kp, err := api.db.GetKeypairByKeyUID(generatedAccountInfo.KeyUID)
if err != nil {
return err
}
if kp == nil {
return errors.New("keypair for the provided seed phrase is not known")
}
_, err = api.manager.AccountsGenerator().StoreAccount(generatedAccountInfo.ID, password)
if err != nil {
return err
}
var paths []string
for _, acc := range kp.Accounts {
paths = append(paths, acc.Path)
}
_, err = api.manager.AccountsGenerator().StoreDerivedAccounts(generatedAccountInfo.ID, password, paths)
if err != nil {
return err
}
return api.db.MarkKeypairFullyOperable(generatedAccountInfo.KeyUID)
}
// Creates a random new mnemonic.
func (api *API) GetRandomMnemonic(ctx context.Context) (string, error) {
return api.manager.GetRandomMnemonic()