Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/processone/ejabberd.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlexey Shchepin <alexey@process-one.net>2006-03-16 04:02:44 +0300
committerAlexey Shchepin <alexey@process-one.net>2006-03-16 04:02:44 +0300
commit7278a606a827ee7794d0e4f74a60ae1f4243c2d4 (patch)
treecf237be3651f54df82935f0ddfd5c27f4a676ac5 /src
parentd5137b0563e9d73b8ca521f1a7af985d5fe3686c (diff)
* src/ejabberd_c2s.erl: Bugfix
SVN Revision: 518
Diffstat (limited to 'src')
-rw-r--r--src/ejabberd_c2s.erl66
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