MUC: Hide new MUC room storage format behind an off-by-default option
[prosody.git] / plugins / muc / muc.lib.lua
index eb992aa3d42616358906101d45ccf822b87386f3..ac8ebaddfb746525a9cb3747511e62bec844e8f8 100644 (file)
@@ -577,7 +577,7 @@ function room_mt:handle_normal_presence(origin, stanza)
                end
                self:save_occupant(dest_occupant);
 
-               if orig_occupant == nil then
+               if orig_occupant == nil or muc_x then
                        -- Send occupant list to newly joined user
                        self:send_occupant_list(real_jid, function(nick, occupant) -- luacheck: ignore 212
                                -- Don't include self
@@ -598,7 +598,7 @@ function room_mt:handle_normal_presence(origin, stanza)
                        self:route_stanza(pr);
                end
 
-               if orig_occupant == nil then
+               if orig_occupant == nil or muc_x then
                        if is_first_dest_session then
                                module:fire_event("muc-occupant-joined", {
                                        room = self;
@@ -872,7 +872,8 @@ function room_mt:handle_admin_query_get_command(origin, stanza)
                -- You need to be at least an admin, and be requesting info about your affifiliation or lower
                -- e.g. an admin can't ask for a list of owners
                local affiliation_rank = valid_affiliations[affiliation or "none"];
-               if affiliation_rank >= valid_affiliations.admin and affiliation_rank >= _aff_rank then
+               if affiliation_rank >= valid_affiliations.admin and affiliation_rank >= _aff_rank
+               or self:get_members_only() and self:get_whois() == "anyone" and affiliation_rank >= valid_affiliations.member then
                        local reply = st.reply(stanza):query("http://jabber.org/protocol/muc#admin");
                        for jid in self:each_affiliation(_aff or "none") do
                                reply:tag("item", {affiliation = _aff, jid = jid}):up();
@@ -1303,13 +1304,24 @@ function _M.new_room(jid, config)
        }, room_mt);
 end
 
+local new_format = module:get_option_boolean("new_muc_storage_format", false);
+
 function room_mt:freeze(live)
-       local frozen, state = {
-               _jid = self.jid;
-               _data = self._data;
-       };
-       for user, affiliation in pairs(self._affiliations) do
-               frozen[user] = affiliation;
+       local frozen, state;
+       if new_format then
+               frozen = {
+                       _jid = self.jid;
+                       _data = self._data;
+               };
+               for user, affiliation in pairs(self._affiliations) do
+                       frozen[user] = affiliation;
+               end
+       else
+               frozen = {
+                       jid = self.jid;
+                       _data = self._data;
+                       _affiliations = self._affiliations;
+               };
        end
        if live then
                state = {};