From 93956ac1121999c18551bdbe3a8a03206c684c69 Mon Sep 17 00:00:00 2001 From: Rob Hoelz Date: Tue, 29 Dec 2009 16:21:12 -0600 Subject: Add support for non-anonymous MUC rooms --- plugins/muc/muc.lib.lua | 50 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 8 deletions(-) (limited to 'plugins/muc') diff --git a/plugins/muc/muc.lib.lua b/plugins/muc/muc.lib.lua index 002498af..88f0cae8 100644 --- a/plugins/muc/muc.lib.lua +++ b/plugins/muc/muc.lib.lua @@ -402,9 +402,23 @@ function room_mt:send_form(origin, stanza) :tag("field", {type='boolean', label='Make Room Publicly Searchable?', var='muc#roomconfig_publicroom'}) :tag("value"):text(self._data.hidden and "0" or "1"):up() :up() + :tag("field", {type='list-single', label='Who May Discover Real JIDs?', var='muc#roomconfig_whois'}) + :tag("value"):text(self._data.whois or 'moderators'):up() + :tag("option", {label = 'Moderators Only'}) + :tag("value"):text('moderators'):up() + :up() + :tag("option", {label = 'Anyone'}) + :tag("value"):text('anyone'):up() + :up() + :up() ); end +local valid_whois = { + moderators = true, + anyone = true, +} + function room_mt:process_form(origin, stanza) local query = stanza.tags[1]; local form; @@ -431,6 +445,14 @@ function room_mt:process_form(origin, stanza) else origin.send(st.error_reply(stanza, "cancel", "bad-request")); return; end self._data.hidden = not public and true or nil; + local whois = fields['muc#roomconfig_whois']; + if not valid_whois[whois] then + origin.send(st.error_reply(stanza, 'cancel', 'bad-request')); + return; + end + self._data.whois = whois + module:log('debug', 'whois=%s', tostring(whois)) + if self.save then self:save(true); end origin.send(st.reply(stanza)); end @@ -735,19 +757,26 @@ function room_mt:set_role(actor, nick, role, callback, reason) return true; end +local function _get_muc_child(stanza) + for i=#stanza.tags,1,-1 do + local tag = stanza.tags[i]; + if tag.name == "x" and tag.attr.xmlns == "http://jabber.org/protocol/muc#user" then + return tag; + end + end +end + function room_mt:_route_stanza(stanza) local muc_child; local to_occupant = self._occupants[self._jid_nick[stanza.attr.to]]; local from_occupant = self._occupants[stanza.attr.from]; if stanza.name == "presence" then if to_occupant and from_occupant then - if to_occupant.role == "moderator" or jid_bare(to_occupant.jid) == jid_bare(from_occupant.jid) then - for i=#stanza.tags,1,-1 do - local tag = stanza.tags[i]; - if tag.name == "x" and tag.attr.xmlns == "http://jabber.org/protocol/muc#user" then - muc_child = tag; - break; - end + if self._data.whois == 'anyone' then + muc_child = _get_muc_child(stanza) + else + if to_occupant.role == "moderator" or jid_bare(to_occupant.jid) == jid_bare(from_occupant.jid) then + muc_child = _get_muc_child(stanza) end end end @@ -762,6 +791,9 @@ function room_mt:_route_stanza(stanza) end end end + if self._data.whois == 'anyone' then + muc_child:tag('status', { code = '100' }); + end end self:route_stanza(stanza); if muc_child then @@ -780,7 +812,9 @@ function _M.new_room(jid) jid = jid; _jid_nick = {}; _occupants = {}; - _data = {}; + _data = { + whois = 'moderators', + }; _affiliations = {}; }, room_mt); end -- cgit v1.2.3 From a69d90ef4573a00afe4d249834322fad8f34ff1d Mon Sep 17 00:00:00 2001 From: Rob Hoelz Date: Wed, 30 Dec 2009 13:26:11 -0600 Subject: Added notification of configuration changes for MUCs --- plugins/muc/muc.lib.lua | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'plugins/muc') diff --git a/plugins/muc/muc.lib.lua b/plugins/muc/muc.lib.lua index 88f0cae8..d28efa63 100644 --- a/plugins/muc/muc.lib.lua +++ b/plugins/muc/muc.lib.lua @@ -434,15 +434,19 @@ function room_mt:process_form(origin, stanza) end if fields.FORM_TYPE ~= "http://jabber.org/protocol/muc#roomconfig" then origin.send(st.error_reply(stanza, "cancel", "bad-request")); return; end + local dirty = false + local persistent = fields['muc#roomconfig_persistentroom']; if persistent == "0" or persistent == "false" then persistent = nil; elseif persistent == "1" or persistent == "true" then persistent = true; else origin.send(st.error_reply(stanza, "cancel", "bad-request")); return; end + dirty = dirty or (self._data.persistent ~= persistent) self._data.persistent = persistent; module:log("debug", "persistent=%s", tostring(persistent)); local public = fields['muc#roomconfig_publicroom']; if public == "0" or public == "false" then public = nil; elseif public == "1" or public == "true" then public = true; else origin.send(st.error_reply(stanza, "cancel", "bad-request")); return; end + dirty = dirty or (self._data.hidden ~= (not public and true or nil)) self._data.hidden = not public and true or nil; local whois = fields['muc#roomconfig_whois']; @@ -450,11 +454,27 @@ function room_mt:process_form(origin, stanza) origin.send(st.error_reply(stanza, 'cancel', 'bad-request')); return; end + local whois_changed = self._data.whois ~= whois self._data.whois = whois module:log('debug', 'whois=%s', tostring(whois)) if self.save then self:save(true); end origin.send(st.reply(stanza)); + + if dirty or whois_changed then + local msg = st.message({type='groupchat', from=self.jid}) + :tag('x', {xmlns='http://jabber.org/protocol/muc#user'}):up() + + if dirty then + msg.tags[1]:tag('status', {code = '104'}) + end + if whois_changed then + local code = (whois == 'moderators') and 173 or 172 + msg.tags[1]:tag('status', {code = code}) + end + + self:broadcast_message(msg, false) + end end function room_mt:destroy(newjid, reason, password) -- cgit v1.2.3