summaryrefslogtreecommitdiffstats
path: root/app/post.go
diff options
context:
space:
mode:
authorChris <ccbrown112@gmail.com>2017-11-28 15:02:56 -0600
committerChristopher Speller <crspeller@gmail.com>2017-11-28 13:02:56 -0800
commitb87fae646a624507f5b2c1270cae1d3585f589ac (patch)
treed81b683cda11b08ed04d7e2431b04a84a715d851 /app/post.go
parent27ba68a7894d5204b8d75dc7353774977d62fa15 (diff)
downloadchat-b87fae646a624507f5b2c1270cae1d3585f589ac.tar.gz
chat-b87fae646a624507f5b2c1270cae1d3585f589ac.tar.bz2
chat-b87fae646a624507f5b2c1270cae1d3585f589ac.zip
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
Diffstat (limited to 'app/post.go')
-rw-r--r--app/post.go48
1 files changed, 48 insertions, 0 deletions
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 {