Comparison

plugins/mod_muc.lua @ 879:2189baddedb8

MUC: Kick participants for error replies only on a selected list of error conditions
author Waqas Hussain <waqas20@gmail.com>
date Wed, 04 Mar 2009 22:45:06 +0500
parent 856:946d0f91bd38
child 896:2c0b9e3c11c3
comparison
equal deleted inserted replaced
878:72a7eeaa9e58 879:2189baddedb8
68 return stanza, 0; 68 return stanza, 0;
69 end 69 end
70 local presence_filters = {["http://jabber.org/protocol/muc"]=true;["http://jabber.org/protocol/muc#user"]=true}; 70 local presence_filters = {["http://jabber.org/protocol/muc"]=true;["http://jabber.org/protocol/muc#user"]=true};
71 function get_filtered_presence(stanza) 71 function get_filtered_presence(stanza)
72 return filter_xmlns_from_stanza(st.clone(stanza), presence_filters); 72 return filter_xmlns_from_stanza(st.clone(stanza), presence_filters);
73 end
74 local kickable_error_conditions = {
75 ["gone"] = true;
76 ["internal-server-error"] = true;
77 ["item-not-found"] = true;
78 ["jid-malformed"] = true;
79 ["recipient-unavailable"] = true;
80 ["redirect"] = true;
81 ["remote-server-not-found"] = true;
82 ["remote-server-timeout"] = true;
83 ["service-unavailable"] = true;
84 };
85 function get_kickable_error(stanza)
86 for _, tag in ipairs(stanza.tags) do
87 if tag.name == "error" and tag.attr.xmlns == "jabber:client" then
88 for _, cond in ipairs(tag.tags) do
89 if cond.attr.xmlns == "urn:ietf:params:xml:ns:xmpp-stanzas" then
90 return kickable_error_conditions[cond.name] and cond.name;
91 end
92 end
93 return true; -- malformed error message
94 end
95 end
96 return true; -- malformed error message
73 end 97 end
74 function getUsingPath(stanza, path, getText) 98 function getUsingPath(stanza, path, getText)
75 local tag = stanza; 99 local tag = stanza;
76 for _, name in ipairs(path) do 100 for _, name in ipairs(path) do
77 if type(tag) ~= 'table' then return; end 101 if type(tag) ~= 'table' then return; end
289 end 313 end
290 elseif not current_nick and type ~= "error" then -- not in room 314 elseif not current_nick and type ~= "error" then -- not in room
291 origin.send(st.error_reply(stanza, "cancel", "not-acceptable")); 315 origin.send(st.error_reply(stanza, "cancel", "not-acceptable"));
292 elseif stanza.name == "message" and type == "groupchat" then -- groupchat messages not allowed in PM 316 elseif stanza.name == "message" and type == "groupchat" then -- groupchat messages not allowed in PM
293 origin.send(st.error_reply(stanza, "modify", "bad-request")); 317 origin.send(st.error_reply(stanza, "modify", "bad-request"));
294 elseif stanza.name == "message" and type == "error" then 318 elseif stanza.name == "message" and type == "error" and get_kickable_error(stanza) then
295 log("debug", "%s kicked from %s for sending an error message", current_nick, room); 319 log("debug", "%s kicked from %s for sending an error message", current_nick, room);
296 handle_to_occupant(origin, st.presence({type='unavailable', from=from, to=to}):tag('status'):text('This participant is kicked from the room because he sent an error message to another occupant')); -- send unavailable 320 handle_to_occupant(origin, st.presence({type='unavailable', from=from, to=to}):tag('status'):text('This participant is kicked from the room because he sent an error message to another occupant')); -- send unavailable
297 else -- private stanza 321 else -- private stanza
298 local o_data = rooms:get(room, to); 322 local o_data = rooms:get(room, to);
299 if o_data then 323 if o_data then
300 log("debug", "%s sent private stanza to %s (%s)", from, to, o_data.jid); 324 log("debug", "%s sent private stanza to %s (%s)", from, to, o_data.jid);
301 local jid = o_data.jid; 325 local jid = o_data.jid;
302 if stanza.name=='iq' and type=='get' and stanza.tags[1].attr.xmlns == 'vcard-temp' then jid = jid_bare(jid); end 326 if stanza.name=='iq' and type=='get' and stanza.tags[1].attr.xmlns == 'vcard-temp' then jid = jid_bare(jid); end
303 stanza.attr.to, stanza.attr.from = jid, current_nick; 327 stanza.attr.to, stanza.attr.from = jid, current_nick;
304 core_route_stanza(component, stanza); 328 core_route_stanza(component, stanza);
305 else -- recipient not in room 329 elseif type ~= "error" and type ~= "result" then -- recipient not in room
306 origin.send(st.error_reply(stanza, "cancel", "item-not-found", "Recipient not in room")); 330 origin.send(st.error_reply(stanza, "cancel", "item-not-found", "Recipient not in room"));
307 end 331 end
308 end 332 end
309 end 333 end
310 334
340 local current_nick = jid_nick:get(stanza.attr.from, to); 364 local current_nick = jid_nick:get(stanza.attr.from, to);
341 if current_nick then 365 if current_nick then
342 stanza.attr.to = current_nick; 366 stanza.attr.to = current_nick;
343 handle_to_occupant(origin, stanza); 367 handle_to_occupant(origin, stanza);
344 stanza.attr.to = to; 368 stanza.attr.to = to;
345 else 369 elseif type ~= "error" and type ~= "result" then
346 origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); 370 origin.send(st.error_reply(stanza, "cancel", "service-unavailable"));
347 end 371 end
348 else 372 else
349 if type == "error" or type == "result" then return; end 373 if type == "error" or type == "result" then return; end
350 origin.send(st.error_reply(stanza, "cancel", "service-unavailable")); 374 origin.send(st.error_reply(stanza, "cancel", "service-unavailable"));