local st = require "util.stanza";
local jid_bare = require "util.jid".bare;
local uuid_generate = require "util.uuid".generate;
+local usermanager = require "core.usermanager";
local xmlns_pubsub = "http://jabber.org/protocol/pubsub";
local xmlns_pubsub_errors = "http://jabber.org/protocol/pubsub#errors";
local origin, stanza = event.origin, event.stanza;
local pubsub = stanza.tags[1];
local action = pubsub.tags[1];
+ if not action then
+ return origin.send(st.error_reply(stanza, "cancel", "bad-request"));
+ end
local handler = handlers[stanza.attr.type.."_"..action.name];
if handler then
handler(origin, stanza, action);
local pubsub_errors = {
["conflict"] = { "cancel", "conflict" };
["invalid-jid"] = { "modify", "bad-request", nil, "invalid-jid" };
+ ["jid-required"] = { "modify", "bad-request", nil, "jid-required" };
+ ["nodeid-required"] = { "modify", "bad-request", nil, "nodeid-required" };
["item-not-found"] = { "cancel", "item-not-found" };
["not-subscribed"] = { "modify", "unexpected-request", nil, "not-subscribed" };
["forbidden"] = { "cancel", "forbidden" };
local item = items:get_child("item");
local id = item and item.attr.id;
+ if not node then
+ return origin.send(pubsub_error_reply(stanza, "nodeid-required"));
+ end
local ok, results = service:get_items(node, stanza.attr.from, id);
if not ok then
return origin.send(pubsub_error_reply(stanza, results));
return origin.send(reply);
end
+function handlers.set_delete(origin, stanza, delete)
+ local node = delete.attr.node;
+
+ local reply, notifier;
+ if not node then
+ return origin.send(pubsub_error_reply(stanza, "nodeid-required"));
+ end
+ local ok, ret = service:delete(node, stanza.attr.from);
+ if ok then
+ reply = st.reply(stanza);
+ else
+ reply = pubsub_error_reply(stanza, ret);
+ end
+ return origin.send(reply);
+end
+
function handlers.set_subscribe(origin, stanza, subscribe)
local node, jid = subscribe.attr.node, subscribe.attr.jid;
+ if not (node and jid) then
+ return origin.send(pubsub_error_reply(stanza, jid and "nodeid-required" or "invalid-jid"));
+ end
--[[
local options_tag, options = stanza.tags[1]:get_child("options"), nil;
if options_tag then
reply = pubsub_error_reply(stanza, ret);
end
origin.send(reply);
- if ok then
- -- Send all current items
- local ok, items = service:get_items(node, stanza.attr.from);
- if items then
- local jids = { [jid] = options or true };
- for id, item in pairs(items) do
- service.config.broadcaster(node, jids, item);
- end
- end
- end
end
function handlers.set_unsubscribe(origin, stanza, unsubscribe)
local node, jid = unsubscribe.attr.node, unsubscribe.attr.jid;
+ if not (node and jid) then
+ return origin.send(pubsub_error_reply(stanza, jid and "nodeid-required" or "invalid-jid"));
+ end
local ok, ret = service:remove_subscription(node, stanza.attr.from, jid);
local reply;
if ok then
function handlers.set_publish(origin, stanza, publish)
local node = publish.attr.node;
+ if not node then
+ return origin.send(pubsub_error_reply(stanza, "nodeid-required"));
+ end
local item = publish:get_child("item");
- local id = (item and item.attr.id) or uuid_generate();
+ local id = (item and item.attr.id);
+ if not id then
+ id = uuid_generate();
+ if item then
+ item.attr.id = id;
+ end
+ end
local ok, ret = service:publish(node, stanza.attr.from, id, item);
local reply;
if ok then
local item = retract:get_child("item");
local id = item and item.attr.id
if not (node and id) then
- origin.send(st.error_reply(stanza, "modify", "bad-request"));
- return true;
+ return origin.send(pubsub_error_reply(stanza, node and "item-not-found" or "nodeid-required"));
end
local reply, notifier;
if notify then
notify = (notify == "1") or (notify == "true");
local reply;
if not node then
- origin.send(st.error_reply(stanza, "modify", "bad-request"));
- return true;
+ return origin.send(pubsub_error_reply(stanza, "nodeid-required"));
end
local ok, ret = service:purge(node, stanza.attr.from, notify);
if ok then
retract = { "delete-items", "retract-items" };
purge = { "purge-nodes" };
publish = { "publish", autocreate_on_publish and "auto-create" };
+ delete = { "delete-nodes" };
get_items = { "retrieve-items" };
add_subscription = { "subscribe" };
get_subscriptions = { "retrieve-subscriptions" };
end
local ok, ret = service:get_nodes(event.stanza.attr.from);
if not ok then
- event.origin.send(pubsub_error_reply(stanza, ret));
+ event.origin.send(pubsub_error_reply(event.stanza, ret));
else
local reply = st.reply(event.stanza)
:tag("query", { xmlns = "http://jabber.org/protocol/disco#items" });
create = true;
publish = true;
retract = true;
+ delete = true;
get_nodes = true;
subscribe = true;