Add LoginAccount endpoint

This commit adds LoginAccount endpoint.
This makes it consistent with CreateAccount and RestoreAccount as they
use similar config.

The notable difference with the previous endpoint is the API, which is
the same as CreateAccount/RestoreAccount, and the fact that it will
override your networks configuration.

Storing them in the config is now not needed anymore, as that's always
driven from the backend, and we won't allow custom networks in the new
wallet.
This commit is contained in:
Andrea Maria Piana 2023-05-24 16:02:53 +01:00
parent d37b605796
commit 7fd9fefdef
8 changed files with 159 additions and 15 deletions

View File

@ -141,7 +141,7 @@ var goerliGanacheTokenOverrides = params.TokenOverride{
Address: ganacheTokenAddress,
}
func setRPCs(networks []params.Network, request *requests.CreateAccount) []params.Network {
func setRPCs(networks []params.Network, request *requests.WalletSecretsConfig) []params.Network {
var networksWithRPC []params.Network
@ -187,5 +187,5 @@ func setRPCs(networks []params.Network, request *requests.CreateAccount) []param
}
func buildDefaultNetworks(request *requests.CreateAccount) []params.Network {
return setRPCs(defaultNetworks, request)
return setRPCs(defaultNetworks, &request.WalletSecretsConfig)
}

View File

@ -13,8 +13,10 @@ func TestBuildDefaultNetworks(t *testing.T) {
poktToken := "poket-token"
infuraToken := "infura-token"
request := &requests.CreateAccount{
PoktToken: poktToken,
InfuraToken: infuraToken,
WalletSecretsConfig: requests.WalletSecretsConfig{
PoktToken: poktToken,
InfuraToken: infuraToken,
},
}
actualNetworks := buildDefaultNetworks(request)
@ -55,7 +57,9 @@ func TestBuildDefaultNetworks(t *testing.T) {
func TestBuildDefaultNetworksGanache(t *testing.T) {
ganacheURL := "ganacheurl"
request := &requests.CreateAccount{
GanacheURL: ganacheURL,
WalletSecretsConfig: requests.WalletSecretsConfig{
GanacheURL: ganacheURL,
},
}
actualNetworks := buildDefaultNetworks(request)

View File

@ -416,6 +416,97 @@ func (b *GethStatusBackend) OverwriteNodeConfigValues(conf *params.NodeConfig, n
return conf, nil
}
func (b *GethStatusBackend) overrideNetworks(conf *params.NodeConfig, request *requests.Login) {
conf.Networks = setRPCs(defaultNetworks, &request.WalletSecretsConfig)
}
func (b *GethStatusBackend) LoginAccount(request *requests.Login) error {
err := b.loginAccount(request)
if err != nil {
// Stop node for clean up
_ = b.StopNode()
}
signal.SendLoggedIn(err)
return err
}
func (b *GethStatusBackend) loginAccount(request *requests.Login) error {
if err := request.Validate(); err != nil {
return err
}
password := request.Password
acc := multiaccounts.Account{
KeyUID: request.KeyUID,
KDFIterations: request.KdfIterations,
}
if acc.KDFIterations == 0 {
acc.KDFIterations = sqlite.ReducedKDFIterationsNumber
}
err := b.ensureAppDBOpened(acc, password)
if err != nil {
return err
}
err = b.loadNodeConfig(nil)
if err != nil {
return err
}
b.overrideNetworks(b.config, request)
err = b.setupLogSettings()
if err != nil {
return err
}
b.account = &acc
accountsDB, err := accounts.NewDB(b.appDB)
if err != nil {
return err
}
chatAddr, err := accountsDB.GetChatAddress()
if err != nil {
return err
}
walletAddr, err := accountsDB.GetWalletAddress()
if err != nil {
return err
}
watchAddrs, err := accountsDB.GetWalletAddresses()
if err != nil {
return err
}
login := account.LoginParams{
Password: password,
ChatAddress: chatAddr,
WatchAddresses: watchAddrs,
MainAccount: walletAddr,
}
err = b.StartNode(b.config)
if err != nil {
b.log.Info("failed to start node")
return err
}
err = b.SelectAccount(login)
if err != nil {
return err
}
err = b.multiaccountsDB.UpdateAccountTimestamp(acc.KeyUID, time.Now().Unix())
if err != nil {
b.log.Info("failed to update account")
return err
}
return nil
}
func (b *GethStatusBackend) startNodeWithAccount(acc multiaccounts.Account, password string, inputNodeCfg *params.NodeConfig) error {
err := b.ensureAppDBOpened(acc, password)
if err != nil {

View File

@ -287,6 +287,30 @@ func CreateAccountAndLogin(requestJSON string) string {
return makeJSONResponse(nil)
}
func LoginAccount(requestJSON string) string {
var request requests.Login
err := json.Unmarshal([]byte(requestJSON), &request)
if err != nil {
return makeJSONResponse(err)
}
err = request.Validate()
if err != nil {
return makeJSONResponse(err)
}
api.RunAsync(func() error {
err := statusBackend.LoginAccount(&request)
if err != nil {
log.Error("loginAccount error", err)
return err
}
log.Debug("loginAccount started node")
return nil
})
return makeJSONResponse(nil)
}
func RestoreAccountAndLogin(requestJSON string) string {
var request requests.RestoreAccount
err := json.Unmarshal([]byte(requestJSON), &request)

View File

@ -36,10 +36,15 @@ type CreateAccount struct {
CurrentNetwork string `json:"currentNetwork"`
NetworkID uint64 `json:"networkId"`
PoktToken string `json:"poktToken"`
InfuraToken string `json:"infuraToken"`
InfuraSecret string `json:"infuraSecret"`
OpenseaAPIKey string `json:"openseaApiKey"`
WalletSecretsConfig
}
type WalletSecretsConfig struct {
PoktToken string `json:"poktToken"`
InfuraToken string `json:"infuraToken"`
InfuraSecret string `json:"infuraSecret"`
OpenseaAPIKey string `json:"openseaApiKey"`
// Testing
GanacheURL string `json:"ganacheURL"`

View File

@ -0,0 +1,20 @@
package requests
import "errors"
var ErrLoginInvalidKeyUID = errors.New("login: invalid key-uid")
type Login struct {
Password string `json:"password"`
KeyUID string `json:"keyUid"`
KdfIterations int `json:"kdfIterations"`
WalletSecretsConfig
}
func (c *Login) Validate() error {
if c.KeyUID == "" {
return ErrLoginInvalidKeyUID
}
return nil
}

View File

@ -6,14 +6,15 @@ package rpc
import (
"context"
"fmt"
)
import (
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/log"
gethrpc "github.com/ethereum/go-ethereum/rpc"
proxy "github.com/siphiuel/lc-proxy-wrapper"
"github.com/status-im/status-go/params"
)

View File

@ -14,16 +14,15 @@ import (
"net/http"
"net/http/httptest"
)
import (
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
gethrpc "github.com/ethereum/go-ethereum/rpc"
"github.com/status-im/status-go/params"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/suite"
gethrpc "github.com/ethereum/go-ethereum/rpc"
"github.com/status-im/status-go/params"
)
type ProxySuite struct {