{fast_tls, ".*", {git, "https://github.com/processone/fast_tls", {tag, "1.0.16"}}},
{stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.10"}}},
{fast_xml, ".*", {git, "https://github.com/processone/fast_xml", {tag, "1.1.24"}}},
- {xmpp, ".*", {git, "https://github.com/processone/xmpp", "3289a6b4e3f3d82e5be513524d2293c0c2b3e7fd"}},
+ {xmpp, ".*", {git, "https://github.com/processone/xmpp", "43676e1"}},
{fast_yaml, ".*", {git, "https://github.com/processone/fast_yaml", {tag, "1.0.11"}}},
{jiffy, ".*", {git, "https://github.com/davisp/jiffy", {tag, "0.14.8"}}},
{p1_oauth2, ".*", {git, "https://github.com/processone/p1_oauth2", {tag, "0.6.2"}}},
%%%-------------------------------------------------------------------
-module(mod_mam).
--protocol({xep, 313, '0.5.1'}).
+-protocol({xep, 313, '0.6.1'}).
-protocol({xep, 334, '0.2'}).
-behaviour(gen_mod).
gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_MAM_1,
?MODULE, process_iq_v0_3, IQDisc),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_MAM_1,
+ ?MODULE, process_iq_v0_3, IQDisc),
+ gen_iq_handler:add_iq_handler(ejabberd_local, Host, ?NS_MAM_2,
+ ?MODULE, process_iq_v0_3, IQDisc),
+ gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_MAM_2,
?MODULE, process_iq_v0_3, IQDisc).
-spec unregister_iq_handlers(binary()) -> ok.
gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_MAM_0),
gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_MAM_0),
gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_MAM_1),
- gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_MAM_1).
+ gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_MAM_1),
+ gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_MAM_2),
+ gen_iq_handler:remove_iq_handler(ejabberd_sm, Host, ?NS_MAM_2).
-spec remove_user(binary(), binary()) -> ok.
remove_user(User, Server) ->
from = From,
sub_els = [#mam_query{xmlns = NS}]} = IQ,
MUCState)
- when (T == set andalso (NS == ?NS_MAM_0 orelse NS == ?NS_MAM_1)) orelse
+ when (T == set andalso (NS /= ?NS_MAM_TMP)) orelse
(T == get andalso NS == ?NS_MAM_TMP) ->
case may_enter_room(From, MUCState) of
true ->
end;
muc_process_iq(#iq{type = get,
sub_els = [#mam_query{xmlns = NS}]} = IQ,
- MUCState) when NS == ?NS_MAM_0; NS == ?NS_MAM_1 ->
+ MUCState) when NS /= ?NS_MAM_TMP ->
LServer = MUCState#state.server_host,
process_iq(LServer, IQ);
muc_process_iq(IQ, _MUCState) ->
disco_sm_features({result, OtherFeatures},
#jid{luser = U, lserver = S},
#jid{luser = U, lserver = S}, <<"">>, _Lang) ->
- {result, [?NS_MAM_TMP, ?NS_MAM_0, ?NS_MAM_1 | OtherFeatures]};
+ {result, [?NS_MAM_TMP, ?NS_MAM_0, ?NS_MAM_1, ?NS_MAM_2 | OtherFeatures]};
disco_sm_features(Acc, _From, _To, _Node, _Lang) ->
Acc.
#mam_fin{xmlns = NS, id = QID, rsm = RSMOut,
complete = IsComplete}
end,
- if NS == ?NS_MAM_TMP; NS == ?NS_MAM_1 ->
+ if NS /= ?NS_MAM_0 ->
lists:foreach(
fun(El) ->
ejabberd_router:route(El)
end, Els),
xmpp:make_iq_result(IQ, Result);
- NS == ?NS_MAM_0 ->
+ true ->
ejabberd_router:route(xmpp:make_iq_result(IQ)),
lists:foreach(
fun(El) ->
X = ejabberd_hooks:run_fold(disco_info, ServerHost, [],
[ServerHost, ?MODULE, <<"">>, Lang]),
MAMFeatures = case gen_mod:is_loaded(ServerHost, mod_mam) of
- true -> [?NS_MAM_TMP, ?NS_MAM_0, ?NS_MAM_1];
+ true -> [?NS_MAM_TMP, ?NS_MAM_0, ?NS_MAM_1, ?NS_MAM_2];
false -> []
end,
RSMFeatures = case RMod:rsm_supported() of
++ case {gen_mod:is_loaded(StateData#state.server_host, mod_mam),
Config#config.mam} of
{true, true} ->
- [?NS_MAM_TMP, ?NS_MAM_0, ?NS_MAM_1];
+ [?NS_MAM_TMP, ?NS_MAM_0, ?NS_MAM_1, ?NS_MAM_2];
_ ->
[]
end,
muc_jid/1, is_feature_advertised/3, get_event/1, put_event/2]).
-include("suite.hrl").
--define(VERSIONS, [?NS_MAM_TMP, ?NS_MAM_0, ?NS_MAM_1]).
+-define(VERSIONS, [?NS_MAM_TMP, ?NS_MAM_0, ?NS_MAM_1, ?NS_MAM_2]).
%%%===================================================================
%%% API
true = sets:is_subset(RequiredFeatures, UserFeatures),
ct:comment("Checking if all MAM conference service features are enabled"),
true = lists:member(?NS_MAM_1, MUCFeatures),
+ true = lists:member(?NS_MAM_2, MUCFeatures),
clean(disconnect(Config)).
fake_by(Config) ->
%% MAM feature should not be advertised at this point,
%% because MAM is not enabled so far
false = is_feature_advertised(Config, ?NS_MAM_1, Room),
+ false = is_feature_advertised(Config, ?NS_MAM_2, Room),
%% Fill in some history
send_messages_to_room(Config, lists:seq(1, 21)),
%% We now should be able to retrieve those via MAM, even though
sub_els = [#muc_user{status_codes = [104]}]} = recv_message(Config),
%% Check if MAM has been enabled
true = is_feature_advertised(Config, ?NS_MAM_1, Room),
+ true = is_feature_advertised(Config, ?NS_MAM_2, Room),
%% We now sending some messages again
send_messages_to_room(Config, lists:seq(1, 5)),
%% And retrieve them via MAM again.
maybe_recv_iq_result(Config, NS, I),
I.
-recv_fin(Config, I, QueryID, ?NS_MAM_1 = NS, IsComplete) ->
+recv_fin(Config, I, QueryID, NS, IsComplete) when NS == ?NS_MAM_1; NS == ?NS_MAM_2 ->
ct:comment("Receiving fin iq for namespace '~s'", [NS]),
#iq{type = result, id = I,
sub_els = [#mam_fin{xmlns = NS,
QID = randoms:get_string(),
Count = length(Range),
I = send(Config, #iq{type = set, to = Room,
- sub_els = [#mam_query{xmlns = ?NS_MAM_1, id = QID}]}),
+ sub_els = [#mam_query{xmlns = ?NS_MAM_2, id = QID}]}),
lists:foreach(
fun(N) ->
Body = xmpp:mk_text(integer_to_binary(N)),
to = MyJID, from = Room,
sub_els =
[#mam_result{
- xmlns = ?NS_MAM_1,
+ xmlns = ?NS_MAM_2,
queryid = QID,
sub_els =
[#forwarded{
body = Body} = xmpp:decode(El)
end, Range),
#iq{from = Room, id = I, type = result,
- sub_els = [#mam_fin{xmlns = ?NS_MAM_1,
+ sub_els = [#mam_fin{xmlns = ?NS_MAM_2,
id = QID,
rsm = #rsm_set{count = Count},
complete = true}]} = recv_iq(Config).