Mercurial > prosody-modules
annotate mod_adhoc_cmd_admin/mod_adhoc_cmd_admin.lua @ 34:fc374b724270
mod_adhoc_cmd_admin: Define form layout only once.
author | Florian Zeitz <florob@babelmonkeys.de> |
---|---|
date | Sat, 10 Oct 2009 04:16:11 +0200 |
parents | f3225c55288f |
children | 3c49411d4aa3 |
rev | line source |
---|---|
29
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
1 -- Copyright (C) 2009 Florian Zeitz |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
2 -- |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
3 -- This file is MIT/X11 licensed. Please see the |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
4 -- COPYING file in the source package for more information. |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
5 -- |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
6 |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
7 local st, jid, uuid = require "util.stanza", require "util.jid", require "util.uuid"; |
32
00d5e133c84d
mod_adhoc_cmd_admin: switch to utils.dataforms. Thanks MattJ for making this possible ;)
Florian Zeitz <florob@babelmonkeys.de>
parents:
29
diff
changeset
|
8 local dataforms_new = require "util.dataforms".new; |
29
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
9 local usermanager_user_exists = require "core.usermanager".user_exists; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
10 local usermanager_create_user = require "core.usermanager".create_user; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
11 |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
12 local is_admin = require "core.usermanager".is_admin; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
13 local admins = set.new(config.get(module:get_host(), "core", "admins")); |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
14 |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
15 local sessions = {}; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
16 |
34
fc374b724270
mod_adhoc_cmd_admin: Define form layout only once.
Florian Zeitz <florob@babelmonkeys.de>
parents:
33
diff
changeset
|
17 local add_user_layout = { |
fc374b724270
mod_adhoc_cmd_admin: Define form layout only once.
Florian Zeitz <florob@babelmonkeys.de>
parents:
33
diff
changeset
|
18 title= "Adding a User"; |
fc374b724270
mod_adhoc_cmd_admin: Define form layout only once.
Florian Zeitz <florob@babelmonkeys.de>
parents:
33
diff
changeset
|
19 instructions = "Fill out this form to add a user."; |
fc374b724270
mod_adhoc_cmd_admin: Define form layout only once.
Florian Zeitz <florob@babelmonkeys.de>
parents:
33
diff
changeset
|
20 |
fc374b724270
mod_adhoc_cmd_admin: Define form layout only once.
Florian Zeitz <florob@babelmonkeys.de>
parents:
33
diff
changeset
|
21 { name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/admin" }; |
fc374b724270
mod_adhoc_cmd_admin: Define form layout only once.
Florian Zeitz <florob@babelmonkeys.de>
parents:
33
diff
changeset
|
22 { name = "accountjid", type = "jid-single", required = true, label = "The Jabber ID for the account to be added" }; |
fc374b724270
mod_adhoc_cmd_admin: Define form layout only once.
Florian Zeitz <florob@babelmonkeys.de>
parents:
33
diff
changeset
|
23 { name = "password", type = "text-private", label = "The password for this account" }; |
fc374b724270
mod_adhoc_cmd_admin: Define form layout only once.
Florian Zeitz <florob@babelmonkeys.de>
parents:
33
diff
changeset
|
24 { name = "password-verify", type = "text-private", label = "Retype password" }; |
fc374b724270
mod_adhoc_cmd_admin: Define form layout only once.
Florian Zeitz <florob@babelmonkeys.de>
parents:
33
diff
changeset
|
25 }; |
fc374b724270
mod_adhoc_cmd_admin: Define form layout only once.
Florian Zeitz <florob@babelmonkeys.de>
parents:
33
diff
changeset
|
26 dataforms_new(add_user_layout) |
fc374b724270
mod_adhoc_cmd_admin: Define form layout only once.
Florian Zeitz <florob@babelmonkeys.de>
parents:
33
diff
changeset
|
27 |
29
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
28 function add_user_command_handler(item, origin, stanza) |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
29 if not is_admin(stanza.attr.from) then |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
30 module:log("warn", "Non-admin %s tried to add a user", tostring(jid.bare(stanza.attr.from))); |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
31 origin.send(st.error_reply(stanza, "auth", "forbidden", "You don't have permission to add a user"):up() |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
32 :tag("command", {xmlns="http://jabber.org/protocol/commands", |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
33 node="http://jabber.org/protocol/admin#add-user", status="canceled"}) |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
34 :tag("note", {type="error"}):text("You don't have permission to add a user")); |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
35 return true; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
36 end |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
37 if stanza.tags[1].attr.sessionid and sessions[stanza.tags[1].attr.sessionid] then |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
38 if stanza.tags[1].attr.action == "cancel" then |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
39 origin.send(st.reply(stanza):tag("command", {xmlns="http://jabber.org/protocol/commands", |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
40 node="http://jabber.org/protocol/admin#add-user", |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
41 sessionid=stanza.tags[1].attr.sessionid, status="canceled"})); |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
42 sessions[stanza.tags[1].attr.sessionid] = nil; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
43 return true; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
44 end |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
45 for _, tag in ipairs(stanza.tags[1].tags) do |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
46 if tag.name == "x" and tag.attr.xmlns == "jabber:x:data" then |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
47 form = tag; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
48 break; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
49 end |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
50 end |
34
fc374b724270
mod_adhoc_cmd_admin: Define form layout only once.
Florian Zeitz <florob@babelmonkeys.de>
parents:
33
diff
changeset
|
51 local fields = add_user_layout:data(form); |
29
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
52 local username, host, resource = jid.split(fields.accountjid); |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
53 if (fields.password == fields["password-verify"]) and username and host and host == stanza.attr.to then |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
54 if usermanager_user_exists(username, host) then |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
55 origin.send(st.error_reply(stanza, "cancel", "conflict", "Account already exists"):up() |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
56 :tag("command", {xmlns="http://jabber.org/protocol/commands", |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
57 node="http://jabber.org/protocol/admin#add-user", status="canceled"}) |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
58 :tag("note", {type="error"}):text("Account already exists")); |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
59 sessions[stanza.tags[1].attr.sessionid] = nil; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
60 return true; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
61 else |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
62 if usermanager_create_user(username, fields.password, host) then |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
63 origin.send(st.reply(stanza):tag("command", {xmlns="http://jabber.org/protocol/commands", |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
64 node="http://jabber.org/protocol/admin#add-user", |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
65 sessionid=stanza.tags[1].attr.sessionid, status="completed"}) |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
66 :tag("note", {type="info"}):text("Account successfully created")); |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
67 sessions[stanza.tags[1].attr.sessionid] = nil; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
68 module:log("debug", "Created new account " .. username.."@"..host); |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
69 return true; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
70 else |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
71 origin.send(st.error_reply(stanza, "wait", "internal-server-error", |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
72 "Failed to write data to disk"):up() |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
73 :tag("command", {xmlns="http://jabber.org/protocol/commands", |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
74 node="http://jabber.org/protocol/admin#add-user", status="canceled"}) |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
75 :tag("note", {type="error"}):text("Failed to write data to disk")); |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
76 sessions[stanza.tags[1].attr.sessionid] = nil; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
77 return true; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
78 end |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
79 end |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
80 else |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
81 module:log("debug", fields.accountjid .. " " .. fields.password .. " " .. fields["password-verify"]); |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
82 origin.send(st.error_reply(stanza, "cancel", "conflict", |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
83 "Invalid data.\nPasswords missmatch, or empy username"):up() |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
84 :tag("command", {xmlns="http://jabber.org/protocol/commands", |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
85 node="http://jabber.org/protocol/admin#add-user", status="canceled"}) |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
86 :tag("note", {type="error"}):text("Invalid data.\nPasswords missmatch, or empy username")); |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
87 sessions[stanza.tags[1].attr.sessionid] = nil; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
88 return true; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
89 end |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
90 else |
33
f3225c55288f
mod_adhoc_cmd_admin: More utils.dataforms sugar
Florian Zeitz <florob@babelmonkeys.de>
parents:
32
diff
changeset
|
91 local sessionid=uuid.generate(); |
29
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
92 sessions[sessionid] = "executing"; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
93 origin.send(st.reply(stanza):tag("command", {xmlns="http://jabber.org/protocol/commands", |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
94 node="http://jabber.org/protocol/admin#add-user", sessionid=sessionid, |
34
fc374b724270
mod_adhoc_cmd_admin: Define form layout only once.
Florian Zeitz <florob@babelmonkeys.de>
parents:
33
diff
changeset
|
95 status="executing"}):add_child(add_user_layout:form())); |
29
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
96 end |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
97 return true; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
98 end |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
99 |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
100 local descriptor = { name="Add User", node="http://jabber.org/protocol/admin#add-user", handler=add_user_command_handler }; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
101 |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
102 function module.unload() |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
103 module:remove_item("adhoc", descriptor); |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
104 end |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
105 |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
106 module:add_item ("adhoc", descriptor); |