mod_blocking/mod_blocking.lua
changeset 940 80ede103d7a3
parent 372 000f1d1c6ca5
child 1215 1b55d8f86644
equal deleted inserted replaced
939:1415fc2a0ac0 940:80ede103d7a3
    98 		end
    98 		end
    99 	end
    99 	end
   100 	return jid_list;
   100 	return jid_list;
   101 end
   101 end
   102 
   102 
       
   103 local function send_push_iqs(username, host, command_type, jids)
       
   104 	local bare_jid = username.."@"..host;
       
   105 
       
   106 	local stanza_content = st.stanza(command_type, { xmlns = xmlns_blocking });
       
   107 	for _, jid in ipairs(jids) do
       
   108 		stanza_content:tag("item", { jid = jid }):up();
       
   109 	end
       
   110 
       
   111 	for resource, session in pairs(prosody.bare_sessions[bare_jid].sessions) do
       
   112 		local iq_push_stanza = st.iq({ type = "set", to = bare_jid.."/"..resource });
       
   113 		iq_push_stanza:add_child(stanza_content);
       
   114 		session.send(iq_push_stanza);
       
   115 	end
       
   116 end
       
   117 
   103 function handle_blocking_command(event)
   118 function handle_blocking_command(event)
   104 	local session, stanza = event.origin, event.stanza;
   119 	local session, stanza = event.origin, event.stanza;
   105 
   120 
   106 	local username, host = jid_split(stanza.attr.from);
   121 	local username, host = jid_split(stanza.attr.from);
   107 	if stanza.attr.type == "set" then
   122 	if stanza.attr.type == "set" then
   116 			else
   131 			else
   117 				for _, jid in ipairs(block_jid_list) do
   132 				for _, jid in ipairs(block_jid_list) do
   118 					add_blocked_jid(username, host, jid);
   133 					add_blocked_jid(username, host, jid);
   119 				end
   134 				end
   120 				session.send(st.reply(stanza));
   135 				session.send(st.reply(stanza));
       
   136 				send_push_iqs(username, host, "block", block_jid_list);
   121 			end
   137 			end
   122 			return true;
   138 			return true;
   123 		elseif stanza.tags[1].name == "unblock" then
   139 		elseif stanza.tags[1].name == "unblock" then
   124 			remove_all_blocked_jids(username, host);
   140 			local unblock = stanza.tags[1];
       
   141 			local unblock_jid_list = {};
       
   142 			for item in unblock:childtags() do
       
   143 				unblock_jid_list[#unblock_jid_list+1] = item.attr.jid;
       
   144 			end
       
   145 			if #unblock_jid_list == 0 then
       
   146 				remove_all_blocked_jids(username, host);
       
   147 			else
       
   148 				for _, jid_to_unblock in ipairs(unblock_jid_list) do
       
   149 					remove_blocked_jid(username, host, jid_to_unblock);
       
   150 				end
       
   151 			end
   125 			session.send(st.reply(stanza));
   152 			session.send(st.reply(stanza));
       
   153 			send_push_iqs(username, host, "unblock", unblock_jid_list);
   126 			return true;
   154 			return true;
   127 		end
   155 		end
   128 	elseif stanza.attr.type == "get" and stanza.tags[1].name == "blocklist" then
   156 	elseif stanza.attr.type == "get" and stanza.tags[1].name == "blocklist" then
   129 		local reply = st.reply(stanza):tag("blocklist", { xmlns = xmlns_blocking });
   157 		local reply = st.reply(stanza):tag("blocklist", { xmlns = xmlns_blocking });
   130 		local blocked_jids = get_blocked_jids(username, host);
   158 		local blocked_jids = get_blocked_jids(username, host);