diff options
author | Alexey Shchepin <alexey@process-one.net> | 2003-12-02 20:20:53 +0000 |
---|---|---|
committer | Alexey Shchepin <alexey@process-one.net> | 2003-12-02 20:20:53 +0000 |
commit | 83a0be10095d0579075103e836e3d48808c6e549 (patch) | |
tree | 6c01fb2f50a82242f4b4507a29c7461c14312ab5 | |
parent | * src/ejabberd_c2s.erl: Added workaround for some Java clients (diff) |
* src/ejabberd_c2s.erl: Bugfix in processing of connection
replacement
SVN Revision: 180
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | src/ejabberd_c2s.erl | 45 |
2 files changed, 38 insertions, 12 deletions
@@ -1,3 +1,8 @@ +2003-12-02 Alexey Shchepin <alexey@sevcom.net> + + * src/ejabberd_c2s.erl: Bugfix in processing of connection + replacement + 2003-11-28 Alexey Shchepin <alexey@sevcom.net> * src/ejabberd_c2s.erl: Added workaround for some Java clients diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index 814cae90..d036ec0d 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, |