aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mod_pubsub.erl48
-rw-r--r--src/mod_pubsub_odbc.erl59
2 files changed, 61 insertions, 46 deletions
diff --git a/src/mod_pubsub.erl b/src/mod_pubsub.erl
index 0b81265f8..515f22790 100644
--- a/src/mod_pubsub.erl
+++ b/src/mod_pubsub.erl
@@ -827,7 +827,7 @@ send_loop(State) ->
end;
(_) -> ok
end,
- Subscriptions)
+ lists:usort(Subscriptions))
end,
State#state.plugins),
if not State#state.ignore_pep_from_offline ->
@@ -1166,22 +1166,21 @@ disco_items(Host, Node, From) ->
%% presence hooks handling functions
%%
-caps_update(#jid{luser = U, lserver = S, lresource = R} = From, To, _Features) ->
- Pid = ejabberd_sm:get_session_pid(U, S, R),
- presence_probe(From, To, Pid).
-
-presence_probe(#jid{luser = User, lserver = Server, lresource = Resource} = JID,
- JID, Pid) ->
- presence(Server, {presence, JID, Pid}),
- presence(Server, {presence, User, Server, [Resource], JID});
-presence_probe(#jid{luser = User, lserver = Server},
- #jid{luser = User, lserver = Server}, _Pid) ->
- %% ignore presence_probe from other ressources for the current user
- %% this way, we do not send duplicated last items if user already connected with other clients
+caps_update(#jid{luser = U, lserver = S, lresource = R}, #jid{lserver = Host} = JID, _Features)
+ when Host =/= S ->
+ presence(Host, {presence, U, S, [R], JID});
+caps_update(_From, _To, _Feature) ->
+ ok.
+
+presence_probe(#jid{luser = U, lserver = S, lresource = R} = JID, JID, Pid) ->
+ presence(S, {presence, JID, Pid}),
+ presence(S, {presence, U, S, [R], JID});
+presence_probe(#jid{luser = U, lserver = S}, #jid{luser = U, lserver = S}, _Pid) ->
+ %% ignore presence_probe from my other ressources
+ %% to not get duplicated last items
ok;
-presence_probe(#jid{luser = User, lserver = Server, lresource = Resource},
- #jid{lserver = Host} = JID, _Pid) ->
- presence(Host, {presence, User, Server, [Resource], JID}).
+presence_probe(#jid{luser = U, lserver = S, lresource = R}, #jid{lserver = Host} = JID, _Pid) ->
+ presence(Host, {presence, U, S, [R], JID}).
presence(ServerHost, Presence) ->
SendLoop = case
@@ -1621,7 +1620,7 @@ command_disco_info(_Host, ?NS_PUBSUB_GET_PENDING,
node_disco_info(Host, Node, From) ->
node_disco_info(Host, Node, From, true, true).
-node_disco_info(Host, Node, From, Identity, Features) ->
+node_disco_info(Host, Node, From, _Identity, _Features) ->
% Action =
% fun(#pubsub_node{type = Type, id = NodeId}) ->
% I = case Identity of
@@ -2952,10 +2951,7 @@ publish_item(Host, ServerHost, Node, Publisher, ItemId, Payload, Access) ->
PublishModel = get_option(Options, publish_model),
DeliverPayloads = get_option(Options, deliver_payloads),
PersistItems = get_option(Options, persist_items),
- MaxItems = case PersistItems of
- false -> 0;
- true -> max_items(Host, Options)
- end,
+ MaxItems = max_items(Host, Options),
PayloadCount = payload_xmlelements(Payload),
PayloadSize = byte_size(term_to_binary(Payload)) - 2,
PayloadMaxSize = get_option(Options, max_payload_size),
@@ -3359,6 +3355,8 @@ send_items(Host, Node, NodeId, Type, {U, S, R} = LJID,
_ -> []
end,
Stanza = case ToSend of
+ [] ->
+ undefined;
[LastItem] ->
{ModifNow, ModifUSR} =
LastItem#pubsub_item.modification,
@@ -3372,11 +3370,13 @@ send_items(Host, Node, NodeId, Type, {U, S, R} = LJID,
attrs = nodeAttr(Node),
children = itemsEls(ToSend)}])
end,
- case is_tuple(Host) of
- false ->
+ case {is_tuple(Host), Stanza} of
+ {_, undefined} ->
+ ok;
+ {false, _} ->
ejabberd_router:route(service_jid(Host),
jlib:make_jid(LJID), Stanza);
- true ->
+ {true, _} ->
case ejabberd_sm:get_session_pid(U, S, R) of
C2SPid when is_pid(C2SPid) ->
ejabberd_c2s:broadcast(C2SPid,
diff --git a/src/mod_pubsub_odbc.erl b/src/mod_pubsub_odbc.erl
index 00e619213..dad839fd3 100644
--- a/src/mod_pubsub_odbc.erl
+++ b/src/mod_pubsub_odbc.erl
@@ -475,7 +475,7 @@ send_loop(State) ->
end;
(_) -> ok
end,
- Subscriptions)
+ lists:usort(Subscriptions))
end,
State#state.plugins),
if not State#state.ignore_pep_from_offline ->
@@ -817,22 +817,21 @@ disco_items(Host, Node, From) ->
%% presence hooks handling functions
%%
-caps_update(#jid{luser = U, lserver = S, lresource = R} = From, To, _Features) ->
- Pid = ejabberd_sm:get_session_pid(U, S, R),
- presence_probe(From, To, Pid).
-
-presence_probe(#jid{luser = User, lserver = Server, lresource = Resource} = JID,
- JID, Pid) ->
- presence(Server, {presence, JID, Pid}),
- presence(Server, {presence, User, Server, [Resource], JID});
-presence_probe(#jid{luser = User, lserver = Server},
- #jid{luser = User, lserver = Server}, _Pid) ->
- %% ignore presence_probe from other ressources for the current user
- %% this way, we do not send duplicated last items if user already connected with other clients
+caps_update(#jid{luser = U, lserver = S, lresource = R}, #jid{lserver = Host} = JID, _Features)
+ when Host =/= S ->
+ presence(Host, {presence, U, S, [R], JID});
+caps_update(_From, _To, _Feature) ->
+ ok.
+
+presence_probe(#jid{luser = U, lserver = S, lresource = R} = JID, JID, Pid) ->
+ presence(S, {presence, JID, Pid}),
+ presence(S, {presence, U, S, [R], JID});
+presence_probe(#jid{luser = U, lserver = S}, #jid{luser = U, lserver = S}, _Pid) ->
+ %% ignore presence_probe from my other ressources
+ %% to not get duplicated last items
ok;
-presence_probe(#jid{luser = User, lserver = Server, lresource = Resource},
- #jid{lserver = Host} = JID, _Pid) ->
- presence(Host, {presence, User, Server, [Resource], JID}).
+presence_probe(#jid{luser = U, lserver = S, lresource = R}, #jid{lserver = Host} = JID, _Pid) ->
+ presence(Host, {presence, U, S, [R], JID}).
presence(ServerHost, Presence) ->
SendLoop = case
@@ -1273,7 +1272,7 @@ command_disco_info(_Host, ?NS_PUBSUB_GET_PENDING,
node_disco_info(Host, Node, From) ->
node_disco_info(Host, Node, From, true, true).
-node_disco_info(Host, Node, From, Identity, Features) ->
+node_disco_info(Host, Node, From, _Identity, _Features) ->
% Action =
% fun(#pubsub_node{type = Type, id = NodeId}) ->
% I = case Identity of
@@ -2618,9 +2617,9 @@ publish_item(Host, ServerHost, Node, Publisher, ItemId, Payload, Access) ->
Features = features(Type),
PublishFeature = lists:member(<<"publish">>, Features),
PublishModel = get_option(Options, publish_model),
- MaxItems = max_items(Host, Options),
DeliverPayloads = get_option(Options, deliver_payloads),
PersistItems = get_option(Options, persist_items),
+ MaxItems = max_items(Host, Options),
PayloadCount = payload_xmlelements(Payload),
PayloadSize = byte_size(term_to_binary(Payload)) - 2,
PayloadMaxSize = get_option(Options, max_payload_size),
@@ -3013,7 +3012,7 @@ send_items(Host, Node, NodeId, Type, LJID, last) ->
ModifNow, ModifUSR)
end,
ejabberd_router:route(service_jid(Host), jlib:make_jid(LJID), Stanza);
-send_items(Host, Node, NodeId, Type, LJID, Number) ->
+send_items(Host, Node, NodeId, Type, {U, S, R} = LJID, Number) ->
ToSend = case node_action(Host, Type, get_items,
[NodeId, LJID])
of
@@ -3026,6 +3025,8 @@ send_items(Host, Node, NodeId, Type, LJID, Number) ->
_ -> []
end,
Stanza = case ToSend of
+ [] ->
+ undefined;
[LastItem] ->
{ModifNow, ModifUSR} =
LastItem#pubsub_item.modification,
@@ -3039,7 +3040,22 @@ send_items(Host, Node, NodeId, Type, LJID, Number) ->
attrs = nodeAttr(Node),
children = itemsEls(ToSend)}])
end,
- ejabberd_router:route(service_jid(Host), jlib:make_jid(LJID), Stanza).
+ case {is_tuple(Host), Stanza} of
+ {_, undefined} ->
+ ok;
+ {false, _} ->
+ ejabberd_router:route(service_jid(Host),
+ jlib:make_jid(LJID), Stanza);
+ {true, _} ->
+ case ejabberd_sm:get_session_pid(U, S, R) of
+ C2SPid when is_pid(C2SPid) ->
+ ejabberd_c2s:broadcast(C2SPid,
+ {pep_message,
+ <<((Node))/binary, "+notify">>},
+ _Sender = service_jid(Host), Stanza);
+ _ -> ok
+ end
+ end.
%% @spec (Host, JID, Plugins) -> {error, Reason} | {result, Response}
%% Host = host()
@@ -3235,8 +3251,7 @@ set_affiliations(Host, Node, From, EntitiesEls) ->
error -> {error, ?ERR_BAD_REQUEST};
_ ->
Action = fun (#pubsub_node{type = Type,
- id = NodeId} =
- N) ->
+ id = NodeId}) ->
Owners = node_owners_call(Type, NodeId),
case lists:member(Owner, Owners) of
true ->