mod_pubsub: Use error registry

This is what util.error was made for!

This replaces the custom error stanza builder with common code in
util.stanza that knows enough about util.error and namespaced errors.

Some awkwardness remains in the way util.pubsub returns conflicting
form fields.
This commit is contained in:
Kim Alvefur 2024-10-27 15:18:24 +01:00
parent 91f9db5ffc
commit 9dd5775dce

View file

@ -1,4 +1,3 @@
local t_unpack = table.unpack;
local time_now = os.time; local time_now = os.time;
local jid_prep = require "prosody.util.jid".prep; local jid_prep = require "prosody.util.jid".prep;
@ -18,7 +17,7 @@ local _M = {};
local handlers = {}; local handlers = {};
_M.handlers = handlers; _M.handlers = handlers;
local pubsub_errors = { local pubsub_errors = errors.init("pubsub", xmlns_pubsub_errors, {
["conflict"] = { "cancel", "conflict" }; ["conflict"] = { "cancel", "conflict" };
["invalid-jid"] = { "modify", "bad-request", nil, "invalid-jid" }; ["invalid-jid"] = { "modify", "bad-request", nil, "invalid-jid" };
["jid-required"] = { "modify", "bad-request", nil, "jid-required" }; ["jid-required"] = { "modify", "bad-request", nil, "jid-required" };
@ -33,16 +32,12 @@ local pubsub_errors = {
["precondition-not-met"] = { "cancel", "conflict", nil, "precondition-not-met" }; ["precondition-not-met"] = { "cancel", "conflict", nil, "precondition-not-met" };
["invalid-item"] = { "modify", "bad-request", "invalid item" }; ["invalid-item"] = { "modify", "bad-request", "invalid item" };
["persistent-items-unsupported"] = { "cancel", "feature-not-implemented", nil, "persistent-items" }; ["persistent-items-unsupported"] = { "cancel", "feature-not-implemented", nil, "persistent-items" };
}; });
local function pubsub_error_reply(stanza, error) local function pubsub_error_reply(stanza, error)
local e = pubsub_errors[error]; if type(error) == "table" and type(error.pubsub_condition) == "string" then
if not e and errors.is_err(error) then error.extra = { namespace = xmlns_pubsub_errors; condition = error.pubsub_condition }
e = { error.type, error.condition, error.text, error.pubsub_condition };
end
local reply = st.error_reply(stanza, t_unpack(e, 1, 3));
if e[4] then
reply:tag(e[4], { xmlns = xmlns_pubsub_errors }):up();
end end
local reply = st.error_reply(stanza, pubsub_errors.wrap(error));
return reply; return reply;
end end
_M.pubsub_error_reply = pubsub_error_reply; _M.pubsub_error_reply = pubsub_error_reply;