]> granicus.if.org Git - ejabberd/commitdiff
Add user's JID to CSI hook arguments
authorHolger Weiss <holger@zedat.fu-berlin.de>
Fri, 5 Aug 2016 21:47:18 +0000 (23:47 +0200)
committerHolger Weiss <holger@zedat.fu-berlin.de>
Fri, 5 Aug 2016 21:47:18 +0000 (23:47 +0200)
Add the JID of the CSI user to the arguments of the 'csi_filter_stanza'
and 'csi_flush_queue' hooks.

src/ejabberd_c2s.erl
src/mod_client_state.erl

index ddbe5602344907d9a159dd21cbec886c30724b3b..270ef1dc5fa12bbcfd8f0d83ff438d0aec0d4e57 100644 (file)
@@ -3080,20 +3080,22 @@ add_resent_delay_info(#state{server = From}, El, Time) ->
 %%% XEP-0352
 %%%----------------------------------------------------------------------
 
-csi_filter_stanza(#state{csi_state = CsiState, server = Server} = StateData,
-                 Stanza) ->
+csi_filter_stanza(#state{csi_state = CsiState, jid = JID, server = Server} =
+                 StateData, Stanza) ->
     {StateData1, Stanzas} = ejabberd_hooks:run_fold(csi_filter_stanza, Server,
                                                    {StateData, [Stanza]},
-                                                   [Server, Stanza]),
+                                                   [Server, JID, Stanza]),
     StateData2 = lists:foldl(fun(CurStanza, AccState) ->
                                     send_stanza(AccState, CurStanza)
                             end, StateData1#state{csi_state = active},
                             Stanzas),
     StateData2#state{csi_state = CsiState}.
 
