U
    ςd                     @   s8  d Z ddlZddlZddlZddlZddlmZmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( ddl)m*Z* ddl+m,Z,m-Z- ddl.m/Z/m0Z0m1Z1m2Z2 ddl3m4Z4 ddl5m6Z6m7Z7 G d	d
 d
Z8G dd dZ9G dd de8Z:dS )z
`.AuthHandler`
    N)#cMSG_SERVICE_REQUESTcMSG_DISCONNECT DISCONNECT_SERVICE_NOT_AVAILABLE)DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLEcMSG_USERAUTH_REQUESTcMSG_SERVICE_ACCEPTDEBUGAUTH_SUCCESSFULINFOcMSG_USERAUTH_SUCCESScMSG_USERAUTH_FAILUREAUTH_PARTIALLY_SUCCESSFULcMSG_USERAUTH_INFO_REQUESTWARNINGAUTH_FAILEDcMSG_USERAUTH_PK_OKcMSG_USERAUTH_INFO_RESPONSEMSG_SERVICE_REQUESTMSG_SERVICE_ACCEPTMSG_USERAUTH_REQUESTMSG_USERAUTH_SUCCESSMSG_USERAUTH_FAILUREMSG_USERAUTH_BANNERMSG_USERAUTH_INFO_REQUESTMSG_USERAUTH_INFO_RESPONSEcMSG_USERAUTH_GSSAPI_RESPONSEcMSG_USERAUTH_GSSAPI_TOKENcMSG_USERAUTH_GSSAPI_MICMSG_USERAUTH_GSSAPI_RESPONSEMSG_USERAUTH_GSSAPI_TOKENMSG_USERAUTH_GSSAPI_ERRORMSG_USERAUTH_GSSAPI_ERRTOKMSG_USERAUTH_GSSAPI_MIC	MSG_NAMEScMSG_USERAUTH_BANNER)Message)bu)SSHExceptionAuthenticationExceptionBadAuthenticationTypePartialAuthentication)InteractiveQuery)GSSAuthGSS_EXCEPTIONSc                   @   s.  e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dHddZdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!d?d@ Z"e#dAdB Z$e#dCdD Z%e#dEdF Z&dGS )IAuthHandlerzC
    Internal class to handle the mechanics of authentication.
    c                 C   s^   t || _d | _d| _d | _d| _d | _d | _d | _	d | _
d | _d | _d| _d | _d| _d S )NF r   T)weakrefproxy	transportusernameauthenticated
auth_eventauth_methodbannerpasswordprivate_keyinteractive_handler
submethodsauth_usernameauth_fail_countgss_hostgss_deleg_creds)selfr3    rB   R/var/www/html/myproject/myenv/lib/python3.8/site-packages/paramiko/auth_handler.py__init__R   s    zAuthHandler.__init__c                 G   s   | j j| S N)r3   _log)rA   argsrB   rB   rC   rF   d   s    zAuthHandler._logc                 C   s   | j S rE   )r5   rA   rB   rB   rC   is_authenticatedg   s    zAuthHandler.is_authenticatedc                 C   s   | j jr| jS | jS d S rE   )r3   server_moder=   r4   rH   rB   rB   rC   get_usernamej   s    zAuthHandler.get_usernamec                 C   s>   | j j  z|| _d| _|| _|   W 5 | j j  X d S Nnoner3   lockacquirereleaser6   r7   r4   _request_authrA   r4   eventrB   rB   rC   	auth_nonep   s    zAuthHandler.auth_nonec                 C   sD   | j j  z$|| _d| _|| _|| _|   W 5 | j j  X d S )N	publickey)	r3   rO   rP   rQ   r6   r7   r4   r:   rR   )rA   r4   keyrT   rB   rB   rC   auth_publickeyz   s    zAuthHandler.auth_publickeyc                 C   sD   | j j  z$|| _d| _|| _|| _|   W 5 | j j  X d S )Nr9   )	r3   rO   rP   rQ   r6   r7   r4   r9   rR   )rA   r4   r9   rT   rB   rB   rC   auth_password   s    zAuthHandler.auth_passwordr0   c                 C   sJ   | j j  z*|| _d| _|| _|| _|| _| 	  W 5 | j j  X dS )K
        response_list = handler(title, instructions, prompt_list)
        keyboard-interactiveN)
