view mod_export_skeletons/skeleton_filter.lua @ 4931:13070c6a7ce8

mod_http_muc_log: Fix exception on lack of trailing slash in room path A request to /room leads to the match call returning nil which in turn calls nodeprep(nil). In Prosody 0.11.x this does nothing and simply returns the nil, while in 0.12 it is an error. Now it redirects to the calendar view at /room/ - even for non-existant rooms. Discovered at a deployment with http_paths = { muc_log = "/" } and requests to /robots.txt and similar, which now result in a uses redirect before returning 404.
author Kim Alvefur <zash@zash.se>
date Fri, 22 Apr 2022 14:29:32 +0200
parents b4cc6ee9fc8c
children
line wrap: on
line source

#!/usr/bin/env lua

package.path = package.path:gsub("([^;]*)(?[^;]*)", "%1prosody/%2;%1%2");
package.cpath = package.cpath:gsub("([^;]*)(?[^;]*)", "%1prosody/%2;%1%2");

local t_insert = table.insert;
local t_sort = table.sort;

local jid = require "util.jid";
local st = require "util.stanza";

local xs = require "util.xmppstream";

local function skeleton(s)
	local o = st.stanza(s.name, { xmlns = s.attr.xmlns });

	local children = {};
	for _, child in ipairs(s.tags) do t_insert(children, skeleton(child)) end
	t_sort(children, function(a, b)
		if a.attr.xmlns == b.attr.xmlns then return a.name < b.name; end
		return (a.attr.xmlns or "") < (b.attr.xmlns or "");
	end);
	for _, child in ipairs(children) do o:add_direct_child(child); end
	return o;
end

local function classify_jid(s)
	if not s then return "" end
	local u, h, r = jid.split(s);
	if r then
		return "full"
	elseif u then
		return "bare"
	elseif h then
		return "host"
	else
		return "invalid"
	end
end

local stream_session = { notopen = true };
local stream_callbacks = { stream_ns = "jabber:client"; default_ns = "jabber:client" };
function stream_callbacks:handlestanza(item)
	local clean = skeleton(item);

	-- Normalize top level attributes
	clean.attr.type = item.attr.type;
	if clean.attr.type == nil and clean.name == "message" then clean.attr.type = "normal"; end
	clean.attr.id = string.rep("x", math.floor(math.log(1 + #(item.attr.id or ""), 2)));
	clean.attr.from = classify_jid(item.attr.from);
	clean.attr.to = classify_jid(item.attr.to);
	print(clean);
end
local stream = xs.new(stream_session, stream_callbacks);
assert(stream:feed(st.stanza("stream", { xmlns = "jabber:client" }):top_tag()));
stream_session.notopen = nil;

local data = io.read(4096);
while data do
	stream:feed(data);
	data = io.read(4096);
end

assert(stream:feed("</stream>"));