-csi_flush_queue(#state{csi_state = CsiState, server = Server} = StateData) ->
+csi_flush_queue(#state{csi_state = CsiState, jid = JID, server = Server} =
+               StateData) ->
     {StateData1, Stanzas} = ejabberd_hooks:run_fold(csi_flush_queue, Server,
-                                                   {StateData, []}, [Server]),
+                                                   {StateData, []},
+                                                   [Server, JID]),
     StateData2 = lists:foldl(fun(CurStanza, AccState) ->
                                     send_stanza(AccState, CurStanza)
                             end, StateData1#state{csi_state = active},
index 036175cced9997492ea0b389153f1c997500d2af..da870f8efb14ff9e513b22a3c4751a4d8e79de07 100644 (file)
@@ -34,8 +34,8 @@
 -export([start/2, stop/1, mod_opt_type/1, depends/2]).
 
 %% ejabberd_hooks callbacks.
--export([filter_presence/3, filter_chat_states/3, filter_pep/3, filter_other/3,
-        flush_queue/2, add_stream_feature/2]).
+-export([filter_presence/4, filter_chat_states/4, filter_pep/4, filter_other/4,
+        flush_queue/3, add_stream_feature/2]).
 
 -include("ejabberd.hrl").
 -include("logger.hrl").
@@ -151,69 +151,70 @@ depends(_Host, _Opts) ->
 %% ejabberd_hooks callbacks.
 %%--------------------------------------------------------------------
 
--spec filter_presence({term(), [xmlel()]}, binary(), xmlel())
+-spec filter_presence({term(), [xmlel()]}, binary(), jid(), xmlel())
       -> {term(), [xmlel()]} | {stop, {term(), [xmlel()]}}.
 
-filter_presence({C2SState, _OutStanzas} = Acc, Host,
+filter_presence({C2SState, _OutStanzas} = Acc, Host, To,
                #xmlel{name = <<"presence">>, attrs = Attrs} = Stanza) ->
     case fxml:get_attr(<<"type">>, Attrs) of
       {value, Type} when Type /= <<"unavailable">> ->
          Acc;
       _ ->
-         ?DEBUG("Got availability presence stanza", []),
+         ?DEBUG("Got availability presence stanza for ~s",
+                [jid:to_string(To)]),
          queue_add(presence, Stanza, Host, C2SState)
     end;
-filter_presence(Acc, _Host, _Stanza) -> Acc.
+filter_presence(Acc, _Host, _To, _Stanza) -> Acc.
 
--spec filter_chat_states({term(), [xmlel()]}, binary(), xmlel())
+-spec filter_chat_states({term(), [xmlel()]}, binary(), jid(), xmlel())
       -> {term(), [xmlel()]} | {stop, {term(), [xmlel()]}}.
 
-filter_chat_states({C2SState, _OutStanzas} = Acc, Host,
+filter_chat_states({C2SState, _OutStanzas} = Acc, Host, To,
                   #xmlel{name = <<"message">>} = Stanza) ->
     case jlib:is_standalone_chat_state(Stanza) of
       true ->
          From = fxml:get_tag_attr_s(<<"from">>, Stanza),
-         To = fxml:get_tag_attr_s(<<"to">>, Stanza),
-         case {jid:from_string(From), jid:from_string(To)} of
+         case {jid:from_string(From), To} of
            {#jid{luser = U, lserver = S}, #jid{luser = U, lserver = S}} ->
                %% Don't queue (carbon copies of) chat states from other
                %% resources, as they might be used to sync the state of
                %% conversations across clients.
                Acc;
            _ ->
-               ?DEBUG("Got standalone chat state notification", []),
+               ?DEBUG("Got standalone chat state notification for ~s",
+                      [jid:to_string(To)]),
                queue_add(chatstate, Stanza, Host, C2SState)
          end;
       false ->
          Acc
     end;
-filter_chat_states(Acc, _Host, _Stanza) -> Acc.
+filter_chat_states(Acc, _Host, _To, _Stanza) -> Acc.
 
--spec filter_pep({term(), [xmlel()]}, binary(), xmlel())
+-spec filter_pep({term(), [xmlel()]}, binary(), jid(), xmlel())
       -> {term(), [xmlel()]} | {stop, {term(), [xmlel()]}}.
 
-filter_pep({C2SState, _OutStanzas} = Acc, Host,
+filter_pep({C2SState, _OutStanzas} = Acc, Host, To,
           #xmlel{name = <<"message">>} = Stanza) ->
     case get_pep_node(Stanza) of
       {value, Node} ->
-         ?DEBUG("Got PEP notification", []),
+         ?DEBUG("Got PEP notification for ~s", [jid:to_string(To)]),
          queue_add({pep, Node}, Stanza, Host, C2SState);
       false ->
          Acc
     end;
-filter_pep(Acc, _Host, _Stanza) -> Acc.
+filter_pep(Acc, _Host, _To, _Stanza) -> Acc.
 
--spec filter_other({term(), [xmlel()]}, binary(), xmlel())
+-spec filter_other({term(), [xmlel()]}, binary(), jid(), xmlel())
       -> {stop, {term(), [xmlel()]}}.
 
-filter_other({C2SState, _OutStanzas}, Host, Stanza) ->
-    ?DEBUG("Won't add stanza to CSI queue", []),
+filter_other({C2SState, _OutStanzas}, Host, To, Stanza) ->
+    ?DEBUG("Won't add stanza for ~s to CSI queue", [jid:to_string(To)]),
     queue_take(Stanza, Host, C2SState).
 
--spec flush_queue({term(), [xmlel()]}, binary()) -> {term(), [xmlel()]}.
+-spec flush_queue({term(), [xmlel()]}, binary(), jid()) -> {term(), [xmlel()]}.
 
-flush_queue({C2SState, _OutStanzas}, Host) ->
-    ?DEBUG("Going to flush CSI queue", []),
+flush_queue({C2SState, _OutStanzas}, Host, JID) ->
+    ?DEBUG("Going to flush CSI queue of ~s", [jid:to_string(JID)]),
     Queue = get_queue(C2SState),
     NewState = set_queue([], C2SState),
     {NewState, get_stanzas(Queue, Host)}.