o
    tf9                     @   sR  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yG   dZY nw 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oe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
   \/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/zmq/tests/test_auth.pyr         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 qDt|D ]}	|		d	rxt
tj||	tj|d qa||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   s4   




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      r   c                 C   s   | \}}|S r   r
   r(   r
   r
   r   r   T   r)   r   c                 C   s   t | S r   )r'   )r   r
   r
   r   r   Z   r   r   c                 C  s.   | j }| I dH  dV  | I dH  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g d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                    sv   t j | _t  dk rtdzt   W n t jy#   tdw 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                    s^   t jdrtdI d H  | jr| j  d | _t jdr(tdI d H  | j  d S )Nwing?)	sysplatform
startswithr   sleepr   stopr1   termr9   r
   r
   r   r,   z   s   
zAuthTest.async_teardownc                 C   s   t  r   )NotImplementedErrorr9   r
   r
   r   r7      s   zAuthTest.make_authc                    s   | j   d S r   )r   startr9   r
   r
   r   r8      s   zAuthTest.start_auth  c           	         s   d}d}| |}|d||f  dg}|dtjI dH  ||tjI dH rHz||tjI dH  W n tjyG   t	dt
 Y dS w dS ||I dH rwz|tjI dH }W n tjyn   t	dt
 Y |S w ||ksuJ d	}|S )
z9Check if client can connect to server using tcp transportFztcp://127.0.0.1z%s:%is   Hello Worldd   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)	r:   r   r   timeoutresultZifaceportmsgZrcvd_msgr
   r
   r   can_connect   s2   
zAuthTest.can_connectc              	   c   s    | j tj9}| j tj}d|_d|_d|_d|_||fV  W d    n1 s,w   Y  W d    d S W d    d S 1 sDw   Y  d S )Nr   i  )r1   socketr   PUSHZPULLZlingerZsndtimeoZrcvtimeor:   r   r   r
   r
   r   	push_pull   s   PzAuthTest.push_pullokc                 c   s    |\}}}}|   4\}}||_||_d|_|d ur2||_||_|dkr)||_n	t \}	}
|
|_||fV  W d    d S 1 sBw   Y  d S )NTrU   )rT   curve_publickeycurve_secretkeycurve_servercurve_serverkeyr   r2   )r:   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 s&J W d   n1 s0w   Y  |  \}}d|_	| ||I dH sJJ W d   dS 1 sUw   Y  dS )zthreaded auth - NULLN   global)
r   r@   r1   rA   r   r   r   rT   rP   
zap_domainrS   r
   r
   r   	test_null   s   

"zAuthTest.test_nullc                    s   | j d tt | j d W d    n1 sw   Y  |  \}}d|_| j||ddI d H r9J W d    d S 1 sDw   Y  d S )N	127.0.0.1	127.0.0.2r^   rE   rL   )	r   denypytestraises
ValueErrorallowrT   r_   rP   rS   r
   r
   r   	test_deny   s   "zAuthTest.test_denyc                    s   | j d tt | j d W d    n1 sw   Y  |  \}}d|_| ||I d H s7J W d    d S 1 sBw   Y  d S )Nra   rb   r^   )	r   rh   re   rf   rg   rd   rT   r_   rP   rS   r
   r
   r   
test_allow   s   "zAuthTest.test_allowzenabled, password, success))TcorrectT)Frk   F)TZ	incorrectFc                    s   |   ?\}}d|_|rd|_|d|_|r"| jjdddid |r0| ||I dH s/J n| j||d	d
I dH r=J W d   n1 sGw   Y  | j  d| _|   \}}| ||I dH sfJ W d   dS 1 sqw   Y  dS )zthreaded auth - PLAINTs   adminascii*Zadminrk   )domain	passwordsNrE   rc   )	rT   Zplain_serverZplain_usernameencodeZplain_passwordr   Zconfigure_plainrP   r@   )r:   enabledpasswordsuccessr   r   r
   r
   r   
test_plain   s$   
"zAuthTest.test_plainzclient_key, location, successT)rU   r   T)badr   F)Nr   Fc                    s   | j d | j||d7\}}|r!|dkr|}| j jd|d |r1| j||ddI dH s0J n| j||ddI dH r>J W d   n1 sHw   Y  | j   d| _ |  \}}| ||I dH sgJ W d   dS 1 srw   Y  dS )	threaded auth - CURVEra   rZ   r   rm   rn   locationrE   rc   N)r   rh   r]   configure_curverP   r@   rT   )r:   r   r   rZ   ry   rs   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 | |0\}}	dkr@| ||	I dH s?J n| j||	ddI dH rMJ W d   dS W d   dS 1 s`w   Y  dS )	z2threaded auth - CURVE with callback authenticationra   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	 | _ d S | _ d S )NrU   r   r9   r%   r|   r#   r
   r   __init__:  s   

