ó
—¤Ø[c           @   s›   d  Z  d d l m Z d d l m Z d d l Z d d l Z d d l Z d d l Z d Z d f  d „  ƒ  YZ	 d „  Z
 d	 e j e j f d
 „  ƒ  YZ d S(   sK   
rhn.SSL builds an abstraction on top of the objects provided by pyOpenSSL
iÿÿÿÿ(   t   SSL(   t   cryptoNix   t	   SSLSocketc           B   s¹   e  Z d  Z d d „ Z d „  Z d „  Z d d „ Z d „  Z d „  Z	 d „  Z
 d „  Z d	 „  Z d
 „  Z d d „ Z d d „ Z d „  Z d „  Z d „  Z e Z e Z d d „ Z RS(   sM   
    Class that wraps a pyOpenSSL Connection object, adding more methods
    c         C   s—   d  |  _ d  |  _ | |  _ g  |  _ | p- g  } x | D] } |  j | ƒ q7 Wt j |  _ t j	 |  _
 d |  _ d |  _ d |  _ d |  _ d  |  _ d  S(   Ni    i    t    (   t   Nonet   _ctxt   _connectiont   _sockt   _trusted_certst   add_trusted_certR    t   SSLv23_METHODt   _ssl_methodt   VERIFY_PEERt   _ssl_verify_flagst   _buffer_sizet   _post   _buffert   _makefile_calledt   _closed(   t   selft   sockett   trusted_certst   f(    (    s+   /usr/lib/python2.7/site-packages/rhn/SSL.pyt   __init__+   s    								c         C   s9   t  j | t  j ƒ s% t d | ‚ n  |  j j | ƒ d S(   sh   
        Adds a trusted certificate to the certificate store of the SSL context
        object.
        s"   Unable to read certificate file %sN(   t   ost   accesst   R_OKt
   ValueErrorR   t   append(   R   t   file(    (    s+   /usr/lib/python2.7/site-packages/rhn/SSL.pyR	   H   s    c         C   så   |  j  ƒ  t j |  j ƒ |  _ |  j j t j ƒ |  j j t j ƒ |  j ru x- |  j D] } |  j j	 | ƒ qX Wn	 d |  _
 |  j j |  j
 t ƒ t t d ƒ r¹ |  j j t j ƒ n  t j |  j |  j ƒ |  _ |  j j ƒ  d S(   s1   
        Initializes the SSL connection.
        i    t   OP_DONT_INSERT_EMPTY_FRAGMENTSN(   t   _check_closedR    t   ContextR   R   t   set_optionst   OP_NO_SSLv2t   OP_NO_SSLv3R   t   load_verify_locationsR   t
   set_verifyt   ssl_verify_callbackt   hasattrR   t
   ConnectionR   R   t   set_connect_state(   R   R   (    (    s+   /usr/lib/python2.7/site-packages/rhn/SSL.pyt   init_sslQ   s    
		c         C   s&   | r | |  _  n  |  j d |  _ |  S(   sG   
        Returns self, since we are a file-like object already
        i   (   R   R   (   R   t   modet   bufsize(    (    s+   /usr/lib/python2.7/site-packages/rhn/SSL.pyt   makefileo   s    c         C   s8   |  j  r d S|  j s$ |  j ƒ  d S|  j d |  _ d S(   s+   
        Closes the SSL connection
        Ni   (   R   R   t   _really_close(   R   (    (    s+   /usr/lib/python2.7/site-packages/rhn/SSL.pyt   close|   s    		
c         C   s   |  j  d  k r d  St j d d k rN |  j  j ƒ  d k rs |  j  j ƒ  qs n% |  j  j ƒ  d k rs |  j  j ƒ  n  |  j  j ƒ  d |  _ d  S(   Ni    i   s%   SSL negotiation finished successfullyi   (	   R   R   t   syst   version_infot   get_state_stringt   shutdownt   state_stringR/   R   (   R   (    (    s+   /usr/lib/python2.7/site-packages/rhn/SSL.pyR.   ‹   s    c         C   s   |  j  r t d ‚ n  d  S(   Ns   I/O operation on closed file(   R   R   (   R   (    (    s+   /usr/lib/python2.7/site-packages/rhn/SSL.pyR   œ   s    	c         C   s/   t  |  j | ƒ r" t |  j | ƒ St | ‚ d  S(   N(   R'   R   t   getattrt   AttributeError(   R   t   name(    (    s+   /usr/lib/python2.7/site-packages/rhn/SSL.pyt   __getattr__    s    c         C   s   d S(   s'   
        Returns false always.
        i    (    (   R   (    (    s+   /usr/lib/python2.7/site-packages/rhn/SSL.pyt   isatty¦   s    c         C   s   |  j  S(   N(   R   (   R   (    (    s+   /usr/lib/python2.7/site-packages/rhn/SSL.pyt   tell¬   s    i    c         C   s   t  d ‚ d  S(   Nt   seek(   t   NotImplementedError(   R   t   posR+   (    (    s+   /usr/lib/python2.7/site-packages/rhn/SSL.pyR;   ¯   s    c         C   s  |  j  ƒ  |  j } t |  j ƒ } x| | k  s= | d k r<| d k	 r_ t | | | ƒ } n  yT |  j j | ƒ } |  j | |  _ t |  j ƒ } |  j j ƒ  } | d k r² Pn  Wq% t	 j
 k
 rÊ Pq% t	 j k
 rì } d G| j GHPq% t	 j k
 r|  j t j d ƒ q% t	 j k
 r8|  j t j d ƒ q% Xq% W| rc|  j |  } |  j | |  _ n |  j } d |  _ |  j t | ƒ |  _ | S(   s@   
        Reads up to amt bytes from the SSL connection.
        i    s   SSL exceptiont   readR   N(   R   R   t   lenR   R   t   minR   t   recvt   pendingR    t   ZeroReturnErrort   SysCallErrort   argst   WantWriteErrort   _pollt   selectt   POLLOUTt   WantReadErrort   POLLINR   (   R   t   amtt   buffer_sizet   buffer_lengtht   dataRB   t   et   ret(    (    s+   /usr/lib/python2.7/site-packages/rhn/SSL.pyR>   ²   s:    
			c         C   s[   t  j ƒ  } | j |  j | ƒ | j |  j j ƒ  d ƒ } | g  k rW t d | ‚ n  d  S(   Niè  s   Connection timed out on %s(   RH   t   pollt   registerR   t
   gettimeoutt   TimeoutException(   R   t   filter_typet   caller_namet   pollert   res(    (    s+   /usr/lib/python2.7/site-packages/rhn/SSL.pyRG   ä   s
    c         C   s­   |  j  ƒ  t | ƒ } x t r¨ y6 |  j j | ƒ } | t | ƒ k rJ Pn  | | } Wq t j k
 r~ |  j t j	 d ƒ q t j
 k
 r¤ |  j t j d ƒ q Xq W| S(   s/   
        Writes to the SSL connection.
        t   write(   R   R?   t   TrueR   t   sendR    RF   RG   RH   RI   RJ   RK   (   R   RO   t   origlent   sent(    (    s+   /usr/lib/python2.7/site-packages/rhn/SSL.pyRZ   ë   s    
	c         C   s   |  j  | ƒ S(   N(   R>   (   R   RL   (    (    s+   /usr/lib/python2.7/site-packages/rhn/SSL.pyRA     s    c         C   s–  |  j  ƒ  x]t rid } |  j j d ƒ } | d k rD | d } n$ | rh t |  j ƒ | k rh | } n  | d k	 r« |  j |  } |  j | |  _ |  j t | ƒ |  _ | S|  j } | rÜ t |  j | t |  j ƒ ƒ } n  y& |  j	 j
 | ƒ } |  j | |  _ Wq t j k
 rPq t j k
 r?|  j t j d ƒ q t j k
 re|  j t j d ƒ q Xq W|  j } d |  _ |  j t | ƒ |  _ | S(   sg   
        Reads a single line (up to `length' characters long) from the SSL
        connection.
        s   
i    i   t   readlineR   N(   R   R[   R   R   t   findR?   R   R   R@   R   RA   R    RC   RF   RG   RH   RI   RJ   RK   (   R   t   lengtht	   charcountt   iRQ   R,   RO   (    (    s+   /usr/lib/python2.7/site-packages/rhn/SSL.pyR_     s:    
			"		N(   t   __name__t
   __module__t   __doc__R   R   R	   R*   R-   R/   R.   R   R8   R9   R:   R;   R>   RG   RZ   RA   R\   t   sendallR_   (    (    (    s+   /usr/lib/python2.7/site-packages/rhn/SSL.pyR   '   s&   									2			c         C   s   | S(   sb   
    Verify callback, which will be called for each certificate in the
    certificate chain.
    (    (   t   connt   certt   errnumt   deptht   ok(    (    s+   /usr/lib/python2.7/site-packages/rhn/SSL.pyR&   7  s    RU   c           B   s   e  Z d  „  Z d „  Z RS(   c         G   s   | |  _  d  S(   N(   RE   (   R   RE   (    (    s+   /usr/lib/python2.7/site-packages/rhn/SSL.pyR   A  s    c         C   s   d S(   Ns   Timeout Exception(    (   R   (    (    s+   /usr/lib/python2.7/site-packages/rhn/SSL.pyt   __str__D  s    (   Rd   Re   R   Rm   (    (    (    s+   /usr/lib/python2.7/site-packages/rhn/SSL.pyRU   ?  s   	(   Rf   t   OpenSSLR    R   R   R0   R   RH   t   DEFAULT_TIMEOUTR   R&   t   Errort   timeoutRU   (    (    (    s+   /usr/lib/python2.7/site-packages/rhn/SSL.pyt   <module>   s   ÿ 	