summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey Shchepin <alexey@process-one.net>2003-05-12 18:36:13 +0000
committerAlexey Shchepin <alexey@process-one.net>2003-05-12 18:36:13 +0000
commit481cc2d1f4215a90ec8b7823d972111353acadc2 (patch)
tree73fbc252e991b7a64603031f7beb4358d7407f55
parent* src/ejabberd_local.erl: Updated missed errors to new style (diff)
* src/ejabberd_s2s_out.erl: Fixed error replies, added timeouts
* src/ejabberd_s2s_in.erl: Likewise SVN Revision: 107
Diffstat (limited to '')
-rw-r--r--ChangeLog5
-rw-r--r--src/ejabberd_s2s_in.erl89
-rw-r--r--src/ejabberd_s2s_out.erl52
3 files changed, 102 insertions, 44 deletions
diff --git a/ChangeLog b/ChangeLog
index 5480eaef..268f18d4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2003-05-12 Alexey Shchepin <alexey@sevcom.net>
+
+ * src/ejabberd_s2s_out.erl: Fixed error replies, added timeouts
+ * src/ejabberd_s2s_in.erl: Likewise
+
2003-05-09 Alexey Shchepin <alexey@sevcom.net>
* 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 a7a058e0..345fafae 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, "</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(INVALID_DOMAIN_ERR,
- "<stream:stream>"
- "<stream:error>Invalid Destination</stream:error>"
- "</stream:stream>"
- ).
+-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 a9dd26cb..9754cafb 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};