FIX: don't validate and render the polls inside a quoted post. (#15019)

Previously, we had issues while approving posts since we validated the polls inside quotes.
This commit is contained in:
Vinoth Kannan 2022-04-15 16:33:07 +05:30 committed by GitHub
parent 10a4bbfa72
commit 461936f211
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 38 additions and 1 deletions

View File

@ -71,7 +71,10 @@ function initializePolls(api) {
});
function attachPolls(elem, helper) {
const pollNodes = elem.querySelectorAll(".poll");
let pollNodes = [...elem.querySelectorAll(".poll")];
pollNodes = pollNodes.filter(
(node) => node.parentNode.tagName !== "BLOCKQUOTE"
);
if (!pollNodes.length || !helper) {
return;
}

View File

@ -286,6 +286,7 @@ class DiscoursePoll::Poll
def self.extract(raw, topic_id, user_id = nil)
# TODO: we should fix the callback mess so that the cooked version is available
# in the validators instead of cooking twice
raw = raw.sub(/\[quote.+\/quote\]/m, '')
cooked = PrettyText.cook(raw, topic_id: topic_id, user_id: user_id)
Nokogiri::HTML5(cooked).css("div.poll").map do |p|

View File

@ -211,4 +211,37 @@ describe DiscoursePoll::Poll do
expect(messages.count).to eq(0)
end
end
describe '.extract' do
it "skips the polls inside quote" do
raw = <<~RAW
[quote="username, post:1, topic:2"]
[poll type=regular result=always]
* 1
* 2
[/poll]
[/quote]
[poll type=regular result=always]
* 3
* 4
[/poll]
Post with a poll and a quoted poll.
RAW
expect(DiscoursePoll::Poll.extract(raw, 2)).to contain_exactly({
"name" => "poll",
"options" => [{
"html" => "3",
"id" => "68b434ff88aeae7054e42cd05a4d9056"
}, {
"html" => "4",
"id" => "aa2393b424f2f395abb63bf785760a3b"
}],
"status" => "open",
"type" => "regular"
})
end
end
end