36 { name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/admin" }; |
36 { name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/admin" }; |
37 { name = "max_items", type = "list-single", label = "Maximum number of users", |
37 { name = "max_items", type = "list-single", label = "Maximum number of users", |
38 value = { "25", "50", "75", "100", "150", "200", "all" } }; |
38 value = { "25", "50", "75", "100", "150", "200", "all" } }; |
39 }; |
39 }; |
40 |
40 |
|
41 local announce_layout = dataforms_new{ |
|
42 title = "Making an Announcement"; |
|
43 instructions = "Fill out this form to make an announcement to all\nactive users of this service."; |
|
44 |
|
45 { name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/admin" }; |
|
46 { name = "subject", type = "text-single", label = "Subject" }; |
|
47 { name = "announcement", type = "text-multi", required = true, label = "Announcement" }; |
|
48 }; |
|
49 |
41 function add_user_command_handler(item, origin, stanza) |
50 function add_user_command_handler(item, origin, stanza) |
42 if stanza.tags[1].attr.sessionid and sessions[stanza.tags[1].attr.sessionid] then |
51 if stanza.tags[1].attr.sessionid and sessions[stanza.tags[1].attr.sessionid] then |
43 if stanza.tags[1].attr.action == "cancel" then |
52 if stanza.tags[1].attr.action == "cancel" then |
44 origin.send(st.reply(stanza):add_child(item:cmdtag("canceled", stanza.tags[1].attr.sessionid))); |
53 origin.send(st.reply(stanza):add_child(item:cmdtag("canceled", stanza.tags[1].attr.sessionid))); |
45 sessions[stanza.tags[1].attr.sessionid] = nil; |
54 sessions[stanza.tags[1].attr.sessionid] = nil; |
46 return true; |
55 return true; |
47 end |
56 end |
48 form = stanza.tags[1]:child_with_ns("jabber:x:data"); |
57 local form = stanza.tags[1]:child_with_ns("jabber:x:data"); |
49 local fields = add_user_layout:data(form); |
58 local fields = add_user_layout:data(form); |
50 local username, host, resource = jid.split(fields.accountjid); |
59 local username, host, resource = jid.split(fields.accountjid); |
51 if (fields.password == fields["password-verify"]) and username and host and host == stanza.attr.to then |
60 if (fields.password == fields["password-verify"]) and username and host and host == stanza.attr.to then |
52 if usermanager_user_exists(username, host) then |
61 if usermanager_user_exists(username, host) then |
53 origin.send(st.error_reply(stanza, "cancel", "conflict", "Account already exists"):up() |
62 origin.send(st.error_reply(stanza, "cancel", "conflict", "Account already exists"):up() |
94 origin.send(st.reply(stanza):add_child(item:cmdtag("canceled", stanza.tags[1].attr.sessionid))); |
103 origin.send(st.reply(stanza):add_child(item:cmdtag("canceled", stanza.tags[1].attr.sessionid))); |
95 sessions[stanza.tags[1].attr.sessionid] = nil; |
104 sessions[stanza.tags[1].attr.sessionid] = nil; |
96 return true; |
105 return true; |
97 end |
106 end |
98 |
107 |
99 form = stanza.tags[1]:child_with_ns("jabber:x:data"); |
108 local form = stanza.tags[1]:child_with_ns("jabber:x:data"); |
100 local fields = add_user_layout:data(form); |
109 local fields = add_user_layout:data(form); |
101 |
110 |
102 local max_items = nil |
111 local max_items = nil |
103 if fields.max_items ~= "all" then |
112 if fields.max_items ~= "all" then |
104 max_items = tonumber(fields.max_items); |
113 max_items = tonumber(fields.max_items); |
126 end |
135 end |
127 |
136 |
128 return true; |
137 return true; |
129 end |
138 end |
130 |
139 |
|
140 function announce_handler(item, origin, stanza) |
|
141 if stanza.tags[1].attr.sessionid and sessions[stanza.tags[1].attr.sessionid] then |
|
142 if stanza.tags[1].attr.action == "cancel" then |
|
143 origin.send(st.reply(stanza):add_child(item:cmdtag("canceled", stanza.tags[1].attr.sessionid))); |
|
144 sessions[stanza.tags[1].attr.sessionid] = nil; |
|
145 return true; |
|
146 end |
|
147 |
|
148 local form = stanza.tags[1]:child_with_ns("jabber:x:data"); |
|
149 local fields = add_user_layout:data(form); |
|
150 |
|
151 module:log("info", "Sending server announcement to all online users"); |
|
152 local host_session = hosts[stanza.attr.to]; |
|
153 local message = st.message({type = "headline", from = stanza.attr.to}, fields.announcement):up() |
|
154 :tag("subject"):text(fields.subject or "Announcement"); |
|
155 |
|
156 local c = 0; |
|
157 for user in pairs(host_session.sessions) do |
|
158 c = c + 1; |
|
159 message.attr.to = user.."@"..stanza.attr.to; |
|
160 core_post_stanza(host_session, message); |
|
161 end |
|
162 |
|
163 module:log("info", "Announcement sent to %d online users", c); |
|
164 |
|
165 origin.send(st.reply(stanza):add_child(item:cmdtag("completed", stanza.tags[1].attr.sessionid) |
|
166 :tag("note"):text("Announcement sent."))); |
|
167 sessions[stanza.tags[1].attr.sessionid] = nil; |
|
168 return true; |
|
169 else |
|
170 local sessionid=uuid.generate(); |
|
171 sessions[sessionid] = "executing"; |
|
172 origin.send(st.reply(stanza):add_child(item:cmdtag("executing", sessionid):add_child(announce_layout:form()))); |
|
173 end |
|
174 |
|
175 return true; |
|
176 end |
|
177 |
131 local add_user_desc = adhoc_new("Add User", "http://jabber.org/protocol/admin#add-user", add_user_command_handler, "admin"); |
178 local add_user_desc = adhoc_new("Add User", "http://jabber.org/protocol/admin#add-user", add_user_command_handler, "admin"); |
132 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"); |
179 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"); |
|
180 local announce_desc = adhoc_new("Send Announcement to Online Users", "http://jabber.org/protocol/admin#announce", announce_handler, "admin"); |
133 |
181 |
134 function module.unload() |
182 function module.unload() |
135 module:remove_item("adhoc", add_user_desc); |
183 module:remove_item("adhoc", add_user_desc); |
136 module:remove_item("adhoc", get_online_users_desc); |
184 module:remove_item("adhoc", get_online_users_desc); |
|
185 module:remove_item("adhoc", announce_desc); |
137 end |
186 end |
138 |
187 |
139 module:add_item("adhoc", add_user_desc); |
188 module:add_item("adhoc", add_user_desc); |
140 module:add_item("adhoc", get_online_users_desc); |
189 module:add_item("adhoc", get_online_users_desc); |
|
190 module:add_item("adhoc", announce_desc); |