Skip to content

Commit

Permalink
Merge pull request #4473 from esl/xml_cleanups
Browse files Browse the repository at this point in the history
Cleanup exml types
  • Loading branch information
DenysGonchar authored Jan 28, 2025
2 parents ce1b5f6 + 2c9994c commit 1428ceb
Show file tree
Hide file tree
Showing 16 changed files with 66 additions and 87 deletions.
2 changes: 1 addition & 1 deletion big_tests/rebar.config
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

%% We use https:// instead of git://
{deps, [
{exml, "4.0.0", {pkg, hexml}},
{exml, "4.1.1", {pkg, hexml}},
{bbmustache, "1.12.2"},
{jiffy, "1.1.2"},
{proper, "1.4.0"},
Expand Down
6 changes: 3 additions & 3 deletions big_tests/rebar.lock
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
0},
{<<"escalus">>,{pkg,<<"escalus">>,<<"4.3.0">>},0},
{<<"esip">>,{pkg,<<"esip">>,<<"1.0.56">>},0},
{<<"exml">>,{pkg,<<"hexml">>,<<"4.0.0">>},0},
{<<"exml">>,{pkg,<<"hexml">>,<<"4.1.1">>},0},
{<<"fast_pbkdf2">>,{pkg,<<"fast_pbkdf2">>,<<"1.0.6">>},2},
{<<"fast_scram">>,{pkg,<<"fast_scram">>,<<"0.6.1">>},1},
{<<"fast_tls">>,{pkg,<<"fast_tls">>,<<"1.1.21">>},1},
Expand Down Expand Up @@ -44,7 +44,7 @@
{<<"ct_groups_summary_hook">>, <<"21B94902B6CF2D345F4D790D34B49654E71CB8E570DCCC9C1C3616DAE720A7AA">>},
{<<"escalus">>, <<"80301D57F4C863FA95F09AE148524508F18D7389B5070E2A5FFB7A38B51527C5">>},
{<<"esip">>, <<"63C0FDC667BE751714E1E5C14621A9334F21B60AC1BB68BE889454CA9CA021B7">>},
{<<"exml">>, <<"54C1AAD5BD290EC31C19CE4A5D449C7E3236107AA2D3610FC04FC963DC8EAF13">>},
{<<"exml">>, <<"D46272177F3B779D75058005C744997034823AB3A237F9B30B56A583B063FDE3">>},
{<<"fast_pbkdf2">>, <<"199BCEC73A1A246941E9465D3DC41052953B638128841ED24B29ED03CF70AF27">>},
{<<"fast_scram">>, <<"BEEADB03D774640F0671681759CE53B2FF33CB58C86FD9BF2A793E2FC1ED0F5D">>},
{<<"fast_tls">>, <<"65D7D547A09EEFB37A1C0D04D8601FAC4F3E6E2C1EDE859A7787081670F9648D">>},
Expand Down Expand Up @@ -75,7 +75,7 @@
{<<"ct_groups_summary_hook">>, <<"997CDE48FEB0C398989E4091A341D4FFF43CFA06CDB8FB2E80CC4A0E0362691C">>},
{<<"escalus">>, <<"8C4D39677D55C48B04EDE4EAC0FD0AD2A574BEDE7180761E6E3D3877900C7708">>},
{<<"esip">>, <<"9EF3660CEF93B623F7368DCD5C79F4E704358631909E6DD464E335378815DA1F">>},
{<<"exml">>, <<"08CC97527C708D57A03F467049AC260B5951BD67906AA154BE56B5D8BDD3238C">>},
{<<"exml">>, <<"86C154396A9B21EEB0EDB9636D0E2D493FE0F59EAAF40FCFE795210F31119D8F">>},
{<<"fast_pbkdf2">>, <<"35EEC22629AAA739915843C7B7DE0D84657D1ECE972D8BBC86368747E9C14012">>},
{<<"fast_scram">>, <<"FE0650A309FDF97C75E1EA812CCFB40EB464ECAFD3783E83AA17C7F572EDAB0B">>},
{<<"fast_tls">>, <<"131542913937025E48CD80AA81F00359686D5501B75621E72026A87B5229505B">>},
Expand Down
2 changes: 1 addition & 1 deletion big_tests/tests/graphql_private_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ parse_xml_error(Config) ->
parse_xml_error(Config, Alice) ->
ResultSet = user_set_private(Alice, <<"AAAABBBB">>, Config),
?assertEqual(<<"Input coercion failed for type XmlElement with value <<\"AAAABBBB\">>."
" The reason it failed is: \"expected <\"">>,
" The reason it failed is: <<\"expected <\">>">>,
get_coercion_err_msg(ResultSet)).

% User private not configured test cases
Expand Down
2 changes: 1 addition & 1 deletion big_tests/tests/graphql_stanza_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -393,7 +393,7 @@ user_send_stanza_with_spoofed_from_story(Config, Alice, Bob) ->
admin_send_unparsable_stanza(Config) ->
Res = send_stanza(<<"<test">>, Config),
?assertEqual(<<"Input coercion failed for type XmlElement with value <<\"<test\">>. "
"The reason it failed is: \"expected >\"">>,
"The reason it failed is: <<\"expected >\">>">>,
get_coercion_err_msg(Res)).

admin_send_stanza_from_unknown_user(Config) ->
Expand Down
2 changes: 1 addition & 1 deletion include/mod_muc_light.hrl
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@

-record(msg, {
id = <<>> :: binary(),
children = [] :: [jlib:xmlch()]
children = [] :: [exml:child()]
}).

-record(config, {
Expand Down
2 changes: 1 addition & 1 deletion rebar.config
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
{deps,
[
%%% Stateless parsers
{exml, "4.0.0", {pkg, hexml}},
{exml, "4.1.1", {pkg, hexml}},
{jiffy, "1.1.2"},
{jid, "2.2.0", {pkg, mongoose_jid}},
{tomerl, "0.5.0"},
Expand Down
6 changes: 3 additions & 3 deletions rebar.lock
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
{<<"erl_csv">>,{pkg,<<"erl_csv">>,<<"0.3.3">>},0},
{<<"erlang_doctor">>,{pkg,<<"erlang_doctor">>,<<"0.2.7">>},0},
{<<"erlcloud">>,{pkg,<<"erlcloud">>,<<"3.8.2">>},0},
{<<"exml">>,{pkg,<<"hexml">>,<<"4.0.0">>},0},
{<<"exml">>,{pkg,<<"hexml">>,<<"4.1.1">>},0},
{<<"exometer_core">>,
{git,"https://github.com/esl/exometer_core.git",
{ref,"123daa053a4abb3ff4bdbf52f08344da535294e9"}},
Expand Down Expand Up @@ -142,7 +142,7 @@
{<<"erl_csv">>, <<"94FBA776D493FE0DA76786D694CC2A788F14C864766DBB04C1786272515898C4">>},
{<<"erlang_doctor">>, <<"38DCCF531B0DCF01B327EF437C7422EA3123457CF664C75BA8219D6022A7DA4B">>},
{<<"erlcloud">>, <<"E0EE55C4B11826E79737655A52282C5C62EB31F7FDFACF4E314C12422C64A95F">>},
{<<"exml">>, <<"54C1AAD5BD290EC31C19CE4A5D449C7E3236107AA2D3610FC04FC963DC8EAF13">>},
{<<"exml">>, <<"D46272177F3B779D75058005C744997034823AB3A237F9B30B56A583B063FDE3">>},
{<<"fast_pbkdf2">>, <<"6045138C4C209FC8222A0B18B2CB1D7BD7407EF4ADAD0F14C5E0F7F4726E3E41">>},
{<<"fast_scram">>, <<"70724F584A118DA147A51EE38DEE56203F217D58AD61E0BB2C2EF834C16B35B8">>},
{<<"fast_tls">>, <<"44356B256AFAD4399C2FC5059A3066669DAFD8BD4E4E796C9C1CF8910DDD265E">>},
Expand Down Expand Up @@ -213,7 +213,7 @@
{<<"erl_csv">>, <<"B1B4B5F6578B2AFC307E8CBF67277AC8E3D721FE5E6B5A4D53BA49215C9600F3">>},
{<<"erlang_doctor">>, <<"5895F16E04666843895479D60624751330F87D8296411E03EC405F42F697796D">>},
{<<"erlcloud">>, <<"36207854A37BF157B45A9A115A7EEE814430808ADB2CC713C72E0048DD6351A1">>},
{<<"exml">>, <<"08CC97527C708D57A03F467049AC260B5951BD67906AA154BE56B5D8BDD3238C">>},
{<<"exml">>, <<"86C154396A9B21EEB0EDB9636D0E2D493FE0F59EAAF40FCFE795210F31119D8F">>},
{<<"fast_pbkdf2">>, <<"BC3B5A3CAB47AD114FF8BB815FEDE62A6187ACD14D8B37412F2AF8236A089CEF">>},
{<<"fast_scram">>, <<"771D034341599CFC6A6C5E56CF924B68D2C7478088CAF17419E3147B66914667">>},
{<<"fast_tls">>, <<"E65779AEFB7AB15C4755230FEF8077E687D20CC5A3984A5974F9F657E8E2485B">>},
Expand Down
2 changes: 1 addition & 1 deletion src/c2s/mongoose_c2s.erl
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ handle_socket_packet(StateData = #c2s_data{parser = Parser}, Packet) ->
?LOG_DEBUG(#{what => received_xml_on_stream, packet => Packet, c2s_pid => self()}),
case exml_stream:parse(Parser, Packet) of
{error, Reason} ->
NextEvent = {next_event, internal, #xmlstreamerror{name = iolist_to_binary(Reason)}},
NextEvent = {next_event, internal, #xmlstreamerror{name = Reason}},
{keep_state, StateData, NextEvent};
{ok, NewParser, XmlElements} ->
Size = iolist_size(Packet),
Expand Down
55 changes: 17 additions & 38 deletions src/jlib.erl
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,6 @@
-type xmlstreamerror() :: #xmlstreamerror{}.
-type xmlstreamel() :: exml:element() | exml_stream:start() | exml_stream:stop() | xmlstreamerror().

-type xmlcdata() :: #xmlcdata{}.

-type xmlch() :: exml:element() | xmlcdata(). % (XML ch)ild

-type iq() :: #iq{}.

-type rsm_in() :: #rsm_in{}.
Expand All @@ -80,8 +76,6 @@

-export_type([xmlstreamel/0, xmlstreamerror/0,
rsm_in/0, rsm_out/0,
xmlcdata/0,
xmlch/0,
iq/0,
rfc3339_string/0]).

Expand All @@ -100,8 +94,7 @@ make_result_iq_reply_attrs(#xmlel{attrs = Attrs}) ->
Attrs1 = swap_from_to_attrs(Attrs),
Attrs1#{<<"type">> => <<"result">>}.

-spec make_error_reply(exml:element() | mongoose_acc:t(),
xmlcdata() | exml:element()) ->
-spec make_error_reply(exml:element() | mongoose_acc:t(), exml:child()) ->
exml:element() | {mongoose_acc:t(), exml:element() | {error, {already_an_error, _, _}}}.
make_error_reply(#xmlel{} = Elem, Error) ->
?LOG_DEBUG(#{what => make_error_reply,
Expand Down Expand Up @@ -191,12 +184,9 @@ swap_from_to_attrs(Attrs) ->
To :: jid:simple_jid() | jid:jid(),
XE :: exml:element()) -> exml:element().
replace_from_to(From, To, XE = #xmlel{attrs = Attrs}) ->
NewAttrs = replace_from_to_attrs(jid:to_binary(From),
jid:to_binary(To),
Attrs),
NewAttrs = replace_from_to_attrs(jid:to_binary(From), jid:to_binary(To), Attrs),
XE#xmlel{attrs = NewAttrs}.


-spec remove_attr(binary(), exml:element()) -> exml:element().
remove_attr(Attr, XE = #xmlel{attrs = Attrs}) ->
NewAttrs = maps:remove(Attr, Attrs),
Expand Down Expand Up @@ -467,41 +457,30 @@ maybe_append_delay(Packet = #xmlel{children = Children}, From, TS, Desc) ->
Packet
end.

remove_delay_tags(#xmlel{children = Els} = Packet) ->
NEl = lists:foldl(
fun(#xmlel{name= <<"delay">>} = R, El) ->
case exml_query:attr(R, <<"xmlns">>) of
?NS_DELAY ->
El;
_ ->
El ++ [R]
end;
(#xmlel{name= <<"x">>} = R, El) ->
case exml_query:attr(R, <<"xmlns">>) of
?NS_DELAY91 ->
El;
_ ->
El ++ [R]
end;
(R, El) ->
El ++ [R]
end, [], Els),
Packet#xmlel{children = NEl}.

-spec remove_cdata([xmlch()]) -> [xmlch()].
remove_delay_tags(#xmlel{children = Children} = Packet) ->
Fun = fun(#xmlel{name = <<"delay">>, attrs = #{<<"xmlns">> := ?NS_DELAY}}, Els) ->
Els;
(#xmlel{name = <<"x">>, attrs = #{<<"xmlns">> := ?NS_DELAY91}}, Els) ->
Els;
(R, Els) ->
[R | Els]
end,
NEls = lists:foldl(Fun, [], Children),
Packet#xmlel{children = lists:reverse(NEls)}.

-spec remove_cdata([exml:child()]) -> [exml:element()].
remove_cdata(L) ->
[E || E <- L, remove_cdata_p(E)].

-spec remove_cdata_p(xmlch()) -> boolean().
-spec remove_cdata_p(exml:child()) -> boolean().
remove_cdata_p(#xmlel{}) -> true;
remove_cdata_p(_) -> false.

-spec append_subtags(exml:element(), [xmlch()]) -> exml:element().
-spec append_subtags(exml:element(), [exml:child()]) -> exml:element().
append_subtags(XE = #xmlel{children = SubTags1}, SubTags2) ->
XE#xmlel{children = SubTags1 ++ SubTags2}.

-spec replace_tag_attr(Attr :: binary(), Value :: binary(), exml:element()
) -> exml:element().
-spec replace_tag_attr(Attr :: binary(), Value :: binary(), exml:element()) -> exml:element().
replace_tag_attr(Attr, Value, XE = #xmlel{attrs = Attrs}) ->
Attrs1 = Attrs#{Attr => Value},
XE#xmlel{attrs = Attrs1}.
Expand Down
2 changes: 1 addition & 1 deletion src/mam/mod_mam_utils.erl
Original file line number Diff line number Diff line change
Expand Up @@ -582,7 +582,7 @@ result_set(FirstId, LastId, FirstIndexI, CountI)
children = FirstEl ++ LastEl ++ [CountEl]}.


-spec result_query(jlib:xmlcdata() | exml:element(), binary()) -> exml:element().
-spec result_query(exml:child(), binary()) -> exml:element().
result_query(SetEl, Namespace) ->
#xmlel{
name = <<"query">>,
Expand Down
2 changes: 1 addition & 1 deletion src/mod_websockets.erl
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ process_client_elements(Elements, #ws_state{fsm_pid = FSM} = State) ->
process_parse_error(_Reason, #ws_state{fsm_pid = undefined} = State) ->
{stop, State};
process_parse_error(Reason, #ws_state{fsm_pid = FSM} = State) ->
send_to_fsm(FSM, #xmlstreamerror{name = iolist_to_binary(Reason)}),
send_to_fsm(FSM, #xmlstreamerror{name = Reason}),
{ok, State}.

send_to_fsm(FSM, Element) ->
Expand Down
2 changes: 1 addition & 1 deletion src/muc/mod_muc.erl
Original file line number Diff line number Diff line change
Expand Up @@ -1031,7 +1031,7 @@ get_room_pos(Desired, [_ | Rooms], HeadPosition) ->
%% with the returned Name already created, nor mark the generated Name
%% as `<<"already used">>'. But in practice, it is unique enough. See
%% http://xmpp.org/extensions/xep-0045.html#createroom-unique
-spec iq_get_unique(jid:jid()) -> jlib:xmlcdata().
-spec iq_get_unique(jid:jid()) -> exml:cdata().
iq_get_unique(From) ->
Raw = [From, erlang:unique_integer(), mongoose_bin:gen_from_crypto()],
#xmlcdata{content = mongoose_bin:encode_crypto(term_to_binary(Raw))}.
Expand Down
20 changes: 10 additions & 10 deletions src/muc/mod_muc_room.erl
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,7 @@ is_query_allowed(#xmlel{children = Els}) ->
-spec locked_state_process_owner_iq(jid:jid(), exml:element(),
ejabberd:lang(), 'error' | 'get' | 'invalid' | 'result', _)
-> {{'error', exml:element()}, statename()}
| {{result, [exml:element() | jlib:xmlcdata()], state() | stop}, statename()}.
| {{result, [exml:child()], state() | stop}, statename()}.
locked_state_process_owner_iq(From, Query, Lang, set, StateData) ->
Result = case is_query_allowed(Query) of
true ->
Expand Down Expand Up @@ -2005,7 +2005,7 @@ extract_password(Packet) ->
{element, <<"password">>},
cdata]).

-spec count_stanza_shift(mod_muc:nick(), [jlib:xmlcdata() | exml:element()],
-spec count_stanza_shift(mod_muc:nick(), [exml:child()],
state()) -> any().
count_stanza_shift(Nick, Els, StateData) ->
HL = lqueue_to_list(StateData#state.history),
Expand Down Expand Up @@ -2087,7 +2087,7 @@ calc_shift(MaxSize, Size, Shift, [S | TSizes]) ->
calc_shift(MaxSize, Size - S, Shift + 1, TSizes).


-spec extract_history([jlib:xmlcdata() | exml:element()], Type :: binary()) ->
-spec extract_history([exml:child()], Type :: binary()) ->
false | non_neg_integer().
extract_history([], _Type) ->
false;
Expand Down Expand Up @@ -3127,7 +3127,7 @@ send_kickban_presence1(UJID, Reason, Code, Affiliation, StateData) ->

-spec process_iq_owner(jid:jid(), get | set, ejabberd:lang(), exml:element(),
state(), statename()) ->
{error, exml:element()} | {result, [exml:element() | jlib:xmlcdata()], state() | stop}.
{error, exml:element()} | {result, [exml:child()], state() | stop}.
process_iq_owner(From, Type, Lang, SubEl, StateData, StateName) ->
case get_affiliation(From, StateData) of
owner ->
Expand All @@ -3139,7 +3139,7 @@ process_iq_owner(From, Type, Lang, SubEl, StateData, StateName) ->

-spec process_authorized_iq_owner(jid:jid(), get | set, ejabberd:lang(), exml:element(),
state(), statename()) ->
{error, exml:element()} | {result, [exml:element() | jlib:xmlcdata()], state() | stop}.
{error, exml:element()} | {result, [exml:child()], state() | stop}.
process_authorized_iq_owner(From, set, Lang, SubEl, StateData, StateName) ->
#xmlel{children = Els} = SubEl,
case jlib:remove_cdata(Els) of
Expand Down Expand Up @@ -3189,7 +3189,7 @@ process_authorized_iq_owner(From, get, Lang, SubEl, StateData, _StateName) ->

-spec process_authorized_submit_owner(From ::jid:jid(), [{binary(), [binary()]}],
StateData :: state()) ->
{error, exml:element()} | {result, [exml:element() | jlib:xmlcdata()], state() | stop}.
{error, exml:element()} | {result, [exml:child()], state() | stop}.
process_authorized_submit_owner(_From, [], StateData) ->
%confirm an instant room
save_persistent_room_state(StateData),
Expand Down Expand Up @@ -3904,7 +3904,7 @@ check_voice_approval(From, XEl, Lang, StateData) ->
%% Invitation support

-spec check_invitation(jid:simple_jid() | jid:jid(),
[jlib:xmlcdata() | exml:element()], ejabberd:lang(), state())
[exml:child()], ejabberd:lang(), state())
-> {'error', _} | {'ok', [jid:jid()]}.
check_invitation(FromJID, Els, Lang, StateData) ->
try
Expand All @@ -3913,7 +3913,7 @@ check_invitation(FromJID, Els, Lang, StateData) ->
end.


-spec unsafe_check_invitation(jid:jid(), [jlib:xmlcdata() | exml:element()],
-spec unsafe_check_invitation(jid:jid(), [exml:child()],
ejabberd:lang(), state()) -> {ok, [jid:jid()]}.
unsafe_check_invitation(FromJID, Els, Lang,
StateData=#state{host=Host, server_host=ServerHost, jid=RoomJID}) ->
Expand Down Expand Up @@ -3971,7 +3971,7 @@ decode_destination_jid(InviteEl) ->
end.


-spec find_invite_elems([jlib:xmlcdata() | exml:element()]) -> [exml:element()].
-spec find_invite_elems([exml:child()]) -> [exml:element()].
find_invite_elems(Els) ->
case jlib:remove_cdata(Els) of
[#xmlel{name = <<"x">>, children = Els1} = XEl] ->
Expand Down Expand Up @@ -4326,7 +4326,7 @@ route_voice_approval(_Type, From, Packet, _Lang, StateData) ->

-spec route_invitation(InvitationsOrError,
From, Packet, Lang, state()) -> state() when
InvitationsOrError :: {'error', jlib:xmlcdata() | exml:element()}
InvitationsOrError :: {'error', exml:cdata() | exml:element()}
| {'ok', [jid:jid()]},
From :: jid:simple_jid() | jid:jid(),
Packet :: exml:element(),
Expand Down
2 changes: 1 addition & 1 deletion src/muc_light/mod_muc_light_codec_backend.erl
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ encode_error(ErrMsg, OrigFrom, OrigTo, OrigPacket, Acc) ->
mongoose_backend:call(HostType, ?MAIN_MODULE, ?FUNCTION_NAME, Args).

-spec encode_error(ErrMsg :: tuple(),
ExtraChildren :: [jlib:xmlch()],
ExtraChildren :: [exml:child()],
OrigFrom :: jid:jid(),
OrigTo :: jid:jid(),
OrigPacket :: exml:element(),
Expand Down
Loading

0 comments on commit 1428ceb

Please sign in to comment.