ó
éÐLac           @   s²  d  d l  m 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	 m
 Z
 d d l	 m Z d d l m Z m Z m Z m Z m Z m Z m Z y d  d l j Z Wn e k
 rÞ d  d l Z n Xy d  d l m Z Wn! e k
 rd  d l m Z n Xy d  d	 l m Z m Z Wn' e k
 rZd  d	 l m Z m Z n Xe j e ƒ Z  d Z" d Z# e ƒ  Z$ d
 e% f d „  ƒ  YZ& e$ j' d ƒ d „  ƒ Z( e$ j' d ƒ d „  ƒ Z) e$ j' d ƒ d „  ƒ Z* e$ j+ d „  ƒ Z, e$ j- d ƒ d „  ƒ Z. e$ j- d ƒ d „  ƒ Z/ e j0 d e j1 ƒ Z2 d „  Z3 d „  Z4 d „  Z5 e d d ƒ Z6 d „  Z7 e$ j8 d ƒ e& d ƒ d „  ƒ ƒ Z9 e$ j- d ƒ e$ j- d  ƒ e$ j- d! ƒ e& d" ƒ d d# „ ƒ ƒ ƒ ƒ Z: e$ j8 d$ ƒ e& d" ƒ d% „  ƒ ƒ Z; e$ j- d& ƒ e& d" ƒ d' „  ƒ ƒ Z< e$ j- d( ƒ e& d" ƒ d) d* „ ƒ ƒ Z= e$ j- d+ ƒ e& d" ƒ d, „  ƒ ƒ Z> e$ j- d- ƒ e& d. ƒ d/ „  ƒ ƒ Z? e$ j- d0 ƒ e$ j- d1 ƒ d2 „  ƒ ƒ Z@ d S(3   iÿÿÿÿ(   t
   namedtupleNi   (   t   __version__(   t   core(   t   static_filet   redirectt   requestt   responset	   HTTPErrort   Bottlet   template(   t   BytesIO(   t   StringIO(   t   urljoint   urlparset   authc           B   s    e  Z d  Z d „  Z d „  Z RS(   sP   decorator to apply authentication if specified for the decorated method & actionc         C   s   | |  _  d  S(   N(   t   action(   t   selfR   (    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/_app.pyt   __init__/   s    c            s   ‡  ‡ f d †  } | S(   Nc             s|   ˆ j  t j k ro t j s/ t j d d  k rK t d d i d d 6ƒ‚ n  t j t j Œ  so t d ƒ ‚ qo n  ˆ  |  | Ž  S(   Ni   i‘  t   headerss   Basic realm="pypi"s   WWW-Authenticatei“  (   R   t   configt   authenticatedR   R   t   NoneR   t   auther(   t   argst   kwargs(   t   methodR   (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/_app.pyt	   protector3   s    (    (   R   R   R   (    (   R   R   sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/_app.pyt   __call__2   s    
(   t   __name__t
   __module__t   __doc__R   R   (    (    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/_app.pyR   ,   s   	t   before_requestc           C   s   t  j t j t j ƒ d  S(   N(   t   logt   infoR   t   log_req_frmtR   t   environ(    (    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/_app.pyt   log_request@   s    c          C   sY   t  t j j d t j j ƒ }  |  j t _ |  j j d ƒ d t j j	 d ƒ t _
 d  S(   Ns   ://t   /(   R   R   t   urlpartst   schemet   netloct   custom_hostt   patht   rstript   fullpatht   lstript   custom_fullpath(   t   parsed(    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/_app.pyt   print_requestE   s     t   after_requestc           C   sF   t  j t j i t d 6t j d 6t j d 6t j d 6t j d 6ƒ d  S(   NR   t   statusR   t   bodyt   cookies(	   R    R!   R   t   log_res_frmtR   R2   R   R3   t   _cookies(    (    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/_app.pyt   log_responseN   s    


c         C   s   t  j t j t |  ƒ ƒ d  S(   N(   R    R!   R   t   log_err_frmtt   vars(   t
   http_error(    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/_app.pyt	   log_error\   s    s   /favicon.icoc           C   s
   t  d ƒ S(   Ni”  (   R   (    (    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/_app.pyt   favicona   s    R%   c          C   s‘   t  j }  y t t t ƒ  ƒ ƒ } Wn d } n Xt j d } t | d t  j j	 d ƒ d d t
 d | d |  j	 d ƒ d d	 |  j	 d ƒ d
 ƒS(   Ni    s   
t   URLR%   t   VERSIONt   NUMPKGSt   PACKAGESs
   /packages/t   SIMPLEs   /simple/(   R   R.   t   lent   listt   packagesR   t   welcome_msgR	   t   urlR+   R   (   t   fpt   numpkgst   msg(    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/_app.pyt   rootf   s    	
s   ^[a-z0-9_.!+-]+$c         C   s   t  j |  ƒ d k	 S(   s7   See https://github.com/pypiserver/pypiserver/issues/102N(   t   _bottle_upload_filename_ret   matchR   (   t   fname(    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/_app.pyt   is_valid_pkg_filename~   s    c          C   s   y t  j d }  Wn  t k
 r3 t d d ƒ ‚ n X|  j j ƒ  } y& t j t | ƒ ƒ } | j	 d ƒ Wn  t
 k
 r‹ t d d ƒ ‚ n Xd  S(   Nt   contenti  s   Missing 'content' file-field!s
   index.htmls   not a zip file(   R   t   filest   KeyErrorR   t   filet   readt   zipfilet   ZipFileR
   t   getinfot	   Exception(   RO   t   zip_datat   zf(    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/_app.pyt
   doc_uploadƒ   s    c             sÔ   t  j j d ƒ ‰  t  j j d ƒ ‰ ˆ  s2 ˆ rT d }  t d |  ˆ  ˆ f ƒ ‚ n  t t ‡  ‡ f d †  t j t ƒ  ƒ ƒ ƒ } t	 | ƒ d k r¯ t d d ˆ  ˆ f ƒ ‚ n  x | D] } t
 j | j ƒ q¶ Wd  S(	   Nt   namet   versions4   Missing 'name'/'version' fields: name=%s, version=%si  c            s   |  j  ˆ  k o |  j ˆ k S(   N(   t   pkgnameR\   (   t   pkg(   R[   R\   (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/_app.pyt   <lambda>˜   t    i    i”  s   %s (%s) not found(   R   t   formst   getR   RC   t   filterR   t   find_packagesRD   RB   t   ost   unlinkt   fn(   RI   t   pkgsR^   (    (   R[   R\   sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/_app.pyt
   remove_pkg   s    t   Uploads   pkg sigc          C   s|  t  j d „  d Dƒ ƒ }  |  j s4 t d d ƒ ‚ n  |  j r{ d |  j j |  j j k r{ t d d |  j |  j f ƒ ‚ n  xú |  D]ò } | s” q‚ n  t | j ƒ s¼ t j | j ƒ d  k rÕ t d d | j ƒ ‚ n  t
 j r#t j t j | j ƒ r#t j d	 | j ƒ t d
 d | j ƒ ‚ n  t j t j | j | j ƒ t j rXt j d } n d } t j d | | j ƒ q‚ Wd  S(   Nc         s   s$   |  ] } t  j j | d  ƒ Vq d  S(   N(   R   RP   Rb   R   (   t   .0t   f(    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/_app.pys	   <genexpr>§   s    RO   t   gpg_signaturei  s   Missing 'content' file-field!s   %s.ascs&   Unrelated signature %r for package %r!s   Bad filename: %ss]   Cannot upload %r since it already exists! 
  You may start server with `--overwrite` option. i™  sL   Package %r already exists!
  You may start server with `--overwrite` option.i    t   anons   User %r stored %r.(   RO   Rm   (   Rj   t   _makeR^   R   t   sigt   raw_filenameRN   R   t   guess_pkgname_and_versionR   R   t	   overwritet   existsRD   RJ   R    t   warnt   storet   saveR   R   R!   (   t   ufilest   uft   user(    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/_app.pyt   file_upload¥   s8    		"
	t   updatec          C   s¬   y t  j d }  Wn  t k
 r3 t d d ƒ ‚ n X|  d k rS t j d |  ƒ nU |  d k ri t ƒ  n? |  d k r t ƒ  n) |  d	 k r• t ƒ  n t d d
 |  ƒ ‚ d S(   Ns   :actioni  s   Missing ':action' field!t   verifyt   submits   Ignored ':action': %sRZ   Ri   R{   s   Unsupported ':action' field: %sR`   (   R}   R~   (	   R   Ra   RQ   R   R    t   warningRZ   Ri   R{   (   R   (    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/_app.pyR|   Ò   s    


s   /simples   /simple/:prefixs	   /packagesRC   c         C   s   t  t j d d ƒ S(   NR%   i-  (   R   R   R.   (   t   prefix(    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/_app.pyt   pep_503_redirectsè   s    s   /RPC2c          C   s  t  j j j t j ƒ }  |  j d ƒ d j d j j	 ƒ  } t
 j d | ƒ | d k r|  j d ƒ d j d j j	 ƒ  } g  } d } xn t ƒ  D]c } | j j | ƒ d k ré i | d 6| j d 6| j d 6| j d	 6} | j | ƒ n  | d
 7} q Wt j | f d d t ƒ} | Sd S(   s%   Handle pip-style RPC2 search requestst
   methodNamei    s    Processing RPC2 request for '%s't   searcht   stringt   _pypi_orderingR\   R[   t   summaryi   t   methodresponseN(   t   xmlt   domt   minidomt   parseR   R3   t   getElementsByTagNamet
   childNodest	   wholeTextt   stripR    R!   RD   R]   t   countR\   t   appendt	   xmlrpclibt   dumpst   True(   t   parsert
   methodnamet   valueR   t   orderingt   pt   dt   call_string(    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/_app.pyt
   handle_rpcð   s*    

s   /simple/c          C   s.   t  t j t ƒ  ƒ ƒ }  d } t | d |  ƒS(   Ns      <html>
        <head>
            <title>Simple Index</title>
        </head>
        <body>
            <h1>Simple Index</h1>
            % for p in links:
                 <a href="{{p}}/">{{p}}</a><br>
            % end
        </body>
    </html>
    t   links(   t   sortedR   t   get_prefixesRD   R	   (   R   t   tmpl(    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/_app.pyt   simpleindex  s    s   /simple/:prefix/R`   c         C   s  t  j |  ƒ } |  | k r1 t d j | ƒ d ƒ St t  j t ƒ  d |  ƒd d „  ƒ} | s˜ t j r‡ t d t j	 j
 d ƒ |  f ƒ St d d	 | ƒ St j } g  | D]: } t j j | j ƒ t | d
 | j t j ƒ ƒ f ^ q¨ } d } t | d |  d | ƒS(   Ns   /simple/{0}/i-  R€   t   keyc         S   s   |  j  |  j f S(   N(   t   parsed_versiont   relfn(   t   x(    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/_app.pyR_   3  R`   s   %s/%s/R%   i”  s   Not Found (%s does not exist)

s   ../../packages/%ss!      <html>
        <head>
            <title>Links for {{prefix}}</title>
        </head>
        <body>
            <h1>Links for {{prefix}}</h1>
            % for file, href in links:
                 <a href="{{href}}">{{file}}</a><br>
            % end
        </body>
    </html>
    R   (   R   t   normalize_pkgname_for_urlR   t   formatRž   Rd   RD   R   t   redirect_to_fallbackt   fallback_urlR+   R   R   R.   Re   R*   t   basenameR¤   R   t   fname_and_hasht	   hash_algoR	   (   R€   t
   normalizedRP   RG   Rl   R   R    (    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/_app.pyt   simple)  s     		Ds
   /packages/c          C   sw   t  j }  t t j t ƒ  ƒ d d „  ƒ} g  | D]* } | j t |  | j t	 j
 ƒ ƒ f ^ q1 } d } t | d | ƒS(   NR¢   c         S   s"   t  j j |  j ƒ |  j |  j f S(   N(   Re   R*   t   dirnameR¤   R]   R£   (   R¥   (    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/_app.pyR_   \  R`   s      <html>
        <head>
            <title>Index of packages</title>
        </head>
        <body>
            <h1>Index of packages</h1>
            % for file, href in links:
                 <a href="{{href}}">{{file}}</a><br>
            % end
        </body>
    </html>
    R   (   R   R.   Rž   R   Rd   RD   t
   relfn_unixR   R«   R   R¬   R	   (   RG   RP   Rl   R   R    (    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/_app.pyt   list_packagesV  s    	4s   /packages/:filename#.*#t   downloadc         C   s˜   t  j t ƒ  ƒ } xr | D]j } | j } | |  k r t |  d | j d t j |  ƒ d ƒ} t j	 r | j
 d d t j	 ƒ n  | Sq Wt d d |  ƒ S(   NRJ   t   mimetypei    s   Cache-Controls   public, max-age=%si”  s   Not Found (%s does not exist)

(   R   Rd   RD   R°   R   RJ   t	   mimetypest
   guess_typeR   t   cache_controlt
   set_headerR   (   t   filenamet   entriesR¥   Rl   R   (    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/_app.pyt   server_staticr  s    			s   /:prefixs	   /:prefix/c         C   s   t  t j t |  ƒ ƒ S(   s'   Redirect unknown root URLs to /simple/.(   R   R   t   get_bad_url_redirect_pathR   (   R€   (    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/_app.pyt   bad_url‡  s    (A   t   collectionsR    t   loggingR´   Re   t   reRT   t   xml.dom.minidomRˆ   R`   R   R   t   bottleR   R   R   R   R   R   R	   t   xmlrpc.clientt   clientR’   t   ImportErrort   ioR
   R   t   urllib.parseR   R   t	   getLoggerR   R    R   RD   R   t   appt   objectR   t   hookR$   R0   R7   t   errorR;   t   routeR<   RJ   t   compilet   IRK   RN   RZ   Ri   Rj   R{   t   postR|   R   Rœ   R¡   R®   R±   Rº   R¼   (    (    (    sJ   /var/www/html/packages/venv/lib/python3.8/site-packages/pypiserver/_app.pyt   <module>   st   4
						-	$	+