From cfe9c2183183759caa46eb634eec1d28333693c3 Mon Sep 17 00:00:00 2001 From: Marius Orcsik Date: Wed, 27 Jan 2021 13:42:12 +0100 Subject: [PATCH] Fixed loading of followup moderation activities --- app/accounts.go | 8 +++ app/converter.go | 125 +++++++++++++--------------------------------- app/filters.go | 12 ++--- app/items.go | 16 ++++++ app/moderation.go | 45 +++++++++++------ app/repository.go | 27 +--------- app/webfinger.go | 4 +- 7 files changed, 99 insertions(+), 138 deletions(-) diff --git a/app/accounts.go b/app/accounts.go index 6c3f71227..33733aa0b 100644 --- a/app/accounts.go +++ b/app/accounts.go @@ -72,6 +72,14 @@ type Account struct { Children AccountPtrCollection `json:"-"` } +var ValidActorTypes = pub.ActivityVocabularyTypes{ + pub.PersonType, + pub.ServiceType, + pub.GroupType, + pub.ApplicationType, + pub.OrganizationType, +} + func (a Account) ID() Hash { return a.Hash } diff --git a/app/converter.go b/app/converter.go index 2d6a59a2d..441daa8d9 100644 --- a/app/converter.go +++ b/app/converter.go @@ -705,95 +705,42 @@ func (c *TagCollection) FromActivityPub(col pub.ItemCollection) error { return nil } -func LoadFromActivityPubObject(it pub.Item) (Renderable, error) { - if it == nil { - return nil, errors.Newf("nil ActivityPub object") - } - typ := it.GetType() - if !(pub.ObjectTypes.Contains(typ) || pub.ActorTypes.Contains(typ)) { - return nil, errors.Newf("invalid ActivityPub object") - } - var result Renderable - var err error - if pub.ObjectTypes.Contains(typ) { - err = pub.OnObject(it, func(ob *pub.Object) error { - i := new(Item) - if err = i.FromActivityPub(ob); err == nil { - result = i - } - return err - }) - } - if pub.ActorTypes.Contains(typ) { - err = pub.OnActor(it, func(ac *pub.Actor) error { - var err error - a := new(Account) - if err = a.FromActivityPub(ac); err == nil { - result = a - } - return err - }) - } - return result, err -} - -func LoadFromActivityPubActivity(it pub.Item) (Renderable, error) { - if it == nil { - return nil, errors.Newf("nil ActivityPub item") +func LoadFromActivityPubItem(it pub.Item) (Renderable, error) { + var ( + result Renderable + err error + typ = it.GetType() + ) + + if typ == pub.FollowType { + f := new(FollowRequest) + err = f.FromActivityPub(it) + result = f + } + if ValidContentManagementTypes.Contains(typ) { + item := new(Item) + err = item.FromActivityPub(it) + result = item + } + if ValidAppreciationTypes.Contains(typ) { + vot := new(Vote) + err = vot.FromActivityPub(it) + result = vot + } + if ValidModerationActivityTypes.Contains(typ) { + op := new(ModerationOp) + err = op.FromActivityPub(it) + result = op + } + if ValidActorTypes.Contains(typ) { + acc := new(Account) + err = acc.FromActivityPub(it) + result = acc + } + if ValidContentTypes.Contains(typ) { + item := new(Item) + err = item.FromActivityPub(it) + result = item } - typ := it.GetType() - - if !pub.ActivityTypes.Contains(typ) { - return LoadFromActivityPubObject(it) - } - var result Renderable - err := pub.OnActivity(it, func(act *pub.Activity) error { - ob := act.Object - switch typ { - case pub.DeleteType: - fallthrough - case pub.UpdateType: - fallthrough - case pub.CreateType: - // Item or Account - if ob.IsObject() { - var err error - result, err = LoadFromActivityPubObject(ob) - return err - } - case pub.LikeType: - fallthrough - case pub.DislikeType: - // Vote - v := new(Vote) - err := v.FromActivityPub(act) - if err != nil { - return err - } - result = v - case pub.FollowType: - // FollowRequest - f := new(FollowRequest) - err := f.FromActivityPub(act) - if err != nil { - return err - } - result = f - break - case pub.FlagType: - fallthrough - case pub.BlockType: - fallthrough - case pub.IgnoreType: - // ModerationOp - m := new(ModerationOp) - err := m.FromActivityPub(act) - if err != nil { - return err - } - result = m - } - return nil - }) return result, err } diff --git a/app/filters.go b/app/filters.go index 64f81e094..e8d37bbf5 100644 --- a/app/filters.go +++ b/app/filters.go @@ -66,7 +66,7 @@ func DefaultFilters(next http.Handler) http.Handler { f.Type = CreateActivitiesFilter f.Object = new(Filters) f.Object.OP = nilIRIs - f.Object.Type = ActivityTypesFilter(ValidItemTypes...) + f.Object.Type = ActivityTypesFilter(ValidContentTypes...) m := ContextListingModel(r.Context()) m.Title = "Newest items" ctx := context.WithValue(r.Context(), FilterCtxtKey, []*Filters{f}) @@ -121,7 +121,7 @@ func fedFilters(r *http.Request) *Filters { f.Type = CreateActivitiesFilter f.Object = &Filters{} f.Object.OP = nilIRIs - f.Object.Type = ActivityTypesFilter(ValidItemTypes...) + f.Object.Type = ActivityTypesFilter(ValidContentTypes...) f.Actor = &Filters{} return f } @@ -160,7 +160,7 @@ func DomainFiltersMw(next http.Handler) http.Handler { EqualsString(MimeTypeText), EqualsString(MimeTypeHTML), } - f.Object.Type = ActivityTypesFilter(ValidItemTypes...) + f.Object.Type = ActivityTypesFilter(ValidContentTypes...) m.Title = fmt.Sprintf("Discussion items") } f.Object.OP = nilIRIs @@ -185,7 +185,7 @@ func TagFiltersMw(next http.Handler) http.Handler { fc := new(Filters) fc.Type = CreateActivitiesFilter fc.Object = new(Filters) - fc.Object.Type = ActivityTypesFilter(ValidItemTypes...) + fc.Object.Type = ActivityTypesFilter(ValidContentTypes...) fc.Object.Tag = tagsFilter(tag) fa := new(Filters) @@ -288,11 +288,11 @@ type moderationFilter struct { var ( modSubmissionsObjectFilter = &Filters{ - Type: ActivityTypesFilter(ValidItemTypes...), + Type: ActivityTypesFilter(ValidContentTypes...), InReplTo: nilIRIs, } modCommentsObjectFilter = &Filters{ - Type: ActivityTypesFilter(ValidItemTypes...), + Type: ActivityTypesFilter(ValidContentTypes...), InReplTo: notNilIRIs, } modAccountsObjectFilter = &Filters{ diff --git a/app/items.go b/app/items.go index cfc43614e..7ecf88adb 100644 --- a/app/items.go +++ b/app/items.go @@ -26,6 +26,22 @@ type ItemMetadata struct { Icon ImageMetadata `json:"icon,omitempty"` } +var ValidContentTypes = pub.ActivityVocabularyTypes{ + pub.ArticleType, + pub.NoteType, + pub.LinkType, + pub.PageType, + pub.DocumentType, + pub.VideoType, + pub.AudioType, +} + +var ValidContentManagementTypes = pub.ActivityVocabularyTypes{ + pub.UpdateType, + pub.CreateType, + pub.DeleteType, +} + type Identifiable interface { Id() int64 } diff --git a/app/moderation.go b/app/moderation.go index f3040f314..53cd2f895 100644 --- a/app/moderation.go +++ b/app/moderation.go @@ -213,6 +213,29 @@ func (m *ModerationOp) Deleted() bool { return m.Flags&FlagsDeleted == FlagsDeleted } +func GetRenderableByType(typ pub.ActivityVocabularyType) Renderable { + var result Renderable + if ValidAppreciationTypes.Contains(typ) { + result = new(Vote) + } + if ValidModerationActivityTypes.Contains(typ) { + result = new(ModerationOp) + } + if ValidActorTypes.Contains(typ) { + result = new(Account) + } + if ValidContentTypes.Contains(typ) { + result = new(Item) + } + return result +} + + +func loadItemActorOrActivityFromModerationActivityObject (it pub.Item) Renderable { + result, _ := LoadFromActivityPubItem(it) + return result +} + func (m *ModerationOp) FromActivityPub(it pub.Item) error { if m == nil { return nil @@ -236,21 +259,13 @@ func (m *ModerationOp) FromActivityPub(it pub.Item) error { m.Icon = icon(strings.ToLower(string(a.Type))) wer.FromActivityPub(a.Actor) m.SubmittedBy = wer - if strings.Contains(a.Object.GetLink().String(), "actors") { - ob := new(Account) - if err := ob.FromActivityPub(a.Object); err == nil { - m.Object = ob - } else { - m.Object = &DeletedAccount - } - } - if strings.Contains(a.Object.GetLink().String(), "objects") { - ob := new(Item) - if err := ob.FromActivityPub(a.Object); err == nil { - m.Object = ob - } else { - m.Object = &DeletedItem - } + if a.Object.IsCollection() { + pub.OnCollectionIntf(a.Object, func(c pub.CollectionInterface) error { + m.Object = loadItemActorOrActivityFromModerationActivityObject(c.Collection().First()) + return nil + }) + } else { + m.Object = loadItemActorOrActivityFromModerationActivityObject(a.Object) } reason := new(Item) pub.OnObject(a, func(o *pub.Object) error { diff --git a/app/repository.go b/app/repository.go index 618218887..dee22adf5 100644 --- a/app/repository.go +++ b/app/repository.go @@ -42,31 +42,6 @@ func (r repository) BaseURL() pub.IRI { return r.fedbox.baseURL } -var ValidActorTypes = pub.ActivityVocabularyTypes{ - pub.PersonType, - pub.ServiceType, - pub.GroupType, - pub.ApplicationType, - pub.OrganizationType, -} - -var ValidItemTypes = pub.ActivityVocabularyTypes{ - pub.ArticleType, - pub.NoteType, - pub.LinkType, - pub.PageType, - pub.DocumentType, - pub.VideoType, - pub.AudioType, -} - -// @deprecated -var ValidActivityTypes = pub.ActivityVocabularyTypes{ - pub.CreateType, - pub.LikeType, - pub.FollowType, -} - // Repository middleware func (h handler) Repository(next http.Handler) http.Handler { fn := func(w http.ResponseWriter, r *http.Request) { @@ -1365,7 +1340,7 @@ func (r *repository) ActorCollection(ctx context.Context, fn CollectionFn, ff .. return nil } if ob.IsObject() { - if ValidItemTypes.Contains(ob.GetType()) { + if ValidContentTypes.Contains(ob.GetType()) { i := Item{} i.FromActivityPub(ob) if validItem(i, f) { diff --git a/app/webfinger.go b/app/webfinger.go index da73f478d..964f5d578 100644 --- a/app/webfinger.go +++ b/app/webfinger.go @@ -37,11 +37,11 @@ var ( Type: ActivityTypesFilter(ValidActorTypes...), } postsFilter = &Filters{ - Type: ActivityTypesFilter(ValidItemTypes...), + Type: ActivityTypesFilter(ValidContentTypes...), OP: nilIRIs, } allFilter = &Filters{ - Type: ActivityTypesFilter(ValidItemTypes...), + Type: ActivityTypesFilter(ValidContentTypes...), } )