diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/ssh/doc/src/notes.xml | 18 | ||||
| -rw-r--r-- | lib/ssh/src/ssh_auth.erl | 2 | ||||
| -rw-r--r-- | lib/ssh/src/ssh_connection_handler.erl | 6 | ||||
| -rw-r--r-- | lib/ssh/test/ssh_protocol_SUITE.erl | 81 | ||||
| -rw-r--r-- | lib/ssh/vsn.mk | 2 | 
5 files changed, 104 insertions, 5 deletions
| diff --git a/lib/ssh/doc/src/notes.xml b/lib/ssh/doc/src/notes.xml index 8fb689fdd5..75e1615c09 100644 --- a/lib/ssh/doc/src/notes.xml +++ b/lib/ssh/doc/src/notes.xml @@ -30,6 +30,24 @@      <file>notes.xml</file>    </header> +<section><title>Ssh 4.2.1</title> + +    <section><title>Fixed Bugs and Malfunctions</title> +      <list> +        <item> +          <p> +	    The authentication method 'keyboard-interactive' failed +	    in the Erlang client when the server after successful +	    authentication continued by asking for zero more +	    passwords.</p> +          <p> +	    Own Id: OTP-13225</p> +        </item> +      </list> +    </section> + +</section> +  <section><title>Ssh 4.2</title>      <section><title>Fixed Bugs and Malfunctions</title> diff --git a/lib/ssh/src/ssh_auth.erl b/lib/ssh/src/ssh_auth.erl index fdbb5c152a..b71bed033a 100644 --- a/lib/ssh/src/ssh_auth.erl +++ b/lib/ssh/src/ssh_auth.erl @@ -477,7 +477,7 @@ keyboard_interact_get_responses(_, undefined, Password, _, _, _, _, _,  				1) when Password =/= undefined ->      [Password]; %% Password auth implemented with keyboard-interaction and passwd is known  keyboard_interact_get_responses(_, _, _, _, _, _, _, _, 0)  -> -    [""]; +    [];  keyboard_interact_get_responses(false, undefined, undefined, _, _, _, [Prompt|_], Opts, _) ->      ssh_no_io:read_line(Prompt, Opts); %% Throws error as keyboard interaction is not allowed  keyboard_interact_get_responses(true, undefined, _,IoCb, Name, Instr, PromptInfos, Opts, _) -> diff --git a/lib/ssh/src/ssh_connection_handler.erl b/lib/ssh/src/ssh_connection_handler.erl index f082db136c..ce1931e4f4 100644 --- a/lib/ssh/src/ssh_connection_handler.erl +++ b/lib/ssh/src/ssh_connection_handler.erl @@ -648,10 +648,12 @@ userauth_keyboard_interactive(Msg = #ssh_msg_userauth_failure{},  userauth_keyboard_interactive_info_response(Msg=#ssh_msg_userauth_failure{},  					    #state{ssh_params = #ssh{role = client}} = State) ->      userauth(Msg, State); -  userauth_keyboard_interactive_info_response(Msg=#ssh_msg_userauth_success{},  					    #state{ssh_params = #ssh{role = client}} = State) -> -    userauth(Msg, State). +    userauth(Msg, State); +userauth_keyboard_interactive_info_response(Msg=#ssh_msg_userauth_info_request{}, +					    #state{ssh_params = #ssh{role = client}} = State) -> +    userauth_keyboard_interactive(Msg, State).  %%--------------------------------------------------------------------  -spec connected({#ssh_msg_kexinit{}, binary()}, %%| %% #ssh_msg_kexdh_init{}, diff --git a/lib/ssh/test/ssh_protocol_SUITE.erl b/lib/ssh/test/ssh_protocol_SUITE.erl index 4c088acabf..fe197f8672 100644 --- a/lib/ssh/test/ssh_protocol_SUITE.erl +++ b/lib/ssh/test/ssh_protocol_SUITE.erl @@ -48,6 +48,7 @@ all() ->      [{group,tool_tests},       {group,kex},       {group,service_requests}, +     {group,authentication},       {group,packet_size_error},       {group,field_size_error}      ]. @@ -78,7 +79,9 @@ groups() ->  			     bad_very_long_service_name,  			     empty_service_name,  			     bad_service_name_then_correct -			    ]} +			    ]}, +     {authentication, [], [client_handles_keyboard_interactive_0_pwds +			  ]}      ]. @@ -494,6 +497,82 @@ bad_service_name_length(Config, LengthExcess) ->  	   {match, disconnect(), receive_msg}  	  ], InitialState). +%%%-------------------------------------------------------------------- +%%% This is due to a fault report (OTP-13255) with OpenSSH-6.6.1 +client_handles_keyboard_interactive_0_pwds(Config) -> +    {User,_Pwd} = server_user_password(Config), + +    %% Create a listening socket as server socket: +    {ok,InitialState} = ssh_trpt_test_lib:exec(listen), +    HostPort = ssh_trpt_test_lib:server_host_port(InitialState), + +    %% Start a process handling one connection on the server side: +    spawn_link( +      fun() -> +	      {ok,_} = +		  ssh_trpt_test_lib:exec( +		    [{set_options, [print_ops, print_messages]}, +		     {accept, [{system_dir, system_dir(Config)}, +			       {user_dir, user_dir(Config)}]}, +		     receive_hello, +		     {send, hello}, + +		     {send, ssh_msg_kexinit}, +		     {match, #ssh_msg_kexinit{_='_'}, receive_msg}, + +		     {match, #ssh_msg_kexdh_init{_='_'}, receive_msg}, +		     {send, ssh_msg_kexdh_reply}, + +		     {send, #ssh_msg_newkeys{}}, +		     {match,  #ssh_msg_newkeys{_='_'}, receive_msg}, + +		     {match, #ssh_msg_service_request{name="ssh-userauth"}, receive_msg}, +		     {send, #ssh_msg_service_accept{name="ssh-userauth"}}, + +		     {match, #ssh_msg_userauth_request{service="ssh-connection", +						       method="none", +						       user=User, +						       _='_'}, receive_msg}, +		     {send, #ssh_msg_userauth_failure{authentications = "keyboard-interactive", +						      partial_success = false}}, +		      +		     {match, #ssh_msg_userauth_request{service="ssh-connection", +						       method="keyboard-interactive", +						       user=User, +						       _='_'}, receive_msg}, +		     {send, #ssh_msg_userauth_info_request{name = "", +							   instruction = "", +							   language_tag = "", +							   num_prompts = 1, +							   data = <<0,0,0,10,80,97,115,115,119,111,114,100,58,32,0>> +							  }}, +		     {match, #ssh_msg_userauth_info_response{num_responses = 1, +							     _='_'}, receive_msg}, +		       +		     %% the next is strange, but openssh 6.6.1 does this and this is what this testcase is about +		     {send, #ssh_msg_userauth_info_request{name = "", +							   instruction = "", +							   language_tag = "", +							   num_prompts = 0, +							   data = <<>> +							  }}, +		     {match, #ssh_msg_userauth_info_response{num_responses = 0, +							     data = <<>>, +							     _='_'}, receive_msg}, +		     %% Here we know that the tested fault is fixed +		     {send, #ssh_msg_userauth_success{}}, +		     close_socket, +		     print_state +		    ], +		    InitialState) +      end), + +    %% and finally connect to it with a regular Erlang SSH client: +    {ok,_} = std_connect(HostPort, Config,  +			 [{preferred_algorithms,[{kex,['diffie-hellman-group1-sha1']}]}] +			). + +  %%%================================================================  %%%==== Internal functions ========================================  %%%================================================================ diff --git a/lib/ssh/vsn.mk b/lib/ssh/vsn.mk index 25b19133b1..55d12abffe 100644 --- a/lib/ssh/vsn.mk +++ b/lib/ssh/vsn.mk @@ -1,5 +1,5 @@  #-*-makefile-*-   ; force emacs to enter makefile-mode -SSH_VSN = 4.2 +SSH_VSN = 4.2.1  APP_VSN    = "ssh-$(SSH_VSN)" | 
