From f3085d09e4193c29fc888e9798e742dba33a1b86 Mon Sep 17 00:00:00 2001 From: Alexey Shchepin Date: Thu, 30 Mar 2006 23:30:05 +0000 Subject: [PATCH] * src/ejabberd_c2s.erl: Bugfix SVN Revision: 523 --- ChangeLog | 4 ++++ src/ejabberd_c2s.erl | 35 +++++++++++++++++++++++++++++------ 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index d78a86ceb..c67598b79 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2006-03-31 Alexey Shchepin + + * src/ejabberd_c2s.erl: Bugfix + 2006-03-25 Alexey Shchepin * src/ejabberd_c2s.erl: Enable zlib only over TCP diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index 305b33981..97ad79620 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -1533,6 +1533,7 @@ roster_change(IJID, ISubscription, StateData) -> LIJID = jlib:jid_tolower(IJID), IsFrom = (ISubscription == both) or (ISubscription == from), IsTo = (ISubscription == both) or (ISubscription == to), + OldIsFrom = ?SETS:is_element(LIJID, StateData#state.pres_f), FSet = if IsFrom -> ?SETS:add_element(LIJID, StateData#state.pres_f); @@ -1551,14 +1552,26 @@ roster_change(IJID, ISubscription, StateData) -> P -> ?DEBUG("roster changed for ~p~n", [StateData#state.user]), From = StateData#state.jid, - Cond1 = (not StateData#state.pres_invis) and IsFrom, - Cond2 = (not IsFrom) + To = jlib:make_jid(IJID), + Cond1 = (not StateData#state.pres_invis) and IsFrom + and (not OldIsFrom), + Cond2 = (not IsFrom) and OldIsFrom and (?SETS:is_element(LIJID, StateData#state.pres_a) or ?SETS:is_element(LIJID, StateData#state.pres_i)), if Cond1 -> ?DEBUG("C1: ~p~n", [LIJID]), - ejabberd_router:route(From, jlib:make_jid(IJID), P), + case catch mod_privacy:check_packet( + StateData#state.user, + StateData#state.server, + StateData#state.privacy_list, + {From, To, P}, + out) of + deny -> + ok; + _ -> + ejabberd_router:route(From, To, P) + end, A = ?SETS:add_element(LIJID, StateData#state.pres_a), StateData#state{pres_a = A, @@ -1566,9 +1579,19 @@ roster_change(IJID, ISubscription, StateData) -> pres_t = TSet}; Cond2 -> ?DEBUG("C2: ~p~n", [LIJID]), - ejabberd_router:route(From, jlib:make_jid(IJID), - {xmlelement, "presence", - [{"type", "unavailable"}], []}), + PU = {xmlelement, "presence", + [{"type", "unavailable"}], []}, + case catch mod_privacy:check_packet( + StateData#state.user, + StateData#state.server, + StateData#state.privacy_list, + {From, To, PU}, + out) of + deny -> + ok; + _ -> + ejabberd_router:route(From, To, PU) + end, I = remove_element(LIJID, StateData#state.pres_i), A = remove_element(LIJID,