summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Shchepin <alexey@process-one.net>2003-12-02 20:20:53 +0000
committerAlexey Shchepin <alexey@process-one.net>2003-12-02 20:20:53 +0000
commit83a0be10095d0579075103e836e3d48808c6e549 (patch)
tree6c01fb2f50a82242f4b4507a29c7461c14312ab5
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--ChangeLog5
-rw-r--r--src/ejabberd_c2s.erl45
2 files changed, 38 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog
index bbcbb243..f313d3ea 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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,