aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mod_admin_extra.erl34
1 files changed, 20 insertions, 14 deletions
diff --git a/src/mod_admin_extra.erl b/src/mod_admin_extra.erl
index 79b5c8d67..3387a831e 100644
--- a/src/mod_admin_extra.erl
+++ b/src/mod_admin_extra.erl
@@ -1480,20 +1480,26 @@ srg_user_del(User, Host, Group, GroupHost) ->
%% @doc Send a message to a Jabber account.
%% @spec (Type::binary(), From::binary(), To::binary(), Subject::binary(), Body::binary()) -> ok
send_message(Type, From, To, Subject, Body) ->
- FromJID = jid:decode(From),
- ToJID = jid:decode(To),
- Packet = build_packet(Type, Subject, Body, FromJID, ToJID),
- State1 = #{jid => FromJID},
- ejabberd_hooks:run_fold(user_send_packet, FromJID#jid.lserver, {Packet, State1}, []),
- ejabberd_router:route(xmpp:set_from_to(Packet, FromJID, ToJID)).
-
-build_packet(Type, Subject, Body, FromJID, ToJID) ->
- #message{type = misc:binary_to_atom(Type),
- body = xmpp:mk_text(Body),
- from = FromJID,
- to = ToJID,
- id = p1_rand:get_string(),
- subject = xmpp:mk_text(Subject)}.
+ CodecOpts = ejabberd_config:codec_options(),
+ try xmpp:decode(
+ #xmlel{name = <<"message">>,
+ attrs = [{<<"to">>, To},
+ {<<"from">>, From},
+ {<<"type">>, Type},
+ {<<"id">>, p1_rand:get_string()}],
+ children =
+ [#xmlel{name = <<"subject">>,
+ children = [{xmlcdata, Subject}]},
+ #xmlel{name = <<"body">>,
+ children = [{xmlcdata, Body}]}]},
+ ?NS_CLIENT, CodecOpts) of
+ #message{from = JID} = Msg ->
+ State = #{jid => JID},
+ ejabberd_hooks:run_fold(user_send_packet, JID#jid.lserver, {Msg, State}, []),
+ ejabberd_router:route(Msg)
+ catch _:{xmpp_codec, Why} ->
+ {error, xmpp:format_error(Why)}
+ end.
send_stanza(FromString, ToString, Stanza) ->
try