From 70a2200888e8efdfe915ffa433a17dc3038cfe2d Mon Sep 17 00:00:00 2001 From: Pablo Polvorin Date: Thu, 27 Jan 2011 11:05:16 -0300 Subject: [PATCH] Fix initial presence after roster subscription approval (EJAB-1384) Send initial presence after the roster subscription workflow is complete. --- src/ejabberd_c2s.erl | 8 ++++---- src/mod_roster.erl | 7 ++++++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index 8d2e6e39f..59b886482 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -226,7 +226,7 @@ broadcast(FsmRef, Type, From, Packet) -> get_state(FsmRef) -> ?GEN_FSM:sync_send_all_state_event(FsmRef, get_state, 1000). -add_rosteritem(FsmRef, IJID, ISubscription) -> +add_rosteritem(FsmRef, IJID, ISubscription) when is_binary(ISubscription) -> ?GEN_FSM:send_all_state_event(FsmRef, {add_rosteritem, IJID, ISubscription}). del_rosteritem(FsmRef, IJID) -> @@ -1146,7 +1146,7 @@ handle_event({add_rosteritem, IJID, ISubscription}, StateName, StateData) -> fsm_next_state(StateName, NewStateData); handle_event({del_rosteritem, IJID}, StateName, StateData) -> - NewStateData = roster_change(IJID, none, StateData), + NewStateData = roster_change(IJID, <<"none">>, StateData), fsm_next_state(StateName, NewStateData); handle_event(_Event, StateName, StateData) -> @@ -1956,8 +1956,8 @@ remove_element(E, Set) -> roster_change(IJID, ISubscription, StateData) -> LIJID = jlib:short_prepd_jid(IJID), - IsFrom = (ISubscription == both) or (ISubscription == from), - IsTo = (ISubscription == both) or (ISubscription == to), + IsFrom = (ISubscription == <<"both">>) or (ISubscription == <<"from">>), + IsTo = (ISubscription == <<"both">>) or (ISubscription == <<"to">>), OldIsFrom = ?SETS:is_element(LIJID, StateData#state.pres_f), FSet = if IsFrom -> diff --git a/src/mod_roster.erl b/src/mod_roster.erl index feb9a2f2e..fe2738bc6 100644 --- a/src/mod_roster.erl +++ b/src/mod_roster.erl @@ -627,7 +627,12 @@ process_item_els(Item, []) -> push_item(User, Server, From, Item) when is_binary(User), is_binary(Server), ?IS_JID(From) -> - {U, S, R} = Item#roster.jid, + {U, S, R2} = Item#roster.jid, + %% the ?XMLATTR macro will convert 'undefined' to <<"undefined">> .. so here we use <<>> for bare jids. + R = case R2 of + undefined -> <<>>; + _ -> R2 + end, ejabberd_sm:route(exmpp_jid:make(), exmpp_jid:make(User, Server), #xmlel{name = 'broadcast', ns = roster_item, attrs =