U
    lufZ8  ã                   @   sV  d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlZd dl	Z	d dl
Z	d dlZ	d dlmZmZ zd dlZW n ek
r   dZY nX ejdd„ ƒZejdd„ ƒZdd	„ Zejd
d„ ƒZejdd„ ƒZejdd„ ƒZejdd„ ƒZej d¡G dd„ dƒƒZG dd„ deƒZejjejdko2ejdk ddG dd„ deƒƒZ dd„ Z!dS )é    N)Úcontextmanager)ÚSkipTestÚ	skip_pypyc                 C   s   t jjS ©N)ÚzmqÚasyncioÚContext)Ú
event_loop© r
   ú7/tmp/pip-unpacked-wheel-h6ekxre8/zmq/tests/test_auth.pyr      s    r   c           
      C   sú   t |  d¡ ¡ ƒ}tj |d¡}tj |d¡}tj |d¡}t |¡ t |¡ t |¡ tj |d¡\}}tj |d¡\}}t |¡D ].}	|	 	d¡rˆt
 tj ||	¡tj |d¡¡ qˆt |¡D ].}	|	 	d	¡rÂt
 tj ||	¡tj |d¡¡ qÂ||fS )
z$Create CURVE certificates for a testÚcertsZcertificatesÚpublic_keysZprivate_keysÚserverÚclientz.keyÚ.z.key_secret)ÚstrÚjoinÚmkdirÚosÚpathr   ÚauthZcreate_certificatesÚlistdirÚendswithÚshutilÚmove)
ZtmpdirÚbase_dirZkeys_dirÚpublic_keys_dirÚsecret_keys_dirZserver_public_fileÚserver_secret_fileZclient_public_fileÚclient_secret_fileÚkey_filer
   r
   r   Úcreate_certs   s8    


 ÿ ÿ
 ÿ
 ÿr!   c                 C   sH   t j | d¡}t j | d¡}tj |¡\}}tj |¡\}}||||fS )z)Return server and client certificate keyszserver.key_secretzclient.key_secret)r   r   r   r   r   Zload_certificate)r   r   r   Úserver_publicÚserver_secretÚclient_publicÚclient_secretr
   r
   r   Ú
load_certsC   s
    r&   c                 C   s   | \}}|S r   r
   ©r!   r   r   r
   r
   r   r   N   s    r   c                 C   s   | \}}|S r   r
   r'   r
   r
   r   r   T   s    r   c                 C   s   t | ƒS r   )r&   )r   r
   r
   r   r   Z   s    r   c                 C  s&   | j }| ¡ I dH  dV  | ¡  dS )z+pytest doesn't support async setup/teardownN)ÚinstanceÚasync_setupÚasync_teardown)Úrequestr	   r(   r
   r
   r   Ú_async_setup_   s    r,   c                   @   sè   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd-dd„Ze	dd„ ƒZ
e	d.dd„ƒZdd„ Zdd„ Zdd„ Zej ddddg¡dd„ ƒZej ddejjdfd d!d"g¡d#d$„ ƒZej d%dd&g¡ej d'dd(g¡d)d*„ ƒƒZed+d,„ ƒZdS )/ÚAuthTestNc                 Ã   sz   t j ¡ | _t  ¡ dk r tdƒ‚zt  ¡  W n t jk
rJ   tdƒ‚Y nX t 	d¡ 
tj¡ |  ¡ | _|  ¡ I d H  d S )N)é   r   zsecurity is new in libzmq 4.0z.security requires libzmq to have curve supportzzmq.auth)r   r   r   ÚcontextZzmq_version_infor   Úcurve_keypairZZMQErrorÚloggingÚ	getLoggerÚsetLevelÚDEBUGÚ	make_authr   Ú
start_auth©Úselfr
   r
   r   r)   m   s    
zAuthTest.async_setupc                 C   s$   | j r| j  ¡  d | _ | j ¡  d S r   )r   Ústopr/   Útermr7   r
   r
   r   r*   z   s    
zAuthTest.async_teardownc                 C   s
   t ƒ ‚d S r   )ÚNotImplementedErrorr7   r
   r
   r   r5   €   s    zAuthTest.make_authc                 Ã   s   | j  ¡  d S r   )r   Ústartr7   r
   r
   r   r6   ƒ   s    zAuthTest.start_authéè  c           	      Ã   sô   d}d}|  |¡}| d||f ¡ dg}| dtj¡I dH  | |tj¡I dH r’z| |tj¡I dH  W q– tjk
