Merge pull request from GHSA-5fq7-3p3j-9vrf

This commit is contained in:
Claire 2024-05-30 14:03:13 +02:00 committed by GitHub
parent 186f916192
commit 943792c187
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 13 additions and 12 deletions

View file

@ -71,16 +71,17 @@ class NotifyService < BaseService
LEFT JOIN mentions m ON m.silent = FALSE AND m.account_id = :sender_id AND m.status_id = s.id LEFT JOIN mentions m ON m.silent = FALSE AND m.account_id = :sender_id AND m.status_id = s.id
WHERE s.id = :id WHERE s.id = :id
UNION ALL UNION ALL
SELECT s.id, s.in_reply_to_id, m.id, st.path || s.id, st.depth + 1 SELECT s.id, s.in_reply_to_id, m.id, ancestors.path || s.id, ancestors.depth + 1
FROM ancestors st FROM ancestors
JOIN statuses s ON s.id = st.in_reply_to_id JOIN statuses s ON s.id = ancestors.in_reply_to_id
LEFT JOIN mentions m ON m.silent = FALSE AND m.account_id = :sender_id AND m.status_id = s.id /* early exit if we already have a mention matching our requirements */
WHERE st.mention_id IS NULL AND NOT s.id = ANY(path) AND st.depth < :depth_limit LEFT JOIN mentions m ON m.silent = FALSE AND m.account_id = :sender_id AND m.status_id = s.id AND s.account_id = :recipient_id
WHERE ancestors.mention_id IS NULL AND NOT s.id = ANY(path) AND ancestors.depth < :depth_limit
) )
SELECT COUNT(*) SELECT COUNT(*)
FROM ancestors st FROM ancestors
JOIN statuses s ON s.id = st.id JOIN statuses s ON s.id = ancestors.id
WHERE st.mention_id IS NOT NULL AND s.visibility = 3 WHERE ancestors.mention_id IS NOT NULL AND s.account_id = :recipient_id AND s.visibility = 3
SQL SQL
end end

View file

@ -76,10 +76,10 @@ RSpec.describe NotifyService, type: :service do
end end
context 'when the message chain is initiated by recipient, but without a mention to the sender, even if the sender sends multiple messages in a row' do context 'when the message chain is initiated by recipient, but without a mention to the sender, even if the sender sends multiple messages in a row' do
let(:reply_to) { Fabricate(:status, account: recipient) } let(:public_status) { Fabricate(:status, account: recipient) }
let!(:mention) { Fabricate(:mention, account: sender, status: reply_to) } let(:intermediate_reply) { Fabricate(:status, account: sender, thread: public_status, visibility: :direct) }
let(:dummy_reply) { Fabricate(:status, account: sender, visibility: :direct, thread: reply_to) } let!(:intermediate_mention) { Fabricate(:mention, account: sender, status: intermediate_reply) }
let(:activity) { Fabricate(:mention, account: recipient, status: Fabricate(:status, account: sender, visibility: :direct, thread: dummy_reply)) } let(:activity) { Fabricate(:mention, account: recipient, status: Fabricate(:status, account: sender, visibility: :direct, thread: intermediate_reply)) }
it 'does not notify' do it 'does not notify' do
expect { subject }.to_not change(Notification, :count) expect { subject }.to_not change(Notification, :count)