Mercurial > prosody-modules
comparison mod_adhoc_cmd_admin/mod_adhoc_cmd_admin.lua @ 124:843cadf36306
mod_adhoc*: Move state handling to mod_adhoc itself
| author | Florian Zeitz <florob@babelmonkeys.de> |
|---|---|
| date | Sat, 23 Jan 2010 04:43:28 +0100 |
| parents | c04443ea114c |
| children | bdd1641c159d |
comparison
equal
deleted
inserted
replaced
| 123:c04443ea114c | 124:843cadf36306 |
|---|---|
| 19 local st, jid, uuid = require "util.stanza", require "util.jid", require "util.uuid"; | 19 local st, jid, uuid = require "util.stanza", require "util.jid", require "util.uuid"; |
| 20 local dataforms_new = require "util.dataforms".new; | 20 local dataforms_new = require "util.dataforms".new; |
| 21 module:log("debug", module:get_name()); | 21 module:log("debug", module:get_name()); |
| 22 local adhoc_new = module:require "adhoc".new; | 22 local adhoc_new = module:require "adhoc".new; |
| 23 | 23 |
| 24 local sessions = {}; | |
| 25 | |
| 26 local add_user_layout = dataforms_new{ | 24 local add_user_layout = dataforms_new{ |
| 27 title = "Adding a User"; | 25 title = "Adding a User"; |
| 28 instructions = "Fill out this form to add a user."; | 26 instructions = "Fill out this form to add a user."; |
| 29 | 27 |
| 30 { name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/admin" }; | 28 { name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/admin" }; |
| 85 { name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/admin" }; | 83 { name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/admin" }; |
| 86 { name = "subject", type = "text-single", label = "Subject" }; | 84 { name = "subject", type = "text-single", label = "Subject" }; |
| 87 { name = "announcement", type = "text-multi", required = true, label = "Announcement" }; | 85 { name = "announcement", type = "text-multi", required = true, label = "Announcement" }; |
| 88 }; | 86 }; |
| 89 | 87 |
| 90 function add_user_command_handler(self, data, sessid) | 88 function add_user_command_handler(self, data, state) |
| 91 if sessid and sessions[sessid] then | 89 if state then |
| 92 if data.action == "cancel" then | 90 if data.action == "cancel" then |
| 93 sessions[sessid] = nil; | 91 return { status = "canceled" }; |
| 94 return { status = "canceled" }, sessid; | |
| 95 end | 92 end |
| 96 local fields = add_user_layout:data(data.form); | 93 local fields = add_user_layout:data(data.form); |
| 97 local username, host, resource = jid.split(fields.accountjid); | 94 local username, host, resource = jid.split(fields.accountjid); |
| 98 if (fields["password"] == fields["password-verify"]) and username and host and host == data.to then | 95 if (fields["password"] == fields["password-verify"]) and username and host and host == data.to then |
| 99 if usermanager_user_exists(username, host) then | 96 if usermanager_user_exists(username, host) then |
| 100 sessions[sessid] = nil; | 97 return { status = "error", error = { type = "cancel", condition = "conflict", message = "Account already exists" } }; |
| 101 return { status = "error", error = { type = "cancel", condition = "conflict", message = "Account already exists" } }, sessid; | |
| 102 else | 98 else |
| 103 if usermanager_create_user(username, fields.password, host) then | 99 if usermanager_create_user(username, fields.password, host) then |
| 104 sessions[sessid] = nil; | |
| 105 module:log("info", "Created new account " .. username.."@"..host); | 100 module:log("info", "Created new account " .. username.."@"..host); |
| 106 return { status = "completed", info = "Account successfully created" }, sessid; | 101 return { status = "completed", info = "Account successfully created" }; |
| 107 else | 102 else |
| 108 sessions[sessid] = nil; | |
| 109 return { status = "error", error = { type = "wait", condition = "internal-server-error", | 103 return { status = "error", error = { type = "wait", condition = "internal-server-error", |
| 110 message = "Failed to write data to disk" } }, sessid; | 104 message = "Failed to write data to disk" } }; |
| 111 end | 105 end |
| 112 end | 106 end |
| 113 else | 107 else |
| 114 module:log("debug", fields.accountjid .. " " .. fields.password .. " " .. fields["password-verify"]); | 108 module:log("debug", fields.accountjid .. " " .. fields.password .. " " .. fields["password-verify"]); |
| 115 sessions[sessid] = nil; | |
| 116 return { status = "error", error = { type = "cancel", condition = "conflict", | 109 return { status = "error", error = { type = "cancel", condition = "conflict", |
| 117 message = "Invalid data.\nPassword mismatch, or empty username" } }, sessid; | 110 message = "Invalid data.\nPassword mismatch, or empty username" } }; |
| 118 end | 111 end |
| 119 else | 112 else |
| 120 local sessionid=uuid.generate(); | 113 return { status = "executing", form = add_user_layout }, "executing"; |
| 121 sessions[sessionid] = "executing"; | 114 end |
| 122 return { status = "executing", form = add_user_layout }, sessionid; | 115 end |
| 123 end | 116 |
| 124 end | 117 function change_user_password_command_handler(self, data, state) |
| 125 | 118 if state then |
| 126 function change_user_password_command_handler(self, data, sessid) | 119 if data.action == "cancel" then |
| 127 if sessid and sessions[sessid] then | 120 return { status = "canceled" }; |
| 128 if data.action == "cancel" then | |
| 129 sessions[sessid] = nil; | |
| 130 return { status = "canceled" }, sessid; | |
| 131 end | 121 end |
| 132 local fields = change_user_password_layout:data(data.form); | 122 local fields = change_user_password_layout:data(data.form); |
| 133 local username, host, resource = jid.split(fields.accountjid); | 123 local username, host, resource = jid.split(fields.accountjid); |
| 134 if usermanager_user_exists(username, host) and usermanager_create_user(username, fields.password, host) then | 124 if usermanager_user_exists(username, host) and usermanager_create_user(username, fields.password, host) then |
| 135 return { status = "completed", info = "Password successfully changed" }, sessid; | 125 return { status = "completed", info = "Password successfully changed" }; |
| 136 else | 126 else |
| 137 sessions[sessid] = nil; | 127 return { status = "error", error = { type = "cancel", condition = "item-not-found", message = "User does not exist" } }; |
| 138 return { status = "error", error = { type = "cancel", condition = "item-not-found", message = "User does not exist" } }, sessid; | 128 end |
| 139 end | 129 else |
| 140 sessions[sessid] = nil; | 130 return { status = "executing", form = change_user_password_layout }, "executing"; |
| 141 return { status = "canceled" }, sessid; | 131 end |
| 142 else | 132 end |
| 143 local sessionid=uuid.generate(); | 133 |
| 144 sessions[sessionid] = "executing"; | 134 function delete_user_command_handler(self, data, state) |
| 145 return { status = "executing", form = change_user_password_layout }, sessionid; | 135 if state then |
| 146 end | 136 if data.action == "cancel" then |
| 147 end | 137 return { status = "canceled" }; |
| 148 | |
| 149 function delete_user_command_handler(self, data, sessid) | |
| 150 if sessid and sessions[sessid] then | |
| 151 if data.action == "cancel" then | |
| 152 sessions[sessid] = nil; | |
| 153 return { status = "canceled" }, sessid; | |
| 154 end | 138 end |
| 155 local fields = delete_user_layout:data(data.form); | 139 local fields = delete_user_layout:data(data.form); |
| 156 local failed = {}; | 140 local failed = {}; |
| 157 local succeeded = {}; | 141 local succeeded = {}; |
| 158 for _, aJID in ipairs(fields.accountjids) do | 142 for _, aJID in ipairs(fields.accountjids) do |
| 163 else | 147 else |
| 164 module:log("debug", "Tried to delete non-existant user "..aJID); | 148 module:log("debug", "Tried to delete non-existant user "..aJID); |
| 165 failed[#failed+1] = aJID; | 149 failed[#failed+1] = aJID; |
| 166 end | 150 end |
| 167 end | 151 end |
| 168 sessions[sessid] = nil; | |
| 169 return {status = "completed", info = (#succeeded ~= 0 and | 152 return {status = "completed", info = (#succeeded ~= 0 and |
| 170 "The following accounts were successfully deleted:\n"..t_concat(succeeded, "\n").."\n" or "").. | 153 "The following accounts were successfully deleted:\n"..t_concat(succeeded, "\n").."\n" or "").. |
| 171 (#failed ~= 0 and | 154 (#failed ~= 0 and |
| 172 "The following accounts could not be deleted:\n"..t_concat(failed, "\n") or "") }, sessid; | 155 "The following accounts could not be deleted:\n"..t_concat(failed, "\n") or "") }; |
| 173 else | 156 else |
| 174 local sessionid=uuid.generate(); | 157 return { status = "executing", form = delete_user_layout }, "executing"; |
| 175 sessions[sessionid] = "executing"; | 158 end |
| 176 return { status = "executing", form = delete_user_layout }, sessionid; | 159 end |
| 177 end | 160 |
| 178 end | 161 function get_user_password_handler(self, data, state) |
| 179 | 162 if state then |
| 180 function get_user_password_handler(self, data, sessid) | 163 if data.action == "cancel" then |
| 181 if sessid and sessions[sessid] then | 164 return { status = "canceled" }; |
| 182 if data.action == "cancel" then | |
| 183 sessions[sessid] = nil; | |
| 184 return { status = "canceled" }, sessid; | |
| 185 end | 165 end |
| 186 local fields = get_user_password_layout:data(data.form); | 166 local fields = get_user_password_layout:data(data.form); |
| 187 local user, host, resource = jid.split(fields.accountjid); | 167 local user, host, resource = jid.split(fields.accountjid); |
| 188 local accountjid = ""; | 168 local accountjid = ""; |
| 189 local password = ""; | 169 local password = ""; |
| 190 if usermanager_user_exists(user, host) then | 170 if usermanager_user_exists(user, host) then |
| 191 accountjid = fields.accountjid; | 171 accountjid = fields.accountjid; |
| 192 password = usermanager_get_password(user, host); | 172 password = usermanager_get_password(user, host); |
| 193 else | 173 else |
| 194 sessions[sessid] = nil; | 174 return { status = "error", error = { type = "cancel", condition = "item-not-found", message = "User does not exist" } }; |
| 195 return { status = "error", error = { type = "cancel", condition = "item-not-found", message = "User does not exist" } }, sessid; | 175 end |
| 196 end | 176 return { status = "completed", result = { layout = get_user_password_result_layout, data = {accountjid = accountjid, password = password} } }; |
| 197 sessions[sessid] = nil; | 177 else |
| 198 return { status = "completed", result = { layout = get_user_password_result_layout, data = {accountjid = accountjid, password = password} } }, sessid; | 178 return { status = "executing", form = get_user_password_layout }, "executing"; |
| 199 else | 179 end |
| 200 local sessionid=uuid.generate(); | 180 end |
| 201 sessions[sessionid] = "executing"; | 181 |
| 202 return { status = "executing", form = get_user_password_layout }, sessionid; | 182 function get_online_users_command_handler(self, data, state) |
| 203 end | 183 if state then |
| 204 end | 184 if data.action == "cancel" then |
| 205 | 185 return { status = "canceled" }; |
| 206 function get_online_users_command_handler(self, data, sessid) | |
| 207 if sessid and sessions[sessid] then | |
| 208 if data.action == "cancel" then | |
| 209 sessions[sessid] = nil; | |
| 210 return { status = "canceled" }, sessid; | |
| 211 end | 186 end |
| 212 | 187 |
| 213 local fields = add_user_layout:data(data.form); | 188 local fields = add_user_layout:data(data.form); |
| 214 | 189 |
| 215 local max_items = nil | 190 local max_items = nil |
| 223 break; | 198 break; |
| 224 end | 199 end |
| 225 users = ((users and users.."\n") or "")..(username.."@"..data.to); | 200 users = ((users and users.."\n") or "")..(username.."@"..data.to); |
| 226 count = count + 1; | 201 count = count + 1; |
| 227 end | 202 end |
| 228 sessions[sessid] = nil; | 203 return { status = "completed", result = {layout = get_online_users_result_layout, data = {onlineuserjids=users}} }; |
| 229 return { status = "completed", result = {layout = get_online_users_result_layout, data = {onlineuserjids=users}} }, sessid; | 204 else |
| 230 else | 205 return { status = "executing", form = get_online_users_layout }, "executing"; |
| 231 local sessionid=uuid.generate(); | 206 end |
| 232 sessions[sessionid] = "executing"; | 207 end |
| 233 return { status = "executing", form = get_online_users_layout }, sessionid; | 208 |
| 234 end | 209 function announce_handler(self, data, state) |
| 235 end | 210 if state then |
| 236 | 211 if data.action == "cancel" then |
| 237 function announce_handler(self, data, sessid) | 212 return { status = "canceled" }; |
| 238 if sessid and sessions[sessid] then | |
| 239 if data.action == "cancel" then | |
| 240 sessions[sessid] = nil; | |
| 241 return { status = "canceled" }, sessid; | |
| 242 end | 213 end |
| 243 | 214 |
| 244 local fields = announce_layout:data(data.form); | 215 local fields = announce_layout:data(data.form); |
| 245 | 216 |
| 246 module:log("info", "Sending server announcement to all online users"); | 217 module:log("info", "Sending server announcement to all online users"); |
| 254 message.attr.to = user.."@"..data.to; | 225 message.attr.to = user.."@"..data.to; |
| 255 core_post_stanza(host_session, message); | 226 core_post_stanza(host_session, message); |
| 256 end | 227 end |
| 257 | 228 |
| 258 module:log("info", "Announcement sent to %d online users", c); | 229 module:log("info", "Announcement sent to %d online users", c); |
| 259 sessions[sessid] = nil; | 230 return { status = "completed", info = "Announcement sent." }; |
| 260 return { status = "completed", info = "Announcement sent." }, sessid; | 231 else |
| 261 else | 232 return { status = "executing", form = announce_layout }, "executing"; |
| 262 local sessionid=uuid.generate(); | |
| 263 sessions[sessionid] = "executing"; | |
| 264 return { status = "executing", form = announce_layout }, sessionid; | |
| 265 end | 233 end |
| 266 | 234 |
| 267 return true; | 235 return true; |
| 268 end | 236 end |
| 269 | 237 |
