From d996bd34b94735bc92f0f724cf9f479168751ecc Mon Sep 17 00:00:00 2001 From: Alexander PapaTutuWawa Date: Fri, 30 Oct 2020 17:45:22 +0100 Subject: [PATCH] mix: Fix smaller issues --- mod_mix/mod_mix.lua | 70 ++++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 30 deletions(-) diff --git a/mod_mix/mod_mix.lua b/mod_mix/mod_mix.lua index b21fbad..357c591 100644 --- a/mod_mix/mod_mix.lua +++ b/mod_mix/mod_mix.lua @@ -26,7 +26,7 @@ local restrict_channel_creation = module:get_option("restrict_local_channels", " module:depends("disco"); -- module:depends("mam"); TODO: Once message sending works -module:add_identity("conference", "mix", module:get_option("name", "Prosody MIX service"); +module:add_identity("conference", "mix", module:get_option("name", "Prosody MIX service")); module:add_feature("http://jabber.org/protocol/disco#info"); module:add_feature(mix_core_xmlns); @@ -62,6 +62,11 @@ function Channel:get_spid(jid) return self.spid[jid]; end +function Channel:set_spid(jid, spid) + -- Sets the Stable Participant ID for the *BARE* jid + self.spid[jid] = spid; +end + function Channel:debug_print() module:log("debug", "Channel %s (%s)", self.jid, self.name); module:log("debug", "'%s'", self.description); @@ -168,10 +173,10 @@ module:hook("iq/bare/http://jabber.org/protocol/disco#items:query", function(eve module:log("debug", "IQ-GET disco#items"); local origin, stanza = event.origin, event.stanza; - local _, channel = get_channel(staza.attr.to); + local _, channel = get_channel(stanza.attr.to); if not channel then origin.send(channel_not_found(stanza)); - return; + return true; end -- TODO: Maybe check permissions @@ -226,7 +231,7 @@ module:hook("iq-get/bare/http://jabber.org/protocol/disco#info:query", function( local _, channel = get_channel(stanza.attr.to); if not channel then origin.send(channel_not_found(stanza)); - return; + return true; end local reply = st.reply(stanza):tag("query", { xmlns = "http://jabber.org/protocol/disco#info" }); reply:tag("feature", { var = "http://jabber.org/protocol/disco#info" }):up(); @@ -258,7 +263,7 @@ module:hook("iq-set/bare/"..mix_core_xmlns..":leave", function(event) local i, channel = get_channel(stanza.attr.to); if not channel then origin.send(channel_not_found(stanza)); - return; + return true; end local participant_index = find_participant(channel.participants, from); @@ -269,7 +274,7 @@ module:hook("iq-set/bare/"..mix_core_xmlns..":leave", function(event) "Not a participant")); channel:debug_print(); module:log("debug", "%s is not a participant in %s", from, channel.jid); - return; + return true; end -- Remove the user as a participant by... @@ -298,14 +303,14 @@ module:hook("iq-set/bare/"..mix_core_xmlns..":join", function(event) local i, channel = get_channel(stanza.attr.to); if not channel then origin.send(channel_not_found(stanza)); - return; + return true; end -- Prevent the user from joining multiple times local participant_index = find_participant(channel.participants, from); if participant_index ~= -1 then - origin.send(st.error_reply(stanza, "cancel", "bad-request", "User already joined")); - return; + module:send(st.error_reply(stanza, "cancel", "bad-request", "User already joined")); + return true; end local spid = channel:get_spid(from) or uuid.generate(); -- Stable Participant ID @@ -339,13 +344,13 @@ module:hook("iq-set/bare/"..mix_core_xmlns..":join", function(event) if not has_subscribed_once then origin.send(st.error_reply(stanza, "cancel", first_error)); - return; + return true; end local participant = Participant:new(jid.bare(from), nick:get_text()) channels[i].subscriptions[from] = nodes; table.insert(channels[i].participants, participant) - channels[i]:get_spid(jid.bare(stanza.attr.from)) = spid; + channels[i]:set_spid(jid.bare(stanza.attr.from), spid); publish_participant(srv, spid, participant); channels[i]:save_state(); @@ -361,14 +366,14 @@ module:hook("iq-set/bare/"..mix_core_xmlns..":setnick", function(event) local i, channel = get_channel(stanza.attr.to); if not channel then origin.send(channel_not_found(stanza)); - return; + return true; end local participant_index = find_participant(channel.participants, from); if participant_index == -1 then channel:debug_print(); module:log("debug", "%s is not a participant in %s", from, channel.jid); - return; + return true; end -- NOTE: Prosody should guarantee us that the setnick stanza exists @@ -376,7 +381,7 @@ module:hook("iq-set/bare/"..mix_core_xmlns..":setnick", function(event) local nick = setnick:get_child("nick"); if nick_stanza == nil then origin.send(st.error_reply(stanza, "cancel", "bad-request", "Missing ")); - return; + return true; end -- Change the nick @@ -417,11 +422,17 @@ function create_channel(node, creator, adhoc) -- Create the PEP nodes local srv = pep.get_pep_service(node); local timestamp = datetime.datetime(time.now()); - srv:create("urn:xmpp:mix:nodes:info", true, { ["access_model"] = "open" }); + local access_model = adhoc and "whitelist" or "open"; + for _, psnode in pairs({"urn:xmpp:mix:nodes:info", "urn:xmpp:mix:nodes:participants", "urn:xmpp:mix:nodes:messages" }) do + srv:create(psnode, true, { ["access_model"] = access_model }); + + -- If the channel is an adhoc channel, then we need to make sure that + -- node affiliations are correct + if adhoc then + srv:set_affiliation(psnode, true, creator, "owner"); + end + end channel:publish_info(srv); - -- TODO: This seems bad - srv:create("urn:xmpp:mix:nodes:participants", true, { ["access_model"] = "open"}); - srv:create("urn:xmpp:mix:nodes:messages", true, { ["access_model"] = "open"}); table.insert(channels, channel); end @@ -433,7 +444,7 @@ module:hook("iq-set/host/"..mix_core_xmlns..":create", function(event) -- Check permissions if not can_create_channels(from) then origin.send(st.error_reply(stanza, "cancel", "forbidden", "Not authorized to create channels")); - return; + return true; end local create = stanza:get_child("create", mix_core_xmlns); @@ -447,7 +458,7 @@ module:hook("iq-set/host/"..mix_core_xmlns..":create", function(event) "cancel", "conflict", "Channel already exists")); - return; + return true; end create_channel(create.attr.channel, from, false); @@ -482,7 +493,7 @@ module:hook("iq-set/host/"..mix_core_xmlns..":destroy", function(event) local i, channel = get_channel(node_jid); if not channel then origin.send(channel_not_found(stanza)); - return; + return true; end -- TODO: Check permissions: can_create_channels and maybe compare to the contact JIDs @@ -507,20 +518,20 @@ module:hook("message/bare", function(event) if stanza.attr.type ~= "groupchat" then -- TODO: Is this correct? origin.send(st.error_reply(stanza, "cancel", "bad-request", "Non-groupchat message")); - return; + return true; end local from = jid.bare(stanza.attr.from); local i, channel = get_channel(stanza.attr.to); if not channel then origin.send(channel_not_found(stanza)); - return; + return true; end local participant_index = find_participant(channel.participants, from); if participant_index == -1 then origin.send(st.error_reply(stanza, "cancel", "forbidden", "Not a participant")); - return; + return true; end local participant = channel.participants[participant_index]; @@ -530,12 +541,11 @@ module:hook("message/bare", function(event) :tag("jid"):text(participant.jid):up()); msg.attr.from = channel.jid.."/"..channel:get_spid(from); for _, p in pairs(channel.participants) do - if p.jid ~= participant.jid then - msg.attr.to = p.jid; - module:send(msg); - module:log("debug", msg:pretty_print()); - module:log("debug", "Message from %s sent to %s", participant.jid, p.jid); - end + -- TODO: Add message to the MAM and return its ID + local tmp = st.clone(msg); + tmp.attr.to = p.jid; + module:send(tmp); + module:log("debug", "Message from %s sent to %s", participant.jid, p.jid); end return true; end);