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 }