diff options
author | Alexey Shchepin <alexey@process-one.net> | 2006-03-16 04:02:44 +0300 |
---|---|---|
committer | Alexey Shchepin <alexey@process-one.net> | 2006-03-16 04:02:44 +0300 |
commit | 7278a606a827ee7794d0e4f74a60ae1f4243c2d4 (patch) | |
tree | cf237be3651f54df82935f0ddfd5c27f4a676ac5 /src | |
parent | d5137b0563e9d73b8ca521f1a7af985d5fe3686c (diff) |
* src/ejabberd_c2s.erl: Bugfix
SVN Revision: 518
Diffstat (limited to 'src')
-rw-r--r-- | src/ejabberd_c2s.erl | 66 |
1 files changed, 63 insertions, 3 deletions
diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index 1775904de..b36775689 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -910,8 +910,38 @@ handle_info({route, From, To, Packet}, StateName, StateData) -> "presence" -> case xml:get_attr_s("type", Attrs) of "probe" -> - process_presence_probe(From, To, StateData), - {false, Attrs, StateData}; + LFrom = jlib:jid_tolower(From), + LBFrom = jlib:jid_remove_resource(LFrom), + NewStateData = + case ?SETS:is_element( + LFrom, StateData#state.pres_a) orelse + ?SETS:is_element( + LBFrom, StateData#state.pres_a) of + true -> + StateData; + false -> + case ?SETS:is_element( + LFrom, StateData#state.pres_f) of + true -> + A = ?SETS:add_element( + LFrom, + StateData#state.pres_a), + StateData#state{pres_a = A}; + false -> + case ?SETS:is_element( + LBFrom, StateData#state.pres_f) of + true -> + A = ?SETS:add_element( + LBFrom, + StateData#state.pres_a), + StateData#state{pres_a = A}; + false -> + StateData + end + end + end, + process_presence_probe(From, To, NewStateData), + {false, Attrs, NewStateData}; "error" -> NewA = remove_element(jlib:jid_tolower(From), StateData#state.pres_a), @@ -938,7 +968,37 @@ handle_info({route, From, To, Packet}, StateName, StateData) -> {'EXIT', _Reason} -> {true, Attrs, StateData}; allow -> - {true, Attrs, StateData}; + LFrom = jlib:jid_tolower(From), + LBFrom = jlib:jid_remove_resource(LFrom), + case ?SETS:is_element( + LFrom, StateData#state.pres_a) orelse + ?SETS:is_element( + LBFrom, StateData#state.pres_a) of + true -> + {true, Attrs, StateData}; + false -> + case ?SETS:is_element( + LFrom, StateData#state.pres_f) of + true -> + A = ?SETS:add_element( + LFrom, + StateData#state.pres_a), + {true, Attrs, + StateData#state{pres_a = A}}; + false -> + case ?SETS:is_element( + LBFrom, StateData#state.pres_f) of + true -> + A = ?SETS:add_element( + LBFrom, + StateData#state.pres_a), + {true, Attrs, + StateData#state{pres_a = A}}; + false -> + {true, Attrs, StateData} + end + end + end; deny -> {false, Attrs, StateData} end |