github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/externals/assertion_parser_test.go (about) 1 // Copyright 2015 Keybase, Inc. All rights reserved. Use of 2 // this source code is governed by the included BSD license. 3 4 package externals 5 6 import ( 7 "context" 8 "testing" 9 10 libkb "github.com/keybase/client/go/libkb" 11 "github.com/stretchr/testify/require" 12 ) 13 14 func TestNormalization(t *testing.T) { 15 tc := setupTest(t, "Normalization", 1) 16 defer tc.Cleanup() 17 inp := "Web://A.AA || HttP://B.bb && dnS://C.cc || MaxFactor@reddit || zQueal@keyBASE || XanxA@hackernews || foO@TWITTER || 0123456789ABCDEF0123456789abcd19@uid || josh@gubble.SoCiAl" 18 outp := "a.aa@web,b.bb@http+c.cc@dns,maxfactor@reddit,zqueal,XanxA@hackernews,foo@twitter,0123456789abcdef0123456789abcd19@uid,josh@gubble.social" 19 expr, err := AssertionParse(libkb.NewMetaContext(context.Background(), tc.G), inp) 20 require.NoError(t, err) 21 require.Equal(t, expr.String(), outp) 22 } 23 24 type Pair struct { 25 k, v string 26 } 27 28 func TestParserFail1(t *testing.T) { 29 tc := setupTest(t, "ParserFail1", 1) 30 defer tc.Cleanup() 31 bads := []Pair{ 32 {"", "Unexpected EOF parsing assertion"}, 33 {"aa ||", "Unexpected EOF parsing assertion"}, 34 {"aa &&", "Unexpected EOF parsing assertion"}, 35 {"(aa", "Unbalanced parentheses"}, 36 {"aa && dns:", "Bad assertion, no value given (key=dns)"}, 37 {"bb && foo:a", "Unknown social network: foo"}, 38 {"&& aa", "Unexpected token: &&"}, 39 {"|| aa", "Unexpected token: ||"}, 40 {"aa)", "Found junk at end of input: )"}, 41 {"()", "Illegal parenthetical expression"}, 42 43 // Invalid usernames 44 {"dns://a", "Invalid hostname: a"}, 45 {"a@pgp", "bad hex string: 'a'"}, 46 {"aBCP@pgp", "bad hex string: 'abcp'"}, 47 {"jj@pgp", "bad hex string: 'jj'"}, 48 {"[al@ice@keybase.io]@email", "Invalid email address: al@ice@keybase.io"}, 49 {"email:[al@ice@keybase.io]", "Invalid email address: al@ice@keybase.io"}, 50 {"phone:onetwothree", "Invalid phone number: onetwothree"}, 51 {"onetwothree@phone", "Invalid phone number: onetwothree"}, 52 {"1-555-222@phone", "Invalid phone number: 1-555-222"}, 53 54 // Username missing 55 {"f@reddit", "Bad username: 'f'"}, 56 {"http://", "Bad assertion, no value given (key=http)"}, 57 {"reddit:", "Bad username: ''"}, 58 {"reddit://", "Bad username: ''"}, 59 {"gubble.social:", "username must be at least 2 characters, was 0"}, 60 {"@gubble.social", "username must be at least 2 characters, was 0"}, 61 {"@rooter", "Bad username: ''"}, 62 {"@zzzzz", "Unknown social network: zzzzz"}, 63 64 // Service name missing 65 {"hello@", "Invalid key-value identity: hello@"}, 66 {":illegal", "Invalid key-value identity: :illegal"}, 67 {"://what", "Invalid key-value identity: ://what"}, 68 69 {"@", "Invalid key-value identity: @"}, 70 {":", "Invalid key-value identity: :"}, 71 {"://", "Invalid key-value identity: ://"}, 72 73 {"alice@rooter@email", "Invalid key-value identity: alice@rooter@email"}, 74 {"alice@keybase.io@email", "Invalid key-value identity: alice@keybase.io@email"}, 75 76 {"(alice@keybasers.de)@email", "Illegal parenthetical expression"}, 77 {"twitter://alice&&(alice@keybasers.de)@email", "Found junk at end of input: )"}, 78 {"bob,[al#ice@kb.io]@email", "Syntax error when parsing: [al#ice@kb.io]@email"}, // `bob,` parsed successfully, but lexer did not match anything after 79 {"[al#ice@keybase.io]@email", "Syntax error when parsing: [al#ice@keybase.io]@email"}, 80 {"[b,b@keybase.io]@email", "Invalid key-value identity: [b,b@keybase.io]@email"}, 81 82 // Always require [] syntax for emails, even though this is theoretically { service: "email", name : "spam" }. 83 {"spam@email", "expected bracket syntax for email assertion"}, 84 85 // entire email:alice@keybase.io is sweeped as URL and passet to 86 // assertion parser, which does not recognize syntax with both : and @ 87 {"email:alice@keybase.io", "Invalid key-value identity: email:alice@keybase.io"}, 88 // similar to above 89 {"email://alice@keybase.io", "Invalid key-value identity: email://alice@keybase.io"}, 90 // non-email example 91 {"rooter:alice@twitter", "Invalid key-value identity: rooter:alice@twitter"}, 92 93 // [] is parser-level illegal 94 {"[]@email", "Invalid key-value identity: []@email"}, 95 {"[]@rooter", "Invalid key-value identity: []@rooter"}, 96 {"rooter:[]", "Invalid key-value identity: rooter:[]"}, 97 {"email:[]", "Invalid key-value identity: email:[]"}, 98 {"email://[]", "Invalid key-value identity: email://[]"}, 99 100 {"[alice]@rooter", "unexpected bracket syntax for assertion: rooter"}, 101 {"rooter:[alice]", "unexpected bracket syntax for assertion: rooter"}, 102 103 {"[michal]", "Syntax error when parsing: [michal]"}, 104 // This is lexed as URL, ERROR, EOF, but it fails prematurely 105 // with assertion parser error on "[michal]@" (first URL), so we 106 // don't get to see "Syntax error". 107 {"[michal]@[keybase]", "Invalid key-value identity: [michal]@"}, 108 109 {"[+1-555-222]@phone", "unexpected bracket syntax for assertion: phone"}, // nice try but no 110 } 111 112 for _, bad := range bads { 113 ret, err := AssertionParse(libkb.NewMetaContext(context.Background(), tc.G), bad.k) 114 require.Error(t, err, "for %q: ret is: %+v", bad.k, ret) 115 require.Equal(t, bad.v, err.Error(), "when testing %q", bad.k) 116 } 117 }