github.com/CryptoKass/go-ethereum@v1.9.8-0.20191108085857-de2259d27c75/signer/core/stdioui.go (about) 1 // Copyright 2018 The go-ethereum Authors 2 // This file is part of the go-ethereum library. 3 // 4 // The go-ethereum library is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU Lesser General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // The go-ethereum library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU Lesser General Public License for more details. 13 // 14 // You should have received a copy of the GNU Lesser General Public License 15 // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. 16 17 package core 18 19 import ( 20 "context" 21 "sync" 22 23 "github.com/ethereum/go-ethereum/internal/ethapi" 24 "github.com/ethereum/go-ethereum/log" 25 "github.com/ethereum/go-ethereum/rpc" 26 ) 27 28 type StdIOUI struct { 29 client rpc.Client 30 mu sync.Mutex 31 } 32 33 func NewStdIOUI() *StdIOUI { 34 client, err := rpc.DialContext(context.Background(), "stdio://") 35 if err != nil { 36 log.Crit("Could not create stdio client", "err", err) 37 } 38 ui := &StdIOUI{client: *client} 39 return ui 40 } 41 42 func (ui *StdIOUI) RegisterUIServer(api *UIServerAPI) { 43 ui.client.RegisterName("clef", api) 44 } 45 46 // dispatch sends a request over the stdio 47 func (ui *StdIOUI) dispatch(serviceMethod string, args interface{}, reply interface{}) error { 48 err := ui.client.Call(&reply, serviceMethod, args) 49 if err != nil { 50 log.Info("Error", "exc", err.Error()) 51 } 52 return err 53 } 54 55 // notify sends a request over the stdio, and does not listen for a response 56 func (ui *StdIOUI) notify(serviceMethod string, args interface{}) error { 57 ctx := context.Background() 58 err := ui.client.Notify(ctx, serviceMethod, args) 59 if err != nil { 60 log.Info("Error", "exc", err.Error()) 61 } 62 return err 63 } 64 65 func (ui *StdIOUI) ApproveTx(request *SignTxRequest) (SignTxResponse, error) { 66 var result SignTxResponse 67 err := ui.dispatch("ui_approveTx", request, &result) 68 return result, err 69 } 70 71 func (ui *StdIOUI) ApproveSignData(request *SignDataRequest) (SignDataResponse, error) { 72 var result SignDataResponse 73 err := ui.dispatch("ui_approveSignData", request, &result) 74 return result, err 75 } 76 77 func (ui *StdIOUI) ApproveListing(request *ListRequest) (ListResponse, error) { 78 var result ListResponse 79 err := ui.dispatch("ui_approveListing", request, &result) 80 return result, err 81 } 82 83 func (ui *StdIOUI) ApproveNewAccount(request *NewAccountRequest) (NewAccountResponse, error) { 84 var result NewAccountResponse 85 err := ui.dispatch("ui_approveNewAccount", request, &result) 86 return result, err 87 } 88 89 func (ui *StdIOUI) ShowError(message string) { 90 err := ui.notify("ui_showError", &Message{message}) 91 if err != nil { 92 log.Info("Error calling 'ui_showError'", "exc", err.Error(), "msg", message) 93 } 94 } 95 96 func (ui *StdIOUI) ShowInfo(message string) { 97 err := ui.notify("ui_showInfo", Message{message}) 98 if err != nil { 99 log.Info("Error calling 'ui_showInfo'", "exc", err.Error(), "msg", message) 100 } 101 } 102 func (ui *StdIOUI) OnApprovedTx(tx ethapi.SignTransactionResult) { 103 err := ui.notify("ui_onApprovedTx", tx) 104 if err != nil { 105 log.Info("Error calling 'ui_onApprovedTx'", "exc", err.Error(), "tx", tx) 106 } 107 } 108 109 func (ui *StdIOUI) OnSignerStartup(info StartupInfo) { 110 err := ui.notify("ui_onSignerStartup", info) 111 if err != nil { 112 log.Info("Error calling 'ui_onSignerStartup'", "exc", err.Error(), "info", info) 113 } 114 } 115 func (ui *StdIOUI) OnInputRequired(info UserInputRequest) (UserInputResponse, error) { 116 var result UserInputResponse 117 err := ui.dispatch("ui_onInputRequired", info, &result) 118 if err != nil { 119 log.Info("Error calling 'ui_onInputRequired'", "exc", err.Error(), "info", info) 120 } 121 return result, err 122 }