signer: prevent panic in type assertions, make cliui print rawdata as quotable-safe

This commit is contained in:
Martin Holst Swende 2019-02-05 14:33:17 +01:00
parent 38ff1c570c
commit 700e1d4e7f
No known key found for this signature in database
GPG key ID: 683B438C05A5DDF0
2 changed files with 21 additions and 10 deletions

View file

@ -169,7 +169,7 @@ func (ui *CommandlineUI) ApproveSignData(request *SignDataRequest) (SignDataResp
fmt.Printf("%v\n", nvt.Pprint(1)) fmt.Printf("%v\n", nvt.Pprint(1))
} }
//fmt.Printf("message: \n%v\n", request.Message) //fmt.Printf("message: \n%v\n", request.Message)
fmt.Printf("raw data: \n%v\n", request.Rawdata) fmt.Printf("raw data: \n%q\n", request.Rawdata)
fmt.Printf("message hash: %v\n", request.Hash) fmt.Printf("message hash: %v\n", request.Hash)
fmt.Printf("-------------------------------------------\n") fmt.Printf("-------------------------------------------\n")
showMetadata(request.Meta) showMetadata(request.Meta)

View file

@ -175,8 +175,6 @@ func (api *SignerAPI) SignData(ctx context.Context, contentType string, addr com
// This method returns the mimetype for signing along with the request // This method returns the mimetype for signing along with the request
func (api *SignerAPI) determineSignatureFormat(ctx context.Context, contentType string, addr common.MixedcaseAddress, data interface{}) (*SignDataRequest, error) { func (api *SignerAPI) determineSignatureFormat(ctx context.Context, contentType string, addr common.MixedcaseAddress, data interface{}) (*SignDataRequest, error) {
var req *SignDataRequest var req *SignDataRequest
req.Address = addr
req.Meta = MetadataFromContext(ctx)
mediaType, _, err := mime.ParseMediaType(contentType) mediaType, _, err := mime.ParseMediaType(contentType)
if err != nil { if err != nil {
@ -201,7 +199,11 @@ func (api *SignerAPI) determineSignatureFormat(ctx context.Context, contentType
req = &SignDataRequest{ContentType: mediaType, Rawdata: []byte(msg), Message: message, Hash: sighash} req = &SignDataRequest{ContentType: mediaType, Rawdata: []byte(msg), Message: message, Hash: sighash}
case ApplicationClique.Mime: case ApplicationClique.Mime:
// Clique is the Ethereum PoA standard // Clique is the Ethereum PoA standard
cliqueData, err := hexutil.Decode(data.(string)) stringData, ok := data.(string)
if !ok {
return nil, fmt.Errorf("input for %v plain must be an hex-encoded string", ApplicationClique.Mime)
}
cliqueData, err := hexutil.Decode(stringData)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -226,11 +228,16 @@ func (api *SignerAPI) determineSignatureFormat(ctx context.Context, contentType
default: // also case TextPlain.Mime: default: // also case TextPlain.Mime:
// Calculates an Ethereum ECDSA signature for: // Calculates an Ethereum ECDSA signature for:
// hash = keccak256("\x19${byteVersion}Ethereum Signed Message:\n${message length}${message}") // hash = keccak256("\x19${byteVersion}Ethereum Signed Message:\n${message length}${message}")
plainData, err := hexutil.Decode(data.(string)) // We expect it to be a string
if err != nil { stringData, ok := data.(string)
return nil, err if !ok {
return nil, fmt.Errorf("input for text/plain must be a string")
} }
sighash, msg := accounts.TextAndHash(plainData) //plainData, err := hexutil.Decode(stringdata)
//if err != nil {
// return nil, err
//}
sighash, msg := accounts.TextAndHash([]byte(stringData))
message := []*NameValueType{ message := []*NameValueType{
{ {
Name: "message", Name: "message",
@ -240,6 +247,8 @@ func (api *SignerAPI) determineSignatureFormat(ctx context.Context, contentType
} }
req = &SignDataRequest{ContentType: mediaType, Rawdata: []byte(msg), Message: message, Hash: sighash} req = &SignDataRequest{ContentType: mediaType, Rawdata: []byte(msg), Message: message, Hash: sighash}
} }
req.Address = addr
req.Meta = MetadataFromContext(ctx)
return req, nil return req, nil
} }
@ -552,8 +561,10 @@ func (api *SignerAPI) EcRecover(ctx context.Context, data hexutil.Bytes, sig hex
// UnmarshalValidatorData converts the bytes input to typed data // UnmarshalValidatorData converts the bytes input to typed data
func UnmarshalValidatorData(data interface{}) (ValidatorData, error) { func UnmarshalValidatorData(data interface{}) (ValidatorData, error) {
raw := data.(map[string]interface{}) raw, ok := data.(map[string]interface{})
if !ok {
return ValidatorData{}, errors.New("validator input is not a map[string]interface{}")
}
addr, ok := raw["address"].(string) addr, ok := raw["address"].(string)
if !ok { if !ok {
return ValidatorData{}, errors.New("validator address is not sent as a string") return ValidatorData{}, errors.New("validator address is not sent as a string")