Mercurial > prosody-modules
annotate mod_adhoc_cmd_admin/mod_adhoc_cmd_admin.lua @ 33:f3225c55288f
mod_adhoc_cmd_admin: More utils.dataforms sugar
author | Florian Zeitz <florob@babelmonkeys.de> |
---|---|
date | Sat, 10 Oct 2009 04:01:45 +0200 |
parents | 00d5e133c84d |
children | fc374b724270 |
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 |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
17 function add_user_command_handler(item, origin, stanza) |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
18 if not is_admin(stanza.attr.from) then |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
19 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
|
20 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
|
21 :tag("command", {xmlns="http://jabber.org/protocol/commands", |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
22 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
|
23 :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
|
24 return true; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
25 end |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
26 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
|
27 if stanza.tags[1].attr.action == "cancel" then |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
28 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
|
29 node="http://jabber.org/protocol/admin#add-user", |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
30 sessionid=stanza.tags[1].attr.sessionid, status="canceled"})); |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
31 sessions[stanza.tags[1].attr.sessionid] = nil; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
32 return true; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
33 end |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
34 for _, tag in ipairs(stanza.tags[1].tags) do |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
35 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
|
36 form = tag; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
37 break; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
38 end |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
39 end |
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
|
40 local layout = { |
00d5e133c84d
mod_adhoc_cmd_admin: switch to utils.dataforms. Thanks MattJ for making this possible ;)
Florian Zeitz <florob@babelmonkeys.de>
parents:
29
diff
changeset
|
41 { name = "accountjid", type = "jid-single" }; |
00d5e133c84d
mod_adhoc_cmd_admin: switch to utils.dataforms. Thanks MattJ for making this possible ;)
Florian Zeitz <florob@babelmonkeys.de>
parents:
29
diff
changeset
|
42 { name = "password", type = "text-private" }; |
00d5e133c84d
mod_adhoc_cmd_admin: switch to utils.dataforms. Thanks MattJ for making this possible ;)
Florian Zeitz <florob@babelmonkeys.de>
parents:
29
diff
changeset
|
43 { name = "password-verify", type = "text-private" }; |
00d5e133c84d
mod_adhoc_cmd_admin: switch to utils.dataforms. Thanks MattJ for making this possible ;)
Florian Zeitz <florob@babelmonkeys.de>
parents:
29
diff
changeset
|
44 }; |
00d5e133c84d
mod_adhoc_cmd_admin: switch to utils.dataforms. Thanks MattJ for making this possible ;)
Florian Zeitz <florob@babelmonkeys.de>
parents:
29
diff
changeset
|
45 dataforms_new(layout); |
00d5e133c84d
mod_adhoc_cmd_admin: switch to utils.dataforms. Thanks MattJ for making this possible ;)
Florian Zeitz <florob@babelmonkeys.de>
parents:
29
diff
changeset
|
46 local fields = layout:data(form); |
29
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
47 local username, host, resource = jid.split(fields.accountjid); |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
48 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
|
49 if usermanager_user_exists(username, host) then |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
50 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
|
51 :tag("command", {xmlns="http://jabber.org/protocol/commands", |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
52 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
|
53 :tag("note", {type="error"}):text("Account already exists")); |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
54 sessions[stanza.tags[1].attr.sessionid] = nil; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
55 return true; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
56 else |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
57 if usermanager_create_user(username, fields.password, host) then |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
58 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
|
59 node="http://jabber.org/protocol/admin#add-user", |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
60 sessionid=stanza.tags[1].attr.sessionid, status="completed"}) |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
61 :tag("note", {type="info"}):text("Account successfully created")); |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
62 sessions[stanza.tags[1].attr.sessionid] = nil; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
63 module:log("debug", "Created new account " .. username.."@"..host); |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
64 return true; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
65 else |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
66 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
|
67 "Failed to write data to disk"):up() |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
68 :tag("command", {xmlns="http://jabber.org/protocol/commands", |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
69 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
|
70 :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
|
71 sessions[stanza.tags[1].attr.sessionid] = nil; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
72 return true; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
73 end |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
74 end |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
75 else |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
76 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
|
77 origin.send(st.error_reply(stanza, "cancel", "conflict", |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
78 "Invalid data.\nPasswords missmatch, or empy username"):up() |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
79 :tag("command", {xmlns="http://jabber.org/protocol/commands", |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
80 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
|
81 :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
|
82 sessions[stanza.tags[1].attr.sessionid] = nil; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
83 return true; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
84 end |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
85 else |
33
f3225c55288f
mod_adhoc_cmd_admin: More utils.dataforms sugar
Florian Zeitz <florob@babelmonkeys.de>
parents:
32
diff
changeset
|
86 local sessionid=uuid.generate(); |
29
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
87 sessions[sessionid] = "executing"; |
33
f3225c55288f
mod_adhoc_cmd_admin: More utils.dataforms sugar
Florian Zeitz <florob@babelmonkeys.de>
parents:
32
diff
changeset
|
88 local form = { |
f3225c55288f
mod_adhoc_cmd_admin: More utils.dataforms sugar
Florian Zeitz <florob@babelmonkeys.de>
parents:
32
diff
changeset
|
89 title= "Adding a User"; |
f3225c55288f
mod_adhoc_cmd_admin: More utils.dataforms sugar
Florian Zeitz <florob@babelmonkeys.de>
parents:
32
diff
changeset
|
90 instructions = "Fill out this form to add a user."; |
f3225c55288f
mod_adhoc_cmd_admin: More utils.dataforms sugar
Florian Zeitz <florob@babelmonkeys.de>
parents:
32
diff
changeset
|
91 |
f3225c55288f
mod_adhoc_cmd_admin: More utils.dataforms sugar
Florian Zeitz <florob@babelmonkeys.de>
parents:
32
diff
changeset
|
92 { name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/admin" }; |
f3225c55288f
mod_adhoc_cmd_admin: More utils.dataforms sugar
Florian Zeitz <florob@babelmonkeys.de>
parents:
32
diff
changeset
|
93 { name = "accountjid", type = "jid-single", required = true, label = "The Jabber ID for the account to be added" }; |
f3225c55288f
mod_adhoc_cmd_admin: More utils.dataforms sugar
Florian Zeitz <florob@babelmonkeys.de>
parents:
32
diff
changeset
|
94 { name = "password", type = "text-private", label = "The password for this account" }; |
f3225c55288f
mod_adhoc_cmd_admin: More utils.dataforms sugar
Florian Zeitz <florob@babelmonkeys.de>
parents:
32
diff
changeset
|
95 { name = "password-verify", type = "text-private", label = "Retype password" }; |
f3225c55288f
mod_adhoc_cmd_admin: More utils.dataforms sugar
Florian Zeitz <florob@babelmonkeys.de>
parents:
32
diff
changeset
|
96 }; |
f3225c55288f
mod_adhoc_cmd_admin: More utils.dataforms sugar
Florian Zeitz <florob@babelmonkeys.de>
parents:
32
diff
changeset
|
97 dataforms_new(form); |
29
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
98 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
|
99 node="http://jabber.org/protocol/admin#add-user", sessionid=sessionid, |
33
f3225c55288f
mod_adhoc_cmd_admin: More utils.dataforms sugar
Florian Zeitz <florob@babelmonkeys.de>
parents:
32
diff
changeset
|
100 status="executing"}):add_child(form:form())); |
29
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
101 end |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
102 return true; |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
103 end |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
104 |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
105 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
|
106 |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
107 function module.unload() |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
108 module:remove_item("adhoc", descriptor); |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
109 end |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
110 |
b384999b047f
mod_adhoc_cmd_admin: Initial commit
Florian Zeitz <florob@babelmonkeys.de>
parents:
diff
changeset
|
111 module:add_item ("adhoc", descriptor); |