diff mod_muc_cache_media/mod_muc_cache_media.lua @ 6419:233691533318

mod_muc_cache_media: use raw strings not patterns
author Stephen Paul Weber <singpolyma@singpolyma.net>
date Tue, 24 Feb 2026 15:26:37 -0500
parents 98e06fc5680f
children 0a9b516e388e
line wrap: on
line diff
--- a/mod_muc_cache_media/mod_muc_cache_media.lua	Tue Feb 24 13:20:45 2026 -0500
+++ b/mod_muc_cache_media/mod_muc_cache_media.lua	Tue Feb 24 15:26:37 2026 -0500
@@ -73,6 +73,10 @@
 	return url:match(".*/([^/?]+)$") or "file"
 end
 
+local function pattern_from_string(s)
+	return s:gsub("[%(%)%.%%%+%-%*%?%[%]%^%$]", function(c) return "%" .. c end)
+end
+
 local function secure_download_to_disk(url)
 	local parsed = socket_url.parse(url)
 	if not parsed or (parsed.scheme~="http" and parsed.scheme~="https") then return promise.reject("invalid scheme") end
@@ -181,11 +185,11 @@
 
 			stanza:maptags(function(el)
 				if el.name == "body" then
-					return st.stanza("body"):text(el:get_text():gsub(original_url, data.local_url))
+					return st.stanza("body"):text(el:get_text():gsub(pattern_from_string(original_url), data.local_url))
 				elseif el.name == "fallback" and el.attr.xmlns == "urn:xmpp:fallback:0" and (el.attr["for"] == "jabber:x:oob" or el.attr["for"] == "urn:xmpp:sims:1") then
 					return el:maptags(function(subel)
-						local s, e = string.find(original_body, original_url)
-						if subel.name == "body" and math.abs(s - tonumber(subel.attr.start)) < 5 then
+						local s, e = string.find(original_body, original_url, 1, true)
+						if s and subel.name == "body" and math.abs(s - tonumber(subel.attr.start)) < 5 then
 							subel.attr["end"] = tostring((tonumber(subel.attr["end"]) - #original_url) + #data.local_url)
 						end
 						return subel