Blob


1 package apub
3 import (
4 "fmt"
5 "net/mail"
6 "strings"
8 "webfinger.net/go/webfinger"
9 )
11 // Finger is convenience function returning the corresponding Actor,
12 // if any, of an address resolvable by WebFinger.
13 // It is equivalent to doing webfinger.Lookup then LookupActor.
14 func Finger(address string) (*Actor, error) {
15 jrd, err := webfinger.Lookup(address, nil)
16 if err != nil {
17 return nil, err
18 }
19 for i := range jrd.Links {
20 if jrd.Links[i].Type == ContentType {
21 return LookupActor(jrd.Links[i].Href)
22 }
23 }
24 return nil, ErrNotExist
25 }
27 func fingerAll(alist []*mail.Address) ([]Actor, error) {
28 actors := make([]Actor, len(alist))
29 for i, addr := range alist {
30 if strings.Contains(addr.Address, "+followers") {
31 addr.Address = strings.Replace(addr.Address, "+followers", "", 1)
32 a, err := Finger(addr.Address)
33 if err != nil {
34 return actors, fmt.Errorf("finger %s: %w", addr.Address, err)
35 }
36 actors[i] = *a
37 continue
38 }
39 actor, err := Finger(addr.Address)
40 if err != nil {
41 return actors, fmt.Errorf("finger %s: %w", addr.Address, err)
42 }
43 actors[i] = *actor
44 }
45 return actors, nil
46 }