1 |
|
-module(mongoose_graphql_stanza_user_mutation). |
2 |
|
-behaviour(mongoose_graphql). |
3 |
|
|
4 |
|
-export([execute/4]). |
5 |
|
|
6 |
|
-ignore_xref([execute/4]). |
7 |
|
|
8 |
|
-include("../mongoose_graphql_types.hrl"). |
9 |
|
-include("mongoose_logger.hrl"). |
10 |
|
-include("jlib.hrl"). |
11 |
|
|
12 |
|
execute(Ctx, _Obj, <<"sendMessage">>, Args) -> |
13 |
3 |
send_message(Ctx, Args); |
14 |
|
execute(Ctx, _Obj, <<"sendMessageHeadLine">>, Args) -> |
15 |
2 |
send_message_headline(Ctx, Args); |
16 |
|
execute(Ctx, _Obj, <<"sendStanza">>, Args) -> |
17 |
2 |
send_stanza(Ctx, Args). |
18 |
|
|
19 |
|
send_message(Ctx, Args) -> |
20 |
3 |
with_from(Ctx, Args, fun send_message2/1). |
21 |
|
|
22 |
|
send_message_headline(Ctx, Args) -> |
23 |
2 |
with_from(Ctx, Args, fun send_message_headline2/1). |
24 |
|
|
25 |
|
send_message2(#{<<"from">> := From, <<"to">> := To, <<"body">> := Body}) -> |
26 |
2 |
Packet = mongoose_stanza_helper:build_message(jid:to_binary(From), jid:to_binary(To), Body), |
27 |
|
%% SkipAuth = false, because we already checked if From exists |
28 |
2 |
mongoose_stanza_helper:route(From, To, Packet, false). |
29 |
|
|
30 |
|
send_message_headline2(Args = #{<<"from">> := From, <<"to">> := To}) -> |
31 |
1 |
Packet = mongoose_stanza_helper:build_message_with_headline( |
32 |
|
jid:to_binary(From), jid:to_binary(To), Args), |
33 |
1 |
mongoose_stanza_helper:route(From, To, Packet, false). |
34 |
|
|
35 |
|
send_stanza(#{user := User}, #{<<"stanza">> := Packet}) -> |
36 |
2 |
From = jid:from_binary(exml_query:attr(Packet, <<"from">>)), |
37 |
2 |
To = jid:from_binary(exml_query:attr(Packet, <<"to">>)), |
38 |
2 |
case compare_bare_jids(User, From) of |
39 |
|
true -> |
40 |
1 |
mongoose_stanza_helper:route(From, To, Packet, false); |
41 |
|
false -> |
42 |
1 |
{error, #{what => bad_from_jid}} |
43 |
|
end. |
44 |
|
|
45 |
3 |
compare_bare_jids(#jid{luser = U, lserver = S}, #jid{luser = U, lserver = S}) -> true; |
46 |
3 |
compare_bare_jids(_, _) -> false. |
47 |
|
|
48 |
|
with_from(_Ctx = #{user := User}, Args, Next) -> |
49 |
5 |
case maps:get(<<"from">>, Args, null) of |
50 |
|
null -> |
51 |
1 |
Next(Args#{<<"from">> => User}); |
52 |
|
From -> |
53 |
4 |
case compare_bare_jids(User, From) of |
54 |
|
true -> |
55 |
|
%% We still can allow a custom resource |
56 |
2 |
Next(Args#{<<"from">> => From}); |
57 |
|
false -> |
58 |
2 |
?LOG_ERROR(#{what => bad_from_jid, |
59 |
:-( |
user_jid => User, from_jid => From}), |
60 |
2 |
{error, #{what => bad_from_jid}} |
61 |
|
end |
62 |
|
end. |