ó
%}Xc           @   s/  d  d l  Z  d  d l Z d  d l Z d  d l Z d  d l Z d  d l m Z m Z m Z m	 Z	 d  d l
 m Z m Z y d  d l Z Wn e k
 r d Z n Xd d d d d g Z d	 j ƒ  j ƒ  Z y e j j Z e j Z Wn e k
 rû e Z Z n Xe d k	 oe e e f k Z y d  d
 l m Z m Z WnU e k
 r‹y$ d  d l m Z d  d l m Z WqŒe k
 r‡d Z d Z qŒXn Xe s«d e f d „  ƒ  YZ n  e sÉd d „ Z d „  Z n  d e f d „  ƒ  YZ d e f d „  ƒ  YZ  d d „ Z! d „  Z" e" d „  ƒ Z# d „  Z$ d „  Z% d S(   iÿÿÿÿN(   t   urllibt   http_clientt   mapt   filter(   t   ResolutionErrort   ExtractionErrort   VerifyingHTTPSHandlert   find_ca_bundlet   is_availablet
   cert_pathst
   opener_fors  
/etc/pki/tls/certs/ca-bundle.crt
/etc/ssl/certs/ca-certificates.crt
/usr/share/ssl/certs/ca-bundle.crt
/usr/local/share/certs/ca-root.crt
/etc/ssl/cert.pem
/System/Library/OpenSSL/certs/cert.pem
/usr/local/share/certs/ca-root-nss.crt
/etc/ssl/ca-bundle.pem
(   t   CertificateErrort   match_hostname(   R   (   R   R   c           B   s   e  Z RS(    (   t   __name__t
   __module__(    (    (    s:   /usr/lib/python2.7/dist-packages/setuptools/ssl_support.pyR   5   s   i   c   
      C   sR  g  } |  s t  S|  j d ƒ } | d } | d } | j d ƒ } | | k rg t d t |  ƒ ƒ ‚ n  | sƒ |  j ƒ  | j ƒ  k S| d k rŸ | j d ƒ nY | j d ƒ s½ | j d ƒ rÖ | j t j	 | ƒ ƒ n" | j t j	 | ƒ j
 d d	 ƒ ƒ x$ | D] } | j t j	 | ƒ ƒ qÿ Wt j d
 d j | ƒ d t j ƒ }	 |	 j | ƒ S(   sp   Matching according to RFC 6125, section 6.4.3

        http://tools.ietf.org/html/rfc6125#section-6.4.3
        t   .i    i   t   *s,   too many wildcards in certificate DNS name: s   [^.]+s   xn--s   \*s   [^.]*s   \As   \.s   \Z(   t   Falset   splitt   countR   t   reprt   lowert   appendt
   startswitht   ret   escapet   replacet   compilet   joint
   IGNORECASEt   match(
   t   dnt   hostnamet   max_wildcardst   patst   partst   leftmostt	   remaindert	   wildcardst   fragt   pat(    (    s:   /usr/lib/python2.7/dist-packages/setuptools/ssl_support.pyt   _dnsname_match;   s*    

"&c         C   s[  |  s t  d ƒ ‚ n  g  } |  j d d ƒ } xC | D]; \ } } | d k r4 t | | ƒ r_ d S| j | ƒ q4 q4 W| sß xc |  j d d ƒ D]L } xC | D]; \ } } | d k r™ t | | ƒ rÄ d S| j | ƒ q™ q™ WqŒ Wn  t | ƒ d k rt d | d	 j t t | ƒ ƒ f ƒ ‚ n; t | ƒ d k rKt d
 | | d f ƒ ‚ n t d ƒ ‚ d S(   s=  Verify that *cert* (in decoded format as returned by
        SSLSocket.getpeercert()) matches the *hostname*.  RFC 2818 and RFC 6125
        rules are followed, but IP addresses are not accepted for *hostname*.

        CertificateError is raised on failure. On success, the function
        returns nothing.
        s   empty or no certificatet   subjectAltNamet   DNSNt   subjectt
   commonNamei   s&   hostname %r doesn't match either of %ss   , s   hostname %r doesn't match %ri    s=   no appropriate commonName or subjectAltName fields were found(    (    (	   t
   ValueErrort   getR)   R   t   lenR   R   R   R   (   t   certR    t   dnsnamest   sant   keyt   valuet   sub(    (    s:   /usr/lib/python2.7/dist-packages/setuptools/ssl_support.pyR   o   s.    %c           B   s    e  Z d  Z d „  Z d „  Z RS(   s=   Simple verifying handler: no auth, subclasses, timeouts, etc.c         C   s   | |  _  t j |  ƒ d  S(   N(   t	   ca_bundlet   HTTPSHandlert   __init__(   t   selfR7   (    (    s:   /usr/lib/python2.7/dist-packages/setuptools/ssl_support.pyR9   ›   s    	c            s   ˆ  j  ‡  f d †  | ƒ S(   Nc            s   t  |  ˆ  j |  S(   N(   t   VerifyingHTTPSConnR7   (   t   hostt   kw(   R:   (    s:   /usr/lib/python2.7/dist-packages/setuptools/ssl_support.pyt   <lambda>¡   s    (   t   do_open(   R:   t   req(    (   R:   s:   /usr/lib/python2.7/dist-packages/setuptools/ssl_support.pyt
   https_openŸ   s    (   R   R   t   __doc__R9   RA   (    (    (    s:   /usr/lib/python2.7/dist-packages/setuptools/ssl_support.pyR   ˜   s   	R;   c           B   s    e  Z d  Z d „  Z d „  Z RS(   s@   Simple verifying connection: no auth, subclasses, timeouts, etc.c         K   s    t  j |  | |  | |  _ d  S(   N(   t   HTTPSConnectionR9   R7   (   R:   R<   R7   R=   (    (    s:   /usr/lib/python2.7/dist-packages/setuptools/ssl_support.pyR9   ¨   s    c         C   sì   t  j |  j |  j f t |  d d  ƒ ƒ } t |  d ƒ rj t |  d d  ƒ rj | |  _ |  j ƒ  |  j	 } n	 |  j } t
 j | d t
 j d |  j ƒ|  _ y t |  j j ƒ  | ƒ Wn4 t k
 rç |  j j t  j ƒ |  j j ƒ  ‚  n Xd  S(   Nt   source_addresst   _tunnelt   _tunnel_hostt	   cert_reqst   ca_certs(   t   sockett   create_connectionR<   t   portt   getattrt   Nonet   hasattrt   sockRE   RF   t   sslt   wrap_sockett   CERT_REQUIREDR7   R   t   getpeercertR   t   shutdownt	   SHUT_RDWRt   close(   R:   RO   t   actual_host(    (    s:   /usr/lib/python2.7/dist-packages/setuptools/ssl_support.pyt   connect¬   s    $!	
	(   R   R   RB   R9   RX   (    (    (    s:   /usr/lib/python2.7/dist-packages/setuptools/ssl_support.pyR;   ¥   s   	c         C   s"   t  j j t |  p t ƒ  ƒ ƒ j S(   s@   Get a urlopen() replacement that uses ca_bundle for verification(   R    t   requestt   build_openerR   R   t   open(   R7   (    (    s:   /usr/lib/python2.7/dist-packages/setuptools/ssl_support.pyR
   È   s    	c            s"   t  j ˆ  ƒ ‡  f d †  ƒ } | S(   Nc             s+   t  ˆ  d ƒ s$ ˆ  |  | Ž  ˆ  _ n  ˆ  j S(   Nt   always_returns(   RN   R\   (   t   argst   kwargs(   t   func(    s:   /usr/lib/python2.7/dist-packages/setuptools/ssl_support.pyt   wrapperÑ   s    (   t	   functoolst   wraps(   R_   R`   (    (   R_   s:   /usr/lib/python2.7/dist-packages/setuptools/ssl_support.pyt   onceÐ   s    c             sn   y d d  l  }  Wn t k
 r$ d  SXd |  j f ‡  f d †  ƒ  Y‰  ˆ  ƒ  } | j d ƒ | j d ƒ | j S(   Niÿÿÿÿt   CertFilec              s&   e  Z ‡  f d  †  Z ‡  f d †  Z RS(   c            s'   t  ˆ  |  ƒ j ƒ  t j |  j ƒ d  S(   N(   t   superR9   t   atexitt   registerRV   (   R:   (   Rd   (    s:   /usr/lib/python2.7/dist-packages/setuptools/ssl_support.pyR9   á   s    c            s/   y t  ˆ  |  ƒ j ƒ  Wn t k
 r* n Xd  S(   N(   Re   RV   t   OSError(   R:   (   Rd   (    s:   /usr/lib/python2.7/dist-packages/setuptools/ssl_support.pyRV   å   s    (   R   R   R9   RV   (    (   Rd   (    s:   /usr/lib/python2.7/dist-packages/setuptools/ssl_support.pyRd   à   s   t   CAt   ROOT(   t   wincertstoret   ImportErrorRM   Rd   t   addstoret   name(   Rk   t	   _wincerts(    (   Rd   s:   /usr/lib/python2.7/dist-packages/setuptools/ssl_support.pyt   get_win_certfileÙ   s    	c          C   s4   t  t j j t ƒ }  t ƒ  p3 t |  d ƒ p3 t ƒ  S(   s*   Return an existing CA bundle path, or NoneN(	   R   t   ost   patht   isfileR	   Rp   t   nextRM   t   _certifi_where(   t   extant_cert_paths(    (    s:   /usr/lib/python2.7/dist-packages/setuptools/ssl_support.pyR   ñ   s    	c           C   s5   y t  d ƒ j ƒ  SWn t t t f k
 r0 n Xd  S(   Nt   certifi(   t
   __import__t   whereRl   R   R   (    (    (    s:   /usr/lib/python2.7/dist-packages/setuptools/ssl_support.pyRu   û   s    (&   Rq   RI   Rf   R   Ra   t   setuptools.extern.six.movesR    R   R   R   t   pkg_resourcesR   R   RP   Rl   RM   t   __all__t   stripR   R	   RY   R8   RC   t   AttributeErrort   objectR   R   R   t   backports.ssl_match_hostnameR.   R)   R   R;   R
   Rc   Rp   R   Ru   (    (    (    s:   /usr/lib/python2.7/dist-packages/setuptools/ssl_support.pyt   <module>   sP   "
	4)#			
