From 33a1ac635cd00ba25eda16cf7194b305d30157ef Mon Sep 17 00:00:00 2001 From: Paul Berg Date: Thu, 6 Dec 2018 08:51:12 +0000 Subject: [PATCH] Added extra regexp for reference types --- signer/core/signed_data.go | 13 +++++++++---- signer/core/signed_data_test.go | 8 ++++---- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/signer/core/signed_data.go b/signer/core/signed_data.go index 42b2911d4a..9601a39e77 100644 --- a/signer/core/signed_data.go +++ b/signer/core/signed_data.go @@ -96,6 +96,7 @@ type TypedDataDomain struct { } var typedDataRegexp = regexp.MustCompile(`^((address|bool|bytes|string)|((bytes)([1-9]|[1-2][0-9]|3[0-2]))|((int|uint)(8|16|32|64|128|256)))(\[])?$`) +var typedDataReferenceTypeRegexp = regexp.MustCompile(`^[A-Z](\w*)(\[])?$`) // Sign receives a request and produces a signature @@ -747,15 +748,19 @@ func (types *Types) Validate() error { } firstChar := []rune(typeVal)[0] if unicode.IsUpper(firstChar) { - if (*types)[typeVal] == nil { - return fmt.Errorf("referenced type '%s' is undefined", typeVal) + if (*types)[typeVal] != nil { + if !typedDataReferenceTypeRegexp.MatchString(typeVal) { + return fmt.Errorf("unknown reference type '%s", typeVal) + } + } else { + return fmt.Errorf("reference type '%s' is undefined", typeVal) } } else { if !typedDataRegexp.MatchString(typeVal) { if (*types)[typeVal] != nil { - return fmt.Errorf("referenced type '%s' must be capitalized", typeVal) + return fmt.Errorf("reference type '%s' must be capitalized", typeVal) } else { - return fmt.Errorf("unknown atomic type '%s'", typeVal) + return fmt.Errorf("unknown type '%s'", typeVal) } } } diff --git a/signer/core/signed_data_test.go b/signer/core/signed_data_test.go index 26221b8068..7a8df321cf 100644 --- a/signer/core/signed_data_test.go +++ b/signer/core/signed_data_test.go @@ -463,8 +463,8 @@ func TestMalformedData2(t *testing.T) { malformedTypedData.Types["Mail"][2]["type"] = "Blahonga" err = malformedTypedData.Validate() - if err == nil || err.Error() != "referenced type 'Blahonga' is undefined" { - t.Fatalf("Expected `referenced type 'Blahonga' is undefined`, got %v", err) + if err == nil || err.Error() != "reference type 'Blahonga' is undefined" { + t.Fatalf("Expected `reference type 'Blahonga' is undefined`, got %v", err) } _, err = malformedTypedData.HashStruct(malformedTypedData.PrimaryType, malformedTypedData.Message) if err == nil || err.Error() != "unrecognized type 'Blahonga'" { @@ -555,8 +555,8 @@ func TestMalformedData3(t *testing.T) { t.Fatalf("unmarshalling failed %v", err) } err = malformedTypedData.Validate() - if err == nil || err.Error() != "unknown atomic type 'uint256 ... and now for something completely different'" { - t.Fatalf("Expected `unknown atomic type 'uint256 ... and now for something completely different'`, got %v", err) + if err == nil || err.Error() != "unknown type 'uint256 ... and now for something completely different'" { + t.Fatalf("Expected `unknown type 'uint256 ... and now for something completely different'`, got %v", err) } malformedTypedData.Types["EIP712Domain"][2]["type"] = "uint256"