Mercurial > prosody-modules
view mod_muc_media_metadata/mod_muc_media_metadata.lua @ 5593:6d0574bfbf5d
mod_client_management: Include software version in table (when known)
Showing software versions could be useful for statistical reasons, e.g.
determining how quickly (or not) users upgrade, but most importantly for
revoking vulnerable clients versions in case of a security issue.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Thu, 13 Jul 2023 23:26:02 +0200 |
parents | d4537f045a78 |
children |
line wrap: on
line source
local async = require "util.async"; local promise = require "util.promise"; local http = require "net.http"; local st = require "util.stanza"; local xmlns_metadata = "xmpp:prosody.im/protocol/media-metadata#0" local fetch_headers = { bytes = "content-length"; type = "content-type"; etag = "etag"; blurhash = "blurhash"; }; local function fetch_media_metadata(url) return promise.new(function (resolve) http.request(url, { method = "HEAD" }, function (body, code, response) --luacheck: ignore 212/body if code == 200 then local metadata = {}; for metadata_name, header_name in pairs(fetch_headers) do metadata[metadata_name] = response.headers[header_name]; end resolve(metadata); else resolve(nil); end end); end); end local function metadata_to_tag(metadata) if not metadata then return; end local metadata_tag = st.stanza("metadata", { xmlns = xmlns_metadata }); for k, v in pairs(metadata) do metadata_tag:text_tag(k, v) end return metadata_tag; end module:hook("muc-occupant-groupchat", function (event) local stanza = event.stanza; local promises; for oob in stanza:childtags("x", "jabber:x:oob") do if not promises then promises = {}; end local url = oob:get_child_text("url"); local p = fetch_media_metadata(url) :next(metadata_to_tag) :next(function (metadata_tag) oob:add_child(metadata_tag); end); table.insert(promises, p); end if not promises then return; end async.wait(promise.all(promises)); end);