From 602a42f5ce51158c3ef5036e144a2b306b15ee40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Wed, 16 Apr 2025 11:39:30 +0200 Subject: [PATCH] Add tests for duplicate occupant-id handling --- test/ejabberd_SUITE_data/ejabberd.mnesia.yml | 1 + test/ejabberd_SUITE_data/ejabberd.mssql.yml | 1 + test/ejabberd_SUITE_data/ejabberd.mysql.yml | 1 + test/ejabberd_SUITE_data/ejabberd.pgsql.yml | 1 + test/ejabberd_SUITE_data/ejabberd.redis.yml | 1 + test/ejabberd_SUITE_data/ejabberd.sqlite.yml | 4 ++ test/ejabberd_SUITE_data/ejabberd.yml | 1 + test/muc_tests.erl | 73 ++++++++++++++++++-- 8 files changed, 79 insertions(+), 4 deletions(-) diff --git a/test/ejabberd_SUITE_data/ejabberd.mnesia.yml b/test/ejabberd_SUITE_data/ejabberd.mnesia.yml index 14bb2bff2..42ab23ab2 100644 --- a/test/ejabberd_SUITE_data/ejabberd.mnesia.yml +++ b/test/ejabberd_SUITE_data/ejabberd.mnesia.yml @@ -14,6 +14,7 @@ define_macro: mod_muc: db_type: internal vcard: VCARD + mod_muc_occupantid: [] mod_offline: db_type: internal mod_privacy: diff --git a/test/ejabberd_SUITE_data/ejabberd.mssql.yml b/test/ejabberd_SUITE_data/ejabberd.mssql.yml index 66bfee3f9..1458cafa4 100644 --- a/test/ejabberd_SUITE_data/ejabberd.mssql.yml +++ b/test/ejabberd_SUITE_data/ejabberd.mssql.yml @@ -22,6 +22,7 @@ define_macro: db_type: sql ram_db_type: sql vcard: VCARD + mod_muc_occupantid: [] mod_offline: use_cache: true db_type: sql diff --git a/test/ejabberd_SUITE_data/ejabberd.mysql.yml b/test/ejabberd_SUITE_data/ejabberd.mysql.yml index abb0a6937..91705ee68 100644 --- a/test/ejabberd_SUITE_data/ejabberd.mysql.yml +++ b/test/ejabberd_SUITE_data/ejabberd.mysql.yml @@ -22,6 +22,7 @@ define_macro: db_type: sql ram_db_type: sql vcard: VCARD + mod_muc_occupantid: [] mod_offline: use_cache: true db_type: sql diff --git a/test/ejabberd_SUITE_data/ejabberd.pgsql.yml b/test/ejabberd_SUITE_data/ejabberd.pgsql.yml index 014e1c058..16d8b1d27 100644 --- a/test/ejabberd_SUITE_data/ejabberd.pgsql.yml +++ b/test/ejabberd_SUITE_data/ejabberd.pgsql.yml @@ -22,6 +22,7 @@ define_macro: db_type: sql ram_db_type: sql vcard: VCARD + mod_muc_occupantid: [] mod_offline: use_cache: true db_type: sql diff --git a/test/ejabberd_SUITE_data/ejabberd.redis.yml b/test/ejabberd_SUITE_data/ejabberd.redis.yml index 7065f0ffd..6ff7d7cdb 100644 --- a/test/ejabberd_SUITE_data/ejabberd.redis.yml +++ b/test/ejabberd_SUITE_data/ejabberd.redis.yml @@ -15,6 +15,7 @@ define_macro: mod_muc: db_type: internal vcard: VCARD + mod_muc_occupantid: [] mod_offline: db_type: internal mod_privacy: diff --git a/test/ejabberd_SUITE_data/ejabberd.sqlite.yml b/test/ejabberd_SUITE_data/ejabberd.sqlite.yml index 3e22f6a2d..11420ef6c 100644 --- a/test/ejabberd_SUITE_data/ejabberd.sqlite.yml +++ b/test/ejabberd_SUITE_data/ejabberd.sqlite.yml @@ -1,5 +1,8 @@ define_macro: SQLITE_CONFIG: + auth_stored_password_types: + - plain + - scram_sha256 sql_type: sqlite sql_pool_size: 1 auth_method: sql @@ -17,6 +20,7 @@ define_macro: db_type: sql ram_db_type: sql vcard: VCARD + mod_muc_occupantid: [] mod_offline: db_type: sql mod_privacy: diff --git a/test/ejabberd_SUITE_data/ejabberd.yml b/test/ejabberd_SUITE_data/ejabberd.yml index 0abc35c2a..812bea841 100644 --- a/test/ejabberd_SUITE_data/ejabberd.yml +++ b/test/ejabberd_SUITE_data/ejabberd.yml @@ -123,6 +123,7 @@ modules: vcard: VCARD mod_muc: vcard: VCARD + mod_muc_occupantid: [] mod_muc_admin: [] mod_carboncopy: [] mod_jidprep: [] diff --git a/test/muc_tests.erl b/test/muc_tests.erl index 7a5d1d28f..053c62b99 100644 --- a/test/muc_tests.erl +++ b/test/muc_tests.erl @@ -304,7 +304,70 @@ master_slave_cases() -> master_slave_test(config_allow_voice_requests), master_slave_test(config_voice_request_interval), master_slave_test(config_visitor_nickchange), - master_slave_test(join_conflict)]}. + master_slave_test(join_conflict), + master_slave_test(duplicate_occupantid) + ]}. + +duplicate_occupantid_master(Config) -> + Room = muc_room_jid(Config), + PeerJID = ?config(slave, Config), + PeerNick = ?config(slave_nick, Config), + PeerNickJID = jid:replace_resource(Room, PeerNick), + MyNick = ?config(nick, Config), + MyNickJID = jid:replace_resource(Room, MyNick), + ok = join_new(Config), + wait_for_slave(Config), + Pres = ?match(#presence{from = PeerNickJID, type = available} = Pres, + recv_presence(Config), Pres), + ?match(#muc_user{items = [#muc_item{jid = PeerJID, + role = participant, + affiliation = none}]}, + xmpp:get_subtag(Pres, #muc_user{})), + OccupantId = ?match([#occupant_id{id = Id}], xmpp:get_subtags(Pres, #occupant_id{}), Id), + Pres2 = ?match(#presence{from = PeerNickJID, type = available} = Pres2, + recv_presence(Config), Pres2), + ?match([#occupant_id{id = OccupantId}], xmpp:get_subtags(Pres2, #occupant_id{})), + Body = xmpp:mk_text(<<"test-1">>), + Msg = ?match(#message{type = groupchat, from = PeerNickJID, + body = Body} = Msg, recv_message(Config), Msg), + ?match([#occupant_id{id = OccupantId}], xmpp:get_subtags(Msg, #occupant_id{})), + recv_muc_presence(Config, PeerNickJID, unavailable), + ok = leave(Config), + disconnect(Config). + +duplicate_occupantid_slave(Config) -> + Room = muc_room_jid(Config), + MyNick = ?config(slave_nick, Config), + MyNickJID = jid:replace_resource(Room, MyNick), + PeerNick = ?config(master_nick, Config), + PeerNickJID = jid:replace_resource(Room, PeerNick), + wait_for_master(Config), + send(Config, #presence{to = MyNickJID, sub_els = [#muc{}]}), + ?match(#presence{from = Room, type = available}, recv_presence(Config)), + OccupantId = case recv_presence(Config) of + #presence{from = MyNickJID, type = available} = Pres -> + recv_muc_presence(Config, PeerNickJID, available), + ?match([#occupant_id{id = Id}], xmpp:get_subtags(Pres, #occupant_id{}), Id); + #presence{from = PeerNickJID, type = available} -> + Pres2 = ?match(#presence{from = MyNickJID, type = available} = Pres2, + recv_presence(Config), Pres2), + ?match([#occupant_id{id = Id}], xmpp:get_subtags(Pres2, #occupant_id{}), Id) + end, + ?match(#message{type = groupchat, from = Room}, recv_message(Config)), + send(Config, #presence{to = Room, sub_els = [#occupant_id{id = <<"fake1">>}, + #occupant_id{id = <<"fake2">>}]}), + Pres3 = ?match(#presence{from = MyNickJID, type = available} = Pres3, + recv_presence(Config), Pres3), + ?match([#occupant_id{id = OccupantId}], xmpp:get_subtags(Pres3, #occupant_id{})), + Body = xmpp:mk_text(<<"test-1">>), + send(Config, #message{to = Room, type = groupchat, body = Body, + sub_els = [#occupant_id{id = <<"fake1">>}, + #occupant_id{id = <<"fake2">>}]}), + Msg = ?match(#message{type = groupchat, from = MyNickJID, + body = Body} = Msg, recv_message(Config), Msg), + ?match([#occupant_id{id = OccupantId}], xmpp:get_subtags(Msg, #occupant_id{})), + ok = leave(Config), + disconnect(Config). join_conflict_master(Config) -> ok = join_new(Config), @@ -1628,7 +1691,7 @@ join(Config, Role, Aff) when is_atom(Role), is_atom(Aff) -> join(Config, Role, #muc{} = SubEl) when is_atom(Role) -> join(Config, Role, none, SubEl). -join(Config, Role, Aff, SubEl) -> +join(Config, Role, Aff, SubEls) when is_list(SubEls) -> ct:comment("Joining existing room as ~s/~s", [Aff, Role]), MyJID = my_jid(Config), Room = muc_room_jid(Config), @@ -1636,7 +1699,7 @@ join(Config, Role, Aff, SubEl) -> MyNickJID = jid:replace_resource(Room, MyNick), PeerNick = ?config(peer_nick, Config), PeerNickJID = jid:replace_resource(Room, PeerNick), - send(Config, #presence{to = MyNickJID, sub_els = [SubEl]}), + send(Config, #presence{to = MyNickJID, sub_els = SubEls}), case recv_presence(Config) of #presence{type = error, from = MyNickJID} = Err -> xmpp:get_subtag(Err, #stanza_error{}); @@ -1667,7 +1730,9 @@ join(Config, Role, Aff, SubEl) -> {History, Subj} = recv_history_and_subject(Config), {empty, History, Subj, Codes} end - end. + end; +join(Config, Role, Aff, SubEl) -> + join(Config, Role, Aff, [SubEl]). leave(Config) -> leave(Config, muc_room_jid(Config)).