r3   rO   rP   rQ   r6   r7   r4   r;   r<   rR   )rA   r4   handlerrT   r<   rB   rB   rC   auth_interactive   s    zAuthHandler.auth_interactivec                 C   sJ   | j j  z*|| _d| _|| _|| _|| _| 	  W 5 | j j  X d S )Ngssapi-with-mic)
r3   rO   rP   rQ   r6   r7   r4   r?   r@   rR   )rA   r4   r?   r@   rT   rB   rB   rC   auth_gssapi_with_mic   s    z AuthHandler.auth_gssapi_with_micc                 C   s>   | j j  z|| _d| _|| _|   W 5 | j j  X d S )Ngssapi-keyexrN   rS   rB   rB   rC   auth_gssapi_keyex   s    zAuthHandler.auth_gssapi_keyexc                 C   s   | j d k	r| j   d S rE   )r6   setrH   rB   rB   rC   abort   s    
zAuthHandler.abortc                 C   s*   t  }|t |d | j| d S Nssh-userauth)r%   add_byter   
add_stringr3   _send_messagerA   mrB   rB   rC   rR      s    

zAuthHandler._request_authc                 C   sH   t  }|t |t |d |d | j| | j  d S )NzService not availableen)	r%   rf   r   add_intr   rg   r3   rh   closeri   rB   rB   rC   !_disconnect_service_not_available   s    



z-AuthHandler._disconnect_service_not_availablec                 C   sH   t  }|t |t |d |d | j| | j  d S )NzNo more auth methods availablerk   )	r%   rf   r   rl   r   rg   r3   rh   rm   ri   rB   rB   rC   _disconnect_no_more_auth   s    



z$AuthHandler._disconnect_no_more_authc                 C   s&   |j r|j j|j jfS | |fS dS )z
        Given any key, return its type/algorithm & bits-to-sign.

        Intended for input to or verification of, key signatures.
        N)Zpublic_blobkey_typeZkey_blobget_name)rA   rW   rB   rB   rC   _get_key_type_and_bits   s    z"AuthHandler._get_key_type_and_bitsc                 C   sp   t  }|| jj |t || || |d |d | |\}}|| || | S )NrV   T)	r%   rg   r3   
session_idrf   r   add_booleanrr   Zasbytes)rA   rW   servicer4   	algorithmrj   _bitsrB   rB   rC   _get_session_blob   s    






zAuthHandler._get_session_blobc                 C   s   d }| j jd k	r t | j j }|d | j  s^| j  }|d ksRt|jtrZt	d}||
 rhq|d k	r |t kr t	dq |  s| j  }|d krt	d}t|jtr|jS |g S )Ng?z5Authentication failed: transport shut down or saw EOFzAuthentication timeout.zAuthentication failed.)r3   Zauth_timeouttimewait	is_activeZget_exception
issubclass	__class__EOFErrorr)   is_setrI   r+   Zallowed_types)rA   rT   Zmax_tserB   rB   rC   wait_for_response   s.    




zAuthHandler.wait_for_responsec                 C   s   |  }| jjr|dkrt }|t || | j| | jj	 \}}|rt }|t
 || || | j| d S |   d S rd   )get_textr3   rJ   r%   rf   r   rg   rh   server_objectZ
get_bannerr$   rn   )rA   rj   ru   r8   languagerB   rB   rC   _parse_service_request
  s    




z"AuthHandler._parse_service_requestc                 C   sF   | j j}|dd|kr2d}| t|| d S | j j| t|S )N-cert-v01@openssh.comr0   z<Auth rejected: pubkey algorithm '{}' unsupported or disabled)r3   preferred_pubkeysreplacerF   r
   formatZ	_key_infor%   )rA   rv   keybloboptionserrrB   rB   rC   _generate_key_from_request  s    z&AuthHandler._generate_key_from_requestc                 C   s.   |d }d}|  t|| |  td |S )Nr   zYServer did not send a server-sig-algs list; defaulting to our first preferred algo ({!r})zNOTE: you may use the 'disabled_algorithms' SSHClient/Transport init kwarg to disable that or other algorithms if your server does not support them!)rF   r   r   )rA   rp   my_algospubkey_algomsgrB   rB   rC   !_choose_fallback_pubkey_algorithm(  s    z-AuthHandler._choose_fallback_pubkey_algorithmc                 C   sR  d|kr|S |  td| |drftd| jjrfd}|| j_|  td |  td| |S dd	 | jj	D }|  td
