aboutsummaryrefslogtreecommitdiff
path: root/src/ejabberd_c2s.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/ejabberd_c2s.erl')
-rw-r--r--src/ejabberd_c2s.erl49
1 files changed, 23 insertions, 26 deletions
diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl
index 7632cb121..2ac28dbb6 100644
--- a/src/ejabberd_c2s.erl
+++ b/src/ejabberd_c2s.erl
@@ -1679,38 +1679,27 @@ handle_info({route, From, To,
Packet, in)
of
allow -> {true, Attrs, StateData};
- deny -> {false, Attrs, StateData}
+ deny ->
+ Err =
+ jlib:make_error_reply(Packet,
+ ?ERR_SERVICE_UNAVAILABLE),
+ ejabberd_router:route(To, From,
+ Err),
+ {false, Attrs, StateData}
end;
_ -> {true, Attrs, StateData}
end,
- if Pass == exit ->
- %% When Pass==exit, NewState contains a string instead of a #state{}
- Lang = StateData#state.lang,
- send_element(StateData, ?SERRT_CONFLICT(Lang, NewState)),
- send_trailer(StateData),
- {stop, normal, StateData};
- Pass ->
+ if Pass ->
Attrs2 =
jlib:replace_from_to_attrs(jlib:jid_to_string(From),
jlib:jid_to_string(To), NewAttrs),
FixedPacket = #xmlel{name = Name, attrs = Attrs2, children = Els},
- FinalState =
- case ejabberd_hooks:run_fold(c2s_filter_packet_in,
- NewState#state.server, FixedPacket,
- [NewState#state.jid, From, To])
- of
- drop ->
- NewState;
- FinalPacket = #xmlel{} ->
- SentState = send_packet(NewState, FinalPacket),
- ejabberd_hooks:run(user_receive_packet,
- SentState#state.server,
- [SentState#state.jid, From, To,
- FinalPacket]),
- SentState
- end,
+ SentStateData = send_packet(NewState, FixedPacket),
+ ejabberd_hooks:run(user_receive_packet,
+ SentStateData#state.server,
+ [SentStateData#state.jid, From, To, FixedPacket]),
ejabberd_hooks:run(c2s_loop_debug, [{route, From, To, Packet}]),
- fsm_next_state(StateName, FinalState);
+ fsm_next_state(StateName, SentStateData);
true ->
ejabberd_hooks:run(c2s_loop_debug, [{route, From, To, Packet}]),
fsm_next_state(StateName, NewState)
@@ -1737,6 +1726,10 @@ handle_info(system_shutdown, StateName, StateData) ->
ok
end,
{stop, normal, StateData};
+handle_info({route_xmlstreamelement, El}, _StateName, StateData) ->
+ {next_state, NStateName, NStateData, _Timeout} =
+ session_established({xmlstreamelement, El}, StateData),
+ fsm_next_state(NStateName, NStateData);
handle_info({force_update_presence, LUser}, StateName,
#state{user = LUser, server = LServer} = StateData) ->
NewStateData = case StateData#state.pres_last of
@@ -2848,8 +2841,12 @@ send_stanza_and_ack_req(StateData, Stanza) ->
AckReq = #xmlel{name = <<"r">>,
attrs = [{<<"xmlns">>, StateData#state.mgmt_xmlns}],
children = []},
- send_element(StateData, Stanza),
- send_element(StateData, AckReq).
+ case send_element(StateData, Stanza) of
+ ok ->
+ send_element(StateData, AckReq);
+ error ->
+ error
+ end.
mgmt_queue_add(StateData, El) ->
NewNum = case StateData#state.mgmt_stanzas_out of