summaryrefslogtreecommitdiff
path: root/app/views/rss/updates.xml.builder
diff options
context:
space:
mode:
authorerdgeist <erdgeist@erdgeist.org>2026-07-09 15:29:40 +0200
committererdgeist <erdgeist@erdgeist.org>2026-07-09 15:29:40 +0200
commit9c3217df50d462d6be4399e3e654d591bf704df7 (patch)
tree627e474b273789667bca9eadffa0e7f626d002bb /app/views/rss/updates.xml.builder
parent8310751d4db2854597d6379b24e346c65622972d (diff)
Fix malformed-HTML fallout across RSS, link rewriting, and flash messaging
Editors' TinyMCE output can contain unclosed void elements like <br>, which is valid HTML5 but invalid XML -- three different places assumed the stricter rule and broke or silently misbehaved on the looser one. The Atom feed's <content type="xhtml"> block required real, well-formed XML structure but was handed a raw, unescaped body string; switched to type="html" with CGI.escapeHTML, matching how title/summary already handle the same content. rewrite_links_in_body used libxml's strict XML parser to rewrite internal links to be locale-prefixed, which raised on exactly this class of malformed markup -- silently, since the whole method was wrapped in rescue; nil, meaning the link rewrite (not the save) quietly failed with no error anywhere. Replaced with Nokogiri's lenient HTML parser, which repairs malformed void elements rather than rejecting them; also drops the bare rescue now that the actual failure mode it was guarding against shouldn't occur, and fixes two adjacent bugs found while in this method: a typo'd /sytem/uploads/ regex that could never match, and a missing https:// exclusion alongside the existing http:// one. Also addresses stale flash messaging surfaced while testing the above: update's save confirmation was being clobbered by edit's own "locked and ready" notice on the very next request, since nothing distinguished a fresh lock acquisition from a redirect back after saving. The save confirmation now names the next step (publish from Status) and flags a stale translation if one exists, using Page#outdated_translations?, already present but previously unused by any controller.
Diffstat (limited to 'app/views/rss/updates.xml.builder')
-rw-r--r--app/views/rss/updates.xml.builder4
1 files changed, 1 insertions, 3 deletions
diff --git a/app/views/rss/updates.xml.builder b/app/views/rss/updates.xml.builder
index 4b2e2f7..27845c4 100644
--- a/app/views/rss/updates.xml.builder
+++ b/app/views/rss/updates.xml.builder
@@ -22,9 +22,7 @@ xml.feed(:xmlns => "http://www.w3.org/2005/Atom", "xml:base" => @host) do
22 xml.updated(item.updated_at.xmlschema) 22 xml.updated(item.updated_at.xmlschema)
23 xml.published(item.published_at.xmlschema) 23 xml.published(item.published_at.xmlschema)
24 xml.summary(CGI.escapeHTML(item.abstract.to_s)) 24 xml.summary(CGI.escapeHTML(item.abstract.to_s))
25 xml.content(:type => "xhtml") do 25 xml.content(CGI.escapeHTML(item.body.to_s), :type => "html")
26 xml.div(item.body, :xmlns => "http://www.w3.org/1999/xhtml")
27 end
28 end 26 end
29 27
30 end 28 end