plugins: Explicitly return to halt event propagation (session.send sometimes does...
authorKim Alvefur <zash@zash.se>
Mon, 21 Sep 2015 21:06:22 +0000 (23:06 +0200)
committerKim Alvefur <zash@zash.se>
Mon, 21 Sep 2015 21:06:22 +0000 (23:06 +0200)
plugins/adhoc/mod_adhoc.lua
plugins/mod_carbons.lua
plugins/mod_private.lua
plugins/mod_pubsub/mod_pubsub.lua
plugins/mod_pubsub/pubsub.lib.lua

index f3e7f52029edcdb1d34efe36365d70d910dd850a..1c956021aaf19fddb91ad2f8c40b50d14896c8aa 100644 (file)
@@ -34,7 +34,8 @@ module:hook("host-disco-info-node", function (event)
                        reply:tag("feature", { var = "jabber:x:data" }):up();
                        event.exists = true;
                else
-                       return origin.send(st.error_reply(stanza, "auth", "forbidden", "This item is not available to you"));
+                       origin.send(st.error_reply(stanza, "auth", "forbidden", "This item is not available to you"));
+                       return true;
                end
        elseif node == xmlns_cmd then
                reply:tag("identity", { name = "Ad-Hoc Commands",
@@ -87,7 +88,8 @@ module:hook("iq/host/"..xmlns_cmd..":command", function (event)
                                return true
                        end
                        -- User has permission now execute the command
-                       return adhoc_handle_cmd(commands[node], origin, stanza);
+                       adhoc_handle_cmd(commands[node], origin, stanza);
+                       return true;
                end
        end
 end, 500);
index 9b94d58dd044c179634de750ef3f98631530fe16..9ef14713553bf3fa7e60c38ef0853b7f88216807 100644 (file)
@@ -14,7 +14,8 @@ local function toggle_carbons(event)
        local state = stanza.tags[1].name;
        module:log("debug", "%s %sd carbons", origin.full_jid, state);
        origin.want_carbons = state == "enable" and stanza.tags[1].attr.xmlns;
-       return origin.send(st.reply(stanza));
+       origin.send(st.reply(stanza));
+       return true;
 end
 module:hook("iq-set/self/"..xmlns_carbons..":disable", toggle_carbons);
 module:hook("iq-set/self/"..xmlns_carbons..":enable", toggle_carbons);
index 8bca515402c71b9b15a0c53793932fb7e45ce569..c01053d509b8effaed36d55572d44ffa2e96be43 100644 (file)
@@ -17,19 +17,23 @@ module:hook("iq/self/jabber:iq:private:query", function(event)
        local origin, stanza = event.origin, event.stanza;
        local query = stanza.tags[1];
        if #query.tags ~= 1 then
-               return origin.send(st.error_reply(stanza, "modify", "bad-format"));
+               origin.send(st.error_reply(stanza, "modify", "bad-format"));
+               return true;
        end
        local tag = query.tags[1];
        local key = tag.name..":"..tag.attr.xmlns;
        local data, err = private_storage:get(origin.username);
        if err then
-               return origin.send(st.error_reply(stanza, "wait", "internal-server-error", err));
+               origin.send(st.error_reply(stanza, "wait", "internal-server-error", err));
+               return true;
        end
        if stanza.attr.type == "get" then
                if data and data[key] then
-                       return origin.send(st.reply(stanza):query("jabber:iq:private"):add_child(st.deserialize(data[key])));
+                       origin.send(st.reply(stanza):query("jabber:iq:private"):add_child(st.deserialize(data[key])));
+                       return true;
                else
-                       return origin.send(st.reply(stanza):add_child(query));
+                       origin.send(st.reply(stanza):add_child(query));
+                       return true;
                end
        else -- type == set
                if not data then data = {}; end;
@@ -41,8 +45,10 @@ module:hook("iq/self/jabber:iq:private:query", function(event)
                -- TODO delete datastore if empty
                local ok, err = private_storage:set(origin.username, data);
                if not ok then
-                       return origin.send(st.error_reply(stanza, "wait", "internal-server-error", err));
+                       origin.send(st.error_reply(stanza, "wait", "internal-server-error", err));
+                       return true;
                end
-               return origin.send(st.reply(stanza));
+               origin.send(st.reply(stanza));
+               return true;
        end
 end);
index 40c28d272e4ae0db9dfe2d295e561313dfd91780..e93a523898adaebfa3e02dc112bca0af36623f55 100644 (file)
@@ -28,7 +28,8 @@ function handle_pubsub_iq(event)
        local pubsub = stanza.tags[1];
        local action = pubsub.tags[1];
        if not action then
-               return origin.send(st.error_reply(stanza, "cancel", "bad-request"));
+               origin.send(st.error_reply(stanza, "cancel", "bad-request"));
+               return true;
        end
        local handler = handlers[stanza.attr.type.."_"..action.name];
        if handler then
index d85c71be6db35a554965b49b4ae7622eefd4ad90..1497c21c015a0da766b61b5abd9cec8dc26776be 100644 (file)
@@ -50,11 +50,13 @@ function handlers.get_items(origin, stanza, items, service)
        local id = item and item.attr.id;
 
        if not node then
-               return origin.send(pubsub_error_reply(stanza, "nodeid-required"));
+               origin.send(pubsub_error_reply(stanza, "nodeid-required"));
+               return true;
        end
        local ok, results = service:get_items(node, stanza.attr.from, id);
        if not ok then
-               return origin.send(pubsub_error_reply(stanza, results));
+               origin.send(pubsub_error_reply(stanza, results));
+               return true;
        end
 
        local data = st.stanza("items", { node = node });
@@ -69,14 +71,16 @@ function handlers.get_items(origin, stanza, items, service)
        else
                reply = pubsub_error_reply(stanza, "item-not-found");
        end
-       return origin.send(reply);
+       origin.send(reply);
+       return true;
 end
 
 function handlers.get_subscriptions(origin, stanza, subscriptions, service)
        local node = subscriptions.attr.node;
        local ok, ret = service:get_subscriptions(node, stanza.attr.from, stanza.attr.from);
        if not ok then
-               return origin.send(pubsub_error_reply(stanza, ret));
+               origin.send(pubsub_error_reply(stanza, ret));
+               return true;
        end
        local reply = st.reply(stanza)
                :tag("pubsub", { xmlns = xmlns_pubsub })
@@ -84,7 +88,8 @@ function handlers.get_subscriptions(origin, stanza, subscriptions, service)
        for _, sub in ipairs(ret) do
                reply:tag("subscription", { node = sub.node, jid = sub.jid, subscription = 'subscribed' }):up();
        end
-       return origin.send(reply);
+       origin.send(reply);
+       return true;
 end
 
 function handlers.set_create(origin, stanza, create, service)
@@ -110,7 +115,8 @@ function handlers.set_create(origin, stanza, create, service)
                        reply = pubsub_error_reply(stanza, ret);
                end
        end
-       return origin.send(reply);
+       origin.send(reply);
+       return true;
 end
 
 function handlers.set_delete(origin, stanza, delete, service)
@@ -118,7 +124,8 @@ function handlers.set_delete(origin, stanza, delete, service)
 
        local reply, notifier;
        if not node then
-               return origin.send(pubsub_error_reply(stanza, "nodeid-required"));
+               origin.send(pubsub_error_reply(stanza, "nodeid-required"));
+               return true;
        end
        local ok, ret = service:delete(node, stanza.attr.from);
        if ok then
@@ -126,13 +133,15 @@ function handlers.set_delete(origin, stanza, delete, service)
        else
                reply = pubsub_error_reply(stanza, ret);
        end
-       return origin.send(reply);
+       origin.send(reply);
+       return true;
 end
 
 function handlers.set_subscribe(origin, stanza, subscribe, service)
        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"));
+               origin.send(pubsub_error_reply(stanza, jid and "nodeid-required" or "invalid-jid"));
+               return true;
        end
        --[[
        local options_tag, options = stanza.tags[1]:get_child("options"), nil;
@@ -163,7 +172,8 @@ end
 function handlers.set_unsubscribe(origin, stanza, unsubscribe, service)
        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"));
+               origin.send(pubsub_error_reply(stanza, jid and "nodeid-required" or "invalid-jid"));
+               return true;
        end
        local ok, ret = service:remove_subscription(node, stanza.attr.from, jid);
        local reply;
@@ -172,13 +182,15 @@ function handlers.set_unsubscribe(origin, stanza, unsubscribe, service)
        else
                reply = pubsub_error_reply(stanza, ret);
        end
-       return origin.send(reply);
+       origin.send(reply);
+       return true;
 end
 
 function handlers.set_publish(origin, stanza, publish, service)
        local node = publish.attr.node;
        if not node then
-               return origin.send(pubsub_error_reply(stanza, "nodeid-required"));
+               origin.send(pubsub_error_reply(stanza, "nodeid-required"));
+               return true;
        end
        local item = publish:get_child("item");
        local id = (item and item.attr.id);
@@ -198,7 +210,8 @@ function handlers.set_publish(origin, stanza, publish, service)
        else
                reply = pubsub_error_reply(stanza, ret);
        end
-       return origin.send(reply);
+       origin.send(reply);
+       return true;
 end
 
 function handlers.set_retract(origin, stanza, retract, service)
@@ -207,7 +220,8 @@ function handlers.set_retract(origin, stanza, retract, service)
        local item = retract:get_child("item");
        local id = item and item.attr.id
        if not (node and id) then
-               return origin.send(pubsub_error_reply(stanza, node and "item-not-found" or "nodeid-required"));
+               origin.send(pubsub_error_reply(stanza, node and "item-not-found" or "nodeid-required"));
+               return true;
        end
        local reply, notifier;
        if notify then
@@ -219,7 +233,8 @@ function handlers.set_retract(origin, stanza, retract, service)
        else
                reply = pubsub_error_reply(stanza, ret);
        end
-       return origin.send(reply);
+       origin.send(reply);
+       return true;
 end
 
 function handlers.set_purge(origin, stanza, purge, service)
@@ -227,7 +242,8 @@ function handlers.set_purge(origin, stanza, purge, service)
        notify = (notify == "1") or (notify == "true");
        local reply;
        if not node then
-               return origin.send(pubsub_error_reply(stanza, "nodeid-required"));
+               origin.send(pubsub_error_reply(stanza, "nodeid-required"));
+               return true;
        end
        local ok, ret = service:purge(node, stanza.attr.from, notify);
        if ok then
@@ -235,48 +251,58 @@ function handlers.set_purge(origin, stanza, purge, service)
        else
                reply = pubsub_error_reply(stanza, ret);
        end
-       return origin.send(reply);
+       origin.send(reply);
+       return true;
 end
 
 function handlers.get_configure(origin, stanza, config, service)
        local node = config.attr.node;
        if not node then
-               return origin.send(pubsub_error_reply(stanza, "nodeid-required"));
+               origin.send(pubsub_error_reply(stanza, "nodeid-required"));
+               return true;
        end
 
        if not service:may(node, stanza.attr.from, "configure") then
-               return origin.send(pubsub_error_reply(stanza, "forbidden"));
+               origin.send(pubsub_error_reply(stanza, "forbidden"));
+               return true;
        end
 
        local node_obj = service.nodes[node];
        if not node_obj then
-               return origin.send(pubsub_error_reply(stanza, "item-not-found"));
+               origin.send(pubsub_error_reply(stanza, "item-not-found"));
+               return true;
        end
 
        local reply = st.reply(stanza)
                :tag("pubsub", { xmlns = xmlns_pubsub_owner })
                        :tag("configure", { node = node })
                                :add_child(node_config_form:form(node_obj.config));
-       return origin.send(reply);
+       origin.send(reply);
+       return true;
 end
 
 function handlers.set_configure(origin, stanza, config, service)
        local node = config.attr.node;
        if not node then
-               return origin.send(pubsub_error_reply(stanza, "nodeid-required"));
+               origin.send(pubsub_error_reply(stanza, "nodeid-required"));
+               return true;
        end
        if not service:may(node, stanza.attr.from, "configure") then
-               return origin.send(pubsub_error_reply(stanza, "forbidden"));
+               origin.send(pubsub_error_reply(stanza, "forbidden"));
+               return true;
        end
        local new_config, err = node_config_form:data(config.tags[1]);
        if not new_config then
-               return origin.send(st.error_reply(stanza, "modify", "bad-request", err));
+               origin.send(st.error_reply(stanza, "modify", "bad-request", err));
+               return true;
        end
        local ok, err = service:set_node_config(node, stanza.attr.from, new_config);
        if not ok then
-               return origin.send(pubsub_error_reply(stanza, err));
+               origin.send(pubsub_error_reply(stanza, err));
+               return true;
        end
-       return origin.send(st.reply(stanza));
+       origin.send(st.reply(stanza));
+       return true;
 end
 
 function handlers.get_default(origin, stanza, default, service)
@@ -284,7 +310,8 @@ function handlers.get_default(origin, stanza, default, service)
                :tag("pubsub", { xmlns = xmlns_pubsub_owner })
                        :tag("default")
                                :add_child(node_config_form:form(service.node_defaults));
-       return origin.send(reply);
+       origin.send(reply);
+       return true;
 end
 
 return _M;