Comparison

mod_saslauth_muc/mod_saslauth_muc.lua @ 1426:249c5447fed1

mod_saslauth_muc: Update to use new MUC API.
author Waqas Hussain <waqas20@gmail.com>
date Fri, 30 May 2014 19:07:18 -0400
parent 1343:7dbde05b48a9
child 3072:926db29176f5
comparison
equal deleted inserted replaced
1425:9c894b56b4e4 1426:249c5447fed1
22 local hosts = hosts; 22 local hosts = hosts;
23 local module = module; 23 local module = module;
24 local pairs, next = pairs, next; 24 local pairs, next = pairs, next;
25 local os_time = os.time; 25 local os_time = os.time;
26 26
27 local muc_password = module:require("muc/password");
28
27 -- SASL sessions management 29 -- SASL sessions management
28 local _rooms = {}; -- SASL data 30 local _rooms = {}; -- SASL data
29 local function get_handler_for(room, jid) return _rooms[room] and _rooms[room][jid]; end 31 local function get_handler_for(room, jid) return _rooms[room] and _rooms[room][jid]; end
30 local function remove_handler_for(room, jid) if _rooms[room] then _rooms[room][jid] = nil; end end 32 local function remove_handler_for(room, jid) if _rooms[room] then _rooms[room][jid] = nil; end end
31 local function create_handler_for(room_jid, jid) 33 local function create_handler_for(room_jid, jid)
32 _rooms[room_jid] = _rooms[room_jid] or {}; 34 _rooms[room_jid] = _rooms[room_jid] or {};
33 _rooms[room_jid][jid] = new_sasl(module.host, { plain = function(sasl, username, realm) 35 _rooms[room_jid][jid] = new_sasl(module.host, { plain = function(sasl, username, realm)
34 local muc = hosts[module.host].modules.muc; 36 local muc = hosts[module.host].modules.muc;
35 local room = muc and muc.rooms[room_jid]; 37 local room = muc and muc.get_room_by_jid(room_jid);
36 local password = room and room:get_password(); 38 local password = room and muc_password.get(room);
37 local ret = password and true or nil; 39 local ret = password and true or nil;
38 return password or "", ret; 40 return password or "", ret;
39 end }); 41 end });
40 _rooms[room_jid][jid].timeout = os_time() + timeout; 42 _rooms[room_jid][jid].timeout = os_time() + timeout;
41 return _rooms[room_jid][jid]; 43 return _rooms[room_jid][jid];
54 function module.unload() 56 function module.unload()
55 timeout = nil; -- stop timer on unload 57 timeout = nil; -- stop timer on unload
56 end 58 end
57 59
58 -- Stanza handlers 60 -- Stanza handlers
59 module:hook("presence/full", function(event) 61 -- Don't allow anyone to join room unless they provide the password
60 local origin, stanza = event.origin, event.stanza; 62 module:hook("muc-occupant-pre-join", function(event)
61 63 local room, stanza = event.room, event.stanza;
62 if not stanza.attr.type then -- available presence 64 local room_password = muc_password.get(room);
63 local room_jid = jid_bare(stanza.attr.to); 65 if room_password then -- room has a password
64 local room = hosts[module.host].modules.muc.rooms[room_jid]; 66 local x = stanza:get_child("x", "http://jabber.org/protocol/muc");
65 67 local password = x and x:get_child_text("password", "http://jabber.org/protocol/muc");
66 if room and not room:get_role(stanza.attr.from) then -- this is a room join 68 if not password then -- no password sent
67 if room:get_password() then -- room has a password 69 local sasl_handler = get_handler_for(jid_bare(stanza.attr.to), stanza.attr.from);
68 local x = stanza:get_child("x", "http://jabber.org/protocol/muc"); 70 if x and sasl_handler and sasl_handler.authorized then -- if already passed SASL
69 local password = x and x:get_child("password"); 71 x:reset():tag("password", { xmlns = "http://jabber.org/protocol/muc" }):text(room_password);
70 if not password then -- no password sent 72 else
71 local sasl_handler = get_handler_for(jid_bare(stanza.attr.to), stanza.attr.from); 73 event.origin.send(st.error_reply(stanza, "auth", "not-authorized")
72 if x and sasl_handler and sasl_handler.authorized then -- if already passed SASL 74 :tag("sasl-required", { xmlns = "urn:xmpp:errors" }));
73 x:reset():tag("password", { xmlns = "http://jabber.org/protocol/muc" }):text(room:get_password()); 75 return true;
74 else
75 origin.send(st.error_reply(stanza, "auth", "not-authorized")
76 :tag("sasl-required", { xmlns = "urn:xmpp:errors" }));
77 return true;
78 end
79 end
80 end 76 end
81 end 77 end
82 end 78 end
83 end, 10); 79 end, -18);
84 80
85 module:hook("iq-get/bare/urn:ietf:params:xml:ns:xmpp-sasl:mechanisms", function(event) 81 module:hook("iq-get/bare/urn:ietf:params:xml:ns:xmpp-sasl:mechanisms", function(event)
86 local origin, stanza = event.origin, event.stanza; 82 local origin, stanza = event.origin, event.stanza;
87 83
88 local reply = st.reply(stanza):tag("mechanisms", { xmlns='urn:ietf:params:xml:ns:xmpp-sasl' }); 84 local reply = st.reply(stanza):tag("mechanisms", { xmlns='urn:ietf:params:xml:ns:xmpp-sasl' });