aboutsummaryrefslogtreecommitdiff
path: root/src/ejabberd_c2s.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/ejabberd_c2s.erl')
-rw-r--r--src/ejabberd_c2s.erl21
1 files changed, 17 insertions, 4 deletions
diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl
index fa7d8f726..e1ab806ab 100644
--- a/src/ejabberd_c2s.erl
+++ b/src/ejabberd_c2s.erl
@@ -879,16 +879,24 @@ get_auth_tags([], U, P, D, R) ->
process_presence_probe(From, To, StateData) ->
LFrom = jlib:jid_tolower(From),
+ LBFrom = setelement(3, LFrom, ""),
case StateData#state.pres_last of
undefined ->
ok;
_ ->
Cond1 = (not StateData#state.pres_invis)
- and ?SETS:is_element(LFrom, StateData#state.pres_f)
- and (not ?SETS:is_element(LFrom, StateData#state.pres_i)),
+ andalso (?SETS:is_element(LFrom, StateData#state.pres_f)
+ orelse
+ ((LFrom /= LBFrom) andalso
+ ?SETS:is_element(LBFrom, StateData#state.pres_f)))
+ andalso (not
+ (?SETS:is_element(LFrom, StateData#state.pres_i)
+ orelse
+ ((LFrom /= LBFrom) andalso
+ ?SETS:is_element(LBFrom, StateData#state.pres_i)))),
Cond2 = StateData#state.pres_invis
- and ?SETS:is_element(LFrom, StateData#state.pres_f)
- and ?SETS:is_element(LFrom, StateData#state.pres_a),
+ andalso ?SETS:is_element(LFrom, StateData#state.pres_f)
+ andalso ?SETS:is_element(LFrom, StateData#state.pres_a),
if
Cond1 ->
Packet = StateData#state.pres_last,
@@ -949,6 +957,8 @@ presence_update(From, Packet, StateData) ->
NewState;
"error" ->
StateData;
+ "probe" ->
+ StateData;
"subscribe" ->
StateData;
"subscribed" ->
@@ -1022,6 +1032,9 @@ presence_track(From, To, Packet, StateData) ->
"error" ->
ejabberd_router:route(From, To, Packet),
StateData;
+ "probe" ->
+ ejabberd_router:route(From, To, Packet),
+ StateData;
_ ->
%-ifdef(PRIVACY_SUPPORT).
case catch mod_privacy:check_packet(