# HG changeset patch # User Florian Zeitz # Date 1268360149 -3600 # Node ID b4f9518d5a00f14fdc2f807f77c8bbcdb1e86e4a # Parent 445efff314c4b8ffc6b57e663751444d7b244ca8 mod_adhoc_cmd_admin: "Get User Roster" command (with not very good™ XML formatting for now) diff -r 445efff314c4 -r b4f9518d5a00 mod_adhoc_cmd_admin/mod_adhoc_cmd_admin.lua --- a/mod_adhoc_cmd_admin/mod_adhoc_cmd_admin.lua Thu Mar 11 10:18:27 2010 +0100 +++ b/mod_adhoc_cmd_admin/mod_adhoc_cmd_admin.lua Fri Mar 12 03:15:49 2010 +0100 @@ -16,6 +16,8 @@ local usermanager_create_user = require "core.usermanager".create_user; local is_admin = require "core.usermanager".is_admin; +local rm_load_roster = require "core.rostermanager".load_roster; + local st, jid, uuid = require "util.stanza", require "util.jid", require "util.uuid"; local timer_add_task = require "util.timer".add_task; local dataforms_new = require "util.dataforms".new; @@ -71,6 +73,17 @@ { name = "password", type = "text-single", label = "Password" }; }; +local get_user_roster_layout = dataforms_new{ + { name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/admin" }; + { name = "accountjid", type = "jid-single", label = "The Jabber ID for which to retrieve the roster" }; +}; + +local get_user_roster_result_layout = dataforms_new{ + { name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/admin" }; + { name = "accountjid", type = "jid-single", label = "This is the roster for" }; + { name = "roster", type = "text-multi", label = "Roster XML" }; +}; + local get_online_users_layout = dataforms_new{ title = "Getting List of Online Users"; instructions = "How many users should be returned at most?"; @@ -236,6 +249,47 @@ end end +function get_user_roster_handler(self, data, state) + if state then + if data.action == "cancel" then + return { status = "canceled" }; + end + + local fields = add_user_layout:data(data.form); + + local user, host, resource = jid.split(fields.accountjid); + if not usermanager_user_exists(user, host) then + return { status = "error", error = { type = "cancel", condition = "item-not-found", message = "User does not exist" } }; + end + local roster = rm_load_roster(user, host); + + local query = st.stanza("query", { xmlns = "jabber:iq:roster" }); + for jid in pairs(roster) do + if jid ~= "pending" and jid then + query:tag("item", { + jid = jid, + subscription = roster[jid].subscription, + ask = roster[jid].ask, + name = roster[jid].name, + }); + for group in pairs(roster[jid].groups) do + query:tag("group"):text(group):up(); + end + query:up(); + end + end + + local query_text = query:__tostring(); -- TODO: Use upcoming pretty_print() function + query_text = query_text:gsub("><", ">\n<"); + + local result = get_user_roster_result_layout:form({ accountjid = user.."@"..host, roster = query_text }, "result"); + result:add_child(query); + return { status = "completed", other = result }; + else + return { status = "executing", form = get_user_roster_layout }, "executing"; + end +end + function get_online_users_command_handler(self, data, state) if state then if data.action == "cancel" then @@ -336,6 +390,7 @@ local delete_user_desc = adhoc_new("Delete User", "http://jabber.org/protocol/admin#delete-user", delete_user_command_handler, "admin"); local end_user_session_desc = adhoc_new("End User Session", "http://jabber.org/protocol/admin#end-user-session", end_user_session_handler, "admin"); local get_user_password_desc = adhoc_new("Get User Password", "http://jabber.org/protocol/admin#get-user-password", get_user_password_handler, "admin"); +local get_user_roster_desc = adhoc_new("Get User Roster","http://jabber.org/protocol/admin#get-user-roster", get_user_roster_handler, "admin"); local get_online_users_desc = adhoc_new("Get List of Online Users", "http://jabber.org/protocol/admin#get-online-users", get_online_users_command_handler, "admin"); local shut_down_service_desc = adhoc_new("Shut Down Service", "http://jabber.org/protocol/admin#shutdown", shut_down_service_handler, "admin"); @@ -345,5 +400,6 @@ module:add_item("adhoc", delete_user_desc); module:add_item("adhoc", end_user_session_desc); module:add_item("adhoc", get_user_password_desc); +module:add_item("adhoc", get_user_roster_desc); module:add_item("adhoc", get_online_users_desc); module:add_item("adhoc", shut_down_service_desc);