diff --git a/ChangeLog b/ChangeLog index 7c06cd100..9d4eba62a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2009-03-24 Badlop + + * src/ejabberd_sm.erl: Partially retract SVN r1976 + EJAB-300 (EJAB-890). Check default privacy list when account, not + a specific session, receives a presence subscription + stanza (EJAB-300). + * src/ejabberd_c2s.erl: Likewise + 2009-03-10 Badlop * doc/release_notes_2.0.4.txt: Added file for new release diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index 9bd5ba535..40cba2a2c 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -1091,21 +1091,16 @@ handle_info({route, From, To, Packet}, StateName, StateData) -> Attrs1 = lists:keydelete("type", 1, Attrs), {true, [{"type", "unavailable"} | Attrs1], StateData}; "subscribe" -> - Reason = xml:get_path_s(Packet,[{elem,"status"},cdata]), - SRes = check_privacy_subs(in, subscribe, From, To, - Packet, Reason, StateData), + SRes = is_privacy_allow(From, To, Packet, StateData#state.privacy_list), {SRes, Attrs, StateData}; "subscribed" -> - SRes = check_privacy_subs(in, subscribed, From, To, - Packet, "", StateData), + SRes = is_privacy_allow(From, To, Packet, StateData#state.privacy_list), {SRes, Attrs, StateData}; "unsubscribe" -> - SRes = check_privacy_subs(in, unsubscribe, From, To, - Packet, "", StateData), + SRes = is_privacy_allow(From, To, Packet, StateData#state.privacy_list), {SRes, Attrs, StateData}; "unsubscribed" -> - SRes = check_privacy_subs(in, unsubscribed, From, To, - Packet, "", StateData), + SRes = is_privacy_allow(From, To, Packet, StateData#state.privacy_list), {SRes, Attrs, StateData}; _ -> case ejabberd_hooks:run_fold( @@ -1628,35 +1623,18 @@ presence_track(From, To, Packet, StateData) -> pres_a = A} end. -%% Check privacy rules for subscription requests and call the roster storage -check_privacy_subs(Dir, Type, From, To, Packet, Reason, StateData) -> - case is_privacy_allow(From, To, Dir, Packet, StateData) of - true -> - ejabberd_hooks:run_fold( - roster_in_subscription, - To#jid.lserver, - false, - [To#jid.user, To#jid.server, From, Type, Reason]), - true; - false -> - false - end. - -%% Check if privacy rules allow this delivery, then push to roster -is_privacy_allow(From, To, Dir, 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}, - Dir]) of - deny -> - false; - allow -> - true - end. +%% Check if privacy rules allow this delivery +is_privacy_allow(From, To, Packet, PrivacyList) -> + User = To#jid.user, + Server = To#jid.server, + allow == ejabberd_hooks:run_fold( + privacy_check_packet, Server, + allow, + [User, + Server, + PrivacyList, + {From, To, Packet}, + in]). presence_broadcast(StateData, From, JIDSet, Packet) -> lists:foreach(fun(JID) -> diff --git a/src/ejabberd_sm.erl b/src/ejabberd_sm.erl index 9a56e5fb1..148ef5a3b 100644 --- a/src/ejabberd_sm.erl +++ b/src/ejabberd_sm.erl @@ -59,6 +59,7 @@ -include("ejabberd.hrl"). -include("jlib.hrl"). -include("ejabberd_ctl.hrl"). +-include("mod_privacy.hrl"). -record(session, {sid, usr, us, priority, info}). -record(state, {}). @@ -381,13 +382,40 @@ do_route(From, To, Packet) -> {Pass, _Subsc} = case xml:get_attr_s("type", Attrs) of "subscribe" -> - {true, true}; + Reason = xml:get_path_s( + Packet, + [{elem, "status"}, cdata]), + {is_privacy_allow(From, To, Packet) andalso + ejabberd_hooks:run_fold( + roster_in_subscription, + LServer, + false, + [User, Server, From, subscribe, Reason]), + true}; "subscribed" -> - {true, true}; + {is_privacy_allow(From, To, Packet) andalso + ejabberd_hooks:run_fold( + roster_in_subscription, + LServer, + false, + [User, Server, From, subscribed, ""]), + true}; "unsubscribe" -> - {true, true}; + {is_privacy_allow(From, To, Packet) andalso + ejabberd_hooks:run_fold( + roster_in_subscription, + LServer, + false, + [User, Server, From, unsubscribe, ""]), + true}; "unsubscribed" -> - {true, true}; + {is_privacy_allow(From, To, Packet) andalso + ejabberd_hooks:run_fold( + roster_in_subscription, + LServer, + false, + [User, Server, From, unsubscribed, ""]), + true}; _ -> {true, false} end, @@ -446,6 +474,31 @@ do_route(From, To, Packet) -> end end. +%% The default list applies to the user as a whole, +%% and is processed if there is no active list set +%% for the target session/resource to which a stanza is addressed, +%% or if there are no current sessions for the user. +is_privacy_allow(From, To, Packet) -> + User = To#jid.user, + Server = To#jid.server, + PrivacyList = ejabberd_hooks:run_fold(privacy_get_user_list, Server, + #userlist{}, [User, Server]), + is_privacy_allow(From, To, Packet, PrivacyList). + +%% Check if privacy rules allow this delivery +%% Function copied from ejabberd_c2s.erl +is_privacy_allow(From, To, Packet, PrivacyList) -> + User = To#jid.user, + Server = To#jid.server, + allow == ejabberd_hooks:run_fold( + privacy_check_packet, Server, + allow, + [User, + Server, + PrivacyList, + {From, To, Packet}, + in]). + route_message(From, To, Packet) -> LUser = To#jid.luser, LServer = To#jid.lserver,