diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl index 567cd6b..96ef196 100644 --- a/src/ejabberd_c2s.erl +++ b/src/ejabberd_c2s.erl @@ -211,7 +211,7 @@ get_subscribed_and_online(FsmRef) -> %% {stop, Reason, NewStateData} %%---------------------------------------------------------------------- -wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) -> +wait_for_stream({xmlstreamstart, Name, Attrs}, StateData) -> DefaultLang = case ?MYLANG of undefined -> " xml:lang='en'"; @@ -359,12 +359,20 @@ wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) -> {stop, normal, StateData} end; _ -> - Header = io_lib:format( - ?STREAM_HEADER, - [StateData#state.streamid, ?MYNAME, "", DefaultLang]), - send_text(StateData, - Header ++ ?INVALID_NS_ERR ++ ?STREAM_TRAILER), - {stop, normal, StateData} + case Name of + "policy-file-request" -> + %% TODO: is really required to call reset_stream? + ejabberd_socket:reset_stream(StateData#state.socket), + send_text(StateData, flash_policy_string()), + {stop, normal, StateData}; + _ -> + Header = io_lib:format( + ?STREAM_HEADER, + [StateData#state.streamid, ?MYNAME, "", DefaultLang]), + send_text(StateData, + Header ++ ?INVALID_NS_ERR ++ ?STREAM_TRAILER), + {stop, normal, StateData} + end end; wait_for_stream(timeout, StateData) -> @@ -1952,3 +1960,25 @@ fsm_reply(Reply, session_established, StateData) -> {reply, Reply, session_established, StateData, ?C2S_HIBERNATE_TIMEOUT}; fsm_reply(Reply, StateName, StateData) -> {reply, Reply, StateName, StateData, ?C2S_OPEN_TIMEOUT}. + + +%% @spec () -> string() +%% @doc Build the content of a Flash policy file. +%% It specifies as domain "*". +%% It specifies as to-ports the ports that serve ejabberd_c2s. +flash_policy_string() -> + Listen = ejabberd_config:get_local_option(listen), + ClientPortsDeep = ["," ++ integer_to_list(Port) + || {Port, ejabberd_c2s, _Opts} <- Listen], + %% NOTE: The function string:join/2 was introduced in Erlang/OTP R12B-0 + %% so it can't be used yet in ejabberd. + [$, | ToPortsString] = lists:flatten(ClientPortsDeep), + + "\n" + "\n" + "\n" + " \n" + "\n\0".