diff options
author | Jonas Schäfer <jonas@wielicki.name> | 2021-12-22 13:06:32 +0100 |
---|---|---|
committer | Jonas Schäfer <jonas@wielicki.name> | 2021-12-22 13:06:32 +0100 |
commit | 663028421f6905cb9ee68fe795af71a60564ae53 (patch) | |
tree | 6113133e8edb7019f2784d971aaa1e43eef0145e | |
parent | 46a6dafd28fe8e39a39b2a3eb70d3abebc82c828 (diff) | |
download | prosody-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.lua | 2 | ||||
-rw-r--r-- | spec/scansion/issue1121.scs | 75 |
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 |