MM-52792: Update createPost, updatePost, & patchPost (#24195)
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
f3f9a84456
Коммит
b7f1a7f262
@@ -5,6 +5,7 @@ package api4
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"time"
|
||||
@@ -75,6 +76,12 @@ func createPost(c *Context, w http.ResponseWriter, r *http.Request) {
|
||||
c.SetPermissionError(model.PermissionCreatePost)
|
||||
return
|
||||
}
|
||||
if *c.App.Config().ServiceSettings.ExperimentalEnableHardenedMode {
|
||||
if reservedProps := post.ContainsIntegrationsReservedProps(); len(reservedProps) > 0 && !c.AppContext.Session().IsIntegration() {
|
||||
c.SetInvalidParamWithDetails("props", fmt.Sprintf("Cannot use props reserved for integrations. props: %v", reservedProps))
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if post.CreateAt != 0 && !c.App.SessionHasPermissionTo(*c.AppContext.Session(), model.PermissionManageSystem) {
|
||||
post.CreateAt = 0
|
||||
@@ -827,6 +834,13 @@ func updatePost(c *Context, w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
if *c.App.Config().ServiceSettings.ExperimentalEnableHardenedMode {
|
||||
if reservedProps := post.ContainsIntegrationsReservedProps(); len(reservedProps) > 0 && !c.AppContext.Session().IsIntegration() {
|
||||
c.SetInvalidParamWithDetails("props", fmt.Sprintf("Cannot use props reserved for integrations. props: %v", reservedProps))
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if !c.App.SessionHasPermissionToChannelByPost(*c.AppContext.Session(), c.Params.PostId, model.PermissionEditPost) {
|
||||
c.SetPermissionError(model.PermissionEditPost)
|
||||
return
|
||||
@@ -888,6 +902,13 @@ func patchPost(c *Context, w http.ResponseWriter, r *http.Request) {
|
||||
audit.AddEventParameterAuditable(auditRec, "patch", &post)
|
||||
defer c.LogAuditRecWithLevel(auditRec, app.LevelContent)
|
||||
|
||||
if *c.App.Config().ServiceSettings.ExperimentalEnableHardenedMode {
|
||||
if reservedProps := post.ContainsIntegrationsReservedProps(); len(reservedProps) > 0 && !c.AppContext.Session().IsIntegration() {
|
||||
c.SetInvalidParamWithDetails("props", fmt.Sprintf("Cannot use props reserved for integrations. props: %v", reservedProps))
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// Updating the file_ids of a post is not a supported operation and will be ignored
|
||||
post.FileIds = nil
|
||||
|
||||
|
||||
@@ -173,6 +173,26 @@ func TestCreatePost(t *testing.T) {
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("err with integrations-reserved props", func(t *testing.T) {
|
||||
originalHardenedModeSetting := *th.App.Config().ServiceSettings.ExperimentalEnableHardenedMode
|
||||
th.App.UpdateConfig(func(cfg *model.Config) {
|
||||
*cfg.ServiceSettings.ExperimentalEnableHardenedMode = true
|
||||
})
|
||||
|
||||
defer th.App.UpdateConfig(func(cfg *model.Config) {
|
||||
*cfg.ServiceSettings.ExperimentalEnableHardenedMode = originalHardenedModeSetting
|
||||
})
|
||||
|
||||
_, postResp, postErr := client.CreatePost(context.Background(), &model.Post{
|
||||
ChannelId: th.BasicChannel.Id,
|
||||
Message: "with props",
|
||||
Props: model.StringInterface{model.PostPropsFromWebhook: "true"},
|
||||
})
|
||||
|
||||
require.Error(t, postErr)
|
||||
CheckBadRequestStatus(t, postResp)
|
||||
})
|
||||
|
||||
post.RootId = ""
|
||||
post.Type = model.PostTypeSystemGeneric
|
||||
_, resp, err := client.CreatePost(context.Background(), post)
|
||||
@@ -418,7 +438,7 @@ func TestCreatePostWithOAuthClient(t *testing.T) {
|
||||
Message: "test message",
|
||||
})
|
||||
require.NoError(t, err)
|
||||
assert.NotContains(t, post.GetProps(), "from_oauth_app", "contains from_oauth_app prop when not using OAuth client")
|
||||
assert.NotContains(t, post.GetProps(), model.PostPropsFromOAuthApp, fmt.Sprintf("contains %s prop when not using OAuth client", model.PostPropsOverrideUsername))
|
||||
|
||||
client := th.CreateClient()
|
||||
client.SetOAuthToken(session.Token)
|
||||
@@ -428,7 +448,28 @@ func TestCreatePostWithOAuthClient(t *testing.T) {
|
||||
})
|
||||
|
||||
require.NoError(t, err)
|
||||
assert.Contains(t, post.GetProps(), "from_oauth_app", "missing from_oauth_app prop when using OAuth client")
|
||||
assert.Contains(t, post.GetProps(), model.PostPropsFromOAuthApp, fmt.Sprintf("missing %s prop when using OAuth client", model.PostPropsOverrideUsername))
|
||||
|
||||
t.Run("allow username and icon overrides", func(t *testing.T) {
|
||||
originalHardenedModeSetting := *th.App.Config().ServiceSettings.ExperimentalEnableHardenedMode
|
||||
th.App.UpdateConfig(func(cfg *model.Config) {
|
||||
*cfg.ServiceSettings.ExperimentalEnableHardenedMode = true
|
||||
})
|
||||
|
||||
defer th.App.UpdateConfig(func(cfg *model.Config) {
|
||||
*cfg.ServiceSettings.ExperimentalEnableHardenedMode = originalHardenedModeSetting
|
||||
})
|
||||
|
||||
post, _, err = client.CreatePost(context.Background(), &model.Post{
|
||||
ChannelId: th.BasicChannel.Id,
|
||||
Message: "test message",
|
||||
Props: model.StringInterface{model.PostPropsOverrideUsername: "newUsernameValue", model.PostPropsOverrideIconURL: "iconUrlOverrideValue"},
|
||||
})
|
||||
|
||||
require.NoError(t, err)
|
||||
assert.Contains(t, post.GetProps(), model.PostPropsOverrideUsername, fmt.Sprintf("missing %s prop when using OAuth client", model.PostPropsOverrideUsername))
|
||||
assert.Contains(t, post.GetProps(), model.PostPropsOverrideIconURL, fmt.Sprintf("missing %s prop when using OAuth client", model.PostPropsOverrideIconURL))
|
||||
})
|
||||
}
|
||||
|
||||
func TestCreatePostEphemeral(t *testing.T) {
|
||||
@@ -1085,6 +1126,26 @@ func TestUpdatePost(t *testing.T) {
|
||||
CheckBadRequestStatus(t, resp)
|
||||
})
|
||||
|
||||
t.Run("err with integrations-reserved props", func(t *testing.T) {
|
||||
originalHardenedModeSetting := *th.App.Config().ServiceSettings.ExperimentalEnableHardenedMode
|
||||
th.App.UpdateConfig(func(cfg *model.Config) {
|
||||
*cfg.ServiceSettings.ExperimentalEnableHardenedMode = true
|
||||
})
|
||||
|
||||
defer th.App.UpdateConfig(func(cfg *model.Config) {
|
||||
*cfg.ServiceSettings.ExperimentalEnableHardenedMode = originalHardenedModeSetting
|
||||
})
|
||||
|
||||
_, resp, err := client.UpdatePost(context.Background(), rpost.Id, &model.Post{
|
||||
ChannelId: th.BasicChannel.Id,
|
||||
Message: "with props",
|
||||
Props: model.StringInterface{model.PostPropsFromWebhook: "true"},
|
||||
})
|
||||
|
||||
require.Error(t, err)
|
||||
CheckBadRequestStatus(t, resp)
|
||||
})
|
||||
|
||||
t.Run("logged out", func(t *testing.T) {
|
||||
client.Logout(context.Background())
|
||||
_, resp, err := client.UpdatePost(context.Background(), rpost.Id, rpost)
|
||||
@@ -1295,6 +1356,33 @@ func TestPatchPost(t *testing.T) {
|
||||
CheckBadRequestStatus(t, resp)
|
||||
require.Equal(t, "api.post.update_post.permissions_time_limit.app_error", err.(*model.AppError).Id, "should be time limit error")
|
||||
})
|
||||
|
||||
t.Run("err with integrations-reserved props", func(t *testing.T) {
|
||||
|
||||
originalHardenedModeSetting := *th.App.Config().ServiceSettings.ExperimentalEnableHardenedMode
|
||||
th.App.UpdateConfig(func(cfg *model.Config) {
|
||||
*cfg.ServiceSettings.ExperimentalEnableHardenedMode = true
|
||||
})
|
||||
|
||||
defer th.App.UpdateConfig(func(cfg *model.Config) {
|
||||
*cfg.ServiceSettings.ExperimentalEnableHardenedMode = originalHardenedModeSetting
|
||||
})
|
||||
|
||||
post := &model.Post{
|
||||
ChannelId: channel.Id,
|
||||
Message: "#hashtag a message",
|
||||
CreateAt: model.GetMillis() - 2000,
|
||||
}
|
||||
post, _, createErr := th.SystemAdminClient.CreatePost(context.Background(), post)
|
||||
require.NoError(t, createErr)
|
||||
|
||||
patch := &model.PostPatch{}
|
||||
patch.Props = &model.StringInterface{model.PostPropsFromWebhook: "true"}
|
||||
_, patchResp, patchErr := client.PatchPost(context.Background(), post.Id, patch)
|
||||
|
||||
require.Error(t, patchErr)
|
||||
CheckBadRequestStatus(t, patchResp)
|
||||
})
|
||||
}
|
||||
|
||||
func TestPinPost(t *testing.T) {
|
||||
|
||||
Ссылка в новой задаче
Block a user