ó
z\Vc           @   s¨   d  Z  d d g Z d d l Z d d l m Z m Z d d l m Z d d l m Z m Z m	 Z	 d d l
 Z
 d d l Z d d l m Z d	 „  Z d d d
 „  ƒ  YZ d S(   s  SSL Connection aka socket

Copyright (c) 1999-2004 Ng Pheng Siong. All rights reserved.

Portions created by Open Source Applications Foundation (OSAF) are
Copyright (C) 2004-2007 OSAF. All Rights Reserved.

Copyright 2008 Heikki Toivonen. All rights reserved.
t
   Connectiont   timeoutiÿÿÿÿN(   t   Ciphert   Cipher_Stack(   t   Session(   t   BIOt   X509t   m2(   t   SSLErrorc          O   s   d S(   Ni   (    (   t   argst   kw(    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   _serverPostConnectionCheck   s    c           B   sŽ  e  Z d  Z e j ƒ  Z e Z e j Z	 e j
 Z dD e j d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d d	 „ 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" d „  Z# d „  Z$ d „  Z% d „  Z& d „  Z' d „  Z( d „  Z) d d „ Z* d d „ Z+ d  „  Z, e, Z- Z. d d! „ Z/ e/ Z0 d" „  Z1 d# „  Z2 d$ „  Z3 d% „  Z4 d& „  Z5 d' „  Z6 d( „  Z7 d) „  Z8 d* „  Z9 d+ „  Z: d, „  Z; d- „  Z< d. „  Z= d/ „  Z> d0 „  Z? d1 d2 „ Z@ d3 „  ZA d4 d5 d6 „ ZB d7 „  ZC d8 „  ZD d9 „  ZE d: „  ZF d; „  ZG d< „  ZH d= „  ZI d> „  ZJ d? „  ZK d@ „  ZL dA „  ZM dB „  ZN dC „  ZO RS(E   s   An SSL connection.c         C   sä   | |  _  t j |  j  j  ƒ |  _ | d  k	 r9 | |  _ n4 t j | t j ƒ |  _ |  j j t j t j	 d ƒ |  j j
 ƒ  |  _ |  j j ƒ  |  _ |  j d  k r¬ d |  _ n  t j |  _ |  j  j d  k	 rà |  j |  j  j ƒ n  d  S(   Ni   g      ð¿(   t   ctxR   t   ssl_newt   sslt   Nonet   sockett   SOCK_STREAMt
   setsockoptt
   SOL_SOCKETt   SO_REUSEADDRt   filenot   _filenot
   gettimeoutt   _timeoutt   bio_nocloset   ssl_close_flagt   post_connection_checkt"   set_post_connection_check_callback(   t   selfR   t   sockt   family(    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   __init__)   s    	c         C   s’   t  |  d d  ƒ r% |  j |  j ƒ n  t  |  d d  ƒ rJ |  j |  j ƒ n  |  j t j k r t  |  d d  ƒ r |  j |  j	 ƒ n  |  j
 j ƒ  d  S(   Nt   sslbiot   sockbioR   (   t   getattrR   t   m2_bio_freeR!   R"   R   R   R   t   m2_ssl_freeR   R   t   close(   R   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   __del__>   s    $c         C   s   t  j |  j ƒ d  S(   N(   R   t   ssl_shutdownR   (   R   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyR&   G   s    c         C   s   t  j |  j ƒ S(   s§   
        If there were errors in this connection, call clear() rather
        than close() to end it, so that bad sessions will be cleared
        from cache.
        (   R   t	   ssl_clearR   (   R   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   clearJ   s    c         C   s   t  j |  j | ƒ d  S(   N(   R   t   ssl_set_shutdown1R   (   R   t   mode(    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   set_shutdownR   s    c         C   s   t  j |  j ƒ S(   N(   R   t   ssl_get_shutdownR   (   R   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   get_shutdownU   s    c         C   s   |  j  j | ƒ d  S(   N(   R   t   bind(   R   t   addr(    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyR0   X   s    i   c         C   s   |  j  j | ƒ d  S(   N(   R   t   listen(   R   t   qlen(    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyR2   [   s    c         C   s   t  j |  j | ƒ S(   N(   R   t   ssl_get_errorR   (   R   t   ret(    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyR4   ^   s    c         C   s&   t  j |  j | j ƒ  | j ƒ  ƒ d S(   s4   
        Explicitly set read and write bios
        N(   R   t   ssl_set_bioR   t   _ptr(   R   t   readbiot   writebio(    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   set_bioa   s    c         C   s   t  j |  j | ƒ d S(   s  
        Set the acceptable client CA list. If the client
        returns a certificate, it must have been issued by
        one of the CAs listed in cafile.
        
        Makes sense only for servers.
        
        @param cafile: Filename from which to load the CA list.
        N(   R   t    ssl_set_client_CA_list_from_fileR   (   R   t   cafile(    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   set_client_CA_list_from_fileg   s    
c         C   s   t  j |  j |  j j ƒ d S(   sÖ   
        Set the acceptable client CA list. If the client
        returns a certificate, it must have been issued by
        one of the CAs listed in context.
        
        Makes sense only for servers.
        N(   R   t#   ssl_set_client_CA_list_from_contextR   R   (   R   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   set_client_CA_list_from_contexts   s    c         C   s   | |  _  d  S(   N(   R1   (   R   R1   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt
   setup_addr}   s    c         C   s4   | t  j t  j f k r' t d ƒ ‚ n  | |  _ d S(   s{   
        By default, SSL struct will be freed in __del__. Call with
        m2.bio_close to override this default.
        s+   flag must be m2.bio_close or m2.bio_nocloseN(   R   t	   bio_closeR   t
   ValueErrorR   (   R   t   flag(    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   set_ssl_close_flag€   s    c         C   sr   t  j |  j j ƒ  d ƒ |  _ t  j |  j |  j |  j ƒ t  j t  j ƒ  ƒ |  _	 t  j
 |  j	 |  j t  j ƒ d  S(   Ni    (   R   t   bio_new_socketR   R   R"   R6   R   t   bio_newt	   bio_f_sslR!   t   bio_set_sslR   (   R   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt	   setup_ssl‰   s    c         C   s   |  j  | ƒ |  j ƒ  d S(   t
   DeprecatedN(   R@   RI   (   R   R1   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt
   _setup_ssl“   s    c         C   s   t  j |  j ƒ d  S(   N(   R   t   ssl_set_accept_stateR   (   R   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   set_accept_state˜   s    c         C   s   t  j |  j |  j ƒ S(   N(   R   t
   ssl_acceptR   R   (   R   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt
   accept_ssl›   s    c         C   s§   |  j  j ƒ  \ } } t |  j | ƒ } | | _ | j ƒ  | j ƒ  | j ƒ  t |  d |  j	 ƒ } | d k	 r | | j ƒ  | j d ƒ s t j d ‚ q n  | | f S(   s¿   Accept an SSL connection. The return value is a pair (ssl, addr) where
        ssl is a new SSL connection object and addr is the address bound to
        the other end of the SSL connection.t   postConnectionChecki    s   post connection check failedN(   R   t   acceptR    R   R1   RI   RM   RO   R#   t   serverPostConnectionCheckR   t   get_peer_certt   Checkert   SSLVerificationError(   R   R   R1   R   t   check(    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyRQ   ž   s    	


c         C   s   t  j |  j ƒ d  S(   N(   R   t   ssl_set_connect_stateR   (   R   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   set_connect_state®   s    c         C   s   t  j |  j |  j ƒ S(   N(   R   t   ssl_connectR   R   (   R   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   connect_ssl±   s    c         C   sŒ   |  j  j | ƒ | |  _ |  j ƒ  |  j ƒ  |  j ƒ  } t |  d |  j ƒ } | d  k	 rˆ | |  j	 ƒ  |  j d ƒ sˆ t
 j d ‚ qˆ n  | S(   NRP   i    s   post connection check failed(   R   t   connectR1   RI   RX   RZ   R#   t   clientPostConnectionCheckR   RS   RT   RU   (   R   R1   R5   RV   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyR[   ´   s    	

c         C   s   t  j |  j | ƒ d  S(   N(   R   t   ssl_set_shutdownR   (   R   t   how(    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   shutdownÀ   s    c         C   s   t  j |  j ƒ S(   s-   Renegotiate this connection's SSL parameters.(   R   t   ssl_renegotiateR   (   R   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   renegotiateÃ   s    c         C   s   t  j |  j ƒ S(   sK   Return the numbers of octets that can be read from the 
        connection.(   R   t   ssl_pendingR   (   R   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   pendingÇ   s    c         C   s   t  j |  j | |  j ƒ S(   N(   R   t	   ssl_writeR   R   (   R   t   data(    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt
   _write_bioÌ   s    c         C   s   t  j |  j | ƒ S(   N(   R   t   ssl_write_nbioR   (   R   Re   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   _write_nbioÏ   s    i   c         C   s1   | d k r t  d ‚ n  t j |  j | |  j ƒ S(   Ni    s	   size <= 0(   RB   R   t   ssl_readR   R   (   R   t   size(    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt	   _read_bioÒ   s    c         C   s+   | d k r t  d ‚ n  t j |  j | ƒ S(   Ni    s	   size <= 0(   RB   R   t   ssl_read_nbioR   (   R   Rj   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt
   _read_nbio×   s    c         C   s)   |  j  d k r |  j | ƒ S|  j | ƒ S(   Ng        (   R   Rf   Rh   (   R   Re   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   writeÜ   s    c         C   s)   |  j  d k r |  j | ƒ S|  j | ƒ S(   Ng        (   R   Rk   Rm   (   R   Rj   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   readâ   s    c         C   s/   |  j  j | ƒ | r" d |  _ n	 d |  _ d S(   s2   Set this connection's underlying socket to _mode_.g      ð¿g        N(   R   t   setblockingR   (   R   R,   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyRp   è   s    c         C   s8   |  j  j | ƒ | |  _ |  j d k r4 d |  _ n  d S(   s?   Set this connection's underlying socket's timeout to _timeout_.g      ð¿N(   R   t
   settimeoutR   R   (   R   R   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyRq   ð   s    	c         C   s   |  j  j ƒ  S(   N(   R   R   (   R   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyR   ÷   s    c         G   s   t  |  j j | ƒ S(   N(   t   applyR   t
   getsockopt(   R   R	   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyRs   ú   s    c         G   s   t  |  j j | ƒ S(   N(   Rr   R   R   (   R   R	   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyR   ý   s    c         C   s   t  j |  j ƒ S(   sG   Return the SSL.Context object associated with this 
        connection.(   R   t   ssl_get_ssl_ctxR   (   R   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   get_context   s    c         C   s   t  j |  j ƒ S(   s(   Return the SSL state of this connection.(   R   t   ssl_get_stateR   (   R   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt	   get_state  s    c         C   s   t  j |  j ƒ t  j k S(   N(   R   t   ssl_get_verify_resultR   t	   X509_V_OK(   R   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt	   verify_ok	  s    c         C   s   t  j |  j ƒ S(   s.   Return the peer certificate verification mode.(   R   t   ssl_get_verify_modeR   (   R   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   get_verify_mode  s    c         C   s   t  j |  j ƒ S(   s/   Return the peer certificate verification depth.(   R   t   ssl_get_verify_depthR   (   R   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   get_verify_depth  s    c         C   s   t  j |  j ƒ S(   s0   Return the peer certificate verification result.(   R   Rx   R   (   R   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   get_verify_result  s    c         C   s2   t  j |  j ƒ } | d k r" d St j | d ƒ S(   s]   Return the peer certificate; if the peer did not provide 
        a certificate, return None.i   N(   R   t   ssl_get_peer_certR   R   R   (   R   t   c(    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyRS     s    c         C   s/   t  j |  j ƒ } | d k r" d St j | ƒ S(   s:  Return the peer certificate chain; if the peer did not provide 
        a certificate chain, return None.
        
        @warning: The returned chain will be valid only for as long as the
        connection object is alive. Once the connection object gets freed,
        the chain will be freed as well.
        N(   R   t   ssl_get_peer_cert_chainR   R   R   t
   X509_Stack(   R   R   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   get_peer_cert_chain!  s    c         C   s,   t  j |  j ƒ } | d k r" d St | ƒ S(   s   Return an M2Crypto.SSL.Cipher object for this connection; if the 
        connection has not been initialised with a cipher suite, return None.N(   R   t   ssl_get_current_cipherR   R   R   (   R   R   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt
   get_cipher/  s    c         C   s,   t  j |  j ƒ } | d k r" d St | ƒ S(   s“   Return an M2Crypto.SSL.Cipher_Stack object for this connection; if the
        connection has not been initialised with cipher suites, return None.N(   R   t   ssl_get_ciphersR   R   R   (   R   R   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   get_ciphers7  s    i    c         C   s   t  j |  j | ƒ S(   s@   Return the cipher suites for this connection as a string object.(   R   t   ssl_get_cipher_listR   (   R   t   idx(    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   get_cipher_list?  s    c         C   s   t  j |  j | ƒ S(   s*   Set the cipher suites for this connection.(   R   t   ssl_set_cipher_listR   (   R   t   cipher_list(    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   set_cipher_listC  s    t   rbiÿÿÿÿc         C   s   t  j |  | | ƒ S(   N(   R   t   _fileobject(   R   R,   t   bufsize(    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   makefileG  s    c         C   s   |  j  j ƒ  S(   N(   R   t   getsockname(   R   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyR“   J  s    c         C   s   |  j  j ƒ  S(   N(   R   t   getpeername(   R   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyR”   M  s    c         C   s=   t  j |  j | ƒ } | s9 t t  j t  j ƒ  ƒ ƒ ‚ n  d  S(   N(   R   t   ssl_set_session_id_contextR   R   t   err_reason_error_stringt   err_get_error(   R   t   idR5   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   set_session_id_ctxP  s    c         C   s   t  j |  j ƒ } t | ƒ S(   N(   R   t   ssl_get_sessionR   R   (   R   t   sess(    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   get_sessionU  s    c         C   s   t  j |  j | j ƒ  ƒ d  S(   N(   R   t   ssl_set_sessionR   R7   (   R   t   session(    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   set_sessionY  s    c         C   s   t  j |  j ƒ S(   N(   R   t   ssl_get_default_session_timeoutR   (   R   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   get_default_session_timeout\  s    c         C   s+   t  j |  j j t j t j t  j ƒ  ƒ ƒ S(   N(   R   t   struct_to_timeoutR   Rs   R   t   SO_RCVTIMEOt   struct_size(   R   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   get_socket_read_timeout_  s    c         C   s+   t  j |  j j t j t j t  j ƒ  ƒ ƒ S(   N(   R   R¢   R   Rs   R   t   SO_SNDTIMEOR¤   (   R   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   get_socket_write_timeoutb  s    c         C   s&   |  j  j t  j t  j | j ƒ  ƒ d  S(   N(   R   R   R   R£   t   pack(   R   t   timeo(    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   set_socket_read_timeoute  s    c         C   s&   |  j  j t  j t  j | j ƒ  ƒ d  S(   N(   R   R   R   R¦   R¨   (   R   R©   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   set_socket_write_timeouti  s    c         C   s   t  j |  j ƒ S(   s8   Return the TLS/SSL protocol version for this connection.(   R   t   ssl_get_versionR   (   R   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   get_versionm  s    c         C   s   | |  _  d  S(   N(   RP   (   R   RP   (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyR   q  s    c         C   s   t  j |  j | ƒ d S(   sI   Set the requested hostname for the SNI (Server Name Indication) extensionN(   R   t   ssl_set_tlsext_host_nameR   (   R   t   name(    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   set_tlsext_host_namet  s    N(P   t   __name__t
   __module__t   __doc__RT   R\   R   RR   R   t   bio_freeR$   t   ssl_freeR%   R   R   t   AF_INETR    R'   R&   R*   R-   R/   R0   R2   R4   R:   R=   R?   R@   RD   RI   RK   RM   RO   RQ   RX   RZ   R[   R_   Ra   Rc   Rf   Rh   Rk   Rm   Rn   t   sendallt   sendRo   t   recvRp   Rq   R   Rs   R   Ru   Rw   Rz   R|   R~   R   RS   R„   R†   Rˆ   R‹   RŽ   R’   R“   R”   R™   Rœ   RŸ   R¡   R¥   R§   Rª   R«   R­   R   R°   (    (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyR       sŠ   													
				
													
																													(    (   R³   t   __all__R   R   R   R   t   M2CryptoR   R   R   R   RT   t   M2Crypto.SSLR   R   R    (    (    (    s=   /usr/lib64/python2.7/site-packages/M2Crypto/SSL/Connection.pyt   <module>	   s   		