summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/post.go6
-rw-r--r--api/post_test.go11
-rw-r--r--i18n/en.json4
-rw-r--r--webapp/components/post_info.jsx3
-rw-r--r--webapp/components/rhs_comment.jsx3
-rw-r--r--webapp/components/rhs_root_post.jsx3
-rw-r--r--webapp/tests/spinner_button.test.jsx1
7 files changed, 28 insertions, 3 deletions
diff --git a/api/post.go b/api/post.go
index 734cb7148..6be3ec7eb 100644
--- a/api/post.go
+++ b/api/post.go
@@ -919,6 +919,12 @@ func updatePost(c *Context, w http.ResponseWriter, r *http.Request) {
c.Err.StatusCode = http.StatusForbidden
return
}
+
+ if oldPost.IsSystemMessage() {
+ c.Err = model.NewLocAppError("updatePost", "api.post.update_post.system_message.app_error", nil, "id="+post.Id)
+ c.Err.StatusCode = http.StatusForbidden
+ return
+ }
}
hashtags, _ := model.ParseHashtags(post.Message)
diff --git a/api/post_test.go b/api/post_test.go
index bb11a5439..b4c23ff06 100644
--- a/api/post_test.go
+++ b/api/post_test.go
@@ -155,6 +155,17 @@ func TestUpdatePost(t *testing.T) {
t.Fatal("failed to updates")
}
}
+
+ post3 := &model.Post{ChannelId: channel1.Id, Message: "a" + model.NewId() + "a", Type: model.POST_JOIN_LEAVE}
+ rpost3, err := Client.CreatePost(post3)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ up3 := &model.Post{Id: rpost3.Data.(*model.Post).Id, ChannelId: channel1.Id, Message: "a" + model.NewId() + " update post 3"}
+ if _, err := Client.UpdatePost(up3); err == nil {
+ t.Fatal("shouldn't have been able to update system message")
+ }
}
func TestGetPosts(t *testing.T) {
diff --git a/i18n/en.json b/i18n/en.json
index abdc647b7..40f722add 100644
--- a/i18n/en.json
+++ b/i18n/en.json
@@ -936,6 +936,10 @@
"translation": "Already deleted id={{.PostId}}"
},
{
+ "id": "api.post.update_post.system_message.app_error",
+ "translation": "Unable to update system message"
+ },
+ {
"id": "api.post_get_post_by_id.get.app_error",
"translation": "Unable to get post"
},
diff --git a/webapp/components/post_info.jsx b/webapp/components/post_info.jsx
index f86c63fd7..ed316745f 100644
--- a/webapp/components/post_info.jsx
+++ b/webapp/components/post_info.jsx
@@ -33,6 +33,7 @@ export default class PostInfo extends React.Component {
var post = this.props.post;
var isOwner = this.props.currentUser.id === post.user_id;
var isAdmin = TeamStore.isTeamAdminForCurrentTeam() || UserStore.isSystemAdminForCurrentUser();
+ const isSystemMessage = post.type.startsWith(Constants.SYSTEM_MESSAGE_PREFIX);
if (post.state === Constants.POST_FAILED || post.state === Constants.POST_LOADING || Utils.isPostEphemeral(post)) {
return '';
@@ -108,7 +109,7 @@ export default class PostInfo extends React.Component {
);
}
- if (isOwner) {
+ if (isOwner && !isSystemMessage) {
dropdownContents.push(
<li
key='editPost'
diff --git a/webapp/components/rhs_comment.jsx b/webapp/components/rhs_comment.jsx
index 5097e0573..c4b62efcf 100644
--- a/webapp/components/rhs_comment.jsx
+++ b/webapp/components/rhs_comment.jsx
@@ -85,6 +85,7 @@ export default class RhsComment extends React.Component {
const isOwner = this.props.currentUser.id === post.user_id;
var isAdmin = TeamStore.isTeamAdminForCurrentTeam() || UserStore.isSystemAdminForCurrentUser();
+ const isSystemMessage = post.type.startsWith(Constants.SYSTEM_MESSAGE_PREFIX);
var dropdownContents = [];
@@ -107,7 +108,7 @@ export default class RhsComment extends React.Component {
);
}
- if (isOwner) {
+ if (isOwner && !isSystemMessage) {
dropdownContents.push(
<li
role='presentation'
diff --git a/webapp/components/rhs_root_post.jsx b/webapp/components/rhs_root_post.jsx
index 849971864..f82948726 100644
--- a/webapp/components/rhs_root_post.jsx
+++ b/webapp/components/rhs_root_post.jsx
@@ -41,6 +41,7 @@ export default class RhsRootPost extends React.Component {
const user = this.props.user;
var isOwner = this.props.currentUser.id === post.user_id;
var isAdmin = TeamStore.isTeamAdminForCurrentTeam() || UserStore.isSystemAdminForCurrentUser();
+ const isSystemMessage = post.type.startsWith(Constants.SYSTEM_MESSAGE_PREFIX);
var timestamp = UserStore.getProfile(post.user_id).update_at;
var channel = ChannelStore.get(post.channel_id);
@@ -94,7 +95,7 @@ export default class RhsRootPost extends React.Component {
);
}
- if (isOwner) {
+ if (isOwner && !isSystemMessage) {
dropdownContents.push(
<li
key='rhs-root-edit'
diff --git a/webapp/tests/spinner_button.test.jsx b/webapp/tests/spinner_button.test.jsx
index 68488b61d..296f4eaff 100644
--- a/webapp/tests/spinner_button.test.jsx
+++ b/webapp/tests/spinner_button.test.jsx
@@ -6,6 +6,7 @@ import SpinnerButton from '../components/spinner_button.jsx';
import React from 'react';
describe('SpinnerButton', function() {
+ this.timeout(10000);
jsdom();
it('check props', function() {