| |st
dt| jjdtd}d }|r&|d}|  td| tt|j|}|r|d }|  td| n|  td d}t||n| ||}|drF|d7 }|| j_|S )Nrsaz0Finalizing pubkey algorithm for key of type {!r}r   z-OpenSSH_(?:[1-6]|7\.[0-7])zssh-rsa-cert-v01@openssh.comz)OpenSSH<7.8 + RSA cert = forcing ssh-rsa!z!Agreed upon {!r} pubkey algorithmc                 S   s   g | ]}d |kr|qS )r   rB   ).0xrB   rB   rC   
<listcomp>O  s      z:AuthHandler._finalize_pubkey_algorithm.<locals>.<listcomp>zOur pubkey algorithm list: {}zFAn RSA key was specified, but no RSA pubkey algorithms are configured!zserver-sig-algsr0   ,zServer-side algorithm list: {}r   z)No common pubkey algorithms exist! Dying.z=Unable to agree on a pubkey algorithm for signing a {!r} key!)rF   r   r   endswithresearchr3   remote_versionZ_agreed_pubkey_algorithmr   r(   r'   Zserver_extensionsgetr&   splitlistfilter__contains__r)   r   )rA   rp   r   r   Zserver_algo_strZserver_algosZ	agreementr   rB   rB   rC   _finalize_pubkey_algorithm3  sl      
  z&AuthHandler._finalize_pubkey_algorithmc              
   C   s  |  }|dkr| td t }|t || j |d || j | jdkr||	d t
| j}|| n>| jdkr|	d | | j\}}| |}|| || | | jd| j|}| j||}|| n| jdkr|d	 || j n| jd
krXt| j| j}	||	  | j| | jj \}
}|
tkr|| | | jj \}
}|
tkr| }t }|t z||	| j || j W n2 t!k
r } z| "| W Y S d }~X Y nX | j| | jj \}
}|
t#kr| }z|	| j || j|}W n2 t!k
rf } z| "| W Y S d }~X Y nX |d krxqn&t }|t || | j$| qt%d&t'|
 t }|t( ||	)| jj* n||
