# HG changeset patch # User Matthew Wild # Date 1335638917 -3600 # Node ID 9591315b98ae11e39fe3a56544f7aadf3bba2cd8 # Parent ceac1a0e74ea72871fa983c9c07affa5e056b6fd mod_adhoc: Remove diff -r ceac1a0e74ea -r 9591315b98ae mod_adhoc/adhoc/adhoc.lib.lua --- 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; diff -r ceac1a0e74ea -r 9591315b98ae mod_adhoc/adhoc/mod_adhoc.lua --- 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