o
    i}                     @   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__ R/var/www/edux/Edux_v2/venv/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	   REPbindrecv_multipartUSERPASSextendsend_multipartclose)r   r   msgversionsequencedomainaddressidentity	mechanismusernamepassword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)r3   joinr   r   r   r   r0   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 r5   )bytes)xr   r   r   <lambda>Z   s    z%TestSecurity.bounce.<locals>.<lambda>zUser-Id	anonymousHelloWorldzSocket-TypeDEALER)
osurandomr    r   listmapr   getr	   ZMQVersionError)	r   serverclienttest_metadatar"   framesrecvdframe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?   	MECHANISMNULLr(   plain_serverbind_to_random_portconnectrM   r   rF   rG   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   TrN   rO   N)r   r	   r?   r'   plain_usernameplain_passwordr   r   
getsockoptPLAIN_USERNAMEPLAIN_PASSWORDrR   r(   PLAINr1   rS   rT   rM   rU   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	   incorrectTrN   rO   s   ping   N)r   r	   r?   r'   socketsr   r   rY   rZ   rR   r(   r^   r1   rS   rT   sendrcvtimeoassertRaisesErrnoEAGAINrecvrU   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 r5   )r   decode).0keyr   r   r   	<genexpr>   s    z,TestSecurity.test_keypair.<locals>.<genexpr>    N)r	   r   r   r   typer9   len)r   publicsecret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_publicrh   )r      z!curve_public is new in libzmq 4.2ri   rn   N)r	   r   r   r   r
   curve_publicro   r9   rp   r   rj   )r   rq   rr   derived_publicrt   r   r   r   test_curve_public   s   

zTestSecurity.test_curve_publicc           
   
   C   sL  |  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dksoJ |tjdksyJ |   d}||}	|d||	f  | || W d   dS 1 sw   Y  dS )ztest CURVE encryptionr   Trh   NFrN   rO   )r   r	   r?   r'   ra   r   curve_serverr   errnoEINVALr   r   curve_secretkeycurve_publickeycurve_serverkeyr(   CURVErD   CURVE_SERVERr1   rS   rT   rM   )
r   rF   rG   eserver_publicserver_secretclient_publicclient_secretrV   rW   r   r   r   
test_curve   s:   


"zTestSecurity.test_curve)T)__name__
__module____qualname__r   r,   
contextlibcontextmanagerr1   r-   r0   rM   rX   r_   rg   ru   ry   r   __classcell__r   r   r   r   r      s    	)

r   )__doc__r   r@   r.   	threadingr   r	   	zmq.testsr   r   r   	zmq.utilsr   r   r   r   r   r   r   r   <module>   s    