]> granicus.if.org Git - ejabberd/commitdiff
Fix submission-id and channel resource
authorEvgeny Khramtsov <ekhramtsov@process-one.net>
Fri, 7 Dec 2018 08:06:26 +0000 (11:06 +0300)
committerEvgeny Khramtsov <ekhramtsov@process-one.net>
Fri, 7 Dec 2018 08:06:26 +0000 (11:06 +0300)
rebar.config
src/mod_mix.erl

index 019b1b0a06046decc7a85213b1dc2b9766154ed0..a464c9345dce6d7c5c18e2484ad5a8bcb3b19abd 100644 (file)
@@ -24,7 +24,7 @@
         {fast_tls, ".*", {git, "https://github.com/processone/fast_tls", {tag, "1.0.26"}}},
         {stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.14"}}},
         {fast_xml, ".*", {git, "https://github.com/processone/fast_xml", {tag, "1.1.34"}}},
-        {xmpp, ".*", {git, "https://github.com/processone/xmpp", "4b74c17"}},
+        {xmpp, ".*", {git, "https://github.com/processone/xmpp", "278ddf9"}},
         {fast_yaml, ".*", {git, "https://github.com/processone/fast_yaml", {tag, "1.0.17"}}},
         {jiffy, ".*", {git, "https://github.com/davisp/jiffy", {tag, "0.14.8"}}},
         {p1_oauth2, ".*", {git, "https://github.com/processone/p1_oauth2", {tag, "0.6.3"}}},
index e9b91202bf966833755f0a089e1f27cf37aee13d..9eebe21c475a4cd04daef5986b42eaa4d505a71e 100644 (file)
@@ -128,7 +128,8 @@ process_disco_info(#iq{type = get, to = #jid{luser = <<>>} = To,
                      identities = [Identity],
                      xdata = X});
 process_disco_info(#iq{type = get, to = #jid{luser = <<_, _/binary>>} = To,
-                      sub_els = [#disco_info{node = <<"mix">>}]} = IQ) ->
+                      sub_els = [#disco_info{node = Node}]} = IQ)
+  when Node == <<"mix">>; Node == <<>> ->
     {Chan, Host, _} = jid:tolower(To),
     ServerHost = ejabberd_router:host_of_route(Host),
     Mod = gen_mod:db_mod(ServerHost, ?MODULE),
@@ -139,7 +140,7 @@ process_disco_info(#iq{type = get, to = #jid{luser = <<_, _/binary>>} = To,
            Features = [?NS_DISCO_INFO, ?NS_DISCO_ITEMS,
                        ?NS_MIX_CORE_0, ?NS_MAM_2],
            xmpp:make_iq_result(
-             IQ, #disco_info{node = <<"mix">>,
+             IQ, #disco_info{node = Node,
                              features = Features,
                              identities = [Identity]});
        {error, notfound} ->
@@ -170,15 +171,16 @@ process_disco_items(#iq{type = get, to = #jid{luser = <<>>} = To,
            xmpp:make_error(IQ, db_error(IQ))
     end;
 process_disco_items(#iq{type = get, to = #jid{luser = <<_, _/binary>>} = To,
-                       sub_els = [#disco_items{node = <<"mix">>}]} = IQ) ->
+                       sub_els = [#disco_items{node = Node}]} = IQ)
+  when Node == <<"mix">>; Node == <<>> ->
     {Chan, Host, _} = jid:tolower(To),
     ServerHost = ejabberd_router:host_of_route(Host),
     Mod = gen_mod:db_mod(ServerHost, ?MODULE),
     case Mod:get_channel(ServerHost, Chan, Host) of
        {ok, _} ->
            BTo = jid:remove_resource(To),
-           Items = [#disco_item{jid = BTo, node = Node} || Node <- known_nodes()],
-           xmpp:make_iq_result(IQ, #disco_items{node = <<"mix">>, items = Items});
+           Items = [#disco_item{jid = BTo, node = N} || N <- known_nodes()],
+           xmpp:make_iq_result(IQ, #disco_items{node = Node, items = Items});
        {error, notfound} ->
            xmpp:make_error(IQ, no_channel_error(IQ));
        {error, db_failure} ->
@@ -438,29 +440,36 @@ process_mix_setnick(#iq{to = To, from = From,
 process_mix_message(#message{from = From, to = To,
                             id = SubmissionID} = Msg) ->
     {Chan, Host, _} = jid:tolower(To),
+    {FUser, FServer, _} = jid:tolower(From),
     ServerHost = ejabberd_router:host_of_route(Host),
     Mod = gen_mod:db_mod(ServerHost, ?MODULE),
     case Mod:get_channel(ServerHost, Chan, Host) of
        {ok, _} ->
            BFrom = jid:remove_resource(From),
            case Mod:get_participant(ServerHost, Chan, Host, BFrom) of
-               {ok, {_ID, Nick}} ->
+               {ok, {StableID, Nick}} ->
                    MamID = mod_mam:make_id(),
-                   Msg1 = xmpp:put_meta(
-                            xmpp:set_subtag(
-                              Msg#message{from = jid:remove_resource(To),
-                                          to = undefined,
-                                          id = integer_to_binary(MamID)},
-                              #mix{jid = BFrom,
-                                   nick = Nick,
-                                   submission_id = SubmissionID}),
-                            stanza_id, MamID),
+                   Msg1 = xmpp:set_subtag(
+                            Msg#message{from = jid:replace_resource(To, StableID),
+                                        to = undefined,
+                                        id = integer_to_binary(MamID)},
+                            #mix{jid = BFrom, nick = Nick}),
+                   Msg2 = xmpp:put_meta(Msg1, stanza_id, MamID),
                    case ejabberd_hooks:run_fold(
-                          store_mam_message, ServerHost, Msg1,
+                          store_mam_message, ServerHost, Msg2,
                           [Chan, Host, BFrom, Nick, groupchat, recv]) of
-                       #message{} = Msg2 ->
+                       #message{} ->
                            multicast(Mod, ServerHost, Chan, Host,
-                                     ?NS_MIX_NODES_MESSAGES, Msg2);
+                                     ?NS_MIX_NODES_MESSAGES,
+                                     fun(#jid{luser = U, lserver = S})
+                                           when U == FUser, S == FServer ->
+                                             xmpp:set_subtag(
+                                               Msg1, #mix{jid = BFrom,
+                                                          nick = Nick,
+                                                          submission_id = SubmissionID});
+                                        (_) ->
+                                             Msg1
+                                     end);
                        _ ->
                            ok
                    end;
@@ -529,13 +538,14 @@ filter_nodes(Nodes) ->
       end, known_nodes()).
 
 -spec multicast(module(), binary(), binary(),
-               binary(), binary(), message()) -> ok.
-multicast(Mod, LServer, Chan, Service, Node, Msg) ->
+               binary(), binary(), fun((jid()) -> message())) -> ok.
+multicast(Mod, LServer, Chan, Service, Node, F) ->
     case Mod:get_subscribed(LServer, Chan, Service, Node) of
        {ok, Subscribers} ->
            lists:foreach(
              fun(To) ->
-                     ejabberd_router:route(Msg#message{to = To})
+                     Msg = xmpp:set_to(F(To), To),
+                     ejabberd_router:route(Msg)
              end, Subscribers);
        {error, db_failure} ->
            ok
@@ -555,7 +565,9 @@ notify_participant_joined(Mod, LServer, To, From, ID, Nick) ->
     Msg = #message{from = jid:remove_resource(To),
                   id = p1_rand:get_string(),
                   sub_els = [Event]},
-    multicast(Mod, LServer, Chan, Host, ?NS_MIX_NODES_PARTICIPANTS, Msg).
+    multicast(Mod, LServer, Chan, Host,
+             ?NS_MIX_NODES_PARTICIPANTS,
+             fun(_) -> Msg end).
 
 -spec notify_participant_left(module(), binary(), jid(), binary()) -> ok.
 notify_participant_left(Mod, LServer, To, ID) ->