From b87fae646a624507f5b2c1270cae1d3585f589ac Mon Sep 17 00:00:00 2001 From: Chris Date: Tue, 28 Nov 2017 15:02:56 -0600 Subject: PLT-5458: If someone posts a channel link to channel_A that you don't belong to, it doesn't render properly (#7833) * add channel link hints to post props * optimization * update regex, add unit test * fix rebase issue --- app/post.go | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) (limited to 'app/post.go') diff --git a/app/post.go b/app/post.go index 00944ee3b..0bd3b654f 100644 --- a/app/post.go +++ b/app/post.go @@ -152,6 +152,10 @@ func (a *App) CreatePost(post *model.Post, channel *model.Channel, triggerWebhoo post.Hashtags, _ = model.ParseHashtags(post.Message) + if err := a.FillInPostProps(post, channel); err != nil { + return nil, err + } + var rpost *model.Post if result := <-a.Srv.Store.Post().Save(post); result.Err != nil { return nil, result.Err @@ -192,6 +196,46 @@ func (a *App) CreatePost(post *model.Post, channel *model.Channel, triggerWebhoo return rpost, nil } +// FillInPostProps should be invoked before saving posts to fill in properties such as +// channel_mentions. +// +// If channel is nil, FillInPostProps will look up the channel corresponding to the post. +func (a *App) FillInPostProps(post *model.Post, channel *model.Channel) *model.AppError { + channelMentions := post.ChannelMentions() + channelMentionsProp := make(map[string]interface{}) + + if len(channelMentions) > 0 { + if channel == nil { + result := <-a.Srv.Store.Channel().GetForPost(post.Id) + if result.Err == nil { + return model.NewAppError("FillInPostProps", "api.context.invalid_param.app_error", map[string]interface{}{"Name": "post.channel_id"}, result.Err.Error(), http.StatusBadRequest) + } + channel = result.Data.(*model.Channel) + } + + mentionedChannels, err := a.GetChannelsByNames(channelMentions, channel.TeamId) + if err != nil { + return err + } + + for _, mentioned := range mentionedChannels { + if mentioned.Type == model.CHANNEL_OPEN { + channelMentionsProp[mentioned.Name] = map[string]interface{}{ + "display_name": mentioned.DisplayName, + } + } + } + } + + if len(channelMentionsProp) > 0 { + post.AddProp("channel_mentions", channelMentionsProp) + } else if post.Props != nil { + delete(post.Props, "channel_mentions") + } + + return nil +} + func (a *App) handlePostEvents(post *model.Post, user *model.User, channel *model.Channel, triggerWebhooks bool, parentPostList *model.PostList) *model.AppError { var tchan store.StoreChannel if len(channel.TeamId) > 0 { @@ -329,6 +373,10 @@ func (a *App) UpdatePost(post *model.Post, safeUpdate bool) (*model.Post, *model newPost.Props = post.Props } + if err := a.FillInPostProps(post, nil); err != nil { + return nil, err + } + if result := <-a.Srv.Store.Post().Update(newPost, oldPost); result.Err != nil { return nil, result.Err } else { -- cgit v1.2.3-1-g7c22