Skip to content

Commit 272af56

Browse files
authored
Merge pull request #4242 from esl/mim-2165-mam-bug
Mim 2165 mam bug
2 parents 7ae0848 + ccbaf10 commit 272af56

File tree

2 files changed

+55
-1
lines changed

2 files changed

+55
-1
lines changed

big_tests/tests/mam_SUITE.erl

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,8 @@ mam_cases() ->
292292
range_archive_request_not_empty,
293293
limit_archive_request,
294294
querying_for_all_messages_with_jid,
295+
querying_for_all_messages_with_jid_after,
296+
querying_with_invalid_mam_id_in_after,
295297
unicode_messages_can_be_extracted
296298
].
297299

@@ -1522,6 +1524,55 @@ muc_server_returns_item_not_found_for_ids_filter_with_nonexistent_id(Config) ->
15221524
end,
15231525
escalus:story(Config, [{alice, 1}], F).
15241526

1527+
%% Based on https://github.com/esl/MongooseIM/issues/4222
1528+
querying_for_all_messages_with_jid_after(Config) ->
1529+
P = ?config(props, Config),
1530+
F = fun(Alice, Bob, Kate) ->
1531+
escalus:send(Alice, escalus_stanza:chat_to(Bob, <<"Hi, Bob!">>)),
1532+
mam_helper:wait_for_archive_size(Alice, 1),
1533+
escalus:send(Alice, escalus_stanza:chat_to(Bob, <<"Hi, Kate!">>)),
1534+
mam_helper:wait_for_archive_size(Alice, 2),
1535+
escalus:send(Kate, escalus_stanza:chat_to(Alice, <<"Hi, Alice!">>)),
1536+
escalus:assert(is_chat_message, [<<"Hi, Alice!">>], escalus:wait_for_stanza(Alice)),
1537+
mam_helper:wait_for_archive_size(Alice, 3),
1538+
escalus:send(Kate, escalus_stanza:chat_to(Alice, <<"How are you?">>)),
1539+
escalus:assert(is_chat_message, [<<"How are you?">>], escalus:wait_for_stanza(Alice)),
1540+
mam_helper:wait_for_archive_size(Alice, 4),
1541+
escalus:send(Bob, escalus_stanza:chat_to(Alice, <<"I am busy now">>)),
1542+
escalus:assert(is_chat_message, [<<"I am busy now">>], escalus:wait_for_stanza(Alice)),
1543+
mam_helper:wait_for_archive_size(Alice, 5),
1544+
escalus:send(Alice, mam_helper:stanza_lookup_messages_iq(P, #{})),
1545+
AllRes = wait_archive_respond(Alice),
1546+
assert_respond_size(5, AllRes),
1547+
%% Third message overall, second message in the conversation with Kate
1548+
Msg3 = lists:nth(3, respond_messages(AllRes)),
1549+
#forwarded_message{result_id = MamId3, message_body = <<"Hi, Alice!">>} =
1550+
parse_forwarded_message(Msg3),
1551+
KateJid = escalus_client:short_jid(Kate),
1552+
Params = #{
1553+
with_jid => KateJid,
1554+
rsm => #rsm_in{max = 50, direction = 'after', id = MamId3}
1555+
},
1556+
escalus:send(Alice, mam_helper:stanza_lookup_messages_iq(P, Params)),
1557+
WithRes = wait_archive_respond(Alice),
1558+
assert_respond_size(1, WithRes),
1559+
[WithMsg] = respond_messages(WithRes),
1560+
#forwarded_message{message_body = <<"How are you?">>} =
1561+
parse_forwarded_message(WithMsg)
1562+
end,
1563+
escalus:fresh_story(Config, [{alice, 1}, {bob, 1}, {kate, 1}], F).
1564+
1565+
querying_with_invalid_mam_id_in_after(Config) ->
1566+
P = ?config(props, Config),
1567+
F = fun(Alice) ->
1568+
Params = #{rsm => #rsm_in{max = 50, direction = 'after', id = <<"PURPLEFE965CC9">>}},
1569+
escalus:send(Alice, mam_helper:stanza_lookup_messages_iq(P, Params)),
1570+
Result = escalus:wait_for_stanza(Alice),
1571+
escalus:assert(is_iq_error, [], Result),
1572+
escalus:assert(is_error, [<<"modify">>, <<"not-acceptable">>], Result)
1573+
end,
1574+
escalus:fresh_story(Config, [{alice, 1}], F).
1575+
15251576
muc_querying_for_all_messages(Config) ->
15261577
P = ?config(props, Config),
15271578
F = fun(Alice) ->

src/mam/mod_mam_utils.erl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@
135135
-include("mongoose_ns.hrl").
136136

137137
-define(MAYBE_BIN(X), (is_binary(X) orelse (X) =:= undefined)).
138+
-define(BIGINT_MAX, 16#7fffffffffffffff). % 9223372036854775807, (2^63 - 1)
138139

139140
-export_type([direction/0, retraction_id/0, retraction_info/0]).
140141

@@ -216,7 +217,9 @@ mess_id_to_external_binary(MessID) when is_integer(MessID) ->
216217
%% @doc Decode a message ID received from the user.
217218
-spec external_binary_to_mess_id(binary()) -> integer().
218219
external_binary_to_mess_id(BExtMessID) when is_binary(BExtMessID) ->
219-
try binary_to_integer(BExtMessID, 32)
220+
try binary_to_integer(BExtMessID, 32) of
221+
MessId when is_integer(MessId), MessId =< ?BIGINT_MAX -> MessId;
222+
_ -> throw(invalid_stanza_id)
220223
catch error:badarg -> throw(invalid_stanza_id)
221224
end.
222225

0 commit comments

Comments
 (0)