github.com/status-im/status-go@v1.1.0/services/connector/commands/request_accounts.go (about)

     1  package commands
     2  
     3  import (
     4  	"database/sql"
     5  	"errors"
     6  
     7  	"github.com/status-im/status-go/multiaccounts/accounts"
     8  	persistence "github.com/status-im/status-go/services/connector/database"
     9  	"github.com/status-im/status-go/signal"
    10  )
    11  
    12  // errors
    13  var (
    14  	ErrAccountsRequestDeniedByUser = errors.New("accounts request denied by user")
    15  	ErrNoAccountsAvailable         = errors.New("no accounts available")
    16  )
    17  
    18  type RequestAccountsCommand struct {
    19  	ClientHandler ClientSideHandlerInterface
    20  	Db            *sql.DB
    21  }
    22  
    23  type RawAccountsResponse struct {
    24  	JSONRPC string             `json:"jsonrpc"`
    25  	ID      int                `json:"id"`
    26  	Result  []accounts.Account `json:"result"`
    27  }
    28  
    29  func (c *RequestAccountsCommand) Execute(request RPCRequest) (interface{}, error) {
    30  	err := request.Validate()
    31  	if err != nil {
    32  		return "", err
    33  	}
    34  
    35  	dApp, err := persistence.SelectDAppByUrl(c.Db, request.URL)
    36  	if err != nil {
    37  		return "", err
    38  	}
    39  
    40  	// FIXME: this may have a security issue in case some malicious software tries to fake the origin
    41  	if dApp == nil {
    42  		connectorDApp := signal.ConnectorDApp{
    43  			URL:     request.URL,
    44  			Name:    request.Name,
    45  			IconURL: request.IconURL,
    46  		}
    47  		account, chainID, err := c.ClientHandler.RequestShareAccountForDApp(connectorDApp)
    48  		if err != nil {
    49  			return "", err
    50  		}
    51  
    52  		dApp = &persistence.DApp{
    53  			URL:           request.URL,
    54  			Name:          request.Name,
    55  			IconURL:       request.IconURL,
    56  			SharedAccount: account,
    57  			ChainID:       chainID,
    58  		}
    59  
    60  		err = persistence.UpsertDApp(c.Db, dApp)
    61  		if err != nil {
    62  			return "", err
    63  		}
    64  		signal.SendConnectorDAppPermissionGranted(connectorDApp)
    65  	}
    66  
    67  	return FormatAccountAddressToResponse(dApp.SharedAccount), nil
    68  }