mirror of
https://github.com/processone/ejabberd.git
synced 2024-11-24 16:23:40 +01:00
Accept stream compression request after SASL
This is an updated version of the patch submitted to EJAB-1382 by Alexey (thanks!).
This commit is contained in:
parent
8f9c18edf2
commit
5b4aefbacd
@ -469,6 +469,22 @@ wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) ->
|
|||||||
false ->
|
false ->
|
||||||
[]
|
[]
|
||||||
end,
|
end,
|
||||||
|
SockMod =
|
||||||
|
(StateData#state.sockmod):get_sockmod(
|
||||||
|
StateData#state.socket),
|
||||||
|
Zlib = StateData#state.zlib,
|
||||||
|
CompressFeature =
|
||||||
|
case Zlib andalso
|
||||||
|
((SockMod == gen_tcp) orelse (SockMod == fast_tls)) of
|
||||||
|
true ->
|
||||||
|
[#xmlel{name = <<"compression">>,
|
||||||
|
attrs = [{<<"xmlns">>, ?NS_FEATURE_COMPRESS}],
|
||||||
|
children = [#xmlel{name = <<"method">>,
|
||||||
|
attrs = [],
|
||||||
|
children = [{xmlcdata, <<"zlib">>}]}]}];
|
||||||
|
_ ->
|
||||||
|
[]
|
||||||
|
end,
|
||||||
StreamFeatures1 = [#xmlel{name = <<"bind">>,
|
StreamFeatures1 = [#xmlel{name = <<"bind">>,
|
||||||
attrs = [{<<"xmlns">>, ?NS_BIND}],
|
attrs = [{<<"xmlns">>, ?NS_BIND}],
|
||||||
children = []},
|
children = []},
|
||||||
@ -479,6 +495,7 @@ wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) ->
|
|||||||
++
|
++
|
||||||
RosterVersioningFeature ++
|
RosterVersioningFeature ++
|
||||||
StreamManagementFeature ++
|
StreamManagementFeature ++
|
||||||
|
CompressFeature ++
|
||||||
ejabberd_hooks:run_fold(c2s_post_auth_features,
|
ejabberd_hooks:run_fold(c2s_post_auth_features,
|
||||||
Server, [], [Server]),
|
Server, [], [Server]),
|
||||||
StreamFeatures = ejabberd_hooks:run_fold(c2s_stream_features,
|
StreamFeatures = ejabberd_hooks:run_fold(c2s_stream_features,
|
||||||
@ -815,38 +832,7 @@ wait_for_feature_request({xmlstreamelement, El},
|
|||||||
{?NS_COMPRESS, <<"compress">>}
|
{?NS_COMPRESS, <<"compress">>}
|
||||||
when Zlib == true,
|
when Zlib == true,
|
||||||
(SockMod == gen_tcp) or (SockMod == fast_tls) ->
|
(SockMod == gen_tcp) or (SockMod == fast_tls) ->
|
||||||
case fxml:get_subtag(El, <<"method">>) of
|
process_compression_request(El, wait_for_feature_request, StateData);
|
||||||
false ->
|
|
||||||
send_element(StateData,
|
|
||||||
#xmlel{name = <<"failure">>,
|
|
||||||
attrs = [{<<"xmlns">>, ?NS_COMPRESS}],
|
|
||||||
children =
|
|
||||||
[#xmlel{name = <<"setup-failed">>,
|
|
||||||
attrs = [], children = []}]}),
|
|
||||||
fsm_next_state(wait_for_feature_request, StateData);
|
|
||||||
Method ->
|
|
||||||
case fxml:get_tag_cdata(Method) of
|
|
||||||
<<"zlib">> ->
|
|
||||||
Socket = StateData#state.socket,
|
|
||||||
BCompressed = fxml:element_to_binary(#xmlel{name = <<"compressed">>,
|
|
||||||
attrs = [{<<"xmlns">>, ?NS_COMPRESS}]}),
|
|
||||||
ZlibSocket = (StateData#state.sockmod):compress(Socket,
|
|
||||||
BCompressed),
|
|
||||||
fsm_next_state(wait_for_stream,
|
|
||||||
StateData#state{socket = ZlibSocket,
|
|
||||||
streamid = new_id()});
|
|
||||||
_ ->
|
|
||||||
send_element(StateData,
|
|
||||||
#xmlel{name = <<"failure">>,
|
|
||||||
attrs = [{<<"xmlns">>, ?NS_COMPRESS}],
|
|
||||||
children =
|
|
||||||
[#xmlel{name =
|
|
||||||
<<"unsupported-method">>,
|
|
||||||
attrs = [],
|
|
||||||
children = []}]}),
|
|
||||||
fsm_next_state(wait_for_feature_request, StateData)
|
|
||||||
end
|
|
||||||
end;
|
|
||||||
_ ->
|
_ ->
|
||||||
if TLSRequired and not TLSEnabled ->
|
if TLSRequired and not TLSEnabled ->
|
||||||
Lang = StateData#state.lang,
|
Lang = StateData#state.lang,
|
||||||
@ -1089,7 +1075,19 @@ wait_for_bind({xmlstreamelement, El}, StateData) ->
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end;
|
end;
|
||||||
_ -> fsm_next_state(wait_for_bind, StateData)
|
_ ->
|
||||||
|
#xmlel{name = Name, attrs = Attrs, children = _Els} = El,
|
||||||
|
Zlib = StateData#state.zlib,
|
||||||
|
SockMod =
|
||||||
|
(StateData#state.sockmod):get_sockmod(StateData#state.socket),
|
||||||
|
case {fxml:get_attr_s(<<"xmlns">>, Attrs), Name} of
|
||||||
|
{?NS_COMPRESS, <<"compress">>}
|
||||||
|
when Zlib == true,
|
||||||
|
(SockMod == gen_tcp) or (SockMod == fast_tls) ->
|
||||||
|
process_compression_request(El, wait_for_bind, StateData);
|
||||||
|
_ ->
|
||||||
|
fsm_next_state(wait_for_bind, StateData)
|
||||||
|
end
|
||||||
end;
|
end;
|
||||||
wait_for_bind(timeout, StateData) ->
|
wait_for_bind(timeout, StateData) ->
|
||||||
{stop, normal, StateData};
|
{stop, normal, StateData};
|
||||||
@ -2510,6 +2508,41 @@ bounce_messages() ->
|
|||||||
after 0 -> ok
|
after 0 -> ok
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
process_compression_request(El, StateName, StateData) ->
|
||||||
|
case fxml:get_subtag(El, <<"method">>) of
|
||||||
|
false ->
|
||||||
|
send_element(StateData,
|
||||||
|
#xmlel{name = <<"failure">>,
|
||||||
|
attrs = [{<<"xmlns">>, ?NS_COMPRESS}],
|
||||||
|
children =
|
||||||
|
[#xmlel{name = <<"setup-failed">>,
|
||||||
|
attrs = [], children = []}]}),
|
||||||
|
fsm_next_state(StateName, StateData);
|
||||||
|
Method ->
|
||||||
|
case fxml:get_tag_cdata(Method) of
|
||||||
|
<<"zlib">> ->
|
||||||
|
Socket = StateData#state.socket,
|
||||||
|
BCompressed = fxml:element_to_binary(
|
||||||
|
#xmlel{name = <<"compressed">>,
|
||||||
|
attrs = [{<<"xmlns">>,
|
||||||
|
?NS_COMPRESS}]}),
|
||||||
|
ZlibSocket = (StateData#state.sockmod):compress(
|
||||||
|
Socket, BCompressed),
|
||||||
|
fsm_next_state(wait_for_stream,
|
||||||
|
StateData#state{socket = ZlibSocket,
|
||||||
|
streamid = new_id()});
|
||||||
|
_ ->
|
||||||
|
send_element(StateData,
|
||||||
|
#xmlel{name = <<"failure">>,
|
||||||
|
attrs = [{<<"xmlns">>, ?NS_COMPRESS}],
|
||||||
|
children =
|
||||||
|
[#xmlel{name = <<"unsupported-method">>,
|
||||||
|
attrs = [],
|
||||||
|
children = []}]}),
|
||||||
|
fsm_next_state(StateName, StateData)
|
||||||
|
end
|
||||||
|
end.
|
||||||
|
|
||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
%%% XEP-0191
|
%%% XEP-0191
|
||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
|
Loading…
Reference in New Issue
Block a user