ó
²vMc        
   @   sz  d  Z  e Z d d l m Z d d l m Z m Z m Z d d l	 m
 Z
 m Z m Z m Z d d d „  ƒ  YZ d e f d „  ƒ  YZ d	 d  d
 „  ƒ  YZ d e
 j f d „  ƒ  YZ d e
 j f d „  ƒ  YZ d e
 j f d „  ƒ  YZ d e
 j f d „  ƒ  YZ d d l m Z m Z m Z d d l m Z m Z d d l m Z d d l m Z d d d	 d d d d d d d g
 Z e Z d S(!   sR  
SSL transport. Requires PyOpenSSL (http://pyopenssl.sf.net).

SSL connections require a ContextFactory so they can create SSL contexts.
End users should only use the ContextFactory classes directly - for SSL
connections use the reactor.connectSSL/listenSSL and so on, as documented
in IReactorSSL.

All server context factories should inherit from ContextFactory, and all
client context factories should inherit from ClientContextFactory. At the
moment this is not enforced, but in the future it might be.

Future Plans:
    - split module so reactor-specific classes are in a separate module
iÿÿÿÿ(   t   SSL(   t
   implementst   implementsOnlyt   implementedBy(   t   tcpt
   interfacest   baset   addresst   ContextFactoryc           B   s   e  Z d  Z d Z d „  Z RS(   s>   A factory for SSL context objects, for server SSL connections.i    c         C   s
   t  ‚ d S(   s4   Return a SSL.Context object. override in subclasses.N(   t   NotImplementedError(   t   self(    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/ssl.pyt
   getContext6   s    (   t   __name__t
   __module__t   __doc__t   isClientR   (    (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/ssl.pyR   1   s   t   DefaultOpenSSLContextFactoryc           B   sM   e  Z d  Z d Z e j e j d „ Z d „  Z	 d „  Z
 d „  Z d „  Z RS(   sI  
    L{DefaultOpenSSLContextFactory} is a factory for server-side SSL context
    objects.  These objects define certain parameters related to SSL
    handshakes and the subsequent connection.

    @ivar _contextFactory: A callable which will be used to create new
        context objects.  This is typically L{SSL.Context}.
    c         C   s2   | |  _  | |  _ | |  _ | |  _ |  j ƒ  d S(   sÐ   
        @param privateKeyFileName: Name of a file containing a private key
        @param certificateFileName: Name of a file containing a certificate
        @param sslmethod: The SSL method to use
        N(   t   privateKeyFileNamet   certificateFileNamet	   sslmethodt   _contextFactoryt   cacheContext(   R
   R   R   R   R   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/ssl.pyt   __init__F   s
    				c         C   sa   |  j  d  k r] |  j |  j ƒ } | j t j ƒ | j |  j ƒ | j	 |  j
 ƒ | |  _  n  d  S(   N(   t   _contextt   NoneR   R   t   set_optionsR    t   OP_NO_SSLv2t   use_certificate_fileR   t   use_privatekey_fileR   (   R
   t   ctx(    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/ssl.pyR   X   s    c         C   s   |  j  j ƒ  } | d =| S(   NR   (   t   __dict__t   copy(   R
   t   d(    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/ssl.pyt   __getstate__c   s    c         C   s   | |  _  d  S(   N(   R   (   R
   t   state(    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/ssl.pyt   __setstate__i   s    c         C   s   |  j  S(   s(   
        Return an SSL context.
        (   R   (   R
   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/ssl.pyR   m   s    N(   R   R   R   R   R   R    t   SSLv23_METHODt   ContextR   R   R!   R#   R   (    (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/ssl.pyR   ;   s   			t   ClientContextFactoryc           B   s/   e  Z d  Z d Z e j Z e j Z d „  Z	 RS(   s"   A context factory for SSL clients.i   c         C   s&   |  j  |  j ƒ } | j t j ƒ | S(   N(   R   t   methodR   R    R   (   R
   R   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/ssl.pyR      s    (
   R   R   R   R   R    R$   R'   R%   R   R   (    (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/ssl.pyR&   t   s
   		t   Clientc           B   s^   e  Z d  Z e e j g  e e j ƒ D] Z	 e	 e j
 k r% e	 ^ q% Œ d d „ Z d „  Z RS(   s   
    I am an SSL client.
    c         C   s,   | |  _  t j j |  | | | | | ƒ d  S(   N(   t
   ctxFactoryR   R(   R   (   R
   t   hostt   portt   bindAddressR)   t	   connectort   reactor(    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/ssl.pyR      s    	c         C   s.   |  j  |  j ƒ |  j ƒ  t j j |  ƒ d  S(   N(   t   startTLSR)   t   startWritingR   R(   t   _connectDone(   R
   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/ssl.pyR1   ”   s    
N(   R   R   R   R   R   t   ISSLTransportR   R   R(   t   it   ITLSTransportR   R   R1   (    (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/ssl.pyR(   ‡   s
   	2t   Serverc           B   s$   e  Z d  Z e e j ƒ d „  Z RS(   s   
    I am an SSL server.
    c         O   s-   t  j j |  | | Ž |  j |  j j ƒ d  S(   N(   R   R5   R   R/   t   serverR)   (   R
   t   argst   kwargs(    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/ssl.pyR   ¡   s    (   R   R   R   R   R   R2   R   (    (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/ssl.pyR5   ›   s   t   Portc           B   s&   e  Z d  Z e Z d d d d „ Z RS(   s   
    I am an SSL port.
    i2   t    c         C   s,   t  j j |  | | | | | ƒ | |  _ d  S(   N(   R   R9   R   R)   (   R
   R+   t   factoryR)   t   backlogt	   interfaceR.   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/ssl.pyR   ­   s    N(   R   R   R   R5   t	   transportR   R   (    (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/ssl.pyR9   §   s   t	   Connectorc           B   s   e  Z d d  „ Z d „  Z RS(   c         C   s/   | |  _  t j j |  | | | | | | ƒ d  S(   N(   t   contextFactoryR   R?   R   (   R
   R*   R+   R;   R@   t   timeoutR,   R.   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/ssl.pyR   ´   s    	c         C   s(   t  |  j |  j |  j |  j |  |  j ƒ S(   N(   R(   R*   R+   R,   R@   R.   (   R
   (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/ssl.pyt   _makeTransport¹   s    N(   R   R   R   R   RB   (    (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/ssl.pyR?   ³   s   (   t   DistinguishedNamet   DNt   Certificate(   t   CertificateRequestt   PrivateCertificate(   t   KeyPair(   t   OpenSSLCertificateOptionsRC   RD   RE   RF   RG   RH   t   CertificateOptionsN(    (    (    R   t   Falset	   supportedt   OpenSSLR    t   zope.interfaceR   R   R   t   twisted.internetR   R   R   R   R   R   R&   R(   R5   R9   R?   t   twisted.internet._sslverifyRC   RD   RE   RF   RG   RH   RI   RJ   t   __all__t   True(    (    (    s8   /usr/lib/python2.7/dist-packages/twisted/internet/ssl.pyt   <module>   s*   "
9			