diff options
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 |