summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvgeny Khramtsov <xramtsov@gmail.com>2014-05-27 15:38:26 +0400
committerEvgeny Khramtsov <xramtsov@gmail.com>2014-05-27 15:38:26 +0400
commit4d1332c30fc3177ab74b33cc2931a789f028979c (patch)
treed490ebaaf05b57df1b1c41498f3c7f94e718d024
parentMerge pull request #221 from weiss/omit-redundant-guard (diff)
parentXEP-0198: Don't drop session on failed resume (diff)
Merge pull request #222 from weiss/keep-session-on-failed-resume
XEP-0198: Don't drop session on failed resume
-rw-r--r--src/ejabberd_c2s.erl17
1 files changed, 11 insertions, 6 deletions
diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl
index fd3e5886..43bce7d0 100644
--- a/src/ejabberd_c2s.erl
+++ b/src/ejabberd_c2s.erl
@@ -1311,8 +1311,8 @@ handle_sync_event(get_subscribed, _From, StateName,
StateData) ->
Subscribed = (?SETS):to_list(StateData#state.pres_f),
{reply, Subscribed, StateName, StateData};
-handle_sync_event(resume_session, _From, _StateName,
- StateData) ->
+handle_sync_event({resume_session, Time}, _From, _StateName,
+ StateData) when element(1, StateData#state.sid) == Time ->
%% The old session should be closed before the new one is opened, so we do
%% this here instead of leaving it to the terminate callback
ejabberd_sm:close_session(StateData#state.sid,
@@ -1320,6 +1320,9 @@ handle_sync_event(resume_session, _From, _StateName,
StateData#state.server,
StateData#state.resource),
{stop, normal, {ok, StateData}, StateData#state{mgmt_state = resumed}};
+handle_sync_event({resume_session, _Time}, _From, StateName,
+ StateData) ->
+ {reply, {error, <<"Previous session not found">>}, StateName, StateData};
handle_sync_event(_Event, _From, StateName,
StateData) ->
Reply = ok, fsm_reply(Reply, StateName, StateData).
@@ -2891,8 +2894,8 @@ inherit_session_state(#state{user = U, server = S} = StateData, ResumeID) ->
{error, <<"Previous session PID not found">>};
OldPID ->
OldSID = {Time, OldPID},
- case catch resume_session(OldPID) of
- {ok, #state{sid = OldSID} = OldStateData} ->
+ case catch resume_session(OldSID) of
+ {ok, OldStateData} ->
NewSID = {Time, self()}, % Old time, new PID
Priority = case OldStateData#state.pres_last of
undefined ->
@@ -2924,6 +2927,8 @@ inherit_session_state(#state{user = U, server = S} = StateData, ResumeID) ->
mgmt_stanzas_in = OldStateData#state.mgmt_stanzas_in,
mgmt_stanzas_out = OldStateData#state.mgmt_stanzas_out,
mgmt_state = active}};
+ {error, Msg} ->
+ {error, Msg};
_ ->
{error, <<"Cannot grab session state">>}
end
@@ -2932,8 +2937,8 @@ inherit_session_state(#state{user = U, server = S} = StateData, ResumeID) ->
{error, <<"Invalid 'previd' value">>}
end.
-resume_session(FsmRef) ->
- (?GEN_FSM):sync_send_all_state_event(FsmRef, resume_session, 3000).
+resume_session({Time, PID}) ->
+ (?GEN_FSM):sync_send_all_state_event(PID, {resume_session, Time}, 3000).
make_resume_id(StateData) ->
{Time, _} = StateData#state.sid,