t+krt%dnh|
t,kr,|- }|- }| }|  t%d&|||n*|
t.krD| /| d S t%d&t'|
 nb| jdkr| jj0r| jj1}|2| j |)| jj*}|| n| jdkrnt%d&| j| j| n| td&| d S )Nre   zuserauth is OKssh-connectionr9   FrV   Tr[   r0   r^   zReceived Package: {}zServer returned an error tokenzCGSS-API Error:
Major Status: {}
Minor Status: {}
Error Message: {}
r`   rM   zUnknown auth method "{}"z!Service request "{}" accepted (?))3r   rF   r   r%   rf   r   rg   r4   r7   rt   r&   r9   rr   r:   r   ry   sign_ssh_datar<   r-   r@   	add_bytesssh_gss_oidsr3   rh   Z
packetizerZread_messager   _parse_userauth_bannerr   
get_stringr   Zssh_init_sec_contextr?   r.   _handle_local_gss_failurer   send_messager(   r   r#   r   Zssh_get_micrs   r!   r    get_intr   _parse_userauth_failureZgss_kex_usedkexgss_ctxtZset_username)rA   rj   ru   r9   rp   rx   rv   blobsigsshgssptypeZmechr   Z	srv_tokenZ
next_tokenZ
maj_statusZ
min_statuserr_msgZkexgss	mic_tokenrB   rB   rC   _parse_service_accept{  s    















   
 






  	


 z!AuthHandler._parse_service_acceptc                 C   s   t  }|tkr2| td| |t d| _n\| td| |t |	| j
j| |tkrv|d n|d |  jd7  _| j
| | jdkr|   |tkr| j
  d S )NzAuth granted ({}).TzAuth rejected ({}).F   
   )r%   r	   rF   r
   r   rf   r   r5   r   rg   r3   r   Zget_allowed_authsr   rt   r>   rh   ro   _auth_trigger)rA   r4   methodresultrj   rB   rB   rC   _send_auth_result   s&    



zAuthHandler._send_auth_resultc                 C   s|   t  }|t ||j ||j |t  |t|j	 |j	D ] }||d  |
|d  qJ| j| d S )Nr   r   )r%   rf   r   rg   nameinstructionsbytesrl   lenpromptsrt   r3   rh   )rA   qrj   prB   rB   rC   _interactive_query  s    

zAuthHandler._interactive_queryc              
   C   s  | j js<t }|t |d |d | j | d S | jrFd S |	 }|	 }|	 }| 
td||| |dkr|   d S | jd k	r| j|kr| 
td |   d S || _| j j }|dkr| j j|}n|dkr|| }| }z|d}W n tk
r   Y nX |rh| 
td | }	z|	dd	}	W n tk
r`   Y nX t}n| j j||}n|d
kr| }
|	 }| }z| ||}W n tk
r } z| 
tdt| d }W 5 d }~X Y nD tk
r. } z$d}| 
t||jj | d }W 5 d }~X Y nX |d krF|   d S | j j!||}|tkrv|
st }|t" || || | j | d S t| }| #||||}|$||sv| 
td t}n|dkr|% }| j j&||}t'|t(rv| )| d S n^|dkr|rt*|}|+ }|dkrV| 
td |   |% }|,|}|s| 
td |   |-d}t }|t. |/| t0| || j _1t2t3t4f| j _5| j | d S |dkrh|rh|% }| j j6}|d krt}| 7||| z|8|| j j9| j W n* tk
rP   t}| 7|||  Y nX t:}| j j;|| n| j j|}| 7||| d S )NrM   Fz.Auth request (type={}) service={}, username={}r   zKAuth rejected because the client attempted to change username in mid-flightr9   zUTF-8z+Auth request to change passwords (rejected)r   rV   zAuth rejected: public key: {}z9Auth rejected: unsupported or mangled public key ({}: {})z Auth rejected: invalid signaturer[   r^   r   z8Disconnect: Received more than one GSS-API OID mechanismz5Disconnect: Received an invalid GSS-API OID mechanismserverr`   )<r3   rJ   r%   rf   r   rg   rt   rh   r5   r   rF   r   r   rn   r=   r   ro   r   Zenable_auth_gssapiZcheck_auth_noneget_boolean
get_binarydecodeUnicodeErrorr   Zcheck_auth_passwordr   r(   r
   str	Exceptionr~   __name__Zcheck_auth_publickeyr   ry   Zverify_ssh_sigr   Zcheck_auth_interactive
isinstancer,   r   r-   r   Zssh_check_mechr   r   r   GssapiWithMicAuthHandlerauth_handlerr   r   r   _expected_packetr   r   ssh_check_micrs   r	   Zcheck_auth_gssapi_keyex)rA   rj   r4   ru   r   Zgss_authr   Z	changereqr9   ZnewpasswordZsig_attachedrv   r   rW   r   r   r   r   r<   r   ZmechsZdesired_mechZmech_okZsupported_mechr   rB   rB   rC   _parse_userauth_request%  s8   


  

 

 



   
 





 
   z#AuthHandler._parse_userauth_requestc                 C   s<   |  td| j d| _| j  | jd k	r8| j  d S )NzAuthentication ({}) successful!T)	rF   r
   r   r7   r5   r3   r   r6   rb   ri   rB   rB   rC   _parse_userauth_success  s     


z#AuthHandler._parse_userauth_successc                 C   s   |  }| }|rB| td | tdt|  t|| j_nV| j	|krd
| j	d
|fD ]}| t| qbtd|| j_n| td
| j	 d| _d | _| jd k	r| j  d S )NzAuthentication continues...z	Methods: z'Authentication type ({}) not permitted.zAllowed methods: {}zBad authentication typeAuthentication ({}) failed.F)Zget_listr   rF   r
   r   r   r+   r3   saved_exceptionr7   r   r*   r5   r4   r6   rb   )rA   rj   Zauthlistpartialr   rB   rB   rC   r     s2    
 
 

z#AuthHandler._parse_userauth_failurec                 C   s$   |  }|| _| td| d S )NzAuth banner: {})r   r8   rF   r
   r   )rA   rj   r8   rB   rB   rC   r     s    z"AuthHandler._parse_userauth_bannerc           	      C   s   | j dkrtd| }| }|  | }g }t|D ]}|| | f q>| |||}t	 }|
t |t| |D ]}|| q| j| d S )Nr[   z Illegal info request from server)r7   r(   r   r   r   rangeappendr   r;   r%   rf   r   rl   r   rg   r3   rh   )	rA   rj   titler   r   Zprompt_listiZresponse_listrrB   rB   rC   _parse_userauth_info_request  s(    
  
z(AuthHandler._parse_userauth_info_requestc                 C   sr   | j jstd| }g }t|D ]}||  q$| j j|}t	|t
r^| | d S | | jd| d S )Nz!Illegal info response from serverr[   )r3   rJ   r(   r   r   r   r   r   Zcheck_auth_interactive_responser   r,   r   r   r=   )rA   rj   n	responsesr   r   rB   rB   rC   _parse_userauth_info_response  s"    

  z)AuthHandler._parse_userauth_info_responsec                 C   sR   || j _| td| | td| j d| _d | _| j	d k	rN| j	
  d S )NzGSSAPI failure: {}r   F)r3   r   rF   r   r   r
   r7   r5   r4   r6   rb   )rA   r   rB   rB   rC   r   *  s    

z%AuthHandler._handle_local_gss_failurec                 C   s   t | jt| jt| jiS rE   )r   r   r   r   r   r   rH   rB   rB   rC   _server_handler_table<  s       z!AuthHandler._server_handler_tablec              
   C   s"   t | jt| jt| jt| jt| j	iS rE   )
r   r   r   r   r   r   r   r   r   r   rH   rB   rB   rC   _client_handler_tableH  s         z!AuthHandler._client_handler_tablec                 C   s   | j jr| jS | jS d S rE   )r3   rJ   r   r   rH   rB   rB   rC   _handler_tableT  s    zAuthHandler._handler_tableN)r0   )'r   
__module____qualname____doc__rD   rF   rI   rK   rU   rX   rY   r]   r_   ra   rc   rR   rn   ro   rr   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   propertyr   r   r   rB   rB   rB   rC   r/   M   sP   


		H  2	

r/   c                   @   s   e Zd ZdZdZdd Zdd Zedd Zed	d
 Z	edd Z
edd Zdd Zdd Zdd Zdd Zdd ZeeeeeeeeiZedd ZdS )r   zA specialized Auth handler for gssapi-with-mic

    During the GSSAPI token exchange we need a modified dispatch table,
    because the packet type numbers are not unique.
    r^   c                 C   s   || _ || _d S rE   )	_delegater   )rA   Zdelegater   rB   rB   rC   rD   e  s    z!GssapiWithMicAuthHandler.__init__c                 C   s   |    | j S rE   )_restore_delegate_auth_handlerr   rc   rH   rB   rB   rC   rc   i  s    zGssapiWithMicAuthHandler.abortc                 C   s   | j jS rE   )r   r3   rH   rB   rB   rC   r3   m  s    z"GssapiWithMicAuthHandler.transportc                 C   s   | j jS rE   )r   r   rH   rB   rB   rC   r   q  s    z*GssapiWithMicAuthHandler._send_auth_resultc                 C   s   | j jS rE   )r   r=   rH   rB   rB   rC   r=   u  s    z&GssapiWithMicAuthHandler.auth_usernamec                 C   s   | j jS rE   )r   r?   rH   rB   rB   rC   r?   y  s    z!GssapiWithMicAuthHandler.gss_hostc                 C   s   | j | j_d S rE   )r   r3   r   rH   rB   rB   rC   r   }  s    z7GssapiWithMicAuthHandler._restore_delegate_auth_handlerc              
   C   s   |  }| j}z|| j|| j}W nJ tk
rn } z,|| j_t}| 	  | 
| j| j|  W 5 d }~X Y nX |d k	rt }|t || tttf| j_| j| d S rE   )r   r   Zssh_accept_sec_contextr?   r=   r   r3   r   r   r   r   r   r%   rf   r   rg   r   r"   r   r   rh   )rA   rj   Zclient_tokenr   tokenr   r   rB   rB   rC   _parse_userauth_gssapi_token  s.      

z5GssapiWithMicAuthHandler._parse_userauth_gssapi_tokenc              
   C   s   |  }| j}| j}|   z||| jj| W n@ tk
rr } z"|| j_t	}| 
|| j|  W 5 d }~X Y nX t}| jj|| | 
|| j| d S rE   )r   r   r=   r   r   r3   rs   r   r   r   r   r   r	   r   Zcheck_auth_gssapi_with_mic)rA   rj   r   r   r4   r   r   rB   rB   rC   _parse_userauth_gssapi_mic  s*       z3GssapiWithMicAuthHandler._parse_userauth_gssapi_micc                 C   s   |    | j|S rE   )r   r   r   ri   rB   rB   rC   r     s    z/GssapiWithMicAuthHandler._parse_service_requestc                 C   s   |    | j|S rE   )r   r   r   ri   rB   rB   rC   r     s    z0GssapiWithMicAuthHandler._parse_userauth_requestc                 C   s   | j S rE   )(_GssapiWithMicAuthHandler__handler_tablerH   rB   rB   rC   r     s    z'GssapiWithMicAuthHandler._handler_tableN)r   r   r   r   r   rD   rc   r   r3   r   r=   r?   r   r   r   r   r   r   r   r   r"   r   r   rB   rB   rB   rC   r   \  s8   



    r   c                       sX   e Zd ZdZe fddZdddZdd Zd	d
 Zdd Z	dddZ
dd Z  ZS )AuthOnlyHandlerzU
    AuthHandler, and just auth, no service requests!

    .. versionadded:: 3.2
    c                    s   t  j }|t= |S rE   )superr   copyr   )rA   Zmy_tabler~   rB   rC   r     s    z%AuthOnlyHandler._client_handler_tableNc              	   C   sx   || _ || _t }|t || |d || || | jj | j| W 5 Q R X t	
 | _| | jS )a  
        Submit a userauth request message & wait for response.

        Performs the transport message send call, sets self.auth_event, and
        will lock-n-block as necessary to both send, and wait for response to,
        the USERAUTH_REQUEST.

        Most callers will want to supply a callback to ``finish_message``,
        which accepts a Message ``m`` and may call mutator methods on it to add
        more fields.
        r   )r7   r4   r%   rf   r   rg   r3   rO   rh   	threadingEventr6   r   )rA   r4   r   Zfinish_messagerj   rB   rB   rC   send_auth_request  s    





z!AuthOnlyHandler.send_auth_requestc                 C   s   |  |dS rL   r   )rA   r4   rB   rB   rC   rU     s    zAuthOnlyHandler.auth_nonec                    sH   |  \}| | | d|  fdd}| |d|S )Nr   c                    s4   |  d |   |  |   d S )NT)rt   rg   r   rj   rv   rx   r   rW   rB   rC   finish  s    


z.AuthOnlyHandler.auth_publickey.<locals>.finishrV   )rr   r   ry   r   )rA   r4   rW   rp   r   rB   r   rC   rX     s    

zAuthOnlyHandler.auth_publickeyc                    s    fdd}|  |d|S )Nc                    s   |  d | t  d S )NF)rt   rg   r&   r   r9   rB   rC   r     s    
z-AuthOnlyHandler.auth_password.<locals>.finishr9   r   )rA   r4   r9   r   rB   r   rC   rY     s    zAuthOnlyHandler.auth_passwordr0   c                    s&   d| _ || _ fdd}| |d|S )rZ   Zkeyboard_interactivec                    s   |  d |    d S )Nr0   )rg   r   r<   rB   rC   r   /  s    
z0AuthOnlyHandler.auth_interactive.<locals>.finishr[   )r7   r;   r   )rA   r4   r\   r<   r   rB   r   rC   r]   %  s    z AuthOnlyHandler.auth_interactivec                 C   st   d}|  t| |dd}||ks,||krN||kr8|n|}d|d}|}n|d }|d|}|  t| |S )NzdServer did not send a server-sig-algs list; defaulting to something in our preferred algorithms listr   r0   zCurrent key type, z&, is in our preferred list; using thatr   z3 not in our list - trying first list item instead, )rF   r   r   )rA   rp   r   r   Znoncert_key_typeactualalgorB   rB   rC   r   8  s    z1AuthOnlyHandler._choose_fallback_pubkey_algorithm)N)r0   )r   r   r   r   r   r   r   rU   rX   rY   r]   r   __classcell__rB   rB   r   rC   r     s   

)

r   );r   r1   r   rz   r   Zparamiko.commonr   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   Zparamiko.messager%   Zparamiko.utilr&   r'   Zparamiko.ssh_exceptionr(   r)   r*   r+   Zparamiko.serverr,   Zparamiko.ssh_gssr-   r.   r/   r   r   rB   rB   rB   rC   <module>   s&   %      l