diff options
author | Alexey Shchepin <alexey@process-one.net> | 2006-03-31 03:30:05 +0400 |
---|---|---|
committer | Alexey Shchepin <alexey@process-one.net> | 2006-03-31 03:30:05 +0400 |
commit | f3085d09e4193c29fc888e9798e742dba33a1b86 (patch) | |
tree | bac219b0beee276f785c0ac48df77c04936c8ee6 /src | |
parent | 832279f1f25c13e9c993d5be75e30f67249866d9 (diff) |
* src/ejabberd_c2s.erl: Bugfix
SVN Revision: 523
Diffstat (limited to 'src')
-rw-r--r-- | src/ejabberd_c2s.erl | 35 |
1 files changed, 29 insertions, 6 deletions
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, |