Guest User

Untitled

a guest
Dec 18th, 2023
28
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.90 KB | None | 0 0
  1. diff --git a/src/xmpp_stream_out.erl b/src/xmpp_stream_out.erl
  2. index 94dd943..fb19b0c 100644
  3. --- a/src/xmpp_stream_out.erl
  4. +++ b/src/xmpp_stream_out.erl
  5. @@ -80,7 +80,7 @@
  6. -type stream_state() :: connecting | wait_for_stream | wait_for_features |
  7. wait_for_starttls_response | wait_for_sasl_response |
  8. wait_for_bind_response | wait_for_session_response |
  9. - downgraded | established | disconnected.
  10. + downgraded | established | disconnected | wait_for_handshake.
  11. -type noreply() :: {noreply, state(), timeout()}.
  12. -type next_state() :: noreply() | {stop, term(), state()}.
  13. -type host_port() :: {inet:hostname(), inet:port_number(), boolean()} | ip_port().
  14. @@ -315,6 +315,7 @@ init([Mod, From, To, Opts]) ->
  15. stream_direction => out,
  16. stream_timeout => current_time() + ?NEGOTIATION_TIMEOUT,
  17. stream_id => xmpp_stream:new_id(),
  18. + stream_version => {1,0},
  19. stream_encrypted => false,
  20. stream_verified => false,
  21. stream_authenticated => false,
  22. @@ -547,7 +548,7 @@ process_stream(#stream_start{version = {N, _}}, State) when N > 1 ->
  23. send_pkt(State, xmpp:serr_unsupported_version());
  24. process_stream(#stream_start{lang = Lang, id = ID,
  25. version = Version} = StreamStart,
  26. - State) ->
  27. + #{xmlns := NS} = State) ->
  28. State1 = State#{stream_remote_id => ID, lang => Lang},
  29. State2 = try callback(handle_stream_start, StreamStart, State1)
  30. catch _:{?MODULE, undef} -> State1
  31. @@ -558,6 +559,10 @@ process_stream(#stream_start{lang = Lang, id = ID,
  32. case Version of
  33. {1, _} ->
  34. State2#{stream_state => wait_for_features};
  35. + _ when NS == ?NS_COMPONENT ->
  36. + Handshake = maps:get(handshake, State2, <<>>),
  37. + send_pkt(State2#{stream_state => wait_for_handshake},
  38. + #handshake{data = Handshake});
  39. _ ->
  40. process_stream_downgrade(StreamStart, State2)
  41. end
  42. @@ -576,6 +581,8 @@ process_element(Pkt, #{stream_state := StateName} = State) ->
  43. process_sasl_failure(Pkt, State);
  44. #stream_error{} ->
  45. process_stream_end({stream, {in, Pkt}}, State);
  46. + #handshake{} when StateName == wait_for_handshake ->
  47. + process_stream_established(State);
  48. _ when is_record(Pkt, stream_features);
  49. is_record(Pkt, starttls_proceed);
  50. is_record(Pkt, starttls);
  51. @@ -908,6 +915,7 @@ sasl_mechanisms(#{stream_encrypted := Encrypted} = State) ->
  52. -spec send_header(state()) -> state().
  53. send_header(#{remote_server := RemoteServer,
  54. stream_encrypted := Encrypted,
  55. + stream_version := Version,
  56. lang := Lang,
  57. xmlns := NS,
  58. user := User,
  59. @@ -929,7 +937,7 @@ send_header(#{remote_server := RemoteServer,
  60. db_xmlns = NS_DB,
  61. from = From,
  62. to = jid:make(RemoteServer),
  63. - version = {1,0}},
  64. + version = Version},
  65. case socket_send(State, StreamStart) of
  66. ok -> State;
  67. {error, Why} -> process_stream_end({socket, Why}, State)
  68.  
Advertisement
Add Comment
Please, Sign In to add comment