diff options
author | Badlop <badlop@process-one.net> | 2008-08-09 18:08:00 +0000 |
---|---|---|
committer | Badlop <badlop@process-one.net> | 2008-08-09 18:08:00 +0000 |
commit | 62f22e89769f600784a4dacb3af63367dc8630dd (patch) | |
tree | 780843efec646fbae68a14f2dab284913d32a406 /src | |
parent | More 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.erl | 30 |
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} |