From 481cc2d1f4215a90ec8b7823d972111353acadc2 Mon Sep 17 00:00:00 2001 From: Alexey Shchepin Date: Mon, 12 May 2003 18:36:13 +0000 Subject: [PATCH] * src/ejabberd_s2s_out.erl: Fixed error replies, added timeouts * src/ejabberd_s2s_in.erl: Likewise SVN Revision: 107 --- ChangeLog | 5 +++ src/ejabberd_s2s_in.erl | 89 ++++++++++++++++++++++++++-------------- src/ejabberd_s2s_out.erl | 52 +++++++++++++++++------ 3 files changed, 102 insertions(+), 44 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5480eaefb..268f18d4c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2003-05-12 Alexey Shchepin + + * src/ejabberd_s2s_out.erl: Fixed error replies, added timeouts + * src/ejabberd_s2s_in.erl: Likewise + 2003-05-09 Alexey Shchepin * src/ejabberd_local.erl: Updated missed errors to new style diff --git a/src/ejabberd_s2s_in.erl b/src/ejabberd_s2s_in.erl index a7a058e0f..345fafae1 100644 --- a/src/ejabberd_s2s_in.erl +++ b/src/ejabberd_s2s_in.erl @@ -28,6 +28,7 @@ terminate/3]). -include("ejabberd.hrl"). +-include("jlib.hrl"). -record(state, {socket, receiver, streamid, myname, server, queue}). @@ -50,17 +51,14 @@ -define(STREAM_TRAILER, ""). --define(INVALID_HEADER_ERR, - "" - "Invalid Stream Header" - "" - ). +-define(INVALID_NAMESPACE_ERR, + xml:element_to_string(?SERR_INVALID_NAMESPACE)). --define(INVALID_DOMAIN_ERR, - "" - "Invalid Destination" - "" - ). +-define(HOST_UNKNOWN_ERR, + xml:element_to_string(?SERR_HOST_UNKNOWN)). + +-define(INVALID_XML_ERR, + xml:element_to_string(?SERR_XML_NOT_WELL_FORMED)). %%%---------------------------------------------------------------------- %%% API @@ -82,10 +80,12 @@ start(SockData, Opts) -> init([{SockMod, Socket}]) -> ?INFO_MSG("started: ~p", [{SockMod, Socket}]), ReceiverPid = spawn(?MODULE, receiver, [Socket, self()]), - {ok, wait_for_stream, #state{socket = Socket, - receiver = ReceiverPid, - streamid = new_id(), - queue = queue:new()}}. + {ok, wait_for_stream, + #state{socket = Socket, + receiver = ReceiverPid, + streamid = new_id(), + queue = queue:new()}, + ?S2STIMEOUT}. %%---------------------------------------------------------------------- %% Func: StateName/2 @@ -105,16 +105,25 @@ wait_for_stream({xmlstreamstart, Name, Attrs}, StateData) -> case lists:member(Me, ejabberd_router:dirty_get_all_domains()) of true -> send_text(StateData#state.socket, ?STREAM_HEADER), - {next_state, wait_for_key, StateData#state{myname = Me}}; + {next_state, wait_for_key, + StateData#state{myname = Me}, ?S2STIMEOUT}; _ -> - send_text(StateData#state.socket, ?INVALID_DOMAIN_ERR), + send_text(StateData#state.socket, ?HOST_UNKNOWN_ERR), {stop, normal, StateData} end; _ -> - send_text(StateData#state.socket, ?INVALID_HEADER_ERR), + send_text(StateData#state.socket, ?INVALID_NAMESPACE_ERR), {stop, normal, StateData} end; +wait_for_stream({xmlstreamerror, _}, StateData) -> + send_text(StateData#state.socket, + ?STREAM_HEADER ++ ?INVALID_XML_ERR ++ ?STREAM_TRAILER), + {stop, normal, StateData}; + +wait_for_stream(timeout, StateData) -> + {stop, normal, StateData}; + wait_for_stream(closed, StateData) -> {stop, normal, StateData}. @@ -130,9 +139,10 @@ wait_for_key({xmlstreamelement, El}, StateData) -> {next_state, wait_for_verification, StateData#state{myname = To, - server = From}}; + server = From}, + ?S2STIMEOUT}; _ -> - send_text(StateData#state.socket, ?INVALID_DOMAIN_ERR), + send_text(StateData#state.socket, ?HOST_UNKNOWN_ERR), {stop, normal, StateData} end; {verify, To, From, Id, Key} -> @@ -149,13 +159,20 @@ wait_for_key({xmlstreamelement, El}, StateData) -> {"id", Id}, {"type", Type}], []}), - {next_state, wait_for_key, StateData}; + {next_state, wait_for_key, StateData, ?S2STIMEOUT}; _ -> - {next_state, wait_for_key, StateData} + {next_state, wait_for_key, StateData, ?S2STIMEOUT} end; wait_for_key({xmlstreamend, Name}, StateData) -> - % TODO + {stop, normal, StateData}; + +wait_for_key({xmlstreamerror, _}, StateData) -> + send_text(StateData#state.socket, + ?STREAM_HEADER ++ ?INVALID_XML_ERR ++ ?STREAM_TRAILER), + {stop, normal, StateData}; + +wait_for_key(timeout, StateData) -> {stop, normal, StateData}; wait_for_key(closed, StateData) -> @@ -170,7 +187,7 @@ wait_for_verification(valid, StateData) -> {"type", "valid"}], []}), send_queue(StateData#state.socket, StateData#state.queue), - {next_state, stream_established, StateData}; + {next_state, stream_established, StateData, ?S2STIMEOUT}; wait_for_verification(invalid, StateData) -> send_element(StateData#state.socket, @@ -198,13 +215,20 @@ wait_for_verification({xmlstreamelement, El}, StateData) -> {"id", Id}, {"type", Type}], []}), - {next_state, wait_for_verification, StateData}; + {next_state, wait_for_verification, StateData, ?S2STIMEOUT}; _ -> - {next_state, wait_for_verification, StateData} + {next_state, wait_for_verification, StateData, ?S2STIMEOUT} end; wait_for_verification({xmlstreamend, Name}, StateData) -> - % TODO + {stop, normal, StateData}; + +wait_for_verification({xmlstreamerror, _}, StateData) -> + send_text(StateData#state.socket, + ?STREAM_HEADER ++ ?INVALID_XML_ERR ++ ?STREAM_TRAILER), + {stop, normal, StateData}; + +wait_for_verification(timeout, StateData) -> {stop, normal, StateData}; wait_for_verification(closed, StateData) -> @@ -260,14 +284,17 @@ stream_established({xmlstreamelement, El}, StateData) -> {next_state, stream_established, StateData, ?S2STIMEOUT}; stream_established({xmlstreamend, Name}, StateData) -> - % TODO + {stop, normal, StateData}; + +stream_established({xmlstreamerror, _}, StateData) -> + send_text(StateData#state.socket, + ?STREAM_HEADER ++ ?INVALID_XML_ERR ++ ?STREAM_TRAILER), {stop, normal, StateData}; stream_established(timeout, StateData) -> {stop, normal, StateData}; stream_established(closed, StateData) -> - % TODO {stop, normal, StateData}. @@ -292,7 +319,7 @@ stream_established(closed, StateData) -> %% {stop, Reason, NewStateData} %%---------------------------------------------------------------------- handle_event(Event, StateName, StateData) -> - {next_state, StateName, StateData}. + {next_state, StateName, StateData, ?S2STIMEOUT}. %%---------------------------------------------------------------------- %% Func: handle_sync_event/4 @@ -323,10 +350,10 @@ handle_info({send_element, El}, StateName, StateData) -> case StateName of stream_established -> send_element(StateData#state.socket, El), - {next_state, StateName, StateData}; + {next_state, StateName, StateData, ?S2STIMEOUT}; _ -> Q = queue:in(El, StateData#state.queue), - {next_state, StateName, StateData#state{queue = Q}} + {next_state, StateName, StateData#state{queue = Q}, ?S2STIMEOUT} end. diff --git a/src/ejabberd_s2s_out.erl b/src/ejabberd_s2s_out.erl index a9dd26cbd..9754cafb5 100644 --- a/src/ejabberd_s2s_out.erl +++ b/src/ejabberd_s2s_out.erl @@ -53,11 +53,14 @@ -define(STREAM_TRAILER, ""). --define(INVALID_HEADER_ERR, - "" - "Invalid Stream Header" - "" - ). +-define(INVALID_NAMESPACE_ERR, + xml:element_to_string(?SERR_INVALID_NAMESPACE)). + +-define(HOST_UNKNOWN_ERR, + xml:element_to_string(?SERR_HOST_UNKNOWN)). + +-define(INVALID_XML_ERR, + xml:element_to_string(?SERR_XML_NOT_WELL_FORMED)). %%%---------------------------------------------------------------------- %%% API @@ -90,7 +93,8 @@ init([From, Server, Type]) -> myname = From, server = Server, new = New, - verify = Verify}}. + verify = Verify}, + ?S2STIMEOUT}. %%---------------------------------------------------------------------- %% Func: StateName/2 @@ -111,7 +115,8 @@ open_socket(init, StateData) -> {next_state, wait_for_stream, StateData#state{socket = Socket, xmlpid = XMLStreamPid, - streamid = new_id()}}; + streamid = new_id()}, + ?S2STIMEOUT}; {error, Reason} -> ?DEBUG("s2s_out: connect return ~p~n", [Reason]), Error = case Reason of @@ -163,12 +168,21 @@ wait_for_stream({xmlstreamstart, Name, Attrs}, StateData) -> {"to", StateData#state.server}], [{xmlcdata, Key2}]}) end, - {next_state, wait_for_validation, StateData#state{new = New}}; + {next_state, wait_for_validation, + StateData#state{new = New}, ?S2STIMEOUT}; _ -> - send_text(StateData#state.socket, ?INVALID_HEADER_ERR), + send_text(StateData#state.socket, ?INVALID_NAMESPACE_ERR), {stop, normal, StateData} end; +wait_for_stream({xmlstreamerror, _}, StateData) -> + send_text(StateData#state.socket, + ?STREAM_HEADER ++ ?INVALID_XML_ERR ++ ?STREAM_TRAILER), + {stop, normal, StateData}; + +wait_for_stream(timeout, StateData) -> + {stop, normal, StateData}; + wait_for_stream(closed, StateData) -> {stop, normal, StateData}. @@ -190,7 +204,7 @@ wait_for_validation({xmlstreamelement, El}, StateData) -> ?INFO_MSG("recv verify: ~p", [{From, To, Id, Type}]), case StateData#state.verify of false -> - {next_state, wait_for_validation, StateData}; + {next_state, wait_for_validation, StateData, ?S2STIMEOUT}; {Pid, Key} -> case Type of "valid" -> @@ -203,15 +217,22 @@ wait_for_validation({xmlstreamelement, El}, StateData) -> {stop, normal, StateData}; _ -> {next_state, wait_for_validation, - StateData#state{verify = false}} + StateData#state{verify = false}, ?S2STIMEOUT} end end; _ -> - {next_state, wait_for_validation, StateData} + {next_state, wait_for_validation, StateData, ?S2STIMEOUT} end; wait_for_validation({xmlstreamend, Name}, StateData) -> - % TODO + {stop, normal, StateData}; + +wait_for_validation({xmlstreamerror, _}, StateData) -> + send_text(StateData#state.socket, + ?STREAM_HEADER ++ ?INVALID_XML_ERR ++ ?STREAM_TRAILER), + {stop, normal, StateData}; + +wait_for_validation(timeout, StateData) -> {stop, normal, StateData}; wait_for_validation(closed, StateData) -> @@ -263,6 +284,11 @@ stream_established({xmlstreamelement, El}, StateData) -> stream_established({xmlstreamend, Name}, StateData) -> {stop, normal, StateData}; +stream_established({xmlstreamerror, _}, StateData) -> + send_text(StateData#state.socket, + ?STREAM_HEADER ++ ?INVALID_XML_ERR ++ ?STREAM_TRAILER), + {stop, normal, StateData}; + stream_established(timeout, StateData) -> {stop, normal, StateData};