fork of indigo with slightly nicer lexgen

identity: normalize DID doc handles; try harder to find valid handles

Changed files
+75 -1
atproto
+5 -1
atproto/identity/identity.go
··· 196 func (i *Identity) DeclaredHandle() (syntax.Handle, error) { 197 for _, u := range i.AlsoKnownAs { 198 if strings.HasPrefix(u, "at://") && len(u) > len("at://") { 199 - return syntax.ParseHandle(u[5:]) 200 } 201 } 202 return "", ErrHandleNotDeclared
··· 196 func (i *Identity) DeclaredHandle() (syntax.Handle, error) { 197 for _, u := range i.AlsoKnownAs { 198 if strings.HasPrefix(u, "at://") && len(u) > len("at://") { 199 + hdl, err := syntax.ParseHandle(u[5:]) 200 + if err != nil { 201 + continue 202 + } 203 + return hdl.Normalize(), nil 204 } 205 } 206 return "", ErrHandleNotDeclared
+70
atproto/identity/identity_test.go
···
··· 1 + package identity 2 + 3 + import ( 4 + "encoding/json" 5 + "io" 6 + "os" 7 + "testing" 8 + 9 + "github.com/stretchr/testify/assert" 10 + ) 11 + 12 + // Tests parsing and normalizing handles from DID documents 13 + func TestHandleExtraction(t *testing.T) { 14 + assert := assert.New(t) 15 + f, err := os.Open("testdata/did_plc_doc.json") 16 + if err != nil { 17 + t.Fatal(err) 18 + } 19 + defer f.Close() 20 + 21 + docBytes, err := io.ReadAll(f) 22 + if err != nil { 23 + t.Fatal(err) 24 + } 25 + 26 + var doc DIDDocument 27 + err = json.Unmarshal(docBytes, &doc) 28 + assert.NoError(err) 29 + 30 + { 31 + ident := ParseIdentity(&doc) 32 + hdl, err := ident.DeclaredHandle() 33 + assert.NoError(err) 34 + assert.Equal("atproto.com", hdl.String()) 35 + } 36 + 37 + { 38 + doc.AlsoKnownAs = []string{ 39 + "at://BLAH.com", 40 + "at://other.org", 41 + } 42 + ident := ParseIdentity(&doc) 43 + hdl, err := ident.DeclaredHandle() 44 + assert.NoError(err) 45 + assert.Equal("blah.com", hdl.String()) 46 + } 47 + 48 + { 49 + doc.AlsoKnownAs = []string{ 50 + "https://http.example.com", 51 + "at://under_example_com", 52 + "at://correct.EXAMPLE.com", 53 + "at://other.example.com", 54 + } 55 + ident := ParseIdentity(&doc) 56 + hdl, err := ident.DeclaredHandle() 57 + assert.NoError(err) 58 + assert.Equal("correct.example.com", hdl.String()) 59 + } 60 + 61 + { 62 + doc.AlsoKnownAs = []string{ 63 + "https://http.example.com", 64 + } 65 + ident := ParseIdentity(&doc) 66 + _, err := ident.DeclaredHandle() 67 + assert.Error(err) 68 + assert.Equal("handle.invalid", ident.Handle.String()) 69 + } 70 + }