rŽ   t 	dt
¡ Y dS X ndS | |¡I dH rðz| tj¡I dH }W n" tjk
rÞ   t 	dt
¡ Y nX ||ksìt‚d	}|S )
z9Check if client can connect to server using tcp transportFztcp://127.0.0.1z%s:%is   Hello Worldéd   Nz#server set POLLOUT, but cannot sendz"client set POLLIN, but cannot recvT)Zbind_to_random_portÚconnectÚpollr   ÚPOLLOUTZsend_multipartZNOBLOCKZAgainÚwarningsÚwarnÚRuntimeWarningZrecv_multipartÚAssertionError)	r8   r   r   ÚtimeoutÚresultZifaceÚportÚmsgZrcvd_msgr
   r
   r   Úcan_connect†   s*    

zAuthTest.can_connectc              
   c   sZ   | j  tj¡B}| j  tj¡(}d|_d|_d|_d|_||fV  W 5 Q R X W 5 Q R X d S )Nr   iÐ  )r/   Úsocketr   ÚPUSHZPULLZlingerZsndtimeoZrcvtimeo©r8   r   r   r
   r
   r   Ú	push_pull¤   s    ÿzAuthTest.push_pullÚokc              	   c   sz   |\}}}}|   ¡ \\}}||_||_d|_|d k	rb||_||_|dkrP||_nt ¡ \}	}
|
|_||fV  W 5 Q R X d S )NTrO   )rN   Úcurve_publickeyÚcurve_secretkeyÚcurve_serverÚcurve_serverkeyr   r0   )r8   r   Ú
client_keyr"   r#   r$   r%   r   r   ÚprivateÚpublicr
   r
   r   Úcurve_push_pull¯   s    zAuthTest.curve_push_pullc              	   Ã   sŒ   | j  ¡  d| _ | j ¡  tj ¡ | _|  ¡  \}}|  ||¡I dH sJt	‚W 5 Q R X |  ¡ &\}}d|_
|  ||¡I dH s~t	‚W 5 Q R X dS )zthreaded auth - NULLNó   global)r   r9   r/   r:   r   r   r   rN   rJ   rE   Ú
zap_domainrM   r
   r
   r   Ú	test_nullÀ   s    

 zAuthTest.test_nullc              	   Ã   sj   | j  d¡ t t¡ | j  d¡ W 5 Q R X |  ¡ *\}}d|_| j||ddI d H r\t	‚W 5 Q R X d S )Nú	127.0.0.1ú	127.0.0.2rX   r>   ©rF   )
r   ÚdenyÚpytestÚraisesÚ
ValueErrorÚallowrN   rY   rJ   rE   rM   r
   r
   r   Ú	test_denyÕ   s    zAuthTest.test_denyc              	   Ã   sf   | j  d¡ t t¡ | j  d¡ W 5 Q R X |  ¡ &\}}d|_|  ||¡I d H sXt	‚W 5 Q R X d S )Nr[   r\   rX   )
r   rb   r_   r`   ra   r^   rN   rY   rJ   rE   rM   r
   r
   r   Ú
test_allowà   s    zAuthTest.test_allowzenabled, password, success)TÚcorrectT)Fre   F)TZ	incorrectFc              	   Ã   sÄ   |   ¡ t\}}d|_|r*d|_| d¡|_|rB| jjdddid |r^|  ||¡I dH sxt‚n| j||d	d
I dH rxt‚W 5 Q R X | j 	¡  d| _|   ¡  \}}|  ||¡I dH s¶t‚W 5 Q R X dS )zthreaded auth - PLAINTs   adminÚasciiÚ*Zadminre   )ÚdomainÚ	passwordsNr>   r]   )
rN   Zplain_serverZplain_usernameÚencodeZplain_passwordr   Zconfigure_plainrJ   rE   r9   )r8   ZenabledÚpasswordÚsuccessr   r   r
   r
   r   Ú
test_plainë   s    $
zAuthTest.test_plainzclient_key, location, successT)rO   r   T)Úbadr   F)Nr   Fc              	   Ã   sÆ   | j  d¡ | j||dd\}}|r@|dkr0|}| j jd|d |r`| j||ddI dH szt‚n| j||ddI dH rzt‚W 5 Q R X | j  ¡  d| _ |  ¡  \}}|  ||¡I dH s¸t‚W 5 Q R X dS )	úthreaded auth - CURVEr[   ©rT   r   rg   ©rh   Úlocationr>   r]   N)r   rb   rW   Úconfigure_curverJ   rE   r9   rN   )r8   r   r   rT   rr   rl   r   r   r
   r
   r   Ú
test_curve	  s    $
zAuthTest.test_curveÚkeyZwrongÚasync_Fc           
   	   ƒ   s¦   | j  d¡ |\‰}‰ }G ‡ ‡‡fdd„dƒ}|r:|j|_|ƒ }| j j|d |  |¡D\}}	ˆdkr~|  ||	¡I dH s˜t‚n| j||	ddI dH r˜t‚W 5 Q R X dS )	z2threaded auth - CURVE with callback authenticationr[   c                       s,   e Zd Z‡ ‡‡fdd„Zdd„ Zdd„ ZdS )z9AuthTest.test_curve_callback.<locals>.CredentialsProviderc                    s   ˆdkrˆ | _ nˆ| _ d S )NrO   ©r   r7   ©r$   ru   r"   r
   r   Ú__init__1  s    zBAuthTest.test_curve_callback.<locals>.CredentialsProvider.__init__c                 S   s   || j krdS dS d S )NTFrw   ©r8   rh   ru   r
   r
   r   Úcallback7  s    
