mod_adhoc_cmd_admin/mod_adhoc_cmd_admin.lua
changeset 67 e839b4453387
parent 49 59f490390528
child 84 b47216512a1d
equal deleted inserted replaced
66:b86ae5e21a56 67:e839b4453387
    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);