mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
FIX: Prevent unauthorized list of private message titles. Also remove some unused code.
This commit is contained in:
parent
40c08eab14
commit
3f0c03a20c
@ -40,7 +40,10 @@ class ListController < ApplicationController
|
|||||||
|
|
||||||
def private_messages
|
def private_messages
|
||||||
list_opts = build_topic_list_options
|
list_opts = build_topic_list_options
|
||||||
list = TopicQuery.new(current_user, list_opts).list_private_messages(fetch_user_from_params)
|
target_user = fetch_user_from_params
|
||||||
|
guardian.ensure_can_see_private_messages!(target_user.id)
|
||||||
|
|
||||||
|
list = TopicQuery.new(current_user, list_opts).list_private_messages(target_user)
|
||||||
list.more_topics_url = url_for(topics_private_messages_path(list_opts.merge(format: 'json', page: next_page)))
|
list.more_topics_url = url_for(topics_private_messages_path(list_opts.merge(format: 'json', page: next_page)))
|
||||||
|
|
||||||
respond(list)
|
respond(list)
|
||||||
@ -48,7 +51,10 @@ class ListController < ApplicationController
|
|||||||
|
|
||||||
def private_messages_sent
|
def private_messages_sent
|
||||||
list_opts = build_topic_list_options
|
list_opts = build_topic_list_options
|
||||||
list = TopicQuery.new(current_user, list_opts).list_private_messages_sent(fetch_user_from_params)
|
target_user = fetch_user_from_params
|
||||||
|
guardian.ensure_can_see_private_messages!(target_user.id)
|
||||||
|
|
||||||
|
list = TopicQuery.new(current_user, list_opts).list_private_messages_sent(target_user)
|
||||||
list.more_topics_url = url_for(topics_private_messages_sent_path(list_opts.merge(format: 'json', page: next_page)))
|
list.more_topics_url = url_for(topics_private_messages_sent_path(list_opts.merge(format: 'json', page: next_page)))
|
||||||
|
|
||||||
respond(list)
|
respond(list)
|
||||||
@ -56,7 +62,10 @@ class ListController < ApplicationController
|
|||||||
|
|
||||||
def private_messages_unread
|
def private_messages_unread
|
||||||
list_opts = build_topic_list_options
|
list_opts = build_topic_list_options
|
||||||
list = TopicQuery.new(current_user, list_opts).list_private_messages_unread(fetch_user_from_params)
|
target_user = fetch_user_from_params
|
||||||
|
guardian.ensure_can_see_private_messages!(target_user.id)
|
||||||
|
|
||||||
|
list = TopicQuery.new(current_user, list_opts).list_private_messages_unread(target_user)
|
||||||
list.more_topics_url = url_for(topics_private_messages_unread_path(list_opts.merge(format: 'json', page: next_page)))
|
list.more_topics_url = url_for(topics_private_messages_unread_path(list_opts.merge(format: 'json', page: next_page)))
|
||||||
|
|
||||||
respond(list)
|
respond(list)
|
||||||
|
@ -16,15 +16,7 @@ class UserActionsController < ApplicationController
|
|||||||
ignore_private_messages: params[:filter] ? false : true
|
ignore_private_messages: params[:filter] ? false : true
|
||||||
}
|
}
|
||||||
|
|
||||||
stream =
|
render_serialized(UserAction.stream(opts), UserActionSerializer, root: "user_actions")
|
||||||
if opts[:action_types] == [UserAction::GOT_PRIVATE_MESSAGE] ||
|
|
||||||
opts[:action_types] == [UserAction::NEW_PRIVATE_MESSAGE]
|
|
||||||
UserAction.private_message_stream(opts[:action_types][0], opts)
|
|
||||||
else
|
|
||||||
UserAction.stream(opts)
|
|
||||||
end
|
|
||||||
|
|
||||||
render_serialized(stream, UserActionSerializer, root: "user_actions")
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def show
|
def show
|
||||||
|
@ -128,44 +128,6 @@ LEFT JOIN categories c on c.id = t.category_id
|
|||||||
builder.map_exec(UserActionRow)
|
builder.map_exec(UserActionRow)
|
||||||
end
|
end
|
||||||
|
|
||||||
# slightly different to standard stream, it collapses replies
|
|
||||||
def self.private_message_stream(action_type, opts)
|
|
||||||
|
|
||||||
user_id = opts[:user_id]
|
|
||||||
return [] unless opts[:guardian].can_see_private_messages?(user_id)
|
|
||||||
|
|
||||||
builder = SqlBuilder.new("
|
|
||||||
SELECT
|
|
||||||
t.title, :action_type action_type, p.created_at, t.id topic_id,
|
|
||||||
:user_id AS target_user_id, au.name AS target_name, au.username AS target_username,
|
|
||||||
coalesce(p.post_number, 1) post_number,
|
|
||||||
p.reply_to_post_number,
|
|
||||||
pu.email, pu.username, pu.name, pu.id user_id,
|
|
||||||
pu.use_uploaded_avatar, pu.uploaded_avatar_template, pu.uploaded_avatar_id,
|
|
||||||
pu.email acting_email, pu.username acting_username, pu.name acting_name, pu.id acting_user_id,
|
|
||||||
pu.use_uploaded_avatar acting_use_uploaded_avatar, pu.uploaded_avatar_template acting_uploaded_avatar_template, pu.uploaded_avatar_id acting_uploaded_avatar_id,
|
|
||||||
p.cooked,
|
|
||||||
CASE WHEN coalesce(p.deleted_at, t.deleted_at) IS NULL THEN false ELSE true END deleted,
|
|
||||||
p.hidden,
|
|
||||||
p.post_type
|
|
||||||
FROM topics t
|
|
||||||
JOIN posts p ON p.topic_id = t.id and p.post_number = t.highest_post_number
|
|
||||||
JOIN users pu ON pu.id = p.user_id
|
|
||||||
JOIN users au ON au.id = :user_id
|
|
||||||
WHERE archetype = 'private_message' and EXISTS (
|
|
||||||
select 1 from user_actions a where a.user_id = :user_id and a.target_topic_id = t.id and action_type = :action_type)
|
|
||||||
ORDER BY p.created_at desc
|
|
||||||
|
|
||||||
/*offset*/
|
|
||||||
/*limit*/
|
|
||||||
")
|
|
||||||
|
|
||||||
builder
|
|
||||||
.offset((opts[:offset] || 0).to_i)
|
|
||||||
.limit((opts[:limit] || 60).to_i)
|
|
||||||
.map_exec(UserActionRow, user_id: user_id, action_type: action_type)
|
|
||||||
end
|
|
||||||
|
|
||||||
def self.log_action!(hash)
|
def self.log_action!(hash)
|
||||||
required_parameters = [:action_type, :user_id, :acting_user_id, :target_topic_id, :target_post_id]
|
required_parameters = [:action_type, :user_id, :acting_user_id, :target_topic_id, :target_post_id]
|
||||||
require_parameters(hash, *required_parameters)
|
require_parameters(hash, *required_parameters)
|
||||||
|
@ -119,6 +119,54 @@ describe ListController do
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "private_messages" do
|
||||||
|
let!(:user) { log_in }
|
||||||
|
|
||||||
|
it "raises an error when can_see_private_messages? is false " do
|
||||||
|
Guardian.any_instance.expects(:can_see_private_messages?).returns(false)
|
||||||
|
xhr :get, :private_messages, username: @user.username
|
||||||
|
response.should be_forbidden
|
||||||
|
end
|
||||||
|
|
||||||
|
it "succeeds when can_see_private_messages? is false " do
|
||||||
|
Guardian.any_instance.expects(:can_see_private_messages?).returns(true)
|
||||||
|
xhr :get, :private_messages, username: @user.username
|
||||||
|
response.should be_success
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "private_messages_sent" do
|
||||||
|
let!(:user) { log_in }
|
||||||
|
|
||||||
|
it "raises an error when can_see_private_messages? is false " do
|
||||||
|
Guardian.any_instance.expects(:can_see_private_messages?).returns(false)
|
||||||
|
xhr :get, :private_messages_sent, username: @user.username
|
||||||
|
response.should be_forbidden
|
||||||
|
end
|
||||||
|
|
||||||
|
it "succeeds when can_see_private_messages? is false " do
|
||||||
|
Guardian.any_instance.expects(:can_see_private_messages?).returns(true)
|
||||||
|
xhr :get, :private_messages_sent, username: @user.username
|
||||||
|
response.should be_success
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "private_messages_unread" do
|
||||||
|
let!(:user) { log_in }
|
||||||
|
|
||||||
|
it "raises an error when can_see_private_messages? is false " do
|
||||||
|
Guardian.any_instance.expects(:can_see_private_messages?).returns(false)
|
||||||
|
xhr :get, :private_messages_unread, username: @user.username
|
||||||
|
response.should be_forbidden
|
||||||
|
end
|
||||||
|
|
||||||
|
it "succeeds when can_see_private_messages? is false " do
|
||||||
|
Guardian.any_instance.expects(:can_see_private_messages?).returns(true)
|
||||||
|
xhr :get, :private_messages_unread, username: @user.username
|
||||||
|
response.should be_success
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context 'hot' do
|
context 'hot' do
|
||||||
before do
|
before do
|
||||||
xhr :get, :hot
|
xhr :get, :hot
|
||||||
|
@ -243,22 +243,6 @@ describe UserAction do
|
|||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'should collapse the inbox correctly' do
|
|
||||||
|
|
||||||
stream = UserAction.private_message_stream(UserAction::GOT_PRIVATE_MESSAGE, user_id: target_user.id, guardian: Guardian.new(target_user))
|
|
||||||
# inbox should collapse this initial and reply message into one item
|
|
||||||
stream.count.should == 1
|
|
||||||
|
|
||||||
|
|
||||||
# outbox should also collapse
|
|
||||||
stream = UserAction.private_message_stream(UserAction::NEW_PRIVATE_MESSAGE, user_id: user.id, guardian: Guardian.new(user))
|
|
||||||
stream.count.should == 1
|
|
||||||
|
|
||||||
# anon should see nothing
|
|
||||||
stream = UserAction.private_message_stream(UserAction::NEW_PRIVATE_MESSAGE, user_id: user.id, guardian: Guardian.new(nil))
|
|
||||||
stream.count.should == 0
|
|
||||||
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'synchronize_favorites' do
|
describe 'synchronize_favorites' do
|
||||||
|
Loading…
Reference in New Issue
Block a user