FIX: Make ChatMessageUpdater check editing access for guardian (#18902)

Follow up to 766bcbc684

This fixes a gaffe from that commit where I passed in the
guardian to ChatMessageUpdater but then forgot to remove
the old way of setting the guardian and user instance variables
from the chat_message that was passed in.

Also, it moves the ensure_can_edit_message! check from the
controller into ChatMessageUpdater so all the access
checks are in the same place.
This commit is contained in:
Martin Brennan 2022-11-08 09:04:18 +10:00 committed by GitHub
parent 20dc27232e
commit c66743ee3d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 18 additions and 14 deletions

View File

@ -144,7 +144,6 @@ class Chat::ChatController < Chat::ChatBaseController
end end
def edit_message def edit_message
guardian.ensure_can_edit_chat!(@message)
chat_message_updater = chat_message_updater =
Chat::ChatMessageUpdater.update( Chat::ChatMessageUpdater.update(
guardian: guardian, guardian: guardian,

View File

@ -15,8 +15,6 @@ class Chat::ChatMessageUpdater
@chat_message = chat_message @chat_message = chat_message
@old_message_content = chat_message.message @old_message_content = chat_message.message
@chat_channel = @chat_message.chat_channel @chat_channel = @chat_message.chat_channel
@user = @chat_message.user
@guardian = Guardian.new(@user)
@new_content = new_content @new_content = new_content
@upload_ids = upload_ids @upload_ids = upload_ids
@error = nil @error = nil
@ -25,6 +23,7 @@ class Chat::ChatMessageUpdater
def update def update
begin begin
validate_channel_status! validate_channel_status!
@guardian.ensure_can_edit_chat!(@chat_message)
@chat_message.message = @new_content @chat_message.message = @new_content
@chat_message.last_editor_id = @user.id @chat_message.last_editor_id = @user.id
upload_info = get_upload_info upload_info = get_upload_info
@ -48,10 +47,6 @@ class Chat::ChatMessageUpdater
private private
# TODO (martin) Since we have guardian here now we should move
# guardian.ensure_can_edit_chat!(@message) from the controller into
# this class.
def validate_channel_status! def validate_channel_status!
return if @guardian.can_modify_channel_message?(@chat_channel) return if @guardian.can_modify_channel_message?(@chat_channel)
raise StandardError.new( raise StandardError.new(

View File

@ -31,10 +31,7 @@ describe Chat::ChatMessageUpdater do
end end
Group.refresh_automatic_groups! Group.refresh_automatic_groups!
@direct_message_channel = @direct_message_channel =
Chat::DirectMessageChannelCreator.create!( Chat::DirectMessageChannelCreator.create!(acting_user: user1, target_users: [user1, user2])
acting_user: user1,
target_users: [user1, user2],
)
end end
def create_chat_message(user, message, channel, upload_ids: nil) def create_chat_message(user, message, channel, upload_ids: nil)
@ -71,6 +68,19 @@ describe Chat::ChatMessageUpdater do
expect(chat_message.reload.message).to eq(og_message) expect(chat_message.reload.message).to eq(og_message)
end end
it "errors if a user other than the message user is trying to edit the message" do
og_message = "This won't be changed!"
chat_message = create_chat_message(user1, og_message, public_chat_channel)
new_message = "2 short"
updater = Chat::ChatMessageUpdater.update(
guardian: Guardian.new(Fabricate(:user)),
chat_message: chat_message,
new_content: new_message,
)
expect(updater.failed?).to eq(true)
expect(updater.error).to match(Discourse::InvalidAccess)
end
it "it updates a messages content" do it "it updates a messages content" do
chat_message = create_chat_message(user1, "This will be changed", public_chat_channel) chat_message = create_chat_message(user1, "This will be changed", public_chat_channel)
new_message = "Change to this!" new_message = "Change to this!"

View File

@ -532,7 +532,7 @@ RSpec.describe Chat::ChatController do
it "raises an invalid request" do it "raises an invalid request" do
put "/chat/#{chat_channel.id}/edit/#{chat_message.id}.json", params: { new_message: "Hi" } put "/chat/#{chat_channel.id}/edit/#{chat_message.id}.json", params: { new_message: "Hi" }
expect(response.status).to eq(403) expect(response.status).to eq(422)
end end
end end
@ -540,7 +540,7 @@ RSpec.describe Chat::ChatController do
sign_in(Fabricate(:user)) sign_in(Fabricate(:user))
put "/chat/#{chat_channel.id}/edit/#{chat_message.id}.json", params: { new_message: "edit!" } put "/chat/#{chat_channel.id}/edit/#{chat_message.id}.json", params: { new_message: "edit!" }
expect(response.status).to eq(403) expect(response.status).to eq(422)
end end
it "errors when staff tries to edit another user's message" do it "errors when staff tries to edit another user's message" do
@ -551,7 +551,7 @@ RSpec.describe Chat::ChatController do
params: { params: {
new_message: new_message, new_message: new_message,
} }
expect(response.status).to eq(403) expect(response.status).to eq(422)
end end
it "allows a user to edit their own messages" do it "allows a user to edit their own messages" do