zBAuthTest.test_curve_callback.<locals>.CredentialsProvider.__init__c                 S   s   || j krdS dS )NTFr~   r:   rn   r|   r
   r
   r   callback@  s   
zBAuthTest.test_curve_callback.<locals>.CredentialsProvider.callbackc                    s$   t dI d H  || jkrdS dS )Ng?TF)r   r?   r   r   r
   r
   r   async_callbackF  s
   
zHAuthTest.test_curve_callback.<locals>.CredentialsProvider.async_callbackN)__name__
__module____qualname__r   r   r   r
   r   r
   r   CredentialsProvider9  s    r   )Zcredentials_providerrU   N   rc   )r   rh   r   r   Zconfigure_curve_callbackr]   rP   )
r:   r   r|   r}   r$   r&   r   providerr   r   r
   r   r   test_curve_callback2  s   "zAuthTest.test_curve_callbackc              
      s  | j d |\}}}}| j jd|d |  \}}||_||_d|_||_||_||_| ||I dH s9J |	dI dH  |j
ddI dH }	|	jdksQJ z|	d	}
W n
 tjyb   Y n
w |
|d
kslJ dd | j _| jtjL}||_||_||_| ||I dH sJ |	dI dH  |j
ddI dH }	|	jdksJ z|	d	}
W n
 tjy   Y nw |
dksJ W d   n1 sw   Y  W d   dS W d   dS 1 sw   Y  dS )rv   ra   rm   rx   TNs   testF)copyzUser-Idutf8c                 S   s   dS )Ncustomr
   rw   r
   r
   r   <lambda>u  s    z-AuthTest.test_curve_user_id.<locals>.<lambda>s   test2r   )r   rh   rz   rT   rV   rW   rX   rY   rP   sendrecvbytesgetr   ZZMQVersionErrordecodeZcurve_user_idr1   rQ   rR   )r:   r   r   r#   r$   r%   r&   r   r   rO   Zuser_idZclient2r
   r
   r   test_curve_user_idW  sR   "zAuthTest.test_curve_user_id)rD   )rU   )r   r   r   r   r+   r,   r7   r8   rP   r   rT   r]   r`   ri   rj   re   markZparametrizert   r   ZCURVE_ALLOW_ANYr{   r   r   r   r
   r
   r
   r   r/   i   sB    




	#r/   c                   @      e Zd ZdZdd ZdS )TestThreadAuthentication'Test authentication running in a threadc                 C      ddl m} || jS )Nr   )ThreadAuthenticator)Zzmq.auth.threadr   r1   )r:   r   r
   r
   r   r7        
z"TestThreadAuthentication.make_authNr   r   r   __doc__r7   r
   r
   r
   r   r     s    r   win32)      z)flaky event loop cleanup on windows+py<38)reasonc                   @   r   )TestAsyncioAuthenticationr   c                 C   r   )Nr   )AsyncioAuthenticator)Zzmq.auth.asyncior   r1   )r:   r   r
   r
   r   r7     r   z#TestAsyncioAuthentication.make_authNr   r
   r
   r
   r   r     s    r   c                    s   ddl m} t  ddlm} W d    n1 sw   Y  || }|j| u s,J |dd}tt	 ||d}W d    d S 1 sGw   Y  d S )Nr   )IOLoop)IOLoopAuthenticatorF)Zmake_current)io_loop)
Ztornado.ioloopr   rI   catch_warningsZzmq.auth.ioloopr   r1   re   ZwarnsDeprecationWarning)r1   r	   r   r   r   r   loopr
   r
   r   test_ioloop_authenticator  s   

"r   )"r   r3   r   r   r<   rI   
contextlibr   re   r   Zzmq.asyncioZzmq.authZ	zmq.testsr   r   tornadoImportErrorZfixturer   r"   r'   r   r   r   r.   r   Zusefixturesr/   r   Zskipifr=   version_infor   r   r
   r
   r
   r   <module>   sR   

$




	   		