25
1
mirror of https://github.com/processone/ejabberd.git synced 2024-11-24 16:23:40 +01:00

Improve namespace handling

This commit is contained in:
Evgeniy Khramtsov 2016-09-24 14:17:21 +03:00
parent 53209b9ab1
commit 58969fb854
19 changed files with 8588 additions and 3985 deletions

View File

@ -862,10 +862,10 @@ resource_conflict_action(U, S, R) ->
-spec decode_element(xmlel(), state_name(), state()) -> fsm_transition().
decode_element(#xmlel{} = El, StateName, StateData) ->
try case xmpp:decode(El, [ignore_els]) of
try case xmpp:decode(El, ?NS_CLIENT, [ignore_els]) of
#iq{sub_els = [_], type = T} = Pkt when T == set; T == get ->
NewPkt = xmpp:decode_els(
Pkt,
Pkt, ?NS_CLIENT,
fun(SubEl) when StateName == session_established ->
case xmpp:get_ns(SubEl) of
?NS_PRIVACY -> true;
@ -873,7 +873,7 @@ decode_element(#xmlel{} = El, StateName, StateData) ->
_ -> false
end;
(SubEl) ->
xmpp_codec:is_known_tag(SubEl)
xmpp:is_known_tag(SubEl)
end),
?MODULE:StateName(NewPkt, StateData);
Pkt ->
@ -1566,7 +1566,7 @@ send_element(StateData, #xmlel{} = El) when StateData#state.xml_socket ->
send_element(StateData, #xmlel{} = El) ->
send_text(StateData, fxml:element_to_binary(El));
send_element(StateData, Pkt) ->
send_element(StateData, xmpp:encode(Pkt)).
send_element(StateData, xmpp:encode(Pkt, ?NS_CLIENT)).
-spec send_error(state(), xmlel() | stanza(), stanza_error()) -> ok.
send_error(StateData, Stanza, Error) ->

View File

@ -440,11 +440,11 @@ process_user_el(#xmlel{name = Name, attrs = Attrs, children = Els} = El,
process_private(xmpp:decode(El), State);
{<<"vCard">>, ?NS_VCARD} ->
process_vcard(El, State);
{<<"offline-messages">>, _} ->
Msgs = [xmpp:decode(E, [ignore_els]) || E <- Els],
{<<"offline-messages">>, NS} ->
Msgs = [xmpp:decode(E, NS, [ignore_els]) || E <- Els],
process_offline_msgs(Msgs, State);
{<<"presence">>, <<"jabber:client">>} ->
process_presence(xmpp:decode(El, [ignore_els]), State);
{<<"presence">>, ?NS_CLIENT} ->
process_presence(xmpp:decode(El, ?NS_CLIENT, [ignore_els]), State);
_ ->
{ok, State}
end

View File

@ -253,7 +253,7 @@ process_iq(From, To, #iq{} = IQ) ->
ejabberd_sm:process_iq(From, To, IQ)
end;
process_iq(From, To, El) ->
try xmpp:decode(El, [ignore_els]) of
try xmpp:decode(El, ?NS_CLIENT, [ignore_els]) of
IQ -> process_iq(From, To, IQ)
catch _:{xmpp_codec, Why} ->
Type = xmpp:get_type(El),
@ -390,7 +390,7 @@ do_route(OrigFrom, OrigTo, OrigPacket) ->
LDstDomain = To#jid.lserver,
case mnesia:dirty_read(route, LDstDomain) of
[] ->
try xmpp:decode(Packet, [ignore_els]) of
try xmpp:decode(Packet, ?NS_CLIENT, [ignore_els]) of
Pkt ->
ejabberd_s2s:route(From, To, Pkt)
catch _:{xmpp_codec, Why} ->
@ -422,7 +422,7 @@ do_route(OrigFrom, OrigTo, OrigPacket) ->
-spec do_route(jid(), jid(), xmlel() | xmpp_element(), #route{}) -> any().
do_route(From, To, Packet, #route{local_hint = LocalHint,
pid = Pid}) when is_pid(Pid) ->
try xmpp:decode(Packet, [ignore_els]) of
try xmpp:decode(Packet, ?NS_CLIENT, [ignore_els]) of
Pkt ->
case LocalHint of
{apply, Module, Function} when node(Pid) == node() ->

View File

@ -557,7 +557,7 @@ send_text(StateData, Text) ->
-spec send_element(state(), xmpp_element()) -> ok.
send_element(StateData, El) ->
El1 = fix_ns(xmpp:encode(El)),
El1 = xmpp:encode(El, ?NS_SERVER),
send_text(StateData, fxml:element_to_binary(El1)).
-spec send_error(state(), xmlel() | stanza(), stanza_error()) -> ok.
@ -591,20 +591,6 @@ change_shaper(StateData, Host, JID) ->
(StateData#state.sockmod):change_shaper(StateData#state.socket,
Shaper).
-spec fix_ns(xmlel()) -> xmlel().
fix_ns(#xmlel{name = Name} = El) when Name == <<"message">>;
Name == <<"iq">>;
Name == <<"presence">>;
Name == <<"db:verify">>,
Name == <<"db:result">> ->
Attrs = lists:filter(
fun({<<"xmlns">>, _}) -> false;
(_) -> true
end, El#xmlel.attrs),
El#xmlel{attrs = Attrs};
fix_ns(El) ->
El.
-spec new_id() -> binary().
new_id() -> randoms:get_string().
@ -632,7 +618,7 @@ decode_element(#xmlel{} = El, StateName, StateData) ->
true ->
[]
end,
try xmpp:decode(El, Opts) of
try xmpp:decode(El, ?NS_SERVER, Opts) of
Pkt -> ?MODULE:StateName(Pkt, StateData)
catch error:{xmpp_codec, Why} ->
case xmpp:is_stanza(El) of

View File

@ -740,7 +740,7 @@ send_text(StateData, Text) ->
-spec send_element(state(), xmpp_element()) -> ok.
send_element(StateData, El) ->
El1 = fix_ns(xmpp:encode(El)),
El1 = xmpp:encode(El, ?NS_SERVER),
send_text(StateData, fxml:element_to_binary(El1)).
-spec send_header(state(), undefined | {integer(), integer()}) -> ok.
@ -766,20 +766,6 @@ send_queue(StateData, Q) ->
{empty, _Q1} -> ok
end.
-spec fix_ns(xmlel()) -> xmlel().
fix_ns(#xmlel{name = Name} = El) when Name == <<"message">>;
Name == <<"iq">>;
Name == <<"presence">>;
Name == <<"db:verify">>,
Name == <<"db:result">> ->
Attrs = lists:filter(
fun({<<"xmlns">>, _}) -> false;
(_) -> true
end, El#xmlel.attrs),
El#xmlel{attrs = Attrs};
fix_ns(El) ->
El.
%% Bounce a single message (xmlelement)
-spec bounce_element(stanza(), stanza_error()) -> ok.
bounce_element(El, Error) ->
@ -1083,7 +1069,12 @@ fsm_limit_opts() ->
-spec decode_element(xmlel(), state_name(), state()) -> fsm_next().
decode_element(#xmlel{} = El, StateName, StateData) ->
try xmpp:decode(El) of
Opts = if StateName == stream_established ->
[ignore_els];
true ->
[]
end,
try xmpp:decode(El, ?NS_SERVER, Opts) of
Pkt -> ?MODULE:StateName(Pkt, StateData)
catch error:{xmpp_codec, Why} ->
Type = xmpp:get_type(El),

View File

@ -308,7 +308,7 @@ send_text(StateData, Text) ->
-spec send_element(state(), xmpp_element()) -> ok.
send_element(StateData, El) ->
El1 = fix_ns(xmpp:encode(El)),
El1 = xmpp:encode(El, ?NS_COMPONENT),
send_text(StateData, fxml:element_to_binary(El1)).
-spec send_error(state(), xmlel() | stanza(), stanza_error()) -> ok.
@ -334,21 +334,9 @@ send_header(StateData, Host) ->
send_trailer(StateData) ->
send_text(StateData, <<"</stream:stream>">>).
-spec fix_ns(xmlel()) -> xmlel().
fix_ns(#xmlel{name = Name} = El) when Name == <<"message">>;
Name == <<"iq">>;
Name == <<"presence">> ->
Attrs = lists:filter(
fun({<<"xmlns">>, _}) -> false;
(_) -> true
end, El#xmlel.attrs),
El#xmlel{attrs = Attrs};
fix_ns(El) ->
El.
-spec decode_element(xmlel(), state_name(), state()) -> fsm_transition().
decode_element(#xmlel{} = El, StateName, StateData) ->
try xmpp:decode(El, [ignore_els]) of
try xmpp:decode(El, ?NS_COMPONENT, [ignore_els]) of
Pkt -> ?MODULE:StateName(Pkt, StateData)
catch error:{xmpp_codec, Why} ->
case xmpp:is_stanza(El) of

View File

@ -144,7 +144,7 @@ process_iq(_Host, Module, Function, From, To, IQ0) ->
end
catch E:R ->
?ERROR_MSG("failed to process iq:~n~s~nReason = ~p",
[xmpp_codec:pp(IQ), {E, {R, erlang:get_stacktrace()}}]),
[xmpp:pp(IQ), {E, {R, erlang:get_stacktrace()}}]),
Txt = <<"Module failed to handle the query">>,
Err = xmpp:err_internal_server_error(Txt, IQ#iq.lang),
ejabberd_router:route(To, From, xmpp:make_error(IQ, Err))
@ -169,7 +169,7 @@ process_iq(Module, Function, #iq{lang = Lang, sub_els = [El]} = IQ) ->
process_iq(Module, Function, From, To, IQ) ->
case Module:Function(From, To, IQ) of
ignore -> ignore;
ResIQ -> xmpp:decode(jlib:iq_to_xml(ResIQ), [ignore_els])
ResIQ -> xmpp:decode(jlib:iq_to_xml(ResIQ), ?NS_CLIENT, [ignore_els])
end.
-spec check_type(type()) -> type().

View File

@ -155,7 +155,7 @@ process_offline(Server, To, #xmlel{children = Els}) ->
LServer = jid:nameprep(Server),
lists:foreach(
fun(#xmlel{} = El) ->
try xmpp:decode(El, [ignore_els]) of
try xmpp:decode(El, ?NS_CLIENT, [ignore_els]) of
#message{from = JID} ->
From = case JID of
undefined -> jid:make(Server);

View File

@ -1351,7 +1351,7 @@ send_stanza(FromString, ToString, Stanza) ->
#xmlel{} = El = fxml_stream:parse_element(Stanza),
#jid{} = From = jid:from_string(FromString),
#jid{} = To = jid:to_string(ToString),
Pkt = xmpp:decode(El, [ignore_els]),
Pkt = xmpp:decode(El, ?NS_CLIENT, [ignore_els]),
ejabberd_router:route(From, To, Pkt)
catch _:{xmpp_codec, Why} ->
io:format("incorrect stanza: ~s~n", [xmpp:format_error(Why)]),

View File

@ -768,7 +768,7 @@ send_motd(#jid{luser = LUser, lserver = LServer} = JID) when LUser /= <<>> ->
Mod = gen_mod:db_mod(LServer, ?MODULE),
case Mod:get_motd(LServer) of
{ok, Packet} ->
try xmpp:decode(Packet, [ignore_els]) of
try xmpp:decode(Packet, ?NS_CLIENT, [ignore_els]) of
Msg ->
case Mod:is_motd_user(LUser, LServer) of
false ->
@ -792,7 +792,7 @@ get_stored_motd(LServer) ->
Mod = gen_mod:db_mod(LServer, ?MODULE),
case Mod:get_motd(LServer) of
{ok, Packet} ->
try xmpp:decode(Packet, [ignore_els]) of
try xmpp:decode(Packet, ?NS_CLIENT, [ignore_els]) of
#message{body = Body, subject = Subject} ->
{xmpp:get_text(Subject), xmpp:get_text(Body)}
catch _:{xmpp_codec, Why} ->

View File

@ -540,18 +540,20 @@ should_archive(#message{body = Body} = Pkt, LServer) ->
should_archive(_, _LServer) ->
false.
-spec strip_my_archived_tag(stanza(), binary()) -> stanza().
strip_my_archived_tag(Pkt, LServer) ->
NewPkt = xmpp:decode_els(
Pkt, fun(El) ->
case xmpp:get_name(El) of
<<"archived">> ->
xmpp:get_ns(El) == ?NS_MAM_TMP;
<<"stanza-id">> ->
xmpp:get_ns(El) == ?NS_SID_0;
_ ->
false
end
end),
Pkt, ?NS_CLIENT,
fun(El) ->
case xmpp:get_name(El) of
<<"archived">> ->
xmpp:get_ns(El) == ?NS_MAM_TMP;
<<"stanza-id">> ->
xmpp:get_ns(El) == ?NS_SID_0;
_ ->
false
end
end),
NewEls = lists:filter(
fun(#mam_archived{by = #jid{luser = <<>>} = By}) ->
By#jid.lserver /= LServer;
@ -564,19 +566,20 @@ strip_my_archived_tag(Pkt, LServer) ->
strip_x_jid_tags(Pkt) ->
NewPkt = xmpp:decode_els(
Pkt, fun(El) ->
case xmpp:get_name(El) of
<<"x">> ->
case xmpp:get_ns(El) of
?NS_MUC_USER -> true;
?NS_MUC_ADMIN -> true;
?NS_MUC_OWNER -> true;
_ -> false
end;
_ ->
false
end
end),
Pkt, ?NS_CLIENT,
fun(El) ->
case xmpp:get_name(El) of
<<"x">> ->
case xmpp:get_ns(El) of
?NS_MUC_USER -> true;
?NS_MUC_ADMIN -> true;
?NS_MUC_OWNER -> true;
_ -> false
end;
_ ->
false
end
end),
NewEls = lists:filter(
fun(El) ->
Items = case El of
@ -836,7 +839,7 @@ msg_to_el(#archive_msg{timestamp = TS, packet = Pkt1, nick = Nick, peer = Peer},
maybe_update_from_to(#xmlel{} = El, JidRequestor, JidArchive, Peer,
{groupchat, _, _} = MsgType, Nick) ->
Pkt = xmpp:decode(El, [ignore_els]),
Pkt = xmpp:decode(El, ?NS_CLIENT, [ignore_els]),
maybe_update_from_to(Pkt, JidRequestor, JidArchive, Peer, MsgType, Nick);
maybe_update_from_to(#message{sub_els = Els} = Pkt, JidRequestor, JidArchive,
Peer, {groupchat, Role,

View File

@ -4343,7 +4343,7 @@ tab_count_user(JID) ->
-spec element_size(stanza()) -> non_neg_integer().
element_size(El) ->
byte_size(fxml:element_to_binary(xmpp:encode(El))).
byte_size(fxml:element_to_binary(xmpp:encode(El, ?NS_CLIENT))).
-spec store_room(state()) -> ok.
store_room(StateData) ->

View File

@ -611,7 +611,7 @@ get_offline_els(LUser, LServer) ->
end, Hdrs).
offline_msg_to_route(LServer, #offline_msg{} = R) ->
Pkt = xmpp:decode(R#offline_msg.packet, [ignore_els]),
Pkt = xmpp:decode(R#offline_msg.packet, ?NS_CLIENT, [ignore_els]),
Pkt1 = case R#offline_msg.timestamp of
undefined ->
Pkt;
@ -626,7 +626,7 @@ read_message_headers(LUser, LServer) ->
lists:map(
fun({Seq, From, To, El}) ->
Node = integer_to_binary(Seq),
Packet = xmpp:decode(El, [ignore_els]),
Packet = xmpp:decode(El, ?NS_CLIENT, [ignore_els]),
{Node, From, To, Packet}
end, Mod:read_message_headers(LUser, LServer)).

View File

@ -10,14 +10,15 @@
%% API
-export([make_iq_result/1, make_iq_result/2, make_error/2,
decode/1, decode/2, encode/1,
decode/1, decode/3, encode/1, encode/2,
get_type/1, get_to/1, get_from/1, get_id/1,
get_lang/1, get_error/1, get_els/1, get_ns/1,
set_type/2, set_to/2, set_from/2, set_id/2,
set_lang/2, set_error/2, set_els/2, set_from_to/3,
format_error/1, is_stanza/1, set_subtag/2, get_subtag/2,
remove_subtag/2, has_subtag/2, decode_els/1, decode_els/2,
pp/1, get_name/1, get_text/1, mk_text/1, mk_text/2]).
remove_subtag/2, has_subtag/2, decode_els/1, decode_els/3,
pp/1, get_name/1, get_text/1, mk_text/1, mk_text/2,
is_known_tag/1, is_known_tag/2]).
%% XMPP errors
-export([err_bad_request/0, err_bad_request/2,
@ -117,7 +118,7 @@ make_error(#xmlel{attrs = Attrs, children = Els} = El, Err) ->
Attrs
end,
Attrs3 = lists:keystore(<<"type">>, 1, Attrs2, {<<"type">>, <<"error">>}),
El#xmlel{attrs = Attrs3, children = Els ++ [encode(Err)]}.
El#xmlel{attrs = Attrs3, children = Els ++ [encode(Err, ?NS_CLIENT)]}.
-spec get_id(iq() | message() | presence() | xmlel()) -> binary().
get_id(#iq{id = ID}) -> ID;
@ -232,35 +233,30 @@ get_name(Pkt) ->
-spec decode(xmlel() | xmpp_element()) -> {ok, xmpp_element()} | {error, any()}.
decode(El) ->
decode(El, []).
decode(El, ?NS_CLIENT, []).
-spec decode(xmlel() | xmpp_element(),
[proplists:property()] |
fun((xmlel() | xmpp_element()) -> boolean())) ->
-spec decode(xmlel() | xmpp_element(), binary(), [proplists:property()]) ->
{ok, xmpp_element()} | {error, any()}.
decode(#xmlel{} = El, MatchFun) when is_function(MatchFun) ->
Pkt = xmpp_codec:decode(add_ns(El), [ignore_els]),
decode_els(Pkt, MatchFun);
decode(#xmlel{} = El, Opts) when is_list(Opts) ->
xmpp_codec:decode(add_ns(El), Opts);
decode(Pkt, _Opts) ->
decode(#xmlel{} = El, TopXMLNS, Opts) ->
xmpp_codec:decode(El, TopXMLNS, Opts);
decode(Pkt, _, _) ->
Pkt.
-spec decode_els(iq()) -> iq();
(message()) -> message();
(presence()) -> presence().
decode_els(Stanza) ->
decode_els(Stanza, fun xmpp_codec:is_known_tag/1).
decode_els(Stanza, ?NS_CLIENT, fun is_known_tag/1).
-type match_fun() :: fun((xmlel()) -> boolean()).
-spec decode_els(iq(), match_fun()) -> iq();
(message(), match_fun()) -> message();
(presence(), match_fun()) -> presence().
decode_els(Stanza, MatchFun) ->
-spec decode_els(iq(), binary(), match_fun()) -> iq();
(message(), binary(), match_fun()) -> message();
(presence(), binary(), match_fun()) -> presence().
decode_els(Stanza, TopXMLNS, MatchFun) ->
Els = lists:map(
fun(#xmlel{} = El) ->
case MatchFun(El) of
true -> decode(El);
true -> decode(El, TopXMLNS, []);
false -> El
end;
(Pkt) ->
@ -270,7 +266,19 @@ decode_els(Stanza, MatchFun) ->
-spec encode(xmpp_element() | xmlel()) -> xmlel().
encode(Pkt) ->
xmpp_codec:encode(Pkt).
encode(Pkt, <<>>).
-spec encode(xmpp_element() | xmlel(), binary()) -> xmlel().
encode(Pkt, TopXMLNS) ->
xmpp_codec:encode(Pkt, TopXMLNS).
-spec is_known_tag(xmlel()) -> boolean().
is_known_tag(El) ->
is_known_tag(El, ?NS_CLIENT).
-spec is_known_tag(xmlel(), binary()) -> boolean().
is_known_tag(El, TopXMLNS) ->
xmpp_codec:is_known_tag(El, TopXMLNS).
format_error(Reason) ->
xmpp_codec:format_error(Reason).
@ -809,16 +817,6 @@ serr(Reason, Text, Lang) ->
text = #text{lang = Lang,
data = translate:translate(Lang, Text)}}.
-spec add_ns(xmlel()) -> xmlel().
add_ns(#xmlel{name = Name} = El) when Name == <<"message">>;
Name == <<"presence">>;
Name == <<"iq">> ->
Attrs = lists:keystore(<<"xmlns">>, 1, El#xmlel.attrs,
{<<"xmlns">>, ?NS_CLIENT}),
El#xmlel{attrs = Attrs};
add_ns(El) ->
El.
-spec match_tag(xmlel() | xmpp_element(), binary(), binary()) -> boolean().
match_tag(El, TagName, XMLNS) ->
get_name(El) == TagName andalso get_ns(El) == XMLNS.

File diff suppressed because it is too large Load Diff

View File

@ -11,7 +11,7 @@
-compile(export_all).
-import(suite, [init_config/1, connect/1, disconnect/1,
recv/0, send/2, send_recv/2, my_jid/1, server_jid/1,
recv/1, send/2, send_recv/2, my_jid/1, server_jid/1,
pubsub_jid/1, proxy_jid/1, muc_jid/1, muc_room_jid/1,
mix_jid/1, mix_room_jid/1, get_features/2, re_register/1,
is_feature_advertised/2, subscribe_to_events/1,
@ -974,7 +974,7 @@ sm_resume(Config) ->
Txt = #text{data = <<"body">>},
Msg = #message{from = ServerJID, to = MyJID, body = [Txt]},
%% Route message. The message should be queued by the C2S process.
ejabberd_router:route(ServerJID, MyJID, xmpp_codec:encode(Msg)),
ejabberd_router:route(ServerJID, MyJID, Msg),
send(Config, #sm_resume{previd = ID, h = 0, xmlns = ?NS_STREAM_MGMT_3}),
?recv1(#sm_resumed{previd = ID, h = 3}),
?recv1(#message{from = ServerJID, to = MyJID, body = [Txt]}),
@ -1001,7 +1001,7 @@ private(Config) ->
<<"some.conference.org">>,
<<>>)},
Storage = #bookmark_storage{conference = [Conference]},
StorageXMLOut = xmpp_codec:encode(Storage),
StorageXMLOut = xmpp:encode(Storage),
WrongEl = #xmlel{name = <<"wrong">>},
#iq{type = error} =
send_recv(Config, #iq{type = get,
@ -1015,9 +1015,9 @@ private(Config) ->
send_recv(
Config,
#iq{type = get,
sub_els = [#private{xml_els = [xmpp_codec:encode(
sub_els = [#private{xml_els = [xmpp:encode(
#bookmark_storage{})]}]}),
Storage = xmpp_codec:decode(StorageXMLIn),
Storage = xmpp:decode(StorageXMLIn),
disconnect(Config).
last(Config) ->
@ -1221,7 +1221,7 @@ pubsub(Config) ->
ItemID = randoms:get_string(),
Node = <<"presence!@#$%^&*()'\"`~<>+-/;:_=[]{}|\\">>,
Item = #ps_item{id = ItemID,
xml_els = [xmpp_codec:encode(#presence{})]},
xml_els = [xmpp:encode(#presence{})]},
#iq{type = result,
sub_els = [#pubsub{publish = #ps_publish{
node = Node,
@ -1320,10 +1320,10 @@ mix_master(Config) ->
?recv2(#iq{type = result, id = I0,
sub_els = [#mix_join{subscribe = Nodes, jid = MyBareJID}]},
#message{from = Room}),
#mix_participant{jid = MyBareJID} = xmpp_codec:decode(PXML),
#mix_participant{jid = MyBareJID} = xmpp:decode(PXML),
%% Coming online
PresenceID = randoms:get_string(),
Presence = xmpp_codec:encode(#presence{}),
Presence = xmpp:encode(#presence{}),
I1 = send(
Config,
#iq{type = set, to = Room,
@ -1355,7 +1355,7 @@ mix_master(Config) ->
sub_els = [#ps_event{
items = #ps_items{
node = ?NS_MIX_NODES_PRESENCE,
retract = PresenceID}}]} = recv(),
retract = PresenceID}}]} = recv(Config),
%% Leaving
I2 = send(Config, #iq{type = set, to = Room, sub_els = [#mix_leave{}]}),
?recv2(#iq{type = result, id = I2, sub_els = []},
@ -2367,7 +2367,7 @@ mam_query_all(Config, NS) ->
_ -> set
end,
I = send(Config, #iq{type = Type, sub_els = [#mam_query{xmlns = NS, id = QID}]}),
maybe_recv_iq_result(NS, I),
maybe_recv_iq_result(Config, NS, I),
Iter = if NS == ?NS_MAM_TMP -> lists:seq(1, 5);
true -> lists:seq(1, 5) ++ lists:seq(1, 5)
end,
@ -2408,7 +2408,7 @@ mam_query_with(Config, JID, NS) ->
Iter = if NS == ?NS_MAM_TMP -> lists:seq(1, 5);
true -> lists:seq(1, 5) ++ lists:seq(1, 5)
end,
maybe_recv_iq_result(NS, I),
maybe_recv_iq_result(Config, NS, I),
lists:foreach(
fun(N) ->
Text = #text{data = integer_to_binary(N)},
@ -2430,9 +2430,9 @@ mam_query_with(Config, JID, NS) ->
?recv1(#message{sub_els = [#mam_fin{complete = true}]})
end.
maybe_recv_iq_result(?NS_MAM_0, I1) ->
maybe_recv_iq_result(Config, ?NS_MAM_0, I1) ->
?recv1(#iq{type = result, id = I1});
maybe_recv_iq_result(_, _) ->
maybe_recv_iq_result(_, _, _) ->
ok.
mam_query_rsm(Config, NS) ->
@ -2446,7 +2446,7 @@ mam_query_rsm(Config, NS) ->
I1 = send(Config,
#iq{type = Type,
sub_els = [#mam_query{xmlns = NS, rsm = #rsm_set{max = 3}}]}),
maybe_recv_iq_result(NS, I1),
maybe_recv_iq_result(Config, NS, I1),
lists:foreach(
fun(N) ->
Text = #text{data = integer_to_binary(N)},
@ -2478,7 +2478,7 @@ mam_query_rsm(Config, NS) ->
sub_els = [#mam_query{xmlns = NS,
rsm = #rsm_set{max = 2,
'after' = Last}}]}),
maybe_recv_iq_result(NS, I2),
maybe_recv_iq_result(Config, NS, I2),
lists:foreach(
fun(N) ->
Text = #text{data = integer_to_binary(N)},
@ -2515,7 +2515,7 @@ mam_query_rsm(Config, NS) ->
sub_els = [#mam_query{xmlns = NS,
rsm = #rsm_set{max = 3,
before = First}}]}),
maybe_recv_iq_result(NS, I3),
maybe_recv_iq_result(Config, NS, I3),
lists:foreach(
fun(N) ->
Text = #text{data = integer_to_binary(N)},
@ -2544,7 +2544,7 @@ mam_query_rsm(Config, NS) ->
#iq{type = Type,
sub_els = [#mam_query{xmlns = NS,
rsm = #rsm_set{max = 0}}]}),
maybe_recv_iq_result(NS, I4),
maybe_recv_iq_result(Config, NS, I4),
if NS == ?NS_MAM_TMP ->
?recv1(#iq{type = result, id = I4,
sub_els = [#mam_query{
@ -2566,7 +2566,7 @@ mam_query_rsm(Config, NS) ->
sub_els = [#mam_query{xmlns = NS,
rsm = #rsm_set{max = 2,
before = <<"">>}}]}),
maybe_recv_iq_result(NS, I5),
maybe_recv_iq_result(Config, NS, I5),
lists:foreach(
fun(N) ->
Text = #text{data = integer_to_binary(N)},
@ -2598,7 +2598,7 @@ client_state_master(Config) ->
ChatState = #message{to = Peer, thread = <<"1">>,
sub_els = [#chatstate{type = active}]},
Message = ChatState#message{body = [#text{data = <<"body">>}]},
PepPayload = xmpp_codec:encode(#presence{}),
PepPayload = xmpp:encode(#presence{}),
PepOne = #message{
to = Peer,
sub_els =
@ -2661,7 +2661,7 @@ client_state_slave(Config) ->
items =
[#ps_item{
id = <<"pep-1">>}]}},
#delay{}]} = recv(),
#delay{}]} = recv(Config),
#message{
from = Peer,
sub_els =
@ -2672,7 +2672,7 @@ client_state_slave(Config) ->
items =
[#ps_item{
id = <<"pep-2">>}]}},
#delay{}]} = recv(),
#delay{}]} = recv(Config),
?recv1(#message{from = Peer, thread = <<"1">>,
sub_els = [#chatstate{type = composing},
#delay{}]}),

View File

@ -184,11 +184,11 @@ init_stream(Config) ->
component -> ?NS_COMPONENT;
server -> ?NS_SERVER
end,
#stream_start{id = ID, xmlns = XMLNS, version = Version} = recv(),
#stream_start{id = ID, xmlns = XMLNS, version = Version} = recv(Config),
set_opt(stream_id, ID, NewConfig).
process_stream_features(Config) ->
#stream_features{sub_els = Fs} = recv(),
#stream_features{sub_els = Fs} = recv(Config),
Mechs = lists:flatmap(
fun(#sasl_mechanisms{list = Ms}) ->
Ms;
@ -213,7 +213,7 @@ disconnect(Config) ->
catch exit:normal ->
ok
end,
{xmlstreamend, <<"stream:stream">>} = recv(),
{xmlstreamend, <<"stream:stream">>} = recv(Config),
ejabberd_socket:close(Socket),
Config.
@ -227,7 +227,7 @@ starttls(Config) ->
starttls(Config, ShouldFail) ->
send(Config, #starttls{}),
case recv() of
case recv(Config) of
#starttls_proceed{} when ShouldFail ->
ct:fail(starttls_should_have_failed);
#starttls_failure{} when ShouldFail ->
@ -244,7 +244,7 @@ starttls(Config, ShouldFail) ->
zlib(Config) ->
send(Config, #compress{methods = [<<"zlib">>]}),
#compressed{} = recv(),
#compressed{} = recv(Config),
ZlibSocket = ejabberd_socket:compress(?config(socket, Config)),
process_stream_features(init_stream(set_opt(socket, ZlibSocket, Config))).
@ -346,7 +346,7 @@ auth_component(Config, ShouldFail) ->
Password = ?config(password, Config),
Digest = p1_sha:sha(<<StreamID/binary, Password/binary>>),
send(Config, #handshake{data = Digest}),
case recv() of
case recv(Config) of
#handshake{} when ShouldFail ->
ct:fail(component_auth_should_have_failed);
#handshake{} ->
@ -369,7 +369,7 @@ auth_SASL(Mech, Config, ShouldFail) ->
wait_auth_SASL_result(set_opt(sasl, SASL, Config), ShouldFail).
wait_auth_SASL_result(Config, ShouldFail) ->
case recv() of
case recv(Config) of
#sasl_success{} when ShouldFail ->
ct:fail(sasl_auth_should_have_failed);
#sasl_success{} ->
@ -379,8 +379,8 @@ wait_auth_SASL_result(Config, ShouldFail) ->
NS = if Type == client -> ?NS_CLIENT;
Type == server -> ?NS_SERVER
end,
#stream_start{xmlns = NS, version = {1,0}} = recv(),
#stream_features{sub_els = Fs} = recv(),
#stream_start{xmlns = NS, version = {1,0}} = recv(Config),
#stream_features{sub_els = Fs} = recv(Config),
if Type == client ->
#xmpp_session{optional = true} =
lists:keyfind(xmpp_session, 1, Fs);
@ -417,39 +417,31 @@ match_failure(Received, [Match]) when is_list(Match)->
match_failure(Received, Matches) ->
ct:fail("Received input:~n~n~p~n~ndon't match expected patterns:~n~n~p", [Received, Matches]).
recv() ->
recv(Config) ->
receive
{'$gen_event', {xmlstreamelement, El}} ->
decode(El);
NS = case ?config(type, Config) of
client -> ?NS_CLIENT;
server -> ?NS_SERVER;
component -> ?NS_COMPONENT
end,
decode(El, NS, []);
{'$gen_event', {xmlstreamstart, Name, Attrs}} ->
decode(#xmlel{name = Name, attrs = Attrs});
decode(#xmlel{name = Name, attrs = Attrs}, <<>>, []);
{'$gen_event', Event} ->
Event
end.
decode(El) ->
decode(El, NS, Opts) ->
try
Pkt = xmpp:decode(El),
ct:pal("recv: ~p ->~n~s", [El, xmpp_codec:pp(Pkt)]),
Pkt = xmpp:decode(El, NS, Opts),
ct:pal("recv: ~p ->~n~s", [El, xmpp:pp(Pkt)]),
Pkt
catch _:{xmpp_codec, Why} ->
ct:fail("recv failed: ~p->~n~s",
[El, xmpp:format_error(Why)])
end.
fix_ns(#xmlel{name = Tag, attrs = Attrs} = El)
when Tag == <<"stream:features">>; Tag == <<"stream:error">> ->
NewAttrs = [{<<"xmlns">>, <<"http://etherx.jabber.org/streams">>}
|lists:keydelete(<<"xmlns">>, 1, Attrs)],
El#xmlel{attrs = NewAttrs};
fix_ns(#xmlel{name = Tag, attrs = Attrs} = El)
when Tag == <<"message">>; Tag == <<"iq">>; Tag == <<"presence">> ->
NewAttrs = [{<<"xmlns">>, <<"jabber:client">>}
|lists:keydelete(<<"xmlns">>, 1, Attrs)],
El#xmlel{attrs = NewAttrs};
fix_ns(El) ->
El.
send_text(Config, Text) ->
ejabberd_socket:send(?config(socket, Config), Text).
@ -467,8 +459,8 @@ send(State, Pkt) ->
_ ->
{undefined, Pkt}
end,
El = xmpp_codec:encode(NewPkt),
ct:pal("sent: ~p <-~n~s", [El, xmpp_codec:pp(NewPkt)]),
El = xmpp:encode(NewPkt),
ct:pal("sent: ~p <-~n~s", [El, xmpp:pp(NewPkt)]),
Data = case NewPkt of
#stream_start{} -> fxml:element_to_header(El);
_ -> fxml:element_to_binary(El)
@ -478,7 +470,7 @@ send(State, Pkt) ->
send_recv(State, IQ) ->
ID = send(State, IQ),
#iq{id = ID} = recv().
#iq{id = ID} = recv(State).
sasl_new(<<"PLAIN">>, User, Server, Password) ->
{<<User/binary, $@, Server/binary, 0, User/binary, 0, Password/binary>>,

View File

@ -13,7 +13,7 @@
-define(recv1(P1),
P1 = (fun() ->
V = recv(),
V = recv(Config),
case V of
P1 -> V;
_ -> suite:match_failure([V], [??P1])
@ -22,7 +22,7 @@
-define(recv2(P1, P2),
(fun() ->
case {R1 = recv(), R2 = recv()} of
case {R1 = recv(Config), R2 = recv(Config)} of
{P1, P2} -> {R1, R2};
{P2, P1} -> {R2, R1};
{P1, V1} -> suite:match_failure([V1], [P2]);
@ -35,7 +35,7 @@
-define(recv3(P1, P2, P3),
(fun() ->
case R3 = recv() of
case R3 = recv(Config) of
P1 -> insert(R3, 1, ?recv2(P2, P3));
P2 -> insert(R3, 2, ?recv2(P1, P3));
P3 -> insert(R3, 3, ?recv2(P1, P2));
@ -45,7 +45,7 @@
-define(recv4(P1, P2, P3, P4),
(fun() ->
case R4 = recv() of
case R4 = recv(Config) of
P1 -> insert(R4, 1, ?recv3(P2, P3, P4));
P2 -> insert(R4, 2, ?recv3(P1, P3, P4));
P3 -> insert(R4, 3, ?recv3(P1, P2, P4));
@ -56,7 +56,7 @@
-define(recv5(P1, P2, P3, P4, P5),
(fun() ->
case R5 = recv() of
case R5 = recv(Config) of
P1 -> insert(R5, 1, ?recv4(P2, P3, P4, P5));
P2 -> insert(R5, 2, ?recv4(P1, P3, P4, P5));
P3 -> insert(R5, 3, ?recv4(P1, P2, P4, P5));

View File

@ -316,7 +316,8 @@
-xml(iq,
#elem{name = <<"iq">>,
xmlns = <<"jabber:client">>,
xmlns = [<<"jabber:client">>, <<"jabber:server">>,
<<"jabber:component:accept">>],
result = {iq, '$id', '$type', '$lang', '$from', '$to', '$_els'},
attrs = [#attr{name = <<"id">>,
required = true},
@ -335,26 +336,30 @@
-xml(message_subject,
#elem{name = <<"subject">>,
xmlns = <<"jabber:client">>,
xmlns = [<<"jabber:client">>, <<"jabber:server">>,
<<"jabber:component:accept">>],
result = {text, '$lang', '$data'},
cdata = #cdata{label = '$data'},
attrs = [#attr{name = <<"xml:lang">>, label = '$lang'}]}).
-xml(message_body,
#elem{name = <<"body">>,
xmlns = <<"jabber:client">>,
xmlns = [<<"jabber:client">>, <<"jabber:server">>,
<<"jabber:component:accept">>],
result = {text, '$lang', '$data'},
cdata = #cdata{label = '$data'},
attrs = [#attr{name = <<"xml:lang">>, label = '$lang'}]}).
-xml(message_thread,
#elem{name = <<"thread">>,
xmlns = <<"jabber:client">>,
xmlns = [<<"jabber:client">>, <<"jabber:server">>,
<<"jabber:component:accept">>],
result = '$cdata'}).
-xml(message,
#elem{name = <<"message">>,
xmlns = <<"jabber:client">>,
xmlns = [<<"jabber:client">>, <<"jabber:server">>,
<<"jabber:component:accept">>],
result = {message, '$id', '$type', '$lang', '$from', '$to',
'$subject', '$body', '$thread', '$_els'},
attrs = [#attr{name = <<"id">>},
@ -377,14 +382,16 @@
-xml(presence_show,
#elem{name = <<"show">>,
xmlns = <<"jabber:client">>,
xmlns = [<<"jabber:client">>, <<"jabber:server">>,
<<"jabber:component:accept">>],
result = '$cdata',
cdata = #cdata{enc = {enc_enum, []},
dec = {dec_enum, [[away, chat, dnd, xa]]}}}).
-xml(presence_status,
#elem{name = <<"status">>,
xmlns = <<"jabber:client">>,
xmlns = [<<"jabber:client">>, <<"jabber:server">>,
<<"jabber:component:accept">>],
result = {text, '$lang', '$data'},
cdata = #cdata{label = '$data'},
attrs = [#attr{name = <<"xml:lang">>,
@ -392,14 +399,16 @@
-xml(presence_priority,
#elem{name = <<"priority">>,
xmlns = <<"jabber:client">>,
xmlns = [<<"jabber:client">>, <<"jabber:server">>,
<<"jabber:component:accept">>],
result = '$cdata',
cdata = #cdata{enc = {enc_int, []},
dec = {dec_int, []}}}).
-xml(presence,
#elem{name = <<"presence">>,
xmlns = <<"jabber:client">>,
xmlns = [<<"jabber:client">>, <<"jabber:server">>,
<<"jabber:component:accept">>],
result = {presence, '$id', '$type', '$lang', '$from', '$to',
'$show', '$status', '$priority', '$_els'},
attrs = [#attr{name = <<"id">>},
@ -527,7 +536,8 @@
-xml(error,
#elem{name = <<"error">>,
xmlns = <<"jabber:client">>,
xmlns = [<<"jabber:client">>, <<"jabber:server">>,
<<"jabber:component:accept">>],
result = {stanza_error, '$type', '$code', '$by', '$reason', '$text', '$_els'},
attrs = [#attr{name = <<"type">>,
label = '$type',
@ -861,7 +871,7 @@
-xml(stream_features,
#elem{name = <<"stream:features">>,
xmlns = <<"http://etherx.jabber.org/streams">>,
xmlns = [<<"jabber:client">>, <<"jabber:server">>],
result = {stream_features, '$_els'}}).
-xml(p1_push,
@ -1187,7 +1197,8 @@
-xml(stream_error,
#elem{name = <<"stream:error">>,
xmlns = <<"http://etherx.jabber.org/streams">>,
xmlns = [<<"jabber:client">>, <<"jabber:server">>,
<<"jabber:component:accept">>],
result = {stream_error, '$reason', '$text'},
refs = [#ref{name = stream_error_text,
label = '$text',
@ -3162,7 +3173,7 @@
-xml(db_result,
#elem{name = <<"db:result">>,
xmlns = <<"jabber:client">>,
xmlns = <<"jabber:server">>,
result = {db_result, '$from', '$to', '$type', '$key', '$_els'},
cdata = #cdata{default = <<"">>, label = '$key'},
attrs = [#attr{name = <<"from">>, required = true,
@ -3175,7 +3186,7 @@
-xml(db_verify,
#elem{name = <<"db:verify">>,
xmlns = <<"jabber:client">>,
xmlns = <<"jabber:server">>,
result = {db_verify, '$from', '$to', '$id', '$type', '$key', '$_els'},
cdata = #cdata{default = <<"">>, label = '$key'},
attrs = [#attr{name = <<"from">>, required = true,
@ -3189,7 +3200,7 @@
-xml(handshake,
#elem{name = <<"handshake">>,
xmlns = <<"jabber:client">>,
xmlns = <<"jabber:component:accept">>,
result = {handshake, '$data'},
cdata = #cdata{default = <<"">>, label = '$data'}}).