deny ->
ok;
allow ->
- ejabberd_hooks:run(presence_probe_hook, StateData#state.server, [From, To, Packet]),
+ Caps = case ?DICT:find(jlib:jid_tolower(To), StateData#state.pres_available) of
+ {ok, Value} -> Value;
+ _ -> mod_caps:read_caps(element(4, Packet)) % This is From=To case, so we can read Caps from Packet
+ end,
+ ejabberd_hooks:run(presence_probe_hook, StateData#state.server, [From, To, Caps]),
ejabberd_router:route(To, From, Packet)
end;
Cond2 ->
%% presence hooks handling functions
%%
-presence_probe(#jid{lserver = Host} = From, To, Packet) ->
+presence_probe(#jid{lserver = Host} = From, To, Caps) ->
Proc = gen_mod:get_module_proc(Host, ?PROCNAME),
- gen_server:cast(Proc, {presence, From, To, Packet}).
+ gen_server:cast(Proc, {presence, From, To, Caps}).
%% -------
%% user remove hook handling function
%% Description: Handling cast messages
%%--------------------------------------------------------------------
%% @private
-handle_cast({presence, From, To, Packet}, State) ->
+handle_cast({presence, From, To, Caps}, State) ->
%% A new resource is available. send last published items
- JID = jlib:jid_tolower(From),
+ LFrom = jlib:jid_tolower(From),
Host = State#state.host,
ServerHost = State#state.server_host,
if From == To ->
#pubsub_node{options = Options} ->
case get_option(Options, send_last_published_item) of
on_sub_and_presence ->
- send_last_item(Host, Node, JID);
+ send_last_item(Host, Node, LFrom);
_ ->
ok
end;
ok
end,
%% and send to From last PEP events published by To
+ ?DEBUG("got presence probe from ~s to ~s",[jlib:jid_to_string(From),jlib:jid_to_string(To)]),
PepKey = jlib:jid_tolower(jlib:jid_remove_resource(To)),
- Caps = mod_caps:read_caps(element(4, Packet)),
lists:foreach(fun(#pubsub_node{nodeid = {_, Node}, options = Options}) ->
case get_option(Options, send_last_published_item) of
on_sub_and_presence ->
authorize -> false; % likewise
roster ->
Grps = get_option(Options, roster_groups_allowed),
- element(2, get_roster_info(To#jid.luser, To#jid.lserver, JID, Grps))
+ element(2, get_roster_info(To#jid.luser, To#jid.lserver, LFrom, Grps))
end,
if Subscribed ->
- send_last_item(PepKey, Node, JID);
+ ?DEBUG("send ~s's ~s event to ~s",[jlib:jid_to_string(PepKey),Node,jlib:jid_to_string(From)]),
+ send_last_item(PepKey, Node, LFrom);
true ->
ok
end;
OwnerKey = jlib:jid_tolower(jlib:jid_remove_resource(Owner)),
case mnesia:read({pubsub_node, {Key, Node}}) of
[] ->
- Parent = lists:sublist(Node, length(Node) - 1),
- ParentExists =
+ {ParentNode, ParentExists} =
case Key of
{_U, _S, _R} ->
%% This is special case for PEP handling
%% PEP does not uses hierarchy
- true;
+ {[], true};
_ ->
+ Parent = lists:sublist(Node, length(Node) - 1),
(Parent == []) orelse
case mnesia:read({pubsub_node, {Key, Parent}}) of
- [] -> false;
- _ -> true
+ [] -> {Parent, false};
+ _ -> {Parent, true}
end
end,
case ParentExists of
%% Service requires registration
%%{error, ?ERR_REGISTRATION_REQUIRED};
mnesia:write(#pubsub_node{nodeid = {Key, Node},
- parentid = {Key, Parent},
+ parentid = {Key, ParentNode},
type = Type,
owners = [OwnerKey],
options = Options});