--- a/mod_adhoc_cmd_admin/mod_adhoc_cmd_admin.lua Fri Jan 15 10:17:57 2010 +0100
+++ b/mod_adhoc_cmd_admin/mod_adhoc_cmd_admin.lua Fri Jan 22 04:25:58 2010 +0100
@@ -18,6 +18,7 @@
local st, jid, uuid = require "util.stanza", require "util.jid", require "util.uuid";
local dataforms_new = require "util.dataforms".new;
+module:log("debug", module:get_name());
local adhoc_new = module:require "adhoc".new;
local sessions = {};
@@ -75,129 +76,103 @@
{ name = "announcement", type = "text-multi", required = true, label = "Announcement" };
};
-function add_user_command_handler(item, origin, stanza)
- if stanza.tags[1].attr.sessionid and sessions[stanza.tags[1].attr.sessionid] then
- if stanza.tags[1].attr.action == "cancel" then
- origin.send(st.reply(stanza):add_child(item:cmdtag("canceled", stanza.tags[1].attr.sessionid)));
- sessions[stanza.tags[1].attr.sessionid] = nil;
- return true;
+function add_user_command_handler(self, data, sessid)
+ if sessid and sessions[sessid] then
+ if data.action == "cancel" then
+ sessions[sessid] = nil;
+ return { status = "canceled" }, sessid;
end
- local form = stanza.tags[1]:child_with_ns("jabber:x:data");
- local fields = add_user_layout:data(form);
+ local fields = add_user_layout:data(data.form);
local username, host, resource = jid.split(fields.accountjid);
- if (fields["password"] == fields["password-verify"]) and username and host and host == stanza.attr.to then
+ if (fields["password"] == fields["password-verify"]) and username and host and host == data.to then
if usermanager_user_exists(username, host) then
- origin.send(st.error_reply(stanza, "cancel", "conflict", "Account already exists"):up()
- :add_child(item:cmdtag("canceled", stanza.tags[1].attr.sessionid)
- :tag("note", {type="error"}):text("Account already exists")));
- sessions[stanza.tags[1].attr.sessionid] = nil;
- return true;
+ sessions[sessid] = nil;
+ return { status = "error", error = { type = "cancel", condition = "conflict", message = "Account already exists" } }, sessid;
else
if usermanager_create_user(username, fields.password, host) then
- origin.send(st.reply(stanza):add_child(item:cmdtag("completed", stanza.tags[1].attr.sessionid)
- :tag("note", {type="info"}):text("Account successfully created")));
- sessions[stanza.tags[1].attr.sessionid] = nil;
- module:log("debug", "Created new account " .. username.."@"..host);
- return true;
+ sessions[sessid] = nil;
+ module:log("info", "Created new account " .. username.."@"..host);
+ return { status = "completed", info = "Account successfully created" }, sessid;
else
- origin.send(st.error_reply(stanza, "wait", "internal-server-error",
- "Failed to write data to disk"):up()
- :add_child(item:cmdtag("canceled", stanza.tags[1].attr.sessionid)
- :tag("note", {type="error"}):text("Failed to write data to disk")));
- sessions[stanza.tags[1].attr.sessionid] = nil;
- return true;
+ sessions[sessid] = nil;
+ return { status = "error", error = { type = "wait", condition = "internal-server-error",
+ message = "Failed to write data to disk" } }, sessid;
end
end
else
module:log("debug", fields.accountjid .. " " .. fields.password .. " " .. fields["password-verify"]);
- origin.send(st.error_reply(stanza, "cancel", "conflict",
- "Invalid data.\nPassword mismatch, or empty username"):up()
- :add_child(item:cmdtag("canceled", stanza.tags[1].attr.sessionid)
- :tag("note", {type="error"}):text("Invalid data.\nPassword mismatch, or empty username")));
- sessions[stanza.tags[1].attr.sessionid] = nil;
- return true;
+ sessions[sessid] = nil;
+ return { status = "error", error = { type = "cancel", condition = "conflict",
+ message = "Invalid data.\nPassword mismatch, or empty username" } }, sessid;
end
else
local sessionid=uuid.generate();
sessions[sessionid] = "executing";
- origin.send(st.reply(stanza):add_child(item:cmdtag("executing", sessionid):add_child(add_user_layout:form())));
+ return { status = "executing", form = add_user_layout }, sessionid;
end
- return true;
end
-function change_user_password_command_handler(item, origin, stanza)
- if stanza.tags[1].attr.sessionid and sessions[stanza.tags[1].attr.sessionid] then
- if stanza.tags[1].attr.action == "cancel" then
- origin.send(st.reply(stanza):add_child(item:cmdtag("canceled", stanza.tags[1].attr.sessionid)));
- sessions[stanza.tags[1].attr.sessionid] = nil;
- return true;
+function change_user_password_command_handler(self, data, sessid)
+ if sessid and sessions[sessid] then
+ if data.action == "cancel" then
+ sessions[sessid] = nil;
+ return { status = "canceled" }, sessid;
end
- local form = stanza.tags[1]:child_with_ns("jabber:x:data");
- local fields = change_user_password_layout:data(form);
+ local fields = change_user_password_layout:data(data.form);
local username, host, resource = jid.split(fields.accountjid);
if usermanager_user_exists(username, host) and usermanager_create_user(username, fields.password, host) then
- origin.send(st.reply(stanza):add_child(item:cmdtag("completed", stanza.tags[1].attr.sessionid)
- :tag("note", {type="info"})
- :text("Password successfully changed")));
+ return { status = "completed", info = "Password successfully changed" }, sessid;
else
- origin.send(st.error_reply(stanza, "cancel", "item-not-found", "User does not exist")
- :add_child(item:cmdtag("canceled", stanza.tags[1].attr.sessionid)
- :tag("note", {type="error"}):text("User does not exist")));
+ sessions[sessid] = nil;
+ return { status = "error", error = { type = "cancel", condition = "item-not-found", message = "User does not exist" } }, sessid;
end
- sessions[stanza.tags[1].attr.sessionid] = nil;
- return true;
+ sessions[sessid] = nil;
+ return { status = "canceled" }, sessid;
else
local sessionid=uuid.generate();
sessions[sessionid] = "executing";
- origin.send(st.reply(stanza):add_child(item:cmdtag("executing", sessionid):add_child(change_user_password_layout:form())));
+ return { status = "executing", form = change_user_password_layout }, sessionid;
end
- return true;
end
-function delete_user_command_handler(item, origin, stanza)
- if stanza.tags[1].attr.sessionid and sessions[stanza.tags[1].attr.sessionid] then
- if stanza.tags[1].attr.action == "cancel" then
- origin.send(st.reply(stanza):add_child(item:cmdtag("canceled", stanza.tags[1].attr.sessionid)));
- sessions[stanza.tags[1].attr.sessionid] = nil;
- return true;
+function delete_user_command_handler(self, data, sessid)
+ if sessid and sessions[sessid] then
+ if data.action == "cancel" then
+ sessions[sessid] = nil;
+ return { status = "canceled" }, sessid;
end
- local form = stanza.tags[1]:child_with_ns("jabber:x:data");
- local fields = delete_user_layout:data(form);
+ local fields = delete_user_layout:data(data.form);
local failed = {};
local succeeded = {};
for _, aJID in ipairs(fields.accountjids) do
local username, host, resource = jid.split(aJID);
if usermanager_user_exists(username, host) and usermanager_create_user(username, nil, host) then
- module:log("debug", "User" .. aJID .. "has been deleted");
+ module:log("debug", "User " .. aJID .. " has been deleted");
succeeded[#succeeded+1] = aJID;
else
- module:log("debug", "Tried to delete not existing user "..aJID);
+ module:log("debug", "Tried to delete non-existant user "..aJID);
failed[#failed+1] = aJID;
end
end
- origin.send(st.reply(stanza):add_child(item:cmdtag("completed", stanza.tags[1].attr.sessionid)
- :tag("note", {type="info"})
- :text((#succeeded ~= 0 and "The following accounts were successfully deleted:\n"..t_concat(succeeded, "\n").."\n" or "")
- ..(#failed ~= 0 and "The following accounts could not be deleted:\n"..t_concat(failed, "\n") or ""))));
- sessions[stanza.tags[1].attr.sessionid] = nil;
- return true;
+ sessions[sessid] = nil;
+ return {status = "completed", info = (#succeeded ~= 0 and
+ "The following accounts were successfully deleted:\n"..t_concat(succeeded, "\n").."\n" or "")..
+ (#failed ~= 0 and
+ "The following accounts could not be deleted:\n"..t_concat(failed, "\n") or "") }, sessid;
else
local sessionid=uuid.generate();
sessions[sessionid] = "executing";
- origin.send(st.reply(stanza):add_child(item:cmdtag("executing", sessionid):add_child(delete_user_layout:form())));
+ return { status = "executing", form = delete_user_layout }, sessionid;
end
- return true;
end
-function get_user_password_handler(item, origin, stanza)
- if stanza.tags[1].attr.sessionid and sessions[stanza.tags[1].attr.sessionid] then
- if stanza.tags[1].attr.action == "cancel" then
- origin.send(st.reply(stanza):add_child(item:cmdtag("canceled", stanza.tags[1].attr.sessionid)));
- sessions[stanza.tags[1].attr.sessionid] = nil;
- return true;
+function get_user_password_handler(self, data, sessid)
+ if sessid and sessions[sessid] then
+ if data.action == "cancel" then
+ sessions[sessid] = nil;
+ return { status = "canceled" }, sessid;
end
- local form = stanza.tags[1]:child_with_ns("jabber:x:data");
- local fields = get_user_password_layout:data(form);
+ local fields = get_user_password_layout:data(data.form);
local accountjid = st.stanza("field", {var="accountjid", label = "JID", type="jid-single"});
local password = st.stanza("field", {var="password", label = "Password", type="text-single"});
local user, host, resource = jid.split(fields.accountjid);
@@ -205,38 +180,30 @@
accountjid:tag("value"):text(fields.accountjid):up();
password:tag("value"):text(usermanager_get_password(user, host)):up();
else
- origin.send(st.error_reply(stanza, "cancel", "item-not-found", "User does not exist")
- :add_child(item:cmdtag("canceled", stanza.tags[1].attr.sessionid)
- :tag("note", {type="error"}):text("User does not exist")));
- sessions[stanza.tags[1].attr.sessionid] = nil;
- return true;
+ sessions[sessid] = nil;
+ return { status = "error", error = { type = "cancel", condition = "item-not-found", message = "User does not exist" } }, sessid;
end
- origin.send(st.reply(stanza):add_child(item:cmdtag("completed", stanza.tags[1].attr.sessionid)
- :tag("x", {xmlns="jabber:x:data", type="result"})
+ sessions[sessid] = nil;
+ return { status = "completed", other = st.stanza("x", {xmlns="jabber:x:data", type="result"})
:tag("field", {type="hidden", var="FORM_TYPE"})
:tag("value"):text("http://jabber.org/protocol/admin"):up():up()
:add_child(accountjid)
- :add_child(password)));
- sessions[stanza.tags[1].attr.sessionid] = nil;
- return true;
+ :add_child(password) }, sessid;
else
local sessionid=uuid.generate();
sessions[sessionid] = "executing";
- origin.send(st.reply(stanza):add_child(item:cmdtag("executing", sessionid):add_child(get_user_password_layout:form())));
+ return { status = "executing", form = get_user_password_layout }, sessionid;
end
- return true;
end
-function get_online_users_command_handler(item, origin, stanza)
- if stanza.tags[1].attr.sessionid and sessions[stanza.tags[1].attr.sessionid] then
- if stanza.tags[1].attr.action == "cancel" then
- origin.send(st.reply(stanza):add_child(item:cmdtag("canceled", stanza.tags[1].attr.sessionid)));
- sessions[stanza.tags[1].attr.sessionid] = nil;
- return true;
+function get_online_users_command_handler(self, data, sessid)
+ if sessid and sessions[sessid] then
+ if data.action == "cancel" then
+ sessions[sessid] = nil;
+ return { status = "canceled" }, sessid;
end
- local form = stanza.tags[1]:child_with_ns("jabber:x:data");
- local fields = add_user_layout:data(form);
+ local fields = add_user_layout:data(data.form);
local max_items = nil
if fields.max_items ~= "all" then
@@ -244,62 +211,53 @@
end
local count = 0;
local field = st.stanza("field", {label="The list of all online users", var="onlineuserjids", type="text-multi"});
- for username, user in pairs(hosts[stanza.attr.to].sessions or {}) do
+ for username, user in pairs(hosts[data.to].sessions or {}) do
if (max_items ~= nil) and (count >= max_items) then
break;
end
- field:tag("value"):text(username.."@"..stanza.attr.to):up();
+ field:tag("value"):text(username.."@"..data.to):up();
count = count + 1;
end
- origin.send(st.reply(stanza):add_child(item:cmdtag("completed", stanza.tags[1].attr.sessionid)
- :tag("x", {xmlns="jabber:x:data", type="result"})
+ sessions[sessid] = nil;
+ return { status = "completed", other = st.stanza("x", {xmlns="jabber:x:data", type="result"})
:tag("field", {type="hidden", var="FORM_TYPE"})
:tag("value"):text("http://jabber.org/protocol/admin"):up():up()
- :add_child(field)));
- sessions[stanza.tags[1].attr.sessionid] = nil;
- return true;
+ :add_child(field) }, sessid;
else
local sessionid=uuid.generate();
sessions[sessionid] = "executing";
- origin.send(st.reply(stanza):add_child(item:cmdtag("executing", sessionid):add_child(get_online_users_layout:form())));
+ return { status = "executing", form = get_online_users_layout }, sessionid;
end
-
- return true;
end
-function announce_handler(item, origin, stanza)
- if stanza.tags[1].attr.sessionid and sessions[stanza.tags[1].attr.sessionid] then
- if stanza.tags[1].attr.action == "cancel" then
- origin.send(st.reply(stanza):add_child(item:cmdtag("canceled", stanza.tags[1].attr.sessionid)));
- sessions[stanza.tags[1].attr.sessionid] = nil;
- return true;
+function announce_handler(self, data, sessid)
+ if sessid and sessions[sessid] then
+ if data.action == "cancel" then
+ sessions[sessid] = nil;
+ return { status = "canceled" }, sessid;
end
- local form = stanza.tags[1]:child_with_ns("jabber:x:data");
- local fields = add_user_layout:data(form);
+ local fields = announce_layout:data(data.form);
module:log("info", "Sending server announcement to all online users");
- local host_session = hosts[stanza.attr.to];
- local message = st.message({type = "headline", from = stanza.attr.to}, fields.announcement):up()
+ local host_session = hosts[data.to];
+ local message = st.message({type = "headline", from = data.to}, fields.announcement):up()
:tag("subject"):text(fields.subject or "Announcement");
local c = 0;
for user in pairs(host_session.sessions) do
c = c + 1;
- message.attr.to = user.."@"..stanza.attr.to;
+ message.attr.to = user.."@"..data.to;
core_post_stanza(host_session, message);
end
module:log("info", "Announcement sent to %d online users", c);
-
- origin.send(st.reply(stanza):add_child(item:cmdtag("completed", stanza.tags[1].attr.sessionid)
- :tag("note"):text("Announcement sent.")));
- sessions[stanza.tags[1].attr.sessionid] = nil;
- return true;
+ sessions[sessid] = nil;
+ return { status = "completed", info = "Announcement sent." }, sessid;
else
local sessionid=uuid.generate();
sessions[sessionid] = "executing";
- origin.send(st.reply(stanza):add_child(item:cmdtag("executing", sessionid):add_child(announce_layout:form())));
+ return { status = "executing", form = announce_layout }, sessionid;
end
return true;