comparison 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
comparison
equal deleted inserted replaced
6418:98e06fc5680f 6419:233691533318
69 return lfs.attributes(path,"size") or 0 69 return lfs.attributes(path,"size") or 0
70 end 70 end
71 71
72 local function filename_from_url(url) 72 local function filename_from_url(url)
73 return url:match(".*/([^/?]+)$") or "file" 73 return url:match(".*/([^/?]+)$") or "file"
74 end
75
76 local function pattern_from_string(s)
77 return s:gsub("[%(%)%.%%%+%-%*%?%[%]%^%$]", function(c) return "%" .. c end)
74 end 78 end
75 79
76 local function secure_download_to_disk(url) 80 local function secure_download_to_disk(url)
77 local parsed = socket_url.parse(url) 81 local parsed = socket_url.parse(url)
78 if not parsed or (parsed.scheme~="http" and parsed.scheme~="https") then return promise.reject("invalid scheme") end 82 if not parsed or (parsed.scheme~="http" and parsed.scheme~="https") then return promise.reject("invalid scheme") end
179 end 183 end
180 end 184 end
181 185
182 stanza:maptags(function(el) 186 stanza:maptags(function(el)
183 if el.name == "body" then 187 if el.name == "body" then
184 return st.stanza("body"):text(el:get_text():gsub(original_url, data.local_url)) 188 return st.stanza("body"):text(el:get_text():gsub(pattern_from_string(original_url), data.local_url))
185 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 189 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
186 return el:maptags(function(subel) 190 return el:maptags(function(subel)
187 local s, e = string.find(original_body, original_url) 191 local s, e = string.find(original_body, original_url, 1, true)
188 if subel.name == "body" and math.abs(s - tonumber(subel.attr.start)) < 5 then 192 if s and subel.name == "body" and math.abs(s - tonumber(subel.attr.start)) < 5 then
189 subel.attr["end"] = tostring((tonumber(subel.attr["end"]) - #original_url) + #data.local_url) 193 subel.attr["end"] = tostring((tonumber(subel.attr["end"]) - #original_url) + #data.local_url)
190 end 194 end
191 return subel 195 return subel
192 end) 196 end)
193 else 197 else