X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=plugins%2Fmuc%2Fmuc.lib.lua;h=8fec0ffca557ba63a0ede668a67a9db4640ab1c4;hb=9b53917789f122e1aa8a8dc2eb62c3c5fbd49267;hp=63204d662bcc62ef5762c4e342d99fe70106dacf;hpb=07e26ffcf6362e9bcf3c8ba71cce19a1fe629c2b;p=prosody.git diff --git a/plugins/muc/muc.lib.lua b/plugins/muc/muc.lib.lua index 63204d66..8fec0ffc 100644 --- a/plugins/muc/muc.lib.lua +++ b/plugins/muc/muc.lib.lua @@ -187,15 +187,15 @@ end -- Takes the x element that goes into the stanzas function room_mt:publicise_occupant_status(occupant, base_x, nick, actor, reason) -- Build real jid and (optionally) occupant jid template presences - local base_presence; - if occupant.role ~= nil then + local base_presence do -- Try to use main jid's presence local pr = occupant:get_presence(); - if pr ~= nil then + if pr and (pr.attr.type ~= "unavailable" or occupant.role == nil) then base_presence = st.clone(pr); + else -- user is leaving but didn't send a leave presence. make one for them + base_presence = st.presence {from = occupant.nick; type = "unavailable";}; end end - base_presence = base_presence or st.presence {from = occupant.nick; type = "unavailable";}; -- Fire event (before full_p and anon_p are created) local event = { @@ -546,7 +546,7 @@ function room_mt:handle_iq_to_occupant(origin, stanza) if (type == "error" or type == "result") then do -- deconstruct_stanza_id if not occupant then return nil; end - local from_jid, id, to_jid_hash = (base64.decode(stanza.attr.id) or ""):match("^(.+)%z(.*)%z(.+)$"); + local from_jid, id, to_jid_hash = (base64.decode(stanza.attr.id) or ""):match("^(%Z+)%z(%Z*)%z(.+)$"); if not(from == from_jid or from == jid_bare(from_jid)) then return nil; end local from_occupant_jid = self:get_occupant_jid(from_jid); if from_occupant_jid == nil then return nil; end @@ -644,11 +644,11 @@ function room_mt:process_form(origin, stanza) if form.attr.type == "cancel" then origin.send(st.reply(stanza)); elseif form.attr.type == "submit" then - local fields; + local fields, errors, present; if form.tags[1] == nil then -- Instant room - fields = {}; + fields, present = {}, {}; else - fields = self:get_form_layout(stanza.attr.from):data(form); + fields, errors, present = self:get_form_layout(stanza.attr.from):data(form); if fields.FORM_TYPE ~= "http://jabber.org/protocol/muc#roomconfig" then origin.send(st.error_reply(stanza, "cancel", "bad-request", "Form is not of type room configuration")); return true; @@ -666,6 +666,11 @@ function room_mt:process_form(origin, stanza) return true; end module:fire_event("muc-config-submitted", event); + for submitted_field in pairs(present) do + event.field, event.value = submitted_field, fields[submitted_field]; + module:fire_event("muc-config-submitted/"..submitted_field, event); + end + event.field, event.value = nil, nil; if self.save then self:save(true); end origin.send(st.reply(stanza)); @@ -723,6 +728,9 @@ end function room_mt:handle_admin_query_set_command(origin, stanza) local item = stanza.tags[1].tags[1]; + if not item then + origin.send(st.error_reply(stanza, "cancel", "bad-request")); + end if item.attr.jid then -- Validate provided JID item.attr.jid = jid_prep(item.attr.jid); if not item.attr.jid then @@ -747,8 +755,11 @@ function room_mt:handle_admin_query_set_command(origin, stanza) else success, errtype, err = nil, "cancel", "bad-request"; end - if not success then origin.send(st.error_reply(stanza, errtype, err)); end - origin.send(st.reply(stanza)); + if not success then + origin.send(st.error_reply(stanza, errtype, err)); + else + origin.send(st.reply(stanza)); + end return true; end @@ -762,7 +773,7 @@ function room_mt:handle_admin_query_get_command(origin, stanza) if _aff and _aff_rank and not _rol then -- 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]; + local affiliation_rank = valid_affiliations[affiliation or "none"]; if affiliation_rank >= valid_affiliations.admin and affiliation_rank >= _aff_rank then local reply = st.reply(stanza):query("http://jabber.org/protocol/muc#admin"); for jid in self:each_affiliation(_aff or "none") do @@ -1146,7 +1157,7 @@ function room_mt:set_role(actor, occupant_jid, role, reason) else -- Can't do anything to other owners or admins local occupant_affiliation = self:get_affiliation(occupant.bare_jid); - if occupant_affiliation == "owner" and occupant_affiliation == "admin" then + if occupant_affiliation == "owner" or occupant_affiliation == "admin" then return nil, "cancel", "not-allowed"; end