ó
L]c           @   s˜   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 d e f d	 „  ƒ  YZ d S(
   s&   Test libzmq security (libzmq >= 3.3.0)iÿÿÿÿN(   t   Thread(   t   BaseZMQTestCaset   SkipTestt   PYPY(   t   z85t   admint   passwordt   TestSecurityc           B   s€   e  Z d  „  Z d „  Z e j d „  ƒ Z d „  Z d „  Z e	 d „ Z
 d „  Z d „  Z d „  Z d	 „  Z d
 „  Z d „  Z RS(   c         C   si   t  j ƒ  d k  r! t d ƒ ‚ n  y t  j ƒ  Wn  t  j k
 rQ t d ƒ ‚ n Xt t |  ƒ j ƒ  d  S(   Ni   i    s   security is new in libzmq 4.0s7   security requires libzmq to be built with CURVE support(   i   i    (   t   zmqt   zmq_version_infoR   t   curve_keypairt   ZMQErrort   superR   t   setUp(   t   self(    (    s6   lib/python2.7/site-packages/zmq/tests/test_security.pyR      s    c         C   sE  |  j  j t j ƒ } | j d ƒ z|  j | ƒ } | d  \ } } } } } } | d k ro | d \ }	 }
 n | d k rˆ | d } n  |  j | d ƒ |  j | d ƒ | | g } | d k sð | d k rä |	 t k rä |
 t k sð | d k r| j	 d d	 d
 d g ƒ n | j	 d d d d g ƒ | j
 | ƒ Wd  | j ƒ  Xd  S(   Ns   inproc://zeromq.zap.01i   t   PLAINt   CURVEs   1.0t   IDENTt   NULLt   200t   OKt	   anonymouss   Hello   Worldt   400s   Invalid username or passwordt    (   t   contextt   socketR   t   REPt   bindt   recv_multipartt   assertEqualt   USERt   PASSt   extendt   send_multipartt   close(   R   R   t   msgt   versiont   sequencet   domaint   addresst   identityt	   mechanismt   usernameR   t   keyt   reply(    (    s6   lib/python2.7/site-packages/zmq/tests/test_security.pyt   zap_handler!   s6    $
c         c   s2   |  j  ƒ  t j d ƒ z	 d  VWd  |  j ƒ  Xd  S(   Ng      à?(   t	   start_zapt   timet   sleept   stop_zap(   R   (    (    s6   lib/python2.7/site-packages/zmq/tests/test_security.pyt   zapD   s
    
	c         C   s&   t  d |  j ƒ |  _ |  j j ƒ  d  S(   Nt   target(   R    R-   t
   zap_threadt   start(   R   (    (    s6   lib/python2.7/site-packages/zmq/tests/test_security.pyR.   M   s    c         C   s   |  j  j ƒ  d  S(   N(   R4   t   join(   R   (    (    s6   lib/python2.7/site-packages/zmq/tests/test_security.pyR1   Q   s    c   	      C   s  t  j d ƒ t  j d ƒ g } | j | ƒ |  j | d t ƒ} t t d „  | ƒ ƒ } yk | rÂ t rÂ xW | D]L } |  j | j	 d ƒ d ƒ |  j | j	 d ƒ d ƒ |  j | d d	 ƒ qo Wn  Wn t
 j k
 rÙ n X|  j | | ƒ | j | ƒ |  j | ƒ } |  j | | ƒ d  S(
   Ni@   t   copyc         S   s   |  j  S(   N(   t   bytes(   t   x(    (    s6   lib/python2.7/site-packages/zmq/tests/test_security.pyt   <lambda>X   R   s   User-IdR   t   Hellot   Worlds   Socket-Typet   DEALER(   t   ost   urandomR!   R   t   Falset   listt   mapR   R   t   getR   t   ZMQVersionError(	   R   t   servert   clientt   test_metadataR#   t   framest   recvdt   framet   msg2(    (    s6   lib/python2.7/site-packages/zmq/tests/test_security.pyt   bounceT   s     c         C   s¹   |  j  t j ƒ } |  j  t j ƒ } |  j | j t j ƒ |  j | j t j ƒ |  j | j d ƒ |  j | j d ƒ d } | j | ƒ } | j	 d | | f ƒ |  j
 | | t ƒ d S(   s   test NULL (default) securityi    s   tcp://127.0.0.1s   %s:%iN(   R   R   R=   R   t	   MECHANISMR   R)   t   plain_servert   bind_to_random_portt   connectRL   R@   (   R   RE   RF   t   ifacet   port(    (    s6   lib/python2.7/site-packages/zmq/tests/test_security.pyt	   test_nullh   s    c         C   sj  |  j  t j ƒ } d | _ |  j  t j ƒ } |  j | j d ƒ |  j | j d ƒ t | _ t | _ |  j | j	 t j
 ƒ t ƒ |  j | j	 t j ƒ t ƒ |  j | j d ƒ |  j | j d ƒ t | _ |  j | j t j ƒ |  j | j t j ƒ | j st ‚ | j st ‚ |  j ƒ  A d } | j | ƒ } | j d | | f ƒ |  j | | ƒ Wd QXd S(   s   test PLAIN authenticationR   R   i    s   tcp://127.0.0.1s   %s:%iN(   R   R   R=   R(   R   t   plain_usernamet   plain_passwordR   R   t
   getsockoptt   PLAIN_USERNAMEt   PLAIN_PASSWORDRN   t   TrueR)   R   t   AssertionErrorR2   RO   RP   RL   (   R   RE   RF   RQ   RR   (    (    s6   lib/python2.7/site-packages/zmq/tests/test_security.pyt
   test_plainu   s*    				c         C   sù   |  j  t j ƒ } d | _ |  j  t j ƒ } |  j j | | g ƒ t | _ d | _ t	 | _
 |  j | j t j ƒ |  j | j t j ƒ |  j ƒ  ] d } | j | ƒ } | j d | | f ƒ | j d ƒ d | _ |  j t j | j ƒ Wd QXd S(   s    test PLAIN failed authenticationR   t	   incorrects   tcp://127.0.0.1s   %s:%it   pingiú   N(   R   R   R=   R(   t   socketsR    R   RT   RU   RY   RN   R   R)   R   R2   RO   RP   t   sendt   rcvtimeot   assertRaisesErrnot   EAGAINt   recv(   R   RE   RF   RQ   RR   (    (    s6   lib/python2.7/site-packages/zmq/tests/test_security.pyt   skip_plain_inauth   s     					c         C   s  y t  j ƒ  \ } } Wn  t  j k
 r8 t d ƒ ‚ n X|  j t | ƒ t ƒ |  j t | ƒ t ƒ |  j t | ƒ d ƒ |  j t | ƒ d ƒ g  | | f D] } t j	 | ƒ ^ qž \ } } |  j t | ƒ t ƒ |  j t | ƒ t ƒ |  j t | ƒ d ƒ |  j t | ƒ d ƒ d S(   s   test curve_keypairs   CURVE unsupportedi(   i    N(
   R   R
   R   R   R   t   typeR8   t   lenR   t   decode(   R   t   publict   secretR+   t   bsecrett   bpublic(    (    s6   lib/python2.7/site-packages/zmq/tests/test_security.pyt   test_keypair£   s    .c         C   sä   y t  j ƒ  \ } } Wn  t  j k
 r8 t d ƒ ‚ n Xt  j ƒ  d k  rZ t d ƒ ‚ n  t  j | ƒ } |  j t | ƒ t ƒ |  j t	 | ƒ d ƒ t
 j | ƒ } |  j t | ƒ t ƒ |  j t	 | ƒ d ƒ |  j | | ƒ d S(	   s   test curve_publics   CURVE unsupportedi   i   s!   curve_public is new in libzmq 4.2i(   i    N(   i   i   (   R   R
   R   R   R	   t   curve_publicR   Re   R8   Rf   R   Rg   (   R   Rh   Ri   t   derived_publicRk   (    (    s6   lib/python2.7/site-packages/zmq/tests/test_security.pyt   test_curve_public¶   s    c   
      C   s’  |  j  t j ƒ } d | _ |  j  t j ƒ } |  j j | | g ƒ y t | _ Wn7 t j k
 r‰ } | j	 t j
 k rŠ t d ƒ ‚ qŠ n Xt j ƒ  \ } } t j ƒ  \ } } | | _ | | _ | | _ | | _ | | _ |  j | j t j ƒ |  j | j t j ƒ |  j | j t j ƒ t ƒ |  j | j t j ƒ t ƒ |  j ƒ  A d } | j | ƒ }	 | j d | |	 f ƒ |  j | | ƒ Wd QXd S(   s   test CURVE encryptionR   s   CURVE unsupporteds   tcp://127.0.0.1s   %s:%iN(   R   R   R=   R(   R^   R    RY   t   curve_serverR   t   errnot   EINVALR   R
   t   curve_secretkeyt   curve_publickeyt   curve_serverkeyR   R)   R   RC   t   CURVE_SERVERR@   R2   RO   RP   RL   (
   R   RE   RF   t   et   server_publict   server_secrett   client_publict   client_secretRQ   RR   (    (    s6   lib/python2.7/site-packages/zmq/tests/test_security.pyt
   test_curveÌ   s2    						(   t   __name__t
   __module__R   R-   t
   contextlibt   contextmanagerR2   R.   R1   RY   RL   RS   R[   Rd   Rl   Ro   R|   (    (    (    s6   lib/python2.7/site-packages/zmq/tests/test_security.pyR      s   			#								(   t   __doc__R>   R   R/   t	   threadingR    R   t	   zmq.testsR   R   R   t	   zmq.utilsR   R   R   R   (    (    (    s6   lib/python2.7/site-packages/zmq/tests/test_security.pyt   <module>   s   