aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBadlop <badlop@process-one.net>2008-02-09 10:38:47 +0000
committerBadlop <badlop@process-one.net>2008-02-09 10:38:47 +0000
commita90606b104b16b1e760f5ef7b61d907b7e67bb91 (patch)
treeeb7adbb928eafa5d89ff67e7dbcb3c2ac106ef93
parent* src/ejabberd.cfg.example: Document options to SQL keep alive (diff)
* src/mod_muc/mod_muc_room.erl: Include the error condition in the
presence status when kicking a participant due to an error stanza (EJAB-496) SVN Revision: 1179
-rw-r--r--ChangeLog4
-rw-r--r--src/mod_muc/mod_muc_room.erl61
2 files changed, 40 insertions, 25 deletions
diff --git a/ChangeLog b/ChangeLog
index b8c5df8a8..dffc4a249 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
2008-02-08 Badlop <badlop@process-one.net>
+ * src/mod_muc/mod_muc_room.erl: Include the error condition in the
+ presence status when kicking a participant due to an error
+ stanza (EJAB-496)
+
* src/ejabberd.cfg.example: Document options to SQL keep alive
interval and pool size (EJAB-206)
* doc/guide.tex: Likewise
diff --git a/src/mod_muc/mod_muc_room.erl b/src/mod_muc/mod_muc_room.erl
index 0102ba03c..0f7073632 100644
--- a/src/mod_muc/mod_muc_room.erl
+++ b/src/mod_muc/mod_muc_room.erl
@@ -294,18 +294,11 @@ normal_state({route, From, "",
"error" ->
case is_user_online(From, StateData) of
true ->
- NewState =
- add_user_presence_un(
- From,
- {xmlelement, "presence",
- [{"type", "unavailable"}],
- [{xmlelement, "status", [],
- [{xmlcdata,
- "This participant sent a bad error message to the room."}]}]},
- StateData),
- send_new_presence(From, NewState),
- {next_state, normal_state,
- remove_online_user(From, NewState)};
+ ErrorText = "This participant is kicked from the room because "
+ "he sent an error message",
+ NewState = expulse_participant(Packet, From, StateData,
+ translate:translate(Lang, ErrorText)),
+ {next_state, normal_state, NewState};
_ ->
{next_state, normal_state, StateData}
end;
@@ -902,16 +895,10 @@ process_presence(From, Nick, {xmlelement, "presence", Attrs, _Els} = Packet,
"error" ->
case is_user_online(From, StateData) of
true ->
- NewState =
- add_user_presence_un(
- From,
- {xmlelement, "presence",
- [{"type", "unavailable"}],
- [{xmlelement, "status", [],
- [{xmlcdata, "This participant sent a bad error presence."}]}]},
- StateData),
- send_new_presence(From, NewState),
- remove_online_user(From, NewState);
+ ErrorText = "This participant is kicked from the room because "
+ "he sent an error presence",
+ expulse_participant(Packet, From, StateData,
+ translate:translate(Lang, ErrorText));
_ ->
StateData
end;
@@ -1040,9 +1027,7 @@ decide_fate_message(_, _, _, _) ->
%% that the sender is a dead participant.
%% If so, return true to kick the participant.
check_error_kick(Packet) ->
- {xmlelement, _, _, EEls} = xml:get_subtag(Packet, "error"),
- [{xmlelement, Name, _, _}] = xml:remove_cdata(EEls),
- case Name of
+ case get_error_condition(Packet) of
"gone" -> true;
"internal-server-error" -> true;
"item-not-found" -> true;
@@ -1055,6 +1040,32 @@ check_error_kick(Packet) ->
_ -> false
end.
+get_error_condition(Packet) ->
+ case catch get_error_condition2(Packet) of
+ {condition, ErrorCondition} ->
+ ErrorCondition;
+ {'EXIT', Error} ->
+ "badformed error stanza"
+ end.
+get_error_condition2(Packet) ->
+ {xmlelement, _, _, EEls} = xml:get_subtag(Packet, "error"),
+ [Condition] = [Name || {xmlelement, Name, [{"xmlns", ?NS_STANZAS}], []} <- EEls],
+ {condition, Condition}.
+
+expulse_participant(Packet, From, StateData, Reason1) ->
+ ErrorCondition = get_error_condition(Packet),
+ Reason2 = io_lib:format(Reason1 ++ ": " ++ "~s", [ErrorCondition]),
+ NewState = add_user_presence_un(
+ From,
+ {xmlelement, "presence",
+ [{"type", "unavailable"}],
+ [{xmlelement, "status", [],
+ [{xmlcdata, Reason2}]
+ }]},
+ StateData),
+ send_new_presence(From, NewState),
+ remove_online_user(From, NewState).
+
set_affiliation(JID, Affiliation, StateData) ->
LJID = jlib:jid_remove_resource(jlib:jid_tolower(JID)),