--- a/mod_adhoc/adhoc/adhoc.lib.lua Sat Apr 28 19:47:17 2012 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,85 +0,0 @@
--- Copyright (C) 2009-2010 Florian Zeitz
---
--- This file is MIT/X11 licensed. Please see the
--- COPYING file in the source package for more information.
---
-
-local st, uuid = require "util.stanza", require "util.uuid";
-
-local xmlns_cmd = "http://jabber.org/protocol/commands";
-
-local states = {}
-
-local _M = {};
-
-function _cmdtag(desc, status, sessionid, action)
- local cmd = st.stanza("command", { xmlns = xmlns_cmd, node = desc.node, status = status });
- if sessionid then cmd.attr.sessionid = sessionid; end
- if action then cmd.attr.action = action; end
-
- return cmd;
-end
-
-function _M.new(name, node, handler, permission)
- return { name = name, node = node, handler = handler, cmdtag = _cmdtag, permission = (permission or "user") };
-end
-
-function _M.handle_cmd(command, origin, stanza)
- local sessionid = stanza.tags[1].attr.sessionid or uuid.generate();
- local dataIn = {};
- dataIn.to = stanza.attr.to;
- dataIn.from = stanza.attr.from;
- dataIn.action = stanza.tags[1].attr.action or "execute";
- dataIn.form = stanza.tags[1]:child_with_ns("jabber:x:data");
-
- local data, state = command:handler(dataIn, states[sessionid]);
- states[sessionid] = state;
- local stanza = st.reply(stanza);
- if data.status == "completed" then
- states[sessionid] = nil;
- cmdtag = command:cmdtag("completed", sessionid);
- elseif data.status == "canceled" then
- states[sessionid] = nil;
- cmdtag = command:cmdtag("canceled", sessionid);
- elseif data.status == "error" then
- states[sessionid] = nil;
- stanza = st.error_reply(stanza, data.error.type, data.error.condition, data.error.message);
- origin.send(stanza);
- return true;
- else
- cmdtag = command:cmdtag("executing", sessionid);
- end
-
- for name, content in pairs(data) do
- if name == "info" then
- cmdtag:tag("note", {type="info"}):text(content):up();
- elseif name == "warn" then
- cmdtag:tag("note", {type="warn"}):text(content):up();
- elseif name == "error" then
- cmdtag:tag("note", {type="error"}):text(content.message):up();
- elseif name =="actions" then
- local actions = st.stanza("actions");
- for _, action in ipairs(content) do
- if (action == "prev") or (action == "next") or (action == "complete") then
- actions:tag(action):up();
- else
- module:log("error", 'Command "'..command.name..
- '" at node "'..command.node..'" provided an invalid action "'..action..'"');
- end
- end
- cmdtag:add_child(actions);
- elseif name == "form" then
- cmdtag:add_child((content.layout or content):form(content.values));
- elseif name == "result" then
- cmdtag:add_child((content.layout or content):form(content.values, "result"));
- elseif name == "other" then
- cmdtag:add_child(content);
- end
- end
- stanza:add_child(cmdtag);
- origin.send(stanza);
-
- return true;
-end
-
-return _M;
--- a/mod_adhoc/adhoc/mod_adhoc.lua Sat Apr 28 19:47:17 2012 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,110 +0,0 @@
--- Copyright (C) 2009 Thilo Cestonaro
--- Copyright (C) 2009-2010 Florian Zeitz
---
--- This file is MIT/X11 licensed. Please see the
--- COPYING file in the source package for more information.
---
-
-local st = require "util.stanza";
-local is_admin = require "core.usermanager".is_admin;
-local adhoc_handle_cmd = module:require "adhoc".handle_cmd;
-local xmlns_cmd = "http://jabber.org/protocol/commands";
-local xmlns_disco = "http://jabber.org/protocol/disco";
-local commands = {};
-
-module:add_feature(xmlns_cmd);
-
-module:hook("iq/host/"..xmlns_disco.."#info:query", function (event)
- local origin, stanza = event.origin, event.stanza;
- local node = stanza.tags[1].attr.node;
- if stanza.attr.type == "get" and node then
- if commands[node] then
- -- Required for Prosody <= 0.7
- local privileged = is_admin(stanza.attr.from)
- or is_admin(stanza.attr.from, stanza.attr.to);
- if (commands[node].permission == "admin" and privileged)
- or (commands[node].permission == "user") then
- reply = st.reply(stanza);
- reply:tag("query", { xmlns = xmlns_disco.."#info",
- node = node });
- reply:tag("identity", { name = commands[node].name,
- category = "automation", type = "command-node" }):up();
- reply:tag("feature", { var = xmlns_cmd }):up();
- reply:tag("feature", { var = "jabber:x:data" }):up();
- else
- reply = st.error_reply(stanza, "auth", "forbidden", "This item is not available to you");
- end
- origin.send(reply);
- return true;
- elseif node == xmlns_cmd then
- reply = st.reply(stanza);
- reply:tag("query", { xmlns = xmlns_disco.."#info",
- node = node });
- reply:tag("identity", { name = "Ad-Hoc Commands",
- category = "automation", type = "command-list" }):up();
- origin.send(reply);
- return true;
- end
- end
-end);
-
-module:hook("iq/host/"..xmlns_disco.."#items:query", function (event)
- local origin, stanza = event.origin, event.stanza;
- if stanza.attr.type == "get" and stanza.tags[1].attr.node
- and stanza.tags[1].attr.node == xmlns_cmd then
- -- Required for Prosody <= 0.7
- local privileged = is_admin(stanza.attr.from)
- or is_admin(stanza.attr.from, stanza.attr.to);
- reply = st.reply(stanza);
- reply:tag("query", { xmlns = xmlns_disco.."#items",
- node = xmlns_cmd });
- for node, command in pairs(commands) do
- if (command.permission == "admin" and privileged)
- or (command.permission == "user") then
- reply:tag("item", { name = command.name,
- node = node, jid = module:get_host() });
- reply:up();
- end
- end
- origin.send(reply);
- return true;
- end
-end, 500);
-
-module:hook("iq/host/"..xmlns_cmd..":command", function (event)
- local origin, stanza = event.origin, event.stanza;
- if stanza.attr.type == "set" then
- local node = stanza.tags[1].attr.node
- if commands[node] then
- -- Required for Prosody <= 0.7
- local privileged = is_admin(event.stanza.attr.from)
- or is_admin(stanza.attr.from, stanza.attr.to);
- if commands[node].permission == "admin"
- and not privileged then
- origin.send(st.error_reply(stanza, "auth", "forbidden", "You don't have permission to execute this command"):up()
- :add_child(commands[node]:cmdtag("canceled")
- :tag("note", {type="error"}):text("You don't have permission to execute this command")));
- return true
- end
- -- User has permission now execute the command
- return adhoc_handle_cmd(commands[node], origin, stanza);
- end
- end
-end, 500);
-
-local function handle_item_added(item)
- commands[item.node] = item;
-end
-
-module:hook("item-added/adhoc", function (event)
- return handle_item_added(event.item);
-end, 500);
-
-module:hook("item-removed/adhoc", function (event)
- commands[event.item.node] = nil;
-end, 500);
-
--- Pick up any items that are already added
-for _, item in ipairs(module:get_host_items("adhoc")) do
- handle_item_added(item);
-end