diff --git a/ChangeLog b/ChangeLog index bbcbb2437..f313d3ea0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2003-12-02 Alexey Shchepin + + * src/ejabberd_c2s.erl: Bugfix in processing of connection + replacement + 2003-11-28 Alexey Shchepin * src/ejabberd_c2s.erl: Added workaround for some Java clients diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index 814cae90a..d036ec0dd 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -676,7 +676,7 @@ handle_info({send_text, Text}, StateName, StateData) -> handle_info(replaced, StateName, StateData) -> % TODO %send_text(StateData#state.sender, Text), - {stop, normal, StateData#state{user = ""}}; + {stop, normal, StateData#state{authentificated = replaced}}; handle_info({route, From, To, Packet}, StateName, StateData) -> {xmlelement, Name, Attrs, Els} = Packet, {Pass, NewAttrs, NewState} = @@ -811,17 +811,38 @@ handle_info({route, From, To, Packet}, StateName, StateData) -> terminate(Reason, StateName, StateData) -> case StateName of session_established -> - ?INFO_MSG("(~w) Close session for ~s", - [StateData#state.socket, - jlib:jid_to_string(StateData#state.jid)]), - ejabberd_sm:close_session(StateData#state.user, - StateData#state.resource), - From = StateData#state.jid, - Packet = {xmlelement, "presence", [{"type", "unavailable"}], []}, - ejabberd_sm:unset_presence(StateData#state.user, - StateData#state.resource), - presence_broadcast(StateData, From, StateData#state.pres_a, Packet), - presence_broadcast(StateData, From, StateData#state.pres_i, Packet); + case StateData#state.authentificated of + replaced -> + ?INFO_MSG("(~w) Replaced session for ~s", + [StateData#state.socket, + jlib:jid_to_string(StateData#state.jid)]), + From = StateData#state.jid, + Packet = {xmlelement, "presence", + [{"type", "unavailable"}], + [{xmlelement, "status", [], + [{xmlcdata, "Replaced by new connection"}]}]}, + ejabberd_sm:unset_presence(StateData#state.user, + StateData#state.resource), + presence_broadcast( + StateData, From, StateData#state.pres_a, Packet), + presence_broadcast( + StateData, From, StateData#state.pres_i, Packet); + _ -> + ?INFO_MSG("(~w) Close session for ~s", + [StateData#state.socket, + jlib:jid_to_string(StateData#state.jid)]), + ejabberd_sm:close_session(StateData#state.user, + StateData#state.resource), + From = StateData#state.jid, + Packet = {xmlelement, "presence", + [{"type", "unavailable"}], []}, + ejabberd_sm:unset_presence(StateData#state.user, + StateData#state.resource), + presence_broadcast( + StateData, From, StateData#state.pres_a, Packet), + presence_broadcast( + StateData, From, StateData#state.pres_i, Packet) + end; _ -> ok end,