aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBadlop <badlop@process-one.net>2008-08-09 18:08:00 +0000
committerBadlop <badlop@process-one.net>2008-08-09 18:08:00 +0000
commit62f22e89769f600784a4dacb3af63367dc8630dd (patch)
tree780843efec646fbae68a14f2dab284913d32a406 /src
parentMore precise ChangeLog for last commit. (diff)
* src/ejabberd_service.erl: Fix XEP-0114 compliance: define xmlns
in header of error response; check the connection is attempted to a served component; include in response the JID of served component not server (thanks to Sergei Golovan) SVN Revision: 1516
Diffstat (limited to 'src')
-rw-r--r--src/ejabberd_service.erl30
1 files changed, 23 insertions, 7 deletions
diff --git a/src/ejabberd_service.erl b/src/ejabberd_service.erl
index 649f44951..d7216fc6e 100644
--- a/src/ejabberd_service.erl
+++ b/src/ejabberd_service.erl
@@ -1,7 +1,7 @@
%%%----------------------------------------------------------------------
%%% File : ejabberd_service.erl
%%% Author : Alexey Shchepin <alexey@process-one.net>
-%%% Purpose : External component management
+%%% Purpose : External component management (XEP-0114)
%%% Created : 6 Dec 2002 by Alexey Shchepin <alexey@process-one.net>
%%%
%%%
@@ -73,11 +73,19 @@
-define(STREAM_TRAILER, "</stream:stream>").
-define(INVALID_HEADER_ERR,
- "<stream:stream>"
+ "<stream:stream "
+ "xmlns:stream='http://etherx.jabber.org/streams'>"
"<stream:error>Invalid Stream Header</stream:error>"
"</stream:stream>"
).
+-define(HOST_UNKNOWN_ERR,
+ "<stream:stream "
+ "xmlns:stream='http://etherx.jabber.org/streams'>"
+ "<stream:error>Host Unknown</stream:error>"
+ "</stream:stream>"
+ ).
+
-define(INVALID_HANDSHAKE_ERR,
"<stream:error>Invalid Handshake</stream:error>"
"</stream:stream>"
@@ -168,13 +176,21 @@ init([{SockMod, Socket}, Opts]) ->
%%----------------------------------------------------------------------
wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) ->
- % TODO
case xml:get_attr_s("xmlns", Attrs) of
"jabber:component:accept" ->
- Header = io_lib:format(?STREAM_HEADER,
- [StateData#state.streamid, ?MYNAME]),
- send_text(StateData, Header),
- {next_state, wait_for_handshake, StateData};
+ %% Check that destination is a served component
+ To = xml:get_attr_s("to", Attrs),
+ case lists:member(To, StateData#state.hosts) of
+ true ->
+ Header = io_lib:format(?STREAM_HEADER,
+ [StateData#state.streamid,
+ xml:crypt(To)]),
+ send_text(StateData, Header),
+ {next_state, wait_for_handshake, StateData};
+ _ ->
+ send_text(StateData, ?HOST_UNKNOWN_ERR),
+ {stop, normal, StateData}
+ end;
_ ->
send_text(StateData, ?INVALID_HEADER_ERR),
{stop, normal, StateData}