
Lac           @   s  d  Z  d d l Z d d l Z d d l Z d d l Z d d l Z d d l Z d d l Z d d l Z d d l	 Z	 y d d l
 m Z Wn! e k
 r d d l m Z n Xd d l Z d d l m Z e j e  Z d   Z d   Z e j d d	  e j d d
  e j d d  e j d e j e j B Z i d d 6d d 6d d 6d d 6d d 6j Z d   Z d   Z e j d e j  Z e j d e j  Z  e j d e j  Z! e j d e j  Z" d   Z# d   Z$ d   Z% d   Z& d    Z' d! e( f d"     YZ) d#   Z* d$   Z+ d% d&  Z, d'   Z- d(   Z. d)   Z/ d*   Z0 d+   Z1 y& d d, l2 m3 Z3 d-   Z4 d.   Z5 Wn e k
 re* Z4 e1 Z5 n Xd S(/   s6   minimal PyPI like server for use with pip/easy_installiN(   t   quotei   (   t   Configurationc    
         s  t  |    } t j d |  | j d k rC t j j d  | _ n  t | j t	 t
 f  rd | j n	 | j g   g    D] } t j j |  ^ qw   x`   D]X } y t j |  Wq t k
 r t j   d } d } t j | | | f  q Xq W  f d   }   d | _ | j s)g  | _ n  t | j  s| j rr| j d k rrd d	 l m } | | j  } n d | _ } t j t |  | _ n  yj | j sd
 | _ t j t d
  j d  | _ n3 t  j! | j d d d  } | j"   | _ Wd QXWn* t# k
 r-t j$ d | j d d n X| j% d k rId | _% n  | j& ry t' j( }	 Wn) t) k
 rd d d d d d g }	 n X| j& |	 k rt j d | j& |	 f  qn  t j d |  | | f S(   s6   
    :return: a 2-tuple (Configure, package-list)
    s   +++Pypiserver invoked with: %ss
   ~/packagesi   s(   Error: while trying to list root(%s): %sc             s&   t  j g    D] }  t |   ^ q   S(   N(   t	   itertoolst   chaint   listdir(   t   r(   t   roots(    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/core.pyt   <lambda>.   t    i    t   .i(   t   HtpasswdFiles   welcome.htmls   utf-8R   t   encodingNs    Could not load welcome-file(%s)!t   exc_infos   https://pypi.org/simplet   md5t   sha1t   sha224t   sha256t   sha384t   sha512s    Hash-algorithm %s not one of: %ss   +++Pypiserver started with: %s(*   R   t   logt   infot   roott   Nonet   ost   patht
   expandusert
   isinstancet   listt   tuplet   abspathR   t   OSErrort   sysR   t   exitt   authenticatedt   callablet   authert   password_filet   passlib.apacheR
   t	   functoolst   partialt   auth_by_htpasswd_filet   welcome_filet   pkg_resourcest   resource_stringt   __name__t   decodet   welcome_msgt   iot   opent   readt	   Exceptiont   warningt   fallback_urlt	   hash_algot   hashlibt   algorithms_availablet   AttributeError(
   t   kwdst   cR   t   errt   msgt   packagesR
   t   htPsswdFilet   fdt   halgos(    (   R   sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/core.pyt	   configure   sX    -%				 c         C   s*   |  d k	 r& |  j   |  j | |  Sd S(   s   The default ``config.auther``.N(   R   t   load_if_changedt   check_password(   R>   t   usernamet   password(    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/core.pyR(   [   s    
s   application/octet-streams   .eggs   .whls
   text/plains   .ascs   (\d+ | [a-z]+ | \.| -)R:   t   pret   previews   final-t   -t   rct   @t   devc         c   sn   xb t  j |   D]Q } t | |  } | d k r7 q n  | d  d k rX | j d  Vq d | Vq Wd Vd  S(	   NR   R	   i   t
   0123456789i   t   *s   *final(   R   R	   (   t   component_ret   splitt   replacet   zfill(   t   st   part(    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/core.pyt   _parse_version_partsm   s    c         C   ss   g  } x` t  |  j    D]L } | j d  rX x' | rT | d d k rT | j   q1 Wn  | j |  q Wt |  S(   NRM   it   00000000(   RT   t   lowert
   startswitht   popt   appendR   (   RR   t   partsRS   (    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/core.pyt   parse_versionz   s    sj   (\.zip|\.tar\.gz|\.tgz|\.tar\.bz2|-py[23]\.\d-.*|\.win-amd64-py[23]\.\d\..*|\.win32-py[23]\.\d\..*|\.egg)$s   ^(?P<namever>(?P<name>.+?)-(?P<ver>\d.*?))
    ((-(?P<build>\d.*?))?-(?P<pyver>.+?)-(?P<abi>.+?)-(?P<plat>.+?)
    \.whl|\.dist-info)$s   -\d+[a-z_.!+]sB   [\.\-](?=cp\d|py\d|macosx|linux|sunos|solaris|irix|aix|cygwin|win)c         C   sl   t  j |   } | s d S| j d  } | j d  } | j d  } | r^ | | d | f S| | f Sd  S(   Nt   namet   vert   buildRH   (   NN(   t   wheel_file_ret   matchR   t   group(   t   basenamet   mR\   R]   R^   (    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/core.pyt    _guess_pkgname_and_version_wheel   s    c         C   s.  t  j j |   }  |  j d  r3 |  j d  }  n  |  j d  rL t |   St j |   s_ d  St j d |   }  d |  k r |  d } } n |  j	 d  d k r |  j
 d d  \ } } ng d |  k r |  j d d  \ } } n@ t j
 |   d } |  t |  d } t j
 |  } | d } | | f S(   Ns   .ascs   .whlR   RH   i   R	   i    (   R   R   Rb   t   endswitht   rstripRd   t   _archive_suffix_rxt   searcht   subt   countRO   t   rsplitt   _pkgname_ret   lent   _pkgname_parts_re(   R   t   pkgnamet   versiont   ver_specRZ   (    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/core.pyt   guess_pkgname_and_version   s&    

c         C   s   t  j d d |   j   S(   s   Perform PEP 503 normalizations   [-_.]+RH   (   t   reRi   RV   (   R\   (    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/core.pyt   normalize_pkgname   s    c         C   s   t  t j d d |   j    S(   sD   Perform PEP 503 normalization and ensure the value is safe for URLs.s   [-_.]+RH   (   R    Rs   Ri   RV   (   R\   (    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/core.pyt   normalize_pkgname_for_url   s    c         C   s,   |  j  d d  } | j d  p* d | k S(   Ns   \t   /R	   s   /.(   RP   RW   (   t	   path_partt   p(    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/core.pyt   is_allowed_path   s    t   PkgFilec        
   B   sS   e  Z d  d d d d d d d d d	 g
 Z d d d d d
  Z d   Z d   Z RS(   t   fnR   t   _fname_and_hasht   relfnt
   relfn_unixt   pkgname_normRo   Rp   t   parsed_versiont   replacesc         C   s   | |  _  t |  |  _ | |  _ t |  |  _ | |  _ | |  _ | |  _ | d  k r] d  n | j
 d d  |  _ | |  _ d  S(   Ns   \Rv   (   Ro   Rt   R   Rp   R[   R   R{   R   R}   R   RP   R~   R   (   t   selfRo   Rp   R{   R   R}   R   (    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/core.pyt   __init__   s    					'c         C   sO   d |  j  j d j g  t |  j  D]" } d | t |  | d  f ^ q"  f S(   Ns   %s(%s)s   , s   %s=%rR8   (   t	   __class__R,   t   joint   sortedt	   __slots__t   getattr(   R   t   k(    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/core.pyt   __repr__   s    		c         C   sS   t  |  d  sL | r= d |  j | t |  j |  f |  _ qL |  j |  _ n  |  j S(   NR|   s   %s#%s=%s(   t   hasattrR~   t   digest_fileR{   R|   (   R   R5   (    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/core.pyt   fname_and_hash   s    %N(   R,   t
   __module__R   R   R   R   R   (    (    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/core.pyRz      s   			c   	      c   s  t  j j |   }  x t  j |   D] \ } } } g  | D] } t |  r8 | ^ q8 | (x | D] } t  j j |  | |  } t |  s^ t  j j |  r q^ n  t |  } | s q^ n  | \ } } | r^ t d | d | d | d |  d | t	 |   d  Vq^ q^ Wq" Wd  S(   NRo   Rp   R{   R   R}   i   (
   R   R   R   t   walkRy   R   t   isfileRr   Rz   Rm   (	   R   t   dirpatht   dirnamest	   filenamest   xR{   t   resRo   Rp   (    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/core.pyt   _listdir   s     & c         C   s   g  } yX t  |   F } g  d   | j   D D]" } | r/ | j d  r/ | ^ q/ } Wd QXWn% t k
 r t j d |     n X| S(   s   
    Read the contents of `filename`, stripping empty lines and '#'-comments.
    Return a list of strings, containing the lines of the file.
    c         s   s   |  ] } | j    Vq d  S(   N(   t   strip(   t   .0t   ln(    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/core.pys	   <genexpr>  s    t   #NsU   Failed to read package blacklist file "%s". Aborting server startup, please fix this.(   R0   t	   readlinesRW   R2   R   t   error(   t   filenamet   linest   ft   line(    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/core.pyt
   read_lines  s    ,	R   c         c   sA   t  |  } x. |  D]& } | r4 | j | k r4 q n  | Vq Wd  S(   N(   Rt   R   (   t   pkgst   prefixR   (    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/core.pyt   find_packages  s
    c         C   s:   t    } x* |  D]" } | j r | j | j  q q W| S(   N(   t   setRo   t   addR   (   R   t   normalized_pkgnamesR   (    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/core.pyt   get_prefixes"  s
    		c         C   s7   d | k s t   t j j |  |  } t j j |  S(   NRv   (   t   AssertionErrorR   R   R   t   exists(   R   R   t   dest_fn(    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/core.pyR   *  s    c         C   s;   d | k s t   t j j |  |  } | | d t d  S(   NRv   t	   overwrite(   R   R   R   R   t   True(   R   R   t   save_methodR   (    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/core.pyt   store0  s    c         C   s^   |  j  } | j d  r% | d  } n  | j d d  d } t |  } | d j |  7} | S(   s    Get the path for a bad root url.Rv   ii   i    s   /simple/{}/(   t   custom_fullpathRe   Rk   R    t   format(   t   requestR   Rx   (    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/core.pyt   get_bad_url_redirect_path6  s    	c            sm   d   t  t |    } t |  d  :  x0 t    f d   d  D] } | j |  qF WWd QX| j   S(   s   
    Reads and digests a file according to specified hashing-algorith.

    :param str sha256: any algo contained in :mod:`hashlib`
    :return: <hash_algo>=<hex_digest>

    From http://stackoverflow.com/a/21565932/548792
    i   i   t   rbc              s    j     S(   N(   R1   (    (   t	   blocksizeR   (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/core.pyR   M  R   R   Ni   (   R   R6   R0   t   itert   updatet	   hexdigest(   t   fpathR5   t   digestert   block(    (   R   R   sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/core.pyt   _digest_fileA  s    	"(   t   cache_managerc         C   s   t  j |  t  S(   N(   R   R   R   (   R   (    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/core.pyR   U  s    c         C   s   t  j |  | t  S(   N(   R   R   R   (   R   R5   (    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/core.pyR   Y  s    (6   t   __doc__R&   R6   R/   R   t   loggingt	   mimetypesR   Rs   R   t   urllib.parseR    t   ImportErrort   urllibR*   R   R   t	   getLoggerR,   R   RA   R(   t   add_typet   compilet   It   VERBOSERN   t   getRP   RT   R[   Rg   R_   Rl   Rn   Rd   Rr   Rt   Ru   Ry   t   objectRz   R   R   R   R   R   R   R   R   t   cacheR   R   R   (    (    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/core.pyt   <module>   sp   	@	,							&								