commit - b526632b614889f059e5aa5d29e84a9f416572da
commit + eec649355b1ab496b58a8e65abc64f9ee7e635ac
blob - 4948c36d47177385965204af8e12e103b013082e
blob + 1e5c0bd4dd580bc4c32e1c2d03f777ca0e989d5e
--- mail.go
+++ mail.go
return nil, fmt.Errorf("webfinger To addresses: %w", err)
}
wto = make([]string, len(actors))
- tags = make([]Activity, len(actors))
for i, a := range actors {
addr := strings.Trim(to[i].Address, "<>")
- tags[i] = Activity{Type: "Mention", Href: a.ID, Name: "@" + addr}
+ if strings.Contains(addr, "+followers") {
+ wto[i] = a.Followers
+ continue
+ }
+ tags = append(tags, Activity{Type: "Mention", Href: a.ID, Name: "@" + addr})
wto[i] = a.ID
}
}
}
wcc = make([]string, len(actors))
for i, a := range actors {
+ if strings.Contains(cc[i].Address, "+followers") {
+ wcc[i] = a.Followers
+ continue
+ }
wcc[i] = a.ID
}
}
blob - 16154099f40f206a7ceb3e7f4bc6645e68288f8b
blob + 0d990da5a71ad9c617d9fe01e40e1e36be087099
--- testdata/outbound.eml
+++ testdata/outbound.eml
From: Oliver Lowe <otl@apubtest2.srcbeat.com>
Date: Wed, 6 Mar 2024 14:03:33 +1100
To: <henfredemars@infosec.pub>
-CC: "Programming" <programming@programming.dev>, <starman@programming.dev>
+CC: "Programming" <programming@programming.dev>, <starman@programming.dev>, <otl+followers@hachyderm.io>
In-Reply-To: <https://infosec.pub/comment/7135766>
Subject:
blob - 1010ca293ad511037e6e90babb868bf19bad25e4
blob + f872625d946401146d5e4c6104e37b8065d32476
--- webfinger.go
+++ webfinger.go
"webfinger.net/go/webfinger"
)
-// Finger is convenience function returning the corresponding Actor,
+// Finger wraps defaultClient.Finger.
+func Finger(address string) (*Actor, error) {
+ return defaultClient.Finger(address)
+}
+
+// Finger is convenience method returning the corresponding Actor,
// if any, of an address resolvable by WebFinger.
// It is equivalent to doing webfinger.Lookup then LookupActor.
-func Finger(address string) (*Actor, error) {
+func (c *Client) Finger(address string) (*Actor, error) {
jrd, err := webfinger.Lookup(address, nil)
if err != nil {
return nil, err
}
for i := range jrd.Links {
if jrd.Links[i].Type == ContentType {
- return LookupActor(jrd.Links[i].Href)
+ return c.LookupActor(jrd.Links[i].Href)
}
}
return nil, ErrNotExist
func fingerAll(alist []*mail.Address) ([]Actor, error) {
actors := make([]Actor, len(alist))
for i, addr := range alist {
+ q := addr.Address
if strings.Contains(addr.Address, "+followers") {
- addr.Address = strings.Replace(addr.Address, "+followers", "", 1)
- a, err := Finger(addr.Address)
- if err != nil {
- return actors, fmt.Errorf("finger %s: %w", addr.Address, err)
- }
- actors[i] = *a
- continue
+ // strip "+followers" to get the regular address that can be fingered.
+ q = strings.Replace(addr.Address, "+followers", "", 1)
}
- actor, err := Finger(addr.Address)
+ actor, err := Finger(q)
if err != nil {
- return actors, fmt.Errorf("finger %s: %w", addr.Address, err)
+ return actors, fmt.Errorf("finger %s: %w", q, err)
}
actors[i] = *actor
}