U
    luf}                     @   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                    sN   t  dk rtdzt   W n t jk
r>   tdY nX 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__ ;/tmp/pip-unpacked-wheel-h6ekxre8/zmq/tests/test_security.pyr      s    zTestSecurity.setUpc                 C   s   | j tj}|d z| |}|d d \}}}}}}|dkrV|dd  \}	}
n|dkrf|d  |dksrt|dks~t||g}|dks|dkr|	tkr|
t	ks|dkr|
dd	d
dg n|
ddddg || W 5 |  X d S )Nzinproc://zeromq.zap.01   s   PLAINs   CURVEs   1.0   IDENTs   NULLs   200s   OKs	   anonymouss   Hello   Worlds   400s   Invalid username or password    )contextsocketr	   ZREPbindcloserecv_multipartAssertionErrorUSERPASSextendsend_multipart)r   r   msgversionsequencedomainaddressidentity	mechanismusernamepasswordZreplyr   r   r   zap_handler   sL    

	zTestSecurity.zap_handlerc                 c   s,   |    td z
d V  W 5 |   X d S )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)r2   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 |}zJ|rts|D ]8}|ddksbt|dd	kstt|d
 dksLtqLW n t	j
k
r   Y nX ||kst|| | |}||kstd S )N@   F)copyc                 S   s   | j S r4   )bytes)xr   r   r   <lambda>Z   r   z%TestSecurity.bounce.<locals>.<lambda>zUser-IdZ	anonymousZHelloZWorldzSocket-TypeDEALER)osurandomr!   r   listmapr   getr   r	   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(t|jtjks8t|jdksFt|jdksTtd}||}|	d||f  | 
||d dS )ztest NULL (default) securityr   tcp://127.0.0.1%s:%iFN)r   r	   r;   Z	MECHANISMZNULLr   r(   plain_serverbind_to_random_portconnectrE   r   rA   rB   ifaceportr   r   r   	test_nullj   s    
zTestSecurity.test_nullc              	   C   s  |  tj}d|_|  tj}|jdks,t|jdks:tt|_t|_|	tj
tksZt|	tjtksnt|jdks|t|jdkstd|_|jtjkst|jtjkst|jrt|jst|  2 d}||}|d||f  | || W 5 Q R X dS )ztest PLAIN authenticationr   r   r   TrF   rG   N)r   r	   r;   r'   plain_usernamer   plain_passwordr   r   
getsockoptZPLAIN_USERNAMEZPLAIN_PASSWORDrH   r(   PLAINr0   rI   rJ   rE   rK   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sPt|j
tjks`t|  F d}||}|d||f  |d d|_| tj|j W 5 Q R X dS )	z test PLAIN failed authenticationr   s	   incorrectTrF   rG   s   ping   N)r   r	   r;   r'   socketsr    r   rO   rP   rH   r(   rR   r   r0   rI   rJ   sendZrcvtimeoZassertRaisesErrnoEAGAINrecvrK   r   r   r   skip_plain_inauth   s     


zTestSecurity.skip_plain_inauthc                 C   s   zt  \}}W n t jk
r.   tdY nX t|tks@tt|tksPtt|dks`tt|dksptdd ||fD \}}t|tkstt|tkstt|dkstt|dkstdS )ztest curve_keypairCURVE unsupported(   c                 s   s   | ]}t |V  qd S r4   )r   decode).0keyr   r   r   	<genexpr>   s     z,TestSecurity.test_keypair.<locals>.<genexpr>    N)r	   r   r   r   typer8   r   len)r   publicsecretZbsecretbpublicr   r   r   test_keypair   s    zTestSecurity.test_keypairc                 C   s   zt  \}}W n t jk
r.   tdY nX t  dk rDtdt |}t|tks^tt	|dksntt
|}t|tkstt	|dkst||kstdS )ztest curve_publicrZ   )r      z!curve_public is new in libzmq 4.2r[   r`   N)r	   r   r   r   r
   Zcurve_publicra   r8   r   rb   r   r\   )r   rc   rd   Zderived_publicre   r   r   r   test_curve_public   s    

zTestSecurity.test_curve_publicc           
   
   C   s4  |  tj}d|_|  tj}| j||g z
d|_W n8 tjk
rp } z|jtj	kr`t
dW 5 d}~X Y nX t \}}t \}}||_||_||_||_||_|jtjkst|jtjkst|tjdkst|tjdkst|  2 d}||}	|d||	f  | || W 5 Q R X dS )ztest CURVE encryptionr   TrZ   NFrF   rG   )r   r	   r;   r'   rU   r    Zcurve_serverr   errnoEINVALr   r   Zcurve_secretkeyZcurve_publickeyZcurve_serverkeyr(   ZCURVEr   r@   ZCURVE_SERVERr0   rI   rJ   rE   )
r   rA   rB   eZserver_publicZserver_secretZclient_publicZclient_secretrL   rM   r   r   r   
test_curve   s2    


zTestSecurity.test_curve)T)__name__
__module____qualname__r   r+   
contextlibcontextmanagerr0   r,   r/   rE   rN   rS   rY   rf   rh   rl   __classcell__r   r   r   r   r      s   	)

r   )__doc__rp   r<   r-   	threadingr   r	   Z	zmq.testsr   r   r   Z	zmq.utilsr   r   r   r   r   r   r   r   <module>   s   