diff --git a/pub/fed.go b/pub/fed.go index 05ba7b0..358480a 100644 --- a/pub/fed.go +++ b/pub/fed.go @@ -400,6 +400,7 @@ func (f *federator) getPostOutboxResolver(c context.Context, rawJson map[string] } } +// TODO: Only Set IRIs func (f *federator) handleClientCreate(ctx context.Context, deliverable *bool, toAddToOutbox *map[string]interface{}) func(s *streams.Create) error { return func(s *streams.Create) error { *deliverable = true @@ -607,6 +608,7 @@ func (f *federator) handleClientReject(c context.Context, deliverable *bool) fun } } +// TODO: Only Set IRIs func (f *federator) handleClientAdd(c context.Context, deliverable *bool, outboxURL *url.URL) func(s *streams.Add) error { return func(s *streams.Add) error { *deliverable = true @@ -908,6 +910,7 @@ func (f *federator) handleDelete(c context.Context) func(s *streams.Delete) erro } } +// TODO: Only Set IRIs func (f *federator) handleFollow(c context.Context, inboxURL *url.URL) func(s *streams.Follow) error { return func(s *streams.Follow) error { // Permit either human-triggered or automatically triggering @@ -1033,6 +1036,7 @@ func (f *federator) handleReject(c context.Context) func(s *streams.Reject) erro } } +// TODO: Only Set IRIs func (f *federator) handleAdd(c context.Context) func(s *streams.Add) error { return func(s *streams.Add) error { // Add is client application specific, generally involving adding an diff --git a/pub/fed_test.go b/pub/fed_test.go index 870eed9..422050b 100644 --- a/pub/fed_test.go +++ b/pub/fed_test.go @@ -268,7 +268,7 @@ func init() { testClientExpectedNote.AppendNameString(noteName) testClientExpectedNote.AppendContentString("This is a simple note") testClientExpectedNote.AppendAttributedToObject(sallyActor) - testClientExpectedNote.AppendToObject(samActor) + testClientExpectedNote.AppendToIRI(samIRI) testClientExpectedCreateNote = &vocab.Create{} testClientExpectedCreateNote.SetId(testNewIRI) testClientExpectedCreateNote.AppendSummaryString("Sally created a note") diff --git a/pub/internal.go b/pub/internal.go index 902d347..0bb260d 100644 --- a/pub/internal.go +++ b/pub/internal.go @@ -514,65 +514,105 @@ func (f *federator) sameRecipients(a vocab.ActivityType) error { for k, v := range toActivity { for i := 0; i < a.ObjectLen(); i++ { if _, ok := to[i][k]; !ok { + var to *url.URL if vObj, ok := v.(vocab.ObjectType); ok { - a.GetObject(i).AppendToObject(vObj) + if !vObj.HasId() { + return fmt.Errorf("to object missing id") + } + to = vObj.GetId() } else if vLink, ok := v.(vocab.LinkType); ok { - a.GetObject(i).AppendToLink(vLink) + if !vLink.HasHref() { + return fmt.Errorf("to link missing href") + } + to = vLink.GetHref() } else if vIRI, ok := v.(*url.URL); ok { - a.GetObject(i).AppendToIRI(vIRI) + to = vIRI } + a.GetObject(i).AppendToIRI(to) } } } for k, v := range btoActivity { for i := 0; i < a.ObjectLen(); i++ { if _, ok := bto[i][k]; !ok { + var bto *url.URL if vObj, ok := v.(vocab.ObjectType); ok { - a.GetObject(i).AppendBtoObject(vObj) + if !vObj.HasId() { + return fmt.Errorf("bto object missing id") + } + bto = vObj.GetId() } else if vLink, ok := v.(vocab.LinkType); ok { - a.GetObject(i).AppendBtoLink(vLink) + if !vLink.HasHref() { + return fmt.Errorf("bto link missing href") + } + bto = vLink.GetHref() } else if vIRI, ok := v.(*url.URL); ok { - a.GetObject(i).AppendBtoIRI(vIRI) + bto = vIRI } + a.GetObject(i).AppendBtoIRI(bto) } } } for k, v := range ccActivity { for i := 0; i < a.ObjectLen(); i++ { if _, ok := cc[i][k]; !ok { + var cc *url.URL if vObj, ok := v.(vocab.ObjectType); ok { - a.GetObject(i).AppendCcObject(vObj) + if !vObj.HasId() { + return fmt.Errorf("cc object missing id") + } + cc = vObj.GetId() } else if vLink, ok := v.(vocab.LinkType); ok { - a.GetObject(i).AppendCcLink(vLink) + if !vLink.HasHref() { + return fmt.Errorf("cc link missing href") + } + cc = vLink.GetHref() } else if vIRI, ok := v.(*url.URL); ok { - a.GetObject(i).AppendCcIRI(vIRI) + cc = vIRI } + a.GetObject(i).AppendCcIRI(cc) } } } for k, v := range bccActivity { for i := 0; i < a.ObjectLen(); i++ { if _, ok := bcc[i][k]; !ok { + var bcc *url.URL if vObj, ok := v.(vocab.ObjectType); ok { - a.GetObject(i).AppendBccObject(vObj) + if !vObj.HasId() { + return fmt.Errorf("bcc object missing id") + } + bcc = vObj.GetId() } else if vLink, ok := v.(vocab.LinkType); ok { - a.GetObject(i).AppendBccLink(vLink) + if !vLink.HasHref() { + return fmt.Errorf("bcc link missing href") + } + bcc = vLink.GetHref() } else if vIRI, ok := v.(*url.URL); ok { - a.GetObject(i).AppendBccIRI(vIRI) + bcc = vIRI } + a.GetObject(i).AppendBccIRI(bcc) } } } for k, v := range audienceActivity { for i := 0; i < a.ObjectLen(); i++ { if _, ok := audience[i][k]; !ok { + var activity *url.URL if vObj, ok := v.(vocab.ObjectType); ok { - a.GetObject(i).AppendAudienceObject(vObj) + if !vObj.HasId() { + return fmt.Errorf("activity object missing id") + } + activity = vObj.GetId() } else if vLink, ok := v.(vocab.LinkType); ok { - a.GetObject(i).AppendAudienceLink(vLink) + if !vLink.HasHref() { + return fmt.Errorf("activity link missing href") + } + activity = vLink.GetHref() } else if vIRI, ok := v.(*url.URL); ok { - a.GetObject(i).AppendAudienceIRI(vIRI) + activity = vIRI } + a.GetObject(i).AppendAudienceIRI(activity) } } } @@ -581,57 +621,97 @@ func (f *federator) sameRecipients(a vocab.ActivityType) error { for i := 0; i < a.ObjectLen(); i++ { for k, v := range to[i] { if _, ok := toActivity[k]; !ok { + var to *url.URL if vObj, ok := v.(vocab.ObjectType); ok { - a.AppendToObject(vObj) + if !vObj.HasId() { + return fmt.Errorf("to object missing id") + } + to = vObj.GetId() } else if vLink, ok := v.(vocab.LinkType); ok { - a.AppendToLink(vLink) + if !vLink.HasHref() { + return fmt.Errorf("to link missing href") + } + to = vLink.GetHref() } else if vIRI, ok := v.(*url.URL); ok { - a.AppendToIRI(vIRI) + to = vIRI } + a.AppendToIRI(to) } } for k, v := range bto[i] { if _, ok := btoActivity[k]; !ok { + var bto *url.URL if vObj, ok := v.(vocab.ObjectType); ok { - a.AppendBtoObject(vObj) + if !vObj.HasId() { + return fmt.Errorf("bto object missing id") + } + bto = vObj.GetId() } else if vLink, ok := v.(vocab.LinkType); ok { - a.AppendBtoLink(vLink) + if !vLink.HasHref() { + return fmt.Errorf("bto link missing href") + } + bto = vLink.GetHref() } else if vIRI, ok := v.(*url.URL); ok { - a.AppendBtoIRI(vIRI) + bto = vIRI } + a.AppendBtoIRI(bto) } } for k, v := range cc[i] { if _, ok := ccActivity[k]; !ok { + var cc *url.URL if vObj, ok := v.(vocab.ObjectType); ok { - a.AppendCcObject(vObj) + if !vObj.HasId() { + return fmt.Errorf("cc object missing id") + } + cc = vObj.GetId() } else if vLink, ok := v.(vocab.LinkType); ok { - a.AppendCcLink(vLink) + if !vLink.HasHref() { + return fmt.Errorf("cc link missing href") + } + cc = vLink.GetHref() } else if vIRI, ok := v.(*url.URL); ok { - a.AppendCcIRI(vIRI) + cc = vIRI } + a.AppendCcIRI(cc) } } for k, v := range bcc[i] { if _, ok := bccActivity[k]; !ok { + var bcc *url.URL if vObj, ok := v.(vocab.ObjectType); ok { - a.AppendBccObject(vObj) + if !vObj.HasId() { + return fmt.Errorf("bcc object missing id") + } + bcc = vObj.GetId() } else if vLink, ok := v.(vocab.LinkType); ok { - a.AppendBccLink(vLink) + if !vLink.HasHref() { + return fmt.Errorf("bcc link missing href") + } + bcc = vLink.GetHref() } else if vIRI, ok := v.(*url.URL); ok { - a.AppendBccIRI(vIRI) + bcc = vIRI } + a.AppendBccIRI(bcc) } } for k, v := range audience[i] { if _, ok := audienceActivity[k]; !ok { + var audience *url.URL if vObj, ok := v.(vocab.ObjectType); ok { - a.AppendAudienceObject(vObj) + if !vObj.HasId() { + return fmt.Errorf("audience object missing id") + } + audience = vObj.GetId() } else if vLink, ok := v.(vocab.LinkType); ok { - a.AppendAudienceLink(vLink) + if !vLink.HasHref() { + return fmt.Errorf("audience link missing href") + } + audience = vLink.GetHref() } else if vIRI, ok := v.(*url.URL); ok { - a.AppendAudienceIRI(vIRI) + audience = vIRI } + a.AppendAudienceIRI(audience) } } } @@ -1390,6 +1470,7 @@ func toTombstone(obj vocab.ObjectType, id *url.URL, now time.Time) vocab.Tombsto type getActorCollectionFn func(actor vocab.ObjectType, lc *vocab.CollectionType, loc *vocab.OrderedCollectionType) (isIRI bool, e error) +// TODO: Only Set IRIs func (f *federator) addAllObjectsToActorCollection(ctx context.Context, getter getActorCollectionFn, c vocab.ActivityType, prepend bool) error { for i := 0; i < c.ActorLen(); i++ { var iri *url.URL @@ -1501,6 +1582,7 @@ func (f *federator) addAllObjectsToActorCollection(ctx context.Context, getter g type getObjectCollectionFn func(object vocab.ObjectType, lc *vocab.CollectionType, loc *vocab.OrderedCollectionType) (isIRI bool, e error) +// TODO: Only Set IRIs func (f *federator) addAllActorsToObjectCollection(ctx context.Context, getter getObjectCollectionFn, c vocab.ActivityType, prepend bool) (bool, error) { ownsAny := false for i := 0; i < c.ObjectLen(); i++ { @@ -1644,6 +1726,7 @@ func (f *federator) ownsAnyObjects(c context.Context, a vocab.ActivityType) (boo return f.ownsAnyIRIs(c, iris), nil } +// TODO: Only Set IRIs func (f *federator) addToOutbox(c context.Context, r *http.Request, m map[string]interface{}) error { outbox, err := f.App.GetOutbox(c, r, ReadWrite) if err != nil { @@ -1660,6 +1743,7 @@ func (f *federator) addToOutbox(c context.Context, r *http.Request, m map[string return f.App.Set(c, outbox) } +// TODO: Only Set IRIs func (f *federator) addToInbox(c context.Context, r *http.Request, m map[string]interface{}) error { inbox, err := f.App.GetInbox(c, r, ReadWrite) if err != nil {