ó
ÐH/\c        
   @@  sÏ  d  Z  d d l m Z d d l Z e j Z d d l Z d d l Z d d l m	 Z	 d d l
 m Z m Z d d l
 m Z m Z d d l
 m Z d d l m Z d d	 l m Z d
 d d d g Z e e e ƒ  d e d g d f  ƒZ e e e ƒ e e ƒ Bƒ Z d e k re j d ƒ n  d
 e	 f d „  ƒ  YZ e pGe e d ƒ ree d „  d „  ƒ e _ n  e  d ƒ Z! e  d ƒ Z" e  d ƒ Z# e$ e$ e% e& e' e$ e( e( e$ d „	 Z) e' e$ d „ Z* e$ e$ d „ Z+ d S(   s<  
SSL wrapper for socket objects on Python 2.7.8 and below.

For the documentation, refer to :mod:`ssl` module manual.

This module implements cooperative SSL socket wrappers.

.. deprecated:: 1.3
   This module is not secure. Support for Python versions
   with only this level of SSL will be dropped in gevent 1.4.
i    (   t   absolute_importN(   t   socket(   t   _fileobjectt   timeout_default(   t   errort   EWOULDBLOCK(   t   timeout(   t   PYPY(   t   copy_globalst	   SSLSockett   wrap_sockett   get_server_certificatet   sslwrap_simplet   names_to_ignoreR   t   dunder_names_to_keept
   namedtuplec        
   B@  s"  e  Z d  Z d d e e e d e e d d „	 Z d d „ Z	 d „  Z
 e d „ Z d „  Z d e d „ Z d d	 „ Z d
 „  Z d d d „ Z d d d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z e rö d „  Z d „  Z n  d „  Z d „  Z d „  Z d d d „ Z  RS(   s{   
    gevent `ssl.SSLSocket <https://docs.python.org/2.6/library/ssl.html#sslsocket-objects>`_
    for Pythons < 2.7.9.
    c      	   C@  sP  t  j |  d | ƒt r& | j ƒ  n  | r< | r< | } n  y t  j |  ƒ Wn8 t k
 r‡ } | j d t j k r{ ‚  n  d  |  _
 nt X|
 d  k r¾ t j |  j | | | | | | ƒ |  _
 n* t j |  j | | | | | | |
 ƒ |  _
 | rû |  j ƒ  n  | |  _ | |  _ | |  _ | |  _ | |  _ |
 |  _ | |  _ |	 |  _ d |  _ d  S(   Nt   _socki    (   R   t   __init__R   t   _dropt   getpeernamet   socket_errort   argst   errnot   ENOTCONNt   Nonet   _sslobjt   _sslt   sslwrapR   t   do_handshaket   keyfilet   certfilet	   cert_reqst   ssl_versiont   ca_certst   cipherst   do_handshake_on_connectt   suppress_ragged_eofst   _makefile_refs(   t   selft   sockR   R   t   server_sideR   R    R!   R#   R$   R"   t   e(    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyR   ;   s<    										i   c         C@  sô   xí t  rï y |  j j | ƒ SWq t k
 rë } | j d t k rO |  j rO d S| j d t k rš |  j d k rw ‚  n  t	 j
 ƒ  |  j |  j d t ƒqì | j d t k rå |  j d k rÂ ‚  n  t	 j
 ƒ  |  j |  j d t ƒqì ‚  q Xq Wd S(   sO   Read up to LEN bytes and return them.
        Return zero-length string on EOF.i    t    g        t   timeout_excN(   t   TrueR   t   readt   SSLErrorR   t   SSL_ERROR_EOFR$   t   SSL_ERROR_WANT_READR   t   syst	   exc_cleart   _waitt   _read_eventt   _SSLErrorReadTimeoutt   SSL_ERROR_WANT_WRITEt   _write_event(   R&   t   lent   ex(    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyR-   g   s"    	

c         C@  sÔ   xÍ t  rÏ y |  j j | ƒ SWq t k
 rË } | j d t k rz |  j d k rW ‚  n  t j ƒ  |  j	 |  j
 d t ƒqÌ | j d t k rÅ |  j d k r¢ ‚  n  t j ƒ  |  j	 |  j d t ƒqÌ ‚  q Xq Wd S(   sh   Write DATA to the underlying SSL channel.  Returns
        number of bytes of DATA actually transmitted.i    g        R+   N(   R,   R   t   writeR.   R   R0   R   R1   R2   R3   R4   t   _SSLErrorWriteTimeoutR6   R7   (   R&   t   dataR9   (    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyR:   ~   s    	

c         C@  s   |  j  j | ƒ S(   sá   Returns a formatted version of the data in the
        certificate provided by the other end of the SSL channel.
        Return None if no certificate was provided, {} if a
        certificate was provided, but not validated.(   R   t   peer_certificate(   R&   t   binary_form(    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyt   getpeercert’   s    c         C@  s   |  j  s d  S|  j  j ƒ  S(   N(   R   R   t   cipher(   R&   (    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyR@   ™   s    	i    c         C@  s&  | t  k r |  j } n  |  j r| d k rC t d |  j ƒ ‚ n  xÜ t ry |  j j | ƒ } Wnœ t k
 r } | j d t	 k r· |  j d k rš d St
 j ƒ  |  j |  j ƒ q| j d t k rú |  j d k rÝ d St
 j ƒ  |  j |  j ƒ q‚  qF X| SqF Wn t j |  | | | ƒ Sd  S(   Ni    s3   non-zero flags not allowed in calls to send() on %sg        (   R   R   R   t
   ValueErrort	   __class__R,   R:   R.   R   R0   R1   R2   R3   R4   R6   R7   R   t   send(   R&   R<   t   flagsR   t   vt   x(    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyRC   ž   s0    		

c         C@  s[   y t  j |  | ƒ Wn@ t k
 rV } |  j d k rD t t ƒ ‚ n  t | j Œ  ‚ n Xd  S(   Ng        (   R   t   sendallt   _socket_timeoutR   R.   R6   R   (   R&   R<   RD   R9   (    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyRG   ¼   s    c         G@  s3   |  j  r t d |  j ƒ ‚ n t j |  | Œ Sd  S(   Ns%   sendto not allowed on instances of %s(   R   RA   RB   R   t   sendto(   R&   R   (    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyRI   Ç   s    	c         C@  sK   |  j  r8 | d k r+ t d |  j ƒ ‚ n  |  j | ƒ St j |  | | ƒ S(   Ni    s3   non-zero flags not allowed in calls to recv() on %s(   R   RA   RB   R-   R   t   recv(   R&   t   buflenRD   (    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyRJ   Î   s    	c         C@  s  | r! | d  k r! t | ƒ } n | d  k r6 d } n  |  j rÿ | d k ra t d |  j ƒ ‚ n  x± t rû y- |  j | ƒ } t | ƒ } | | | *| SWqd t k
 r÷ } | j d t	 k rñ |  j
 d k rÑ ‚  n  t j ƒ  |  j |  j ƒ qd qø ‚  qd Xqd Wn t j |  | | | ƒ Sd  S(   Ni   i    s8   non-zero flags not allowed in calls to recv_into() on %sg        (   R   R8   R   RA   RB   R,   R-   R.   R   R0   R   R1   R2   R3   R4   R   t	   recv_into(   R&   t   buffert   nbytesRD   t
   tmp_bufferRE   RF   (    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyRL   Ø   s0    			

c         G@  s3   |  j  r t d |  j ƒ ‚ n t j |  | Œ Sd  S(   Ns'   recvfrom not allowed on instances of %s(   R   RA   RB   R   t   recvfrom(   R&   R   (    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyRP   ô   s    	c         G@  s3   |  j  r t d |  j ƒ ‚ n t j |  | Œ Sd  S(   Ns,   recvfrom_into not allowed on instances of %s(   R   RA   RB   R   t   recvfrom_into(   R&   R   (    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyRQ   û   s    	c         C@  s   |  j  r |  j  j ƒ  Sd S(   Ni    (   R   t   pending(   R&   (    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyRR     s    	c         C@  sñ   xê t  rì y |  j j ƒ  SWq t k
 rè } | j d t k rL |  j rL d S| j d t k r— |  j d k rt ‚  n  t	 j
 ƒ  |  j |  j d t ƒqé | j d t k râ |  j d k r¿ ‚  n  t	 j
 ƒ  |  j |  j d t ƒqé ‚  q Xq Wd  S(   Ni    R*   g        R+   (   R,   R   t   shutdownR.   R   R/   R$   R0   R   R1   R2   R3   R4   R5   R6   R7   R;   (   R&   R9   (    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyt   _sslobj_shutdown  s"    	

c         C@  sD   |  j  s" t d t |  ƒ ƒ ‚ n  |  j ƒ  } d  |  _  t d | ƒ S(   Ns   No SSL wrapper around R   (   R   RA   t   strRT   R   R   (   R&   t   s(    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyt   unwrap  s
    		c         C@  s   d  |  _ t j |  | ƒ d  S(   N(   R   R   R   RS   (   R&   t   how(    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyRS   "  s    	c         C@  s;   |  j  d k  r( d  |  _ t j |  ƒ n |  j  d 8_  d  S(   Ni   (   R%   R   R   R   t   close(   R&   (    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyRY   &  s    	c         C@  s   |  j  d 7_  d  S(   Ni   (   R%   (   R&   (    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyt   _reuse/  s    c         C@  s/   |  j  d k  r |  j ƒ  n |  j  d 8_  d  S(   Ni   (   R%   RY   (   R&   (    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyR   2  s    c         C@  sÑ   xÊ t  rÌ y |  j j ƒ  SWq t k
 rÈ } | j d t k rw |  j d k rT ‚  n  t j ƒ  |  j	 |  j
 d t ƒqÉ | j d t k rÂ |  j d k rŸ ‚  n  t j ƒ  |  j	 |  j d t ƒqÉ ‚  q Xq Wd S(   s   Perform a TLS/SSL handshake.i    g        R+   N(   R,   R   R   R.   R   R0   R   R1   R2   R3   R4   t   _SSLErrorHandshakeTimeoutR6   R7   (   R&   R9   (    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyR   8  s    	

c      	   C@  sÆ   |  j  r t d ƒ ‚ n  t j |  | ƒ |  j d k rp t j |  j t	 |  j
 |  j |  j |  j |  j ƒ |  _  n< t j |  j t	 |  j
 |  j |  j |  j |  j |  j ƒ |  _  |  j rÂ |  j ƒ  n  d S(   sQ   Connects to remote ADDR, and then wraps the connection in
        an SSL channel.s/   attempt to connect already-connected SSLSocket!N(   R   RA   R   t   connectR"   R   R   R   R   t   FalseR   R   R   R    R!   R#   R   (   R&   t   addr(    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyR\   K  s    		c         C@  sé   |  j  } xy t r„ y | j ƒ  \ } } PWnE t k
 rp } | j d t k s] |  j d k rc ‚  n  t j ƒ  n X|  j	 |  j
 ƒ q Wt | d |  j d |  j d t d |  j d |  j d |  j d	 |  j d
 |  j d |  j ƒ	} | | f S(   s¿   Accepts a new connection from a remote client, and returns
        a tuple containing that new connection wrapped with a server-side
        SSL channel, and the address of the remote client.i    g        R   R   R(   R   R    R!   R#   R$   R"   (   R   R,   t   acceptR   R   R   R   R1   R2   R3   R4   R	   R   R   R   R    R!   R#   R$   R"   (   R&   R'   t   client_sockett   addressR9   t   sslobj(    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyR_   ^  s*    		"								t   riÿÿÿÿc         C@  s.   t  s |  j d 7_ n  t |  | | d t ƒS(   s   Make and return a file-like object that
        works with the SSL connection.  Just use the code
        from the socket module.i   RY   (   R   R%   R   R,   (   R&   t   modet   bufsize(    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyt   makefilez  s    N(!   t   __name__t
   __module__t   __doc__R   R]   t	   CERT_NONEt   PROTOCOL_SSLv23R,   R   R-   R:   R?   R@   R   RC   RG   RI   RJ   RL   RP   RQ   RR   RT   RW   RS   RY   R   RZ   R   R   R\   R_   Rf   (    (    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyR	   5   s<   '			
											R   c         C@  s
   |  j  ƒ  S(   N(   t
   gettimeout(   R&   (    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyt   <lambda>Œ  s    c         C@  s   |  j  | ƒ S(   N(   t
   settimeout(   R&   t   value(    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyRm     s    s   The read operation timed outs   The write operation timed outs!   The handshake operation timed outc
   
      C@  s@   t  |  d | d | d | d | d | d | d | d | d	 |	 ƒ	S(
   s)   Create a new :class:`SSLSocket` instance.R   R   R(   R   R    R!   R#   R$   R"   (   R	   (
   R'   R   R   R(   R   R    R!   R#   R$   R"   (    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyR
   •  s    c         C@  sl   | d k	 r t } n t } t t ƒ  d | d | d | ƒ} | j |  ƒ | j t ƒ } | j ƒ  t	 | ƒ S(   s÷   Retrieve the certificate from the server at the specified address,
    and return it as a PEM-encoded string.
    If 'ca_certs' is specified, validate the server cert against it.
    If 'ssl_version' is specified, use it in the connection attempt.R    R   R!   N(
   R   t   CERT_REQUIREDRj   R
   R   R\   R?   R,   RY   t   DER_cert_to_PEM_cert(   R^   R    R!   R   RV   t   dercert(    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyR   £  s    	
c         C@  s   t  |  | | ƒ S(   sŽ   A replacement for the old socket.ssl function.  Designed
    for compatibility with Python 2.5 and earlier.  Will disappear in
    Python 3.0.(   R	   (   R'   R   R   (    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyR   µ  s    (,   Ri   t
   __future__R    t   sslt   __ssl__R   R1   R   t   gevent._socket2R   t   gevent.socketR   R   R   R   R   R   RH   t   gevent._compatR   t   gevent._utilR   t   __implements__t   globalst   __imports__t   listt   sett   __all__t   removeR	   t   hasattrt   propertyR.   R5   R;   R[   R   R]   Rj   Rk   R,   R
   R   R   (    (    (    s+   lib/python2.7/site-packages/gevent/_ssl2.pyt   <module>   sH   			ÿ P	
