U
    7Ó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   úW/var/www/html/alexa-login-pro/venv/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r¨t	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r†tƒ }| t¡ | |¡ | j |¡ | jj 	¡ \}}|r‚tƒ }| 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})z”NOTE: 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
 |¡¡ |s–t
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q´n&tƒ }| t¡ | |¡ | j $|¡ qút%d &t'|
 ¡ƒ‚tƒ }| t(¡ | |	 )| jj*¡¡ n||
t+krît%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rªn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|
sštƒ }| t"¡ | |¡ | |¡ | j  |¡ d S t| ¡ ƒ}|  #||||¡}| $||¡sv|  
td¡ t}nž|dkr| %¡ }| j j &||¡}t'|t(ƒrv|  )|¡ d S n^|dkrÒ|rÒt*|ƒ}| +¡ }|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r„d 
| 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Ë   z°A 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	r¬tƒ }| 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