ejabberd_hooks:run(user_send_packet,
Server,
[FromJID, ToJID, NewEl]),
- ejabberd_router:route(FromJID, ToJID, NewEl),
+ check_privacy_route(FromJID, StateData, FromJID,
+ ToJID, NewEl),
StateData;
_ ->
StateData
Server = StateData#state.server,
case xml:get_attr_s("type", Attrs) of
"unavailable" ->
- ejabberd_router:route(From, To, Packet),
+ check_privacy_route(From, StateData, From, To, Packet),
I = remove_element(LTo, StateData#state.pres_i),
A = remove_element(LTo, StateData#state.pres_a),
StateData#state{pres_i = I,
pres_a = A};
"invisible" ->
- ejabberd_router:route(From, To, Packet),
+ check_privacy_route(From, StateData, From, To, Packet),
I = ?SETS:add_element(LTo, StateData#state.pres_i),
A = remove_element(LTo, StateData#state.pres_a),
StateData#state{pres_i = I,
ejabberd_hooks:run(roster_out_subscription,
Server,
[User, Server, To, subscribe]),
- ejabberd_router:route(jlib:jid_remove_resource(From), To, Packet),
+ check_privacy_route(From, StateData, jlib:jid_remove_resource(From),
+ To, Packet),
StateData;
"subscribed" ->
ejabberd_hooks:run(roster_out_subscription,
Server,
[User, Server, To, subscribed]),
- ejabberd_router:route(jlib:jid_remove_resource(From), To, Packet),
+ check_privacy_route(From, StateData, jlib:jid_remove_resource(From),
+ To, Packet),
StateData;
"unsubscribe" ->
ejabberd_hooks:run(roster_out_subscription,
Server,
[User, Server, To, unsubscribe]),
- ejabberd_router:route(jlib:jid_remove_resource(From), To, Packet),
+ check_privacy_route(From, StateData, jlib:jid_remove_resource(From),
+ To, Packet),
StateData;
"unsubscribed" ->
ejabberd_hooks:run(roster_out_subscription,
Server,
[User, Server, To, unsubscribed]),
- ejabberd_router:route(jlib:jid_remove_resource(From), To, Packet),
+ check_privacy_route(From, StateData, jlib:jid_remove_resource(From),
+ To, Packet),
StateData;
"error" ->
- ejabberd_router:route(From, To, Packet),
+ check_privacy_route(From, StateData, From, To, Packet),
StateData;
"probe" ->
- ejabberd_router:route(From, To, Packet),
+ check_privacy_route(From, StateData, From, To, Packet),
StateData;
_ ->
- case ejabberd_hooks:run_fold(
- privacy_check_packet, StateData#state.server,
- allow,
- [StateData#state.user,
- StateData#state.server,
- StateData#state.privacy_list,
- {From, To, Packet},
- out]) of
- deny ->
- ok;
- allow ->
- ejabberd_router:route(From, To, Packet)
- end,
+ check_privacy_route(From, StateData, From, To, Packet),
I = remove_element(LTo, StateData#state.pres_i),
A = ?SETS:add_element(LTo, StateData#state.pres_a),
StateData#state{pres_i = I,
pres_a = A}
end.
+check_privacy_route(From, StateData, FromRoute, To, Packet) ->
+ case ejabberd_hooks:run_fold(
+ privacy_check_packet, StateData#state.server,
+ allow,
+ [StateData#state.user,
+ StateData#state.server,
+ StateData#state.privacy_list,
+ {From, To, Packet},
+ out]) of
+ deny ->
+ ok;
+ allow ->
+ ejabberd_router:route(FromRoute, To, Packet)
+ end.
+
presence_broadcast(StateData, From, JIDSet, Packet) ->
lists:foreach(fun(JID) ->
FJID = jlib:make_jid(JID),
end.
+%% From is the sender, To is the destination.
+%% If Dir = out, User@Server is the sender account (From).
+%% If Dir = in, User@Server is the destination account (To).
check_packet(_, User, Server,
#userlist{list = List, needdb = NeedDb},
- {From, To, {xmlelement, PName, _, _}},
+ {From, To, {xmlelement, PName, Attrs, _}},
Dir) ->
case List of
[] ->
PType = case PName of
"message" -> message;
"iq" -> iq;
- "presence" -> presence
+ "presence" ->
+ case xml:get_attr_s("type", Attrs) of
+ %% notification
+ "" -> presence;
+ "unavailable" -> presence;
+ %% subscribe, subscribed, unsubscribe,
+ %% unsubscribed, error, probe, or other
+ _ -> other
+ end
end,
- case {PType, Dir} of
- {message, in} ->
- LJID = jlib:jid_tolower(From),
- {Subscription, Groups} =
- case NeedDb of
- true -> ejabberd_hooks:run_fold(roster_get_jid_info, jlib:nameprep(Server), {none, []}, [User, Server, LJID]);
- false -> {[], []}
- end,
- check_packet_aux(List, message,
- LJID, Subscription, Groups);
- {iq, in} ->
- LJID = jlib:jid_tolower(From),
- {Subscription, Groups} =
- case NeedDb of
- true -> ejabberd_hooks:run_fold(roster_get_jid_info, jlib:nameprep(Server), {none, []}, [User, Server, LJID]);
- false -> {[], []}
- end,
- check_packet_aux(List, iq,
- LJID, Subscription, Groups);
- {presence, in} ->
- LJID = jlib:jid_tolower(From),
- {Subscription, Groups} =
- case NeedDb of
- true -> ejabberd_hooks:run_fold(roster_get_jid_info, jlib:nameprep(Server), {none, []}, [User, Server, LJID]);
- false -> {[], []}
- end,
- check_packet_aux(List, presence_in,
- LJID, Subscription, Groups);
- {presence, out} ->
- LJID = jlib:jid_tolower(To),
- {Subscription, Groups} =
- case NeedDb of
- true -> ejabberd_hooks:run_fold(roster_get_jid_info, jlib:nameprep(Server), {none, []}, [User, Server, LJID]);
- false -> {[], []}
- end,
- check_packet_aux(List, presence_out,
- LJID, Subscription, Groups);
- _ ->
- allow
- end
+ PType2 = case {PType, Dir} of
+ {message, in} -> message;
+ {iq, in} -> iq;
+ {presence, in} -> presence_in;
+ {presence, out} -> presence_out;
+ {_, _} -> other
+ end,
+ LJID = case Dir of
+ in -> jlib:jid_tolower(From);
+ out -> jlib:jid_tolower(To)
+ end,
+ {Subscription, Groups} =
+ case NeedDb of
+ true -> ejabberd_hooks:run_fold(roster_get_jid_info,
+ jlib:nameprep(Server),
+ {none, []},
+ [User, Server, LJID]);
+ false -> {[], []}
+ end,
+ check_packet_aux(List, PType2, LJID, Subscription, Groups)
end.
+%% Ptype = mesage | iq | presence_in | presence_out | other
check_packet_aux([], _PType, _JID, _Subscription, _Groups) ->
allow;
check_packet_aux([Item | List], PType, JID, Subscription, Groups) ->
presence_in ->
Item#listitem.match_presence_in;
presence_out ->
- Item#listitem.match_presence_out
+ Item#listitem.match_presence_out;
+ other ->
+ false
end
end.