Blame


1 77918b00 2024-03-07 o package apub
2 77918b00 2024-03-07 o
3 77918b00 2024-03-07 o import (
4 77918b00 2024-03-07 o "fmt"
5 77918b00 2024-03-07 o "net/mail"
6 77918b00 2024-03-07 o "os"
7 77918b00 2024-03-07 o "os/user"
8 77918b00 2024-03-07 o "path"
9 77918b00 2024-03-07 o "strings"
10 77918b00 2024-03-07 o
11 77918b00 2024-03-07 o "webfinger.net/go/webfinger"
12 77918b00 2024-03-07 o )
13 77918b00 2024-03-07 o
14 77918b00 2024-03-07 o func Finger(address string) (*Actor, error) {
15 77918b00 2024-03-07 o jrd, err := webfinger.Lookup(address, nil)
16 77918b00 2024-03-07 o if err != nil {
17 77918b00 2024-03-07 o return nil, err
18 77918b00 2024-03-07 o }
19 77918b00 2024-03-07 o for i := range jrd.Links {
20 77918b00 2024-03-07 o if jrd.Links[i].Type == ContentType {
21 77918b00 2024-03-07 o return LookupActor(jrd.Links[i].Href)
22 77918b00 2024-03-07 o }
23 77918b00 2024-03-07 o }
24 77918b00 2024-03-07 o return nil, ErrNotExist
25 77918b00 2024-03-07 o }
26 77918b00 2024-03-07 o
27 77918b00 2024-03-07 o func fingerAll(alist []*mail.Address) ([]string, error) {
28 77918b00 2024-03-07 o actors := make([]string, len(alist))
29 77918b00 2024-03-07 o for i, addr := range alist {
30 77918b00 2024-03-07 o if strings.Contains(addr.Address, "+followers") {
31 77918b00 2024-03-07 o addr.Address = strings.Replace(addr.Address, "+followers", "", 1)
32 77918b00 2024-03-07 o a, err := Finger(addr.Address)
33 77918b00 2024-03-07 o if err != nil {
34 77918b00 2024-03-07 o return actors, fmt.Errorf("finger %s: %w", addr.Address, err)
35 77918b00 2024-03-07 o }
36 77918b00 2024-03-07 o actors[i] = a.Followers
37 77918b00 2024-03-07 o continue
38 77918b00 2024-03-07 o }
39 77918b00 2024-03-07 o actor, err := Finger(addr.Address)
40 77918b00 2024-03-07 o if err != nil {
41 77918b00 2024-03-07 o return actors, fmt.Errorf("finger %s: %w", addr.Address, err)
42 77918b00 2024-03-07 o }
43 77918b00 2024-03-07 o actors[i] = actor.ID
44 77918b00 2024-03-07 o }
45 77918b00 2024-03-07 o return actors, nil
46 77918b00 2024-03-07 o }
47 77918b00 2024-03-07 o
48 77918b00 2024-03-07 o func UserWebFingerFile(username string) (string, error) {
49 77918b00 2024-03-07 o u, err := user.Lookup(username)
50 77918b00 2024-03-07 o if err != nil {
51 77918b00 2024-03-07 o return "", err
52 77918b00 2024-03-07 o }
53 77918b00 2024-03-07 o if u.HomeDir == "" {
54 77918b00 2024-03-07 o return "", fmt.Errorf("no home directory")
55 77918b00 2024-03-07 o }
56 77918b00 2024-03-07 o
57 77918b00 2024-03-07 o paths := []string{
58 77918b00 2024-03-07 o path.Join(u.HomeDir, "lib/webfinger"), // Plan 9
59 77918b00 2024-03-07 o path.Join(u.HomeDir, ".config/webfinger"), // Unix-like
60 77918b00 2024-03-07 o path.Join(u.HomeDir, "Application Support/webfinger"), // macOS
61 77918b00 2024-03-07 o }
62 77918b00 2024-03-07 o for i := range paths {
63 77918b00 2024-03-07 o if _, err := os.Stat(paths[i]); err == nil {
64 77918b00 2024-03-07 o return paths[i], nil
65 77918b00 2024-03-07 o }
66 77918b00 2024-03-07 o }
67 77918b00 2024-03-07 o return "", fmt.Errorf("no webfinger file")
68 77918b00 2024-03-07 o }