aboutsummaryrefslogtreecommitdiff
path: root/src/ejabberd_s2s_out.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/ejabberd_s2s_out.erl')
-rw-r--r--src/ejabberd_s2s_out.erl52
1 files changed, 39 insertions, 13 deletions
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, "</stream:stream>").
--define(INVALID_HEADER_ERR,
- "<stream:stream>"
- "<stream:error>Invalid Stream Header</stream:error>"
- "</stream:stream>"
- ).
+-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};