Software / code / prosody
File
plugins/adhoc/mod_adhoc.lua @ 5915:e6fed1d80116
Back out 1b0ac7950129, as SSLv3 appears to still be in moderate use on the network. Also, although obsolete, SSLv3 isn't documented to have any weaknesses that TLS 1.0 (the most common version used today) doesn't also have. Get your act together clients!
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Tue, 12 Nov 2013 02:13:01 +0000 |
| parent | 4926:58714123f600 |
| child | 5760:e599d9a367cf |
line wrap: on
line source
-- Copyright (C) 2009 Thilo Cestonaro -- Copyright (C) 2009-2011 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 local privileged = 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 local admin = is_admin(stanza.attr.from, stanza.attr.to); local global_admin = is_admin(stanza.attr.from); 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 admin) or (command.permission == "global_admin" and global_admin) 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 local admin = is_admin(stanza.attr.from, stanza.attr.to); local global_admin = is_admin(stanza.attr.from); if (commands[node].permission == "admin" and not admin) or (commands[node].permission == "global_admin" and not global_admin) 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 adhoc_added(event) local item = event.item; commands[item.node] = item; end local function adhoc_removed(event) commands[event.item.node] = nil; end module:handle_items("adhoc", adhoc_added, adhoc_removed); module:handle_items("adhoc-provider", adhoc_added, adhoc_removed);