Blob


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