Blob


1 package apub
3 import (
4 "fmt"
5 "net/mail"
6 "os"
7 "os/user"
8 "path"
9 "strings"
11 "webfinger.net/go/webfinger"
12 )
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) ([]string, error) {
28 actors := make([]string, 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.Followers
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.ID
44 }
45 return actors, nil
46 }
48 func UserWebFingerFile(username string) (string, error) {
49 u, err := user.Lookup(username)
50 if err != nil {
51 return "", err
52 }
53 if u.HomeDir == "" {
54 return "", fmt.Errorf("no home directory")
55 }
57 paths := []string{
58 path.Join(u.HomeDir, "lib/webfinger"), // Plan 9
59 path.Join(u.HomeDir, ".config/webfinger"), // Unix-like
60 path.Join(u.HomeDir, "Application Support/webfinger"), // macOS
61 }
62 for i := range paths {
63 if _, err := os.Stat(paths[i]); err == nil {
64 return paths[i], nil
65 }
66 }
67 return "", fmt.Errorf("no webfinger file")
68 }