update to latest activity

This commit is contained in:
tobi 2025-01-22 13:17:59 +01:00
parent 301e822abf
commit fee12158c4
4 changed files with 90 additions and 46 deletions

2
go.mod
View file

@ -68,7 +68,7 @@ require (
github.com/spf13/cobra v1.8.1 github.com/spf13/cobra v1.8.1
github.com/spf13/viper v1.19.0 github.com/spf13/viper v1.19.0
github.com/stretchr/testify v1.10.0 github.com/stretchr/testify v1.10.0
github.com/superseriousbusiness/activity v1.9.0-gts.0.20250121090817-0ef92d24eba1 github.com/superseriousbusiness/activity v1.9.0-gts.0.20250122115604-584771cb6edc
github.com/superseriousbusiness/httpsig v1.2.0-SSB github.com/superseriousbusiness/httpsig v1.2.0-SSB
github.com/superseriousbusiness/oauth2/v4 v4.3.2-SSB.0.20230227143000-f4900831d6c8 github.com/superseriousbusiness/oauth2/v4 v4.3.2-SSB.0.20230227143000-f4900831d6c8
github.com/tdewolff/minify/v2 v2.21.2 github.com/tdewolff/minify/v2 v2.21.2

4
go.sum generated
View file

@ -526,8 +526,8 @@ github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOf
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
github.com/superseriousbusiness/activity v1.9.0-gts.0.20250121090817-0ef92d24eba1 h1:bFHT+Qww4wJmcNqRdv8pXEc5t1RvVO8neSd/K6Csu9w= github.com/superseriousbusiness/activity v1.9.0-gts.0.20250122115604-584771cb6edc h1:9kb/xF1/UlmW/aQ/s8P/Ob+QtW6o7GRr+6xrbPaRUto=
github.com/superseriousbusiness/activity v1.9.0-gts.0.20250121090817-0ef92d24eba1/go.mod h1:9l74ZCv8zw07vipNMzahq8oQZt2xPaJZ+L+gLicQntQ= github.com/superseriousbusiness/activity v1.9.0-gts.0.20250122115604-584771cb6edc/go.mod h1:9l74ZCv8zw07vipNMzahq8oQZt2xPaJZ+L+gLicQntQ=
github.com/superseriousbusiness/go-jpeg-image-structure/v2 v2.0.0-20220321154430-d89a106fdabe h1:ksl2oCx/Qo8sNDc3Grb8WGKBM9nkvhCm25uvlT86azE= github.com/superseriousbusiness/go-jpeg-image-structure/v2 v2.0.0-20220321154430-d89a106fdabe h1:ksl2oCx/Qo8sNDc3Grb8WGKBM9nkvhCm25uvlT86azE=
github.com/superseriousbusiness/go-jpeg-image-structure/v2 v2.0.0-20220321154430-d89a106fdabe/go.mod h1:gH4P6gN1V+wmIw5o97KGaa1RgXB/tVpC2UNzijhg3E4= github.com/superseriousbusiness/go-jpeg-image-structure/v2 v2.0.0-20220321154430-d89a106fdabe/go.mod h1:gH4P6gN1V+wmIw5o97KGaa1RgXB/tVpC2UNzijhg3E4=
github.com/superseriousbusiness/go-png-image-structure/v2 v2.0.1-SSB h1:8psprYSK1KdOSH7yQ4PbJq0YYaGQY+gzdW/B0ExDb/8= github.com/superseriousbusiness/go-png-image-structure/v2 v2.0.1-SSB h1:8psprYSK1KdOSH7yQ4PbJq0YYaGQY+gzdW/B0ExDb/8=

View file

@ -5,7 +5,6 @@
"fmt" "fmt"
"net/http" "net/http"
"net/url" "net/url"
"slices"
"github.com/superseriousbusiness/activity/streams" "github.com/superseriousbusiness/activity/streams"
"github.com/superseriousbusiness/activity/streams/vocab" "github.com/superseriousbusiness/activity/streams/vocab"
@ -778,20 +777,30 @@ func (a *SideEffectActor) prepare(
// We now need to dereference the actor or collection // We now need to dereference the actor or collection
// IRIs to derive inboxes that we can POST requests to. // IRIs to derive inboxes that we can POST requests to.
// var (
inboxes = make([]*url.URL, 0, len(actorsAndCollections))
derefdEntries = make(map[string]struct{}, len(actorsAndCollections))
)
// First check if the implemented database logic // First check if the implemented database logic
// can return any of these inboxes without having // can return any of these inboxes without having
// to make remote dereference calls (much cheaper). // to make remote dereference calls (much cheaper).
inboxesFromDB := []*url.URL{}
for _, actorOrCollection := range actorsAndCollections { for _, actorOrCollection := range actorsAndCollections {
actorOrCollectionStr := actorOrCollection.String()
if _, derefd := derefdEntries[actorOrCollectionStr]; derefd {
// Ignore potential duplicates
// we've already derefd to inbox(es).
continue
}
// BEGIN LOCK // BEGIN LOCK
unlock, err := a.db.Lock(ctx, actorOrCollection) unlock, err := a.db.Lock(ctx, actorOrCollection)
if err != nil { if err != nil {
return nil, err return nil, err
} }
// Try to get inbox(es) for this actor or collection IRI. // Try to get inbox(es) for this actor or collection.
inboxes, err := a.db.InboxesForIRI(ctx, actorOrCollection) gotInboxes, err := a.db.InboxesForIRI(ctx, actorOrCollection)
// END LOCK // END LOCK
unlock() unlock()
@ -800,20 +809,16 @@ func (a *SideEffectActor) prepare(
return nil, err return nil, err
} }
if len(inboxes) > 0 { if len(gotInboxes) == 0 {
// We have a hit. // No hit(s).
inboxesFromDB = append(inboxesFromDB, inboxes...) continue
// Since we found one or more inboxes for this iri,
// we should remove it from the list of actors and
// collections we still need to deref to inboxes.
actorsAndCollections = slices.DeleteFunc(
actorsAndCollections,
func(t *url.URL) bool {
return t.String() == actorOrCollection.String()
},
)
} }
// We have one or more hits.
inboxes = append(inboxes, gotInboxes...)
// Mark this actor or collection as deref'd.
derefdEntries[actorOrCollectionStr] = struct{}{}
} }
// Now look for any remaining actors/collections // Now look for any remaining actors/collections
@ -827,29 +832,32 @@ func(t *url.URL) bool {
return nil, err return nil, err
} }
// Fetch remaining actors, unpacking collection // Make HTTP calls to unpack collection IRIs into
// IRIs into Actor IRIs and then into Actor types. // Actor IRIs and then into Actor types, ignoring
// actors or collections we've already deref'd.
actorsFromRemote, err := a.resolveActors( actorsFromRemote, err := a.resolveActors(
ctx, ctx,
t, t,
actorsAndCollections, actorsAndCollections,
0, derefdEntries,
a.s2s.MaxDeliveryRecursionDepth(ctx), 0, a.s2s.MaxDeliveryRecursionDepth(ctx),
) )
if err != nil { if err != nil {
return nil, err return nil, err
} }
// Extract inbox IRI from each Actor type. // Release no-longer-needed collections.
clear(derefdEntries)
clear(actorsAndCollections)
// Extract inbox IRI from each deref'd Actor (if any).
inboxesFromRemote, err := actorsToInboxIRIs(actorsFromRemote) inboxesFromRemote, err := actorsToInboxIRIs(actorsFromRemote)
if err != nil { if err != nil {
return nil, err return nil, err
} }
// Combine db-discovered inboxes and deref-discovered // Combine db-discovered inboxes and remote-discovered
// inboxes to a final list of destination inboxes. // inboxes into a final list of destination inboxes.
inboxes := []*url.URL{}
inboxes = append(inboxes, inboxesFromDB...)
inboxes = append(inboxes, inboxesFromRemote...) inboxes = append(inboxes, inboxesFromRemote...)
// POST FILTERING // POST FILTERING
@ -919,37 +927,73 @@ func(t *url.URL) bool {
// instances of actorObject. It attempts to apply recursively when it encounters // instances of actorObject. It attempts to apply recursively when it encounters
// a target that is a Collection or OrderedCollection. // a target that is a Collection or OrderedCollection.
// //
// Any IRI strings in the ignores map will be skipped (use this when
// you've already dereferenced some of the actorAndCollectionIRIs).
//
// If maxDepth is zero or negative, then recursion is infinitely applied. // If maxDepth is zero or negative, then recursion is infinitely applied.
// //
// If a recipient is a Collection or OrderedCollection, then the server MUST // If a recipient is a Collection or OrderedCollection, then the server MUST
// dereference the collection, WITH the user's credentials. // dereference the collection, WITH the user's credentials.
// //
// Note that this also applies to CollectionPage and OrderedCollectionPage. // Note that this also applies to CollectionPage and OrderedCollectionPage.
func (a *SideEffectActor) resolveActors(c context.Context, t Transport, r []*url.URL, depth, maxDepth int) (actors []vocab.Type, err error) { func (a *SideEffectActor) resolveActors(
ctx context.Context,
t Transport,
actorAndCollectionIRIs []*url.URL,
ignores map[string]struct{},
depth, maxDepth int,
) ([]vocab.Type, error) {
if maxDepth > 0 && depth >= maxDepth { if maxDepth > 0 && depth >= maxDepth {
return // Hit our max depth.
return nil, nil
} }
for _, u := range r {
var act vocab.Type if len(actorAndCollectionIRIs) == 0 {
var more []*url.URL // Nothing to do.
// TODO: Determine if more logic is needed here for inaccessible return nil, nil
// collections owned by peer servers. }
act, more, err = a.dereferenceForResolvingInboxes(c, t, u)
// Optimistically assume 1:1 mapping of IRIs to actors.
actors := make([]vocab.Type, 0, len(actorAndCollectionIRIs))
// Deref each actorOrCollectionIRI if not ignored.
for _, actorOrCollectionIRI := range actorAndCollectionIRIs {
_, ignore := ignores[actorOrCollectionIRI.String()]
if ignore {
// Don't try to
// deref this one.
continue
}
// TODO: Determine if more logic is needed here for
// inaccessible collections owned by peer servers.
actor, more, err := a.dereferenceForResolvingInboxes(ctx, t, actorOrCollectionIRI)
if err != nil { if err != nil {
// Missing recipient -- skip. // Missing recipient -- skip.
continue continue
} }
var recurActors []vocab.Type
recurActors, err = a.resolveActors(c, t, more, depth+1, maxDepth) if actor != nil {
// Got a hit.
actors = append(actors, actor)
}
// If this was a collection, get more.
recurActors, err := a.resolveActors(
ctx,
t,
more,
ignores,
depth+1, maxDepth,
)
if err != nil { if err != nil {
return return nil, err
}
if act != nil {
actors = append(actors, act)
} }
actors = append(actors, recurActors...) actors = append(actors, recurActors...)
} }
return
return actors, nil
} }
// dereferenceForResolvingInboxes dereferences an IRI solely for finding an // dereferenceForResolvingInboxes dereferences an IRI solely for finding an

2
vendor/modules.txt vendored
View file

@ -653,7 +653,7 @@ github.com/stretchr/testify/suite
# github.com/subosito/gotenv v1.6.0 # github.com/subosito/gotenv v1.6.0
## explicit; go 1.18 ## explicit; go 1.18
github.com/subosito/gotenv github.com/subosito/gotenv
# github.com/superseriousbusiness/activity v1.9.0-gts.0.20250121090817-0ef92d24eba1 # github.com/superseriousbusiness/activity v1.9.0-gts.0.20250122115604-584771cb6edc
## explicit; go 1.21 ## explicit; go 1.21
github.com/superseriousbusiness/activity/pub github.com/superseriousbusiness/activity/pub
github.com/superseriousbusiness/activity/streams github.com/superseriousbusiness/activity/streams