o
    tfp                     @   sl   d 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mZm	Z	m
Z
 ddlmZ dZdZG dd	 d	e	ZdS )
z&Test libzmq security (libzmq >= 3.3.0)    N)Thread)PYPYBaseZMQTestCaseSkipTest)z85s   admins   passwordc                       s|   e Zd Z fddZdd Zejdd Zdd Zd	d
 Z	dddZ
dd Zdd Zdd Zdd Zdd Zdd Z  ZS )TestSecurityc                    sH   t  dk r
tdzt   W n t jy   tdw t   d S )N)   r   zsecurity is new in libzmq 4.0z7security requires libzmq to be built with CURVE support)zmqzmq_version_infor   curve_keypairZMQErrorsupersetUpself	__class__ `/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/zmq/tests/test_security.pyr      s   zTestSecurity.setUpc                 C   s   | j tj}|d ze| |}|d d \}}}}}}|dkr+|dd  \}	}
n|dkr3|d  |dks9J |dks?J ||g}|dksW|dkrS|	tkrS|
tksW|dkr_|g d n|g d	 |	| W |
  d S |
  w )
Nzinproc://zeromq.zap.01   s   PLAINs   CURVEs   1.0   IDENTs   NULL)s   200s   OKs	   anonymouss   Hello   World)s   400s   Invalid username or password    r   )contextsocketr	   ZREPbindrecv_multipartUSERPASSextendsend_multipartclose)r   r   msgversionsequencedomainaddressidentity	mechanismusernamepasswordZreplyr   r   r   zap_handler   s.   

	zTestSecurity.zap_handlerc                 c   s4    |    td z
d V  W |   d S |   w )Ng      ?)	start_zaptimesleepstop_zapr   r   r   r   zapF   s   
zTestSecurity.zapc                 C   s   t | jd| _| j  d S )N)target)r   r*   
zap_threadstartr   r   r   r   r+   O   s   zTestSecurity.start_zapc                 C   s   | j   d S N)r1   joinr   r   r   r   r.   S   s   zTestSecurity.stop_zapTc           	      C   s   t dt dg}|| | j|dd}ttdd |}z%|rCtsC|D ]}|ddks1J |dd	ks:J |d
 dksBJ q&W n
 tj	yN   Y nw ||ksUJ || | |}||kseJ d S )N@   F)copyc                 S   s   | j S r3   )bytes)xr   r   r   <lambda>Z   s    z%TestSecurity.bounce.<locals>.<lambda>zUser-IdZ	anonymousZHelloZWorldzSocket-TypeDEALER)
osurandomr   r   listmapr   getr	   ZZMQVersionError)	r   serverclientZtest_metadatar!   framesZrecvdframeZmsg2r   r   r   bounceV   s$   


zTestSecurity.bouncec                 C   s   |  tj}|  tj}|jtjksJ |jtjksJ |jdks#J |jdks*J d}||}|d||f  | 	||d dS )ztest NULL (default) securityr   tcp://127.0.0.1%s:%iFN)
r   r	   r:   Z	MECHANISMZNULLr'   plain_serverbind_to_random_portconnectrD   r   r@   rA   ifaceportr   r   r   	test_nullj   s   
zTestSecurity.test_nullc                 C   s  |  tj}d|_|  tj}|jdksJ |jdksJ t|_t|_|tj	tks-J |tj
tks7J |jdks>J |jdksEJ d|_|jtjksPJ |jtjksXJ |jr]J |jsbJ |   d}||}|d||f  | || W d   dS 1 sw   Y  dS )ztest PLAIN authenticationr   r   r   TrE   rF   N)r   r	   r:   r&   plain_usernameplain_passwordr   r   
getsockoptZPLAIN_USERNAMEZPLAIN_PASSWORDrG   r'   PLAINr/   rH   rI   rD   rJ   r   r   r   
test_plainw   s,   



"zTestSecurity.test_plainc                 C   s   |  tj}d|_|  tj}| j||g t|_d|_d|_	|j
tjks(J |j
tjks0J |  ) d}||}|d||f  |d d|_| tj|j W d   dS 1 s`w   Y  dS )	z test PLAIN failed authenticationr   s	   incorrectTrE   rF   s   ping   N)r   r	   r:   r&   socketsr   r   rN   rO   rG   r'   rQ   r/   rH   rI   sendZrcvtimeoZassertRaisesErrnoEAGAINrecvrJ   r   r   r   skip_plain_inauth   s"   


"zTestSecurity.skip_plain_inauthc                 C   s   zt  \}}W n t jy   tdw t|tksJ t|tks%J t|dks-J t|dks5J dd ||fD \}}t|tksHJ t|tksPJ t|dksXJ t|dks`J dS )ztest curve_keypairCURVE unsupported(   c                 s   s    | ]}t |V  qd S r3   )r   decode).0keyr   r   r   	<genexpr>   s    z,TestSecurity.test_keypair.<locals>.<genexpr>    N)r	   r   r   r   typer7   len)r   publicsecretZbsecretbpublicr   r   r   test_keypair   s   zTestSecurity.test_keypairc                 C   s   zt  \}}W n t jy   tdw t  dk rtdt |}t|tks,J t|dks4J t	
|}t|tksAJ t|dksIJ ||ksOJ dS )ztest curve_publicrY   )r      z!curve_public is new in libzmq 4.2rZ   r_   N)r	   r   r   r   r
   Zcurve_publicr`   r7   ra   r   r[   )r   rb   rc   Zderived_publicrd   r   r   r   test_curve_public   s   

zTestSecurity.test_curve_publicc           
   
   C   sD  |  tj}d|_|  tj}| j||g zd|_W n tjy9 } z|jtj	kr/t
dW Y d}~nd}~ww t \}}t \}}||_||_||_||_||_|jtjks]J |jtjkseJ |tjsmJ |tjruJ |   d}||}	|d||	f  | || W d   dS 1 sw   Y  dS )ztest CURVE encryptionr   TrY   NrE   rF   )r   r	   r:   r&   rT   r   Zcurve_serverr   errnoEINVALr   r   Zcurve_secretkeyZcurve_publickeyZcurve_serverkeyr'   ZCURVEr?   ZCURVE_SERVERr/   rH   rI   rD   )
r   r@   rA   eZserver_publicZserver_secretZclient_publicZclient_secretrK   rL   r   r   r   
test_curve   s:   


"zTestSecurity.test_curve)T)__name__
__module____qualname__r   r*   
contextlibcontextmanagerr/   r+   r.   rD   rM   rR   rX   re   rg   rk   __classcell__r   r   r   r   r      s    	)

r   )__doc__ro   r;   r,   	threadingr   r	   Z	zmq.testsr   r   r   Z	zmq.utilsr   r   r   r   r   r   r   r   <module>   s    