aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonas Schäfer <jonas@wielicki.name>2021-12-22 13:06:32 +0100
committerJonas Schäfer <jonas@wielicki.name>2021-12-22 13:06:32 +0100
commit663028421f6905cb9ee68fe795af71a60564ae53 (patch)
tree6113133e8edb7019f2784d971aaa1e43eef0145e
parent46a6dafd28fe8e39a39b2a3eb70d3abebc82c828 (diff)
downloadprosody-663028421f6905cb9ee68fe795af71a60564ae53.tar.gz
prosody-663028421f6905cb9ee68fe795af71a60564ae53.zip
mod_roster: pass correct username to roster-item-removed
The other invocations use it that way, and the only listener in trunk which uses it (in mod_presence) expects it that way. Passing the username of the JID from the removed entry causes incorrect unavailable presence stanzas to be sent, allegedly kicking people off MUCs. Fixes #1121.
-rw-r--r--plugins/mod_roster.lua2
-rw-r--r--spec/scansion/issue1121.scs75
2 files changed, 76 insertions, 1 deletions
diff --git a/plugins/mod_roster.lua b/plugins/mod_roster.lua
index 39d59cbd..29466d5b 100644
--- a/plugins/mod_roster.lua
+++ b/plugins/mod_roster.lua
@@ -74,7 +74,7 @@ module:hook("iq/self/jabber:iq:roster:query", function(event)
local r_item = roster[jid];
if r_item then
module:fire_event("roster-item-removed", {
- username = node, jid = jid, item = r_item, origin = session, roster = roster,
+ username = from_node, jid = jid, item = r_item, origin = session, roster = roster,
});
local success, err_type, err_cond, err_msg = rm_remove_from_roster(session, jid);
if success then
diff --git a/spec/scansion/issue1121.scs b/spec/scansion/issue1121.scs
new file mode 100644
index 00000000..68d728b9
--- /dev/null
+++ b/spec/scansion/issue1121.scs
@@ -0,0 +1,75 @@
+# When removing roster contact, Prosody should send directed "unavailable" presence but sends global unavailable presence
+
+[Client] Romeo
+ jid: romeo@localhost
+ password: password
+
+[Client] Juliet
+ jid: juliet@localhost
+ password: password
+
+-----
+
+Romeo connects
+
+Romeo sends
+ <presence/>
+
+Romeo receives
+ <presence from="${Romeo's full JID}"/>
+
+Juliet connects
+
+Juliet sends
+ <presence/>
+
+Juliet receives
+ <presence from="${Juliet's full JID}"/>
+
+Romeo sends
+ <presence to="juliet@localhost" type="subscribe"/>
+
+Romeo receives
+ <presence from="juliet@localhost" to="romeo@localhost"/>
+
+Juliet receives
+ <presence from="romeo@localhost" to="juliet@localhost" type="subscribe"/>
+
+Juliet sends
+ <presence to="romeo@localhost" type="subscribed"/>
+
+Romeo receives
+ <presence from="${Juliet's full JID}" to="romeo@localhost"/>
+
+Juliet sends
+ <presence to="romeo@localhost" type="subscribe"/>
+
+Juliet receives
+ <presence from="romeo@localhost" to="juliet@localhost"/>
+
+Romeo receives
+ <presence from="juliet@localhost" to="romeo@localhost" type="subscribe"/>
+
+Romeo sends
+ <presence to="juliet@localhost" type="subscribed"/>
+
+Juliet receives
+ <presence from="${Romeo's full JID}" to="juliet@localhost"/>
+
+Romeo receives
+ <presence from="${Juliet's full JID}" to="romeo@localhost"/>
+
+Juliet sends
+ <iq type="set" id="iq1">
+ <query xmlns="jabber:iq:roster">
+ <item jid="romeo@localhost" subscription="remove"/>
+ </query>
+ </iq>
+
+Juliet receives
+ <iq type="result" id="iq1"/>
+
+Romeo receives
+ <presence from="${Juliet's full JID}" to="romeo@localhost" type="unavailable"/>
+
+Romeo disconnects