ó
iù™Nc           @   sr  d  Z  d d l Z d d l m Z e d k ra d d l m Z d d l m Z d d l m	 Z
 n0 d d l m Z d d	 l m Z d d
 l m
 Z
 d d l m Z d d l m Z d d l m Z d d l m Z m Z d d l m Z d d l m Z m Z d d l m Z d d d „  ƒ  YZ i  d „ Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ  d S(   sH  
This module implements OpenSSL socket BIO based TLS support.  It is only used if
memory BIO APIs are not available, which is when the version of pyOpenSSL
installed is older than 0.10 (when L{twisted.protocols.tls} is not importable).
This implementation is undesirable because of the complexity of working with
OpenSSL's non-blocking socket-based APIs (which this module probably does about
99% correctly, but see #4455 for an example of a problem with it).

Eventually, use of this module should emit a warning.  See #4974 and 5014.

@see: L{twisted.internet._newtls}
@since: 11.1
iÿÿÿÿN(   t   platformTypet   win32(   t   WSAEINTR(   t   WSAEWOULDBLOCK(   t
   WSAENOBUFS(   t   EINTR(   t   EWOULDBLOCK(   t   ENOBUFS(   t   SSL(   t
   implements(   t   log(   t   ITLSTransportt   ISSLTransport(   t   FileDescriptor(   t   CONNECTION_DONEt   CONNECTION_LOST(   t   _TLSDelayedt	   _TLSMixinc           B   s   e  Z d  Z d Z d Z e Z Z d „  Z d „  Z	 d „  Z
 d „  Z d „  Z d „  Z d „  Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z RS(   t   sock_shutdowni    c         C   s   |  j  j ƒ  S(   N(   t   sockett   get_peer_certificate(   t   self(    (    s<   /usr/lib/python2.7/dist-packages/twisted/internet/_oldtls.pyt   getPeerCertificate1   s    c         C   s  |  j  r t S|  j r, d |  _ |  j ƒ  n  y |  j j |  ƒ SWnÊ t j k
 rW t St j k
 rk d  St j	 k
 r¨ d |  _
 |  j j |  ƒ |  j j |  ƒ d  St j k
 rö \ } } | d k rØ | d k sä | d k rè t St j ƒ  t St j k
 r} | SXd  S(   Ni    i   iÿÿÿÿs   Unexpected EOF(   t   disconnectedR   t   writeBlockedOnReadt   _resetReadWritet   _baset   doReadR   t   ZeroReturnErrort   WantReadErrort   WantWriteErrort   readBlockedOnWritet   startWritingt   stopReadingt   SysCallErrorR   R
   t   errt   Error(   R   t   retvalt   desct   e(    (    s<   /usr/lib/python2.7/dist-packages/twisted/internet/_oldtls.pyR   4   s0    				
c         C   sU   |  j  r |  j ƒ  S|  j r& |  j ƒ  S|  j rE d |  _ |  j ƒ  n  |  j j |  ƒ S(   Ni    (   R   t   _postLoseConnectiont   _writeDisconnectedt   _closeWriteConnectionR   R   R   t   doWrite(   R   (    (    s<   /usr/lib/python2.7/dist-packages/twisted/internet/_oldtls.pyR+   ^   s    	
	
		c         C   sÓ   y |  j  j |  | ƒ SWnµ t j k
 r. d St j k
 rk d |  _ |  j  j |  ƒ |  j  j |  ƒ d St j k
 r t	 St j
 k
 r¸ } | d d k r± | d k r± d St	 Sn t j k
 rÎ } | SXd  S(   Ni    i   iÿÿÿÿt    (   R   t   writeSomeDataR   R   R   R   t   stopWritingt   startReadingR   R   R"   R$   (   R   t   dataR'   (    (    s<   /usr/lib/python2.7/dist-packages/twisted/internet/_oldtls.pyR-   u   s"    	c         C   s;   t  |  _ t |  j d ƒ r1 |  j j t j ƒ n  |  j ƒ  S(   sÄ   
        Gets called after loseConnection(), after buffered data is sent.

        We try to send an SSL shutdown alert, but if it doesn't work, retry
        when the socket is writable.
        t   set_shutdown(   t   TrueR   t   hasattrR   R1   R   t   RECEIVED_SHUTDOWNt   _sendCloseAlert(   R   (    (    s<   /usr/lib/python2.7/dist-packages/twisted/internet/_oldtls.pyR(   Œ   s    	c         C   s"  y t  j |  j j ƒ  d ƒ Wn4 t k
 rS } | j d t t t f k rO d St	 SXy„ t
 |  j d ƒ rÄ |  j j ƒ  } |  j j | t j Bƒ |  j j ƒ  } | t j @s× |  j j t j ƒ q× n |  j j ƒ  t } Wn t j k
 rñ } | SX| r|  j ƒ  t S|  j ƒ  |  j ƒ  d  Sd  S(   NR,   i    R1   (   t   ost   writeR   t   filenot   OSErrort   argsR   R   R   R   R3   t   get_shutdownR1   R   R4   t   shutdownt   SENT_SHUTDOWNR2   R$   R.   R   R    R/   t   None(   R   t   set	   laststatet   doneR'   (    (    s<   /usr/lib/python2.7/dist-packages/twisted/internet/_oldtls.pyR5   ¢   s.    



c         C   s,   |  j  ƒ  } | t k r( |  j j |  ƒ S| S(   N(   R5   R   R   R*   (   R   t   result(    (    s<   /usr/lib/python2.7/dist-packages/twisted/internet/_oldtls.pyR*   ã   s    c         C   s&   t  |  _ |  j s" |  j j |  ƒ Sd  S(   N(   R2   t   _userWantReadR   R   R/   (   R   (    (    s<   /usr/lib/python2.7/dist-packages/twisted/internet/_oldtls.pyR/   ë   s    		c         C   s0   t  |  _ |  j s |  j r, |  j j |  ƒ Sd  S(   N(   t   FalseRC   R   R   R   R!   (   R   (    (    s<   /usr/lib/python2.7/dist-packages/twisted/internet/_oldtls.pyR!   ñ   s    	c         C   s&   t  |  _ |  j s" |  j j |  ƒ Sd  S(   N(   R2   t   _userWantWriteR   R   R    (   R   (    (    s<   /usr/lib/python2.7/dist-packages/twisted/internet/_oldtls.pyR    ú   s    		c         C   s0   t  |  _ |  j s |  j r, |  j j |  ƒ Sd  S(   N(   RD   RE   R   R   R   R.   (   R   (    (    s<   /usr/lib/python2.7/dist-packages/twisted/internet/_oldtls.pyR.      s    	c         C   sD   |  j  r |  j ƒ  n
 |  j ƒ  |  j r6 |  j ƒ  n
 |  j ƒ  d  S(   N(   RE   R    R.   RC   R/   R!   (   R   (    (    s<   /usr/lib/python2.7/dist-packages/twisted/internet/_oldtls.pyR   	  s    	
	(   t   __name__t
   __module__t   _socketShutdownMethodR   R   R2   RC   RE   R   R   R+   R-   R(   R5   R*   R/   R!   R    R.   R   (    (    (    s<   /usr/lib/python2.7/dist-packages/twisted/internet/_oldtls.pyR   *   s    
		*				A							c            s@   ˆ  | k r8 d t  ˆ  f ‡  f d †  ƒ  Y} | | ˆ  <n  | ˆ  S(   Nt   TLSConnectionc              s   e  Z e e ƒ ˆ  Z RS(    (   RF   RG   R	   R   R   (    (   t   klass(    s<   /usr/lib/python2.7/dist-packages/twisted/internet/_oldtls.pyRI     s   
(   R   (   RJ   t	   _existingRI   (    (   RJ   s<   /usr/lib/python2.7/dist-packages/twisted/internet/_oldtls.pyt   _getTLSClass  s    t   ConnectionMixinc           B   sJ   e  Z d  Z d Z d Z e d „ Z d „  Z d „  Z	 d „  Z
 d „  Z RS(   sƒ   
    Mixin for L{twisted.internet.tcp.Connection} to help implement
    L{ITLSTransport} using pyOpenSSL to do crypto and I/O.
    i    c         C   s”   |  j  s t ‚ |  j s" |  j r; t g  | | ƒ |  _ t S|  j ƒ  |  j ƒ  |  j	 ƒ  t
 j | j ƒ  |  j ƒ |  _ |  j j |  _ |  j ƒ  t S(   N(   t   TLSt   AssertionErrort
   dataBuffert   _tempDataBufferR   t   _tlsWaitingRD   R!   R.   t	   _startTLSR   t
   Connectiont
   getContextR   R8   R/   R2   (   R   t   ctxt   extra(    (    s<   /usr/lib/python2.7/dist-packages/twisted/internet/_oldtls.pyt   startTLS)  s    



c         C   s   d |  _  t |  j ƒ |  _ d  S(   Ni   (   RN   RL   t	   __class__(   R   (    (    s<   /usr/lib/python2.7/dist-packages/twisted/internet/_oldtls.pyRS   ;  s    	c         C   s9   |  j  d  k	 r% |  j  j j | ƒ n t j |  | ƒ d  S(   N(   RR   R>   t   bufferedDatat   appendR   R7   (   R   t   bytes(    (    s<   /usr/lib/python2.7/dist-packages/twisted/internet/_oldtls.pyR7   @  s    c         C   s9   |  j  d  k	 r% |  j  j j | ƒ n t j |  | ƒ d  S(   N(   RR   R>   RZ   t   extendR   t   writeSequence(   R   t   iovec(    (    s<   /usr/lib/python2.7/dist-packages/twisted/internet/_oldtls.pyR^   G  s    c         C   st   t  j |  ƒ } |  j d  k	 rp |  j rp |  j rp |  j } d  |  _ |  j | j | j ƒ |  j	 | j
 ƒ qp n  | S(   N(   R   R+   RR   R>   RP   RQ   RX   t   contextRW   R^   RZ   (   R   RB   t   waiting(    (    s<   /usr/lib/python2.7/dist-packages/twisted/internet/_oldtls.pyR+   N  s    		N(   RF   RG   t   __doc__RN   R>   RR   R2   RX   RS   R7   R^   R+   (    (    (    s<   /usr/lib/python2.7/dist-packages/twisted/internet/_oldtls.pyRM   !  s   			t   ClientMixinc           B   s$   e  Z d  Z e e ƒ d d „ Z RS(   sh   
    Mixin for L{twisted.internet.tcp.Client} to implement the client part of
    L{ITLSTransport}.
    i   c         C   sB   |  j  j |  | | ƒ r> | r. |  j j ƒ  q> |  j j ƒ  n  d  S(   N(   R   RX   R   t   set_connect_statet   set_accept_state(   R   RV   t   client(    (    s<   /usr/lib/python2.7/dist-packages/twisted/internet/_oldtls.pyRX   a  s    (   RF   RG   Rb   R	   R   RX   (    (    (    s<   /usr/lib/python2.7/dist-packages/twisted/internet/_oldtls.pyRc   Z  s   
t   ServerMixinc           B   s$   e  Z d  Z e e ƒ d d „ Z RS(   sh   
    Mixin for L{twisted.internet.tcp.Client} to implement the server part of
    L{ITLSTransport}.
    i   c         C   sB   |  j  j |  | | ƒ r> | r. |  j j ƒ  q> |  j j ƒ  n  d  S(   N(   R   RX   R   Re   Rd   (   R   RV   t   server(    (    s<   /usr/lib/python2.7/dist-packages/twisted/internet/_oldtls.pyRX   q  s    (   RF   RG   Rb   R	   R   RX   (    (    (    s<   /usr/lib/python2.7/dist-packages/twisted/internet/_oldtls.pyRg   j  s   
(    (!   Rb   R6   t   twisted.python.runtimeR    t   errnoR   R   R   R   R   R   t   OpenSSLR   t   zope.interfaceR	   t   twisted.pythonR
   t   twisted.internet.interfacesR   R   t   twisted.internet.abstractR   t   twisted.internet.mainR   R   t   twisted.internet._sslR   R   RL   t   objectRM   Rc   Rg   (    (    (    s<   /usr/lib/python2.7/dist-packages/twisted/internet/_oldtls.pyt   <module>   s*   î	9