File

mod_server_info/mod_server_info.lua @ 6199:fe8222112cf4

mod_conversejs: Serve base app at / This makes things slightly less awkward for the browser to figure out which URLs belong to a PWA. The app's "start URL" was previously without the '/' and therefore was not considered within the scope of the PWA. Now the canonical app URL will always have a '/'. Prosody/mod_http should take care of redirecting existing links without the trailing / to the new URL. If you have an installation at https://prosody/conversejs then it is now at https://prosody/conversejs/ (the first URL will now redirect to the second URL if you use it). The alternative would be to make the PWA scope include the parent, i.e. the whole of https://prosody/ in this case. This might get messy if other PWAs are provided by the same site or Prosody installation, however.
author Matthew Wild <mwild1@gmail.com>
date Tue, 11 Feb 2025 13:18:38 +0000
parent 5950:f408b8e603af
line wrap: on
line source

-- mod_server_info imported from Prosody commit 1ce18cb3e6cc for the benefit
-- of 0.12 deployments. This community version of the module will not load in
-- newer Prosody versions, which include their own copy of the module.
--% conflicts: mod_server_info

local dataforms = require "util.dataforms";

local server_info_config = module:get_option("server_info", {});
local server_info_custom_fields = module:get_option_array("server_info_extensions");

-- Source: http://xmpp.org/registrar/formtypes.html#http:--jabber.org-network-serverinfo
local form_layout = dataforms.new({
	{ var = "FORM_TYPE"; type = "hidden"; value = "http://jabber.org/network/serverinfo" };
});

if server_info_custom_fields then
	for _, field in ipairs(server_info_custom_fields) do
		table.insert(form_layout, field);
	end
end

local generated_form;

function update_form()
	local new_form = form_layout:form(server_info_config, "result");
	if generated_form then
		module:remove_item("extension", generated_form);
	end
	generated_form = new_form;
	module:add_item("extension", generated_form);
end

function add_fields(event)
	local fields = event.item;
	for _, field in ipairs(fields) do
		table.insert(form_layout, field);
	end
	update_form();
end

function remove_fields(event)
	local removed_fields = event.item;
	for _, removed_field in ipairs(removed_fields) do
		local removed_var = removed_field.var or removed_field.name;
		for i, field in ipairs(form_layout) do
			local var = field.var or field.name
			if var == removed_var then
				table.remove(form_layout, i);
				break;
			end
		end
	end
	update_form();
end

module:handle_items("server-info-fields", add_fields, remove_fields);

function module.load()
	update_form();
end