]> granicus.if.org Git - ejabberd/commitdiff
Send last PEP items to remote subscribers
authorHolger Weiss <holger@zedat.fu-berlin.de>
Fri, 14 Nov 2014 00:33:11 +0000 (01:33 +0100)
committerHolger Weiss <holger@zedat.fu-berlin.de>
Fri, 14 Nov 2014 00:33:11 +0000 (01:33 +0100)
When a remote subscriber becomes available, send him the last published
PEP items, as we do for local subscribers.

However, the current implementation depends on a running ejabberd_c2s
process of the publisher to send items to remote subscribers.  So, for
those, the behavior is always like it is for local subscribers when
"ignore_pep_from_offline" is set to "true".

src/mod_pubsub.erl
src/mod_pubsub_odbc.erl

index c34b1583c5acec3a3204feeaf2ae7fd3de1889dd..e6437199be9a63cb86afb40d4eb5f69785aecd53 100644 (file)
@@ -3367,14 +3367,23 @@ send_items(Host, Node, NodeId, Type, LJID, Number) ->
 ).
 
 dispatch_items(_From, _To, _Node, _Stanza = undefined) -> ok;
-dispatch_items(From, {ToU, ToS, ToR} = To, Node, Stanza) ->
-    case ejabberd_sm:get_session_pid(ToU, ToS, ToR) of
-      C2SPid when is_pid(C2SPid) ->
-         ejabberd_c2s:send_filtered(C2SPid,
-                                    {pep_message, <<Node/binary, "+notify">>},
-                                    service_jid(From), jlib:make_jid(To),
-                                    Stanza)
-      _ -> ok
+dispatch_items({FromU, FromS, FromR} = From, {ToU, ToS, ToR} = To, Node,
+              Stanza) ->
+    C2SPid = case ejabberd_sm:get_session_pid(ToU, ToS, ToR) of
+              ToPid when is_pid(ToPid) -> ToPid;
+              _ ->
+                  R = user_resource(FromU, FromS, FromR),
+                  case ejabberd_sm:get_session_pid(FromU, FromS, R) of
+                    FromPid when is_pid(FromPid) -> FromPid;
+                    _ -> undefined
+                  end
+            end,
+    if C2SPid == undefined -> ok;
+       true ->
+          ejabberd_c2s:send_filtered(C2SPid,
+                                     {pep_message, <<Node/binary, "+notify">>},
+                                     service_jid(From), jlib:make_jid(To),
+                                     Stanza)
     end;
 dispatch_items(From, To, _Node, Stanza) ->
     ejabberd_router:route(service_jid(From), jlib:make_jid(To), Stanza).
index 8edd1250ba200c17e4f32c4c5221d2a3f2a1d025..e2b357f032c635ce0f06336dcd5b52097a5934c2 100644 (file)
@@ -3052,14 +3052,23 @@ send_items(Host, Node, NodeId, Type, LJID, Number) ->
 ).
 
 dispatch_items(_From, _To, _Node, _Stanza = undefined) -> ok;
-dispatch_items(From, {ToU, ToS, ToR} = To, Node, Stanza) ->
-    case ejabberd_sm:get_session_pid(ToU, ToS, ToR) of
-      C2SPid when is_pid(C2SPid) ->
-         ejabberd_c2s:send_filtered(C2SPid,
-                                    {pep_message, <<Node/binary, "+notify">>},
-                                    service_jid(From), jlib:make_jid(To),
-                                    Stanza)
-      _ -> ok
+dispatch_items({FromU, FromS, FromR} = From, {ToU, ToS, ToR} = To, Node,
+              Stanza) ->
+    C2SPid = case ejabberd_sm:get_session_pid(ToU, ToS, ToR) of
+              ToPid when is_pid(ToPid) -> ToPid;
+              _ ->
+                  R = user_resource(FromU, FromS, FromR),
+                  case ejabberd_sm:get_session_pid(FromU, FromS, R) of
+                    FromPid when is_pid(FromPid) -> FromPid;
+                    _ -> undefined
+                  end
+            end,
+    if C2SPid == undefined -> ok;
+       true ->
+          ejabberd_c2s:send_filtered(C2SPid,
+                                     {pep_message, <<Node/binary, "+notify">>},
+                                     service_jid(From), jlib:make_jid(To),
+                                     Stanza)
     end;
 dispatch_items(From, To, _Node, Stanza) ->
     ejabberd_router:route(service_jid(From), jlib:make_jid(To), Stanza).