From b0cc0cdcf9ffb58cf44d72f343a069226ad4bb21 Mon Sep 17 00:00:00 2001 From: Badlop Date: Mon, 16 Feb 2009 16:24:08 +0000 Subject: [PATCH] * src/mod_privacy.erl: Privacy List: deny presence-out all + send presence to: presence is sent (EJAB-255) * src/ejabberd_c2s.erl: Likewise SVN Revision: 1881 --- ChangeLog | 4 +++ src/ejabberd_c2s.erl | 52 ++++++++++++++++------------ src/mod_privacy.erl | 80 ++++++++++++++++++++------------------------ 3 files changed, 71 insertions(+), 65 deletions(-) diff --git a/ChangeLog b/ChangeLog index b054ec9b2..945545cce 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2009-02-16 Badlop + * src/mod_privacy.erl: Privacy List: deny presence-out all + send + presence to: presence is sent (EJAB-255) + * src/ejabberd_c2s.erl: Likewise + * src/mod_muc/mod_muc_room.erl: Owner of a password protected room must provide the password, like other participants (EJAB-867) diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index 117bbc9b3..6d68d249b 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -973,7 +973,8 @@ session_established2(El, StateData) -> 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 @@ -1571,13 +1572,13 @@ presence_track(From, To, Packet, 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, @@ -1586,52 +1587,59 @@ presence_track(From, To, Packet, StateData) -> 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), diff --git a/src/mod_privacy.erl b/src/mod_privacy.erl index 1fa1bbeaa..623763bad 100644 --- a/src/mod_privacy.erl +++ b/src/mod_privacy.erl @@ -555,9 +555,12 @@ get_user_list(_, User, Server) -> 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 [] -> @@ -566,50 +569,39 @@ check_packet(_, User, Server, 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) -> @@ -647,7 +639,9 @@ is_ptype_match(Item, PType) -> presence_in -> Item#listitem.match_presence_in; presence_out -> - Item#listitem.match_presence_out + Item#listitem.match_presence_out; + other -> + false end end.