zBAuthTest.test_curve_callback.<locals>.CredentialsProvider.callbackc                 Ó   s&   t  d¡I d H  || jkrdS dS d S )Ngš™™™™™¹?TF)r   Úsleepr   rz   r
   r
   r   Úasync_callback=  s    
zHAuthTest.test_curve_callback.<locals>.CredentialsProvider.async_callbackN)Ú__name__Ú
__module__Ú__qualname__ry   r{   r}   r
   rx   r
   r   ÚCredentialsProvider0  s   r   )Zcredentials_providerrO   NéÈ   r]   )r   rb   r}   r{   Zconfigure_curve_callbackrW   rJ   rE   )
r8   r   ru   rv   r#   r%   r   Zproviderr   r   r
   rx   r   Útest_curve_callback)  s    zAuthTest.test_curve_callbackc              
   Ã   s   | j  d¡ |\}}}}| j jd|d |  ¡ d\}}||_||_d|_||_||_||_|  ||¡I dH srt	‚| 
d¡I dH  |jddI dH }	|	jdks¢t	‚z|	 d	¡}
W n tjk
rÆ   Y nX |
| d
¡ksÚt	‚dd„ | j _| j tj¡˜}||_||_||_|  ||¡I dH s t	‚| 
d¡I dH  |jddI dH }	|	jdksRt	‚z|	 d	¡}
W n tjk
rx   Y nX |
dksˆt	‚W 5 Q R X W 5 Q R X dS )ro   r[   rg   rq   TNs   testF)ÚcopyzUser-IdÚutf8c                 S   s   dS )NÚcustomr
   rp   r
   r
   r   Ú<lambda>l  ó    z-AuthTest.test_curve_user_id.<locals>.<lambda>s   test2r†   )r   rb   rs   rN   rP   rQ   rR   rS   rJ   rE   ÚsendÚrecvÚbytesÚgetr   ZZMQVersionErrorÚdecodeZcurve_user_idr/   rK   rL   )r8   r   r   r"   r#   r$   r%   r   r   rI   Zuser_idZclient2r
   r
   r   Útest_curve_user_idN  sB    zAuthTest.test_curve_user_id)r=   )rO   )r~   r   r€   r   r)   r*   r5   r6   rJ   r   rN   rW   rZ   rc   rd   r_   ÚmarkZparametrizerm   r   ZCURVE_ALLOW_ANYrt   rƒ   r   rŽ   r
   r
   r
   r   r-   i   sF   


ýþ
üþ	
#r-   c                   @   s   e Zd ZdZdd„ ZdS )ÚTestThreadAuthenticationú'Test authentication running in a threadc                 C   s   ddl m} || jƒS )Nr   )ÚThreadAuthenticator)Zzmq.auth.threadr’   r/   )r8   r’   r
   r
   r   r5   ‚  s    z"TestThreadAuthentication.make_authN©r~   r   r€   Ú__doc__r5   r
   r
   r
   r   r     s   r   Úwin32)é   é   z(flaky event loop cleanup on windows+py36)Úreasonc                   @   s   e Zd ZdZdd„ ZdS )ÚTestAsyncioAuthenticationr‘   c                 C   s   ddl m} || jƒS )Nr   )ÚAsyncioAuthenticator)Zzmq.auth.asynciorš   r/   )r8   rš   r
   r
   r   r5     s    z#TestAsyncioAuthentication.make_authNr“   r
   r
   r
   r   r™   ˆ  s   r™   c              	   Ã   sp   ddl m} t ¡  ddlm} W 5 Q R X || ƒ}|j| ksBt‚|dd}t 	t
¡ ||d}W 5 Q R X d S )Nr   )ÚIOLoop)ÚIOLoopAuthenticatorF)Zmake_current)Úio_loop)Ztornado.ioloopr›   rB   Úcatch_warningsZzmq.auth.iolooprœ   r/   rE   r_   ZwarnsÚDeprecationWarning)r/   r	   r   r›   rœ   r   Zloopr
   r
   r   Útest_ioloop_authenticator•  s    

r    )"r   r1   r   r   ÚsysrB   Ú
contextlibr   r_   r   Zzmq.asyncioZzmq.authZ	zmq.testsr   r   ZtornadoÚImportErrorZfixturer   r!   r&   r   r   r   r,   r   Zusefixturesr-   r   ZskipifÚplatformÚversion_infor™   r    r
   r
   r
   r   Ú<module>   sN   


$



	
  	þ	