
    q&fO                         d dl Z d dlZd dlZddlmZ ddlmZmZmZm	Z	m
Z
mZmZmZmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlm Z m!Z"m#Z#m$Z$ ddl%m&Z& d	 Z'd
 Z(d Z)d Z*ddZ+d Z,	 ddZ- G d d      Z.y)    N   )_   )	ErrorResponseHTTP_SERVER_ERROR	cspvaluesget_contact	get_mtimeismember	paritygen
staticfilestatusmessage)configitemsencodingerror
extensionshgpathutil	profilingpycompatrcutil	registrarscmutil	templatertemplateutiluiutil)	hgweb_modrequestwebutilwsgicgi)dateutilc                     | D cg c]+  \  }}t        j                  |      j                  d      |f- c}}S c c}}w )N   /)r   pconvertstrip)itemsnamepaths      >/usr/lib/python3/dist-packages/mercurial/hgweb/hgwebdir_mod.py
cleannamesr+   7   s3    FKL
dT]]4 &&t,d3LLLs   0:c                    g }t        |       D ]  \  }}t        j                  j                  |      \  }}	 ddd|   }t        j                  j                  t        j                  |            }t        j                  |d|      } |j                  t        |||               |S # t        $ r |j                  ||f       Y w xY w)NFT)   *s   **)	followsymrecurse)r+   osr)   splitKeyErrorappendnormpathr   abspathr   	walkreposextendurlrepos)pathsreposprefixrootrootheadroottailr/   s          r*   	findreposr?   ;   s    E"5) 8WW]]40(
	"40:G 77##DLL$:;!!(dGLXfh678 L  	LL&$(	s   B))CCc              #      K   |D ]j  }t         j                  j                  |      }| dz   t        j                  |t        |      d       j                  d      z   j                  d      |f l yw)a  yield url paths and filesystem paths from a list of repo paths

    >>> conv = lambda seq: [(v, util.pconvert(p)) for v,p in seq]
    >>> conv(urlrepos(b'hg', b'/opt', [b'/opt/r', b'/opt/r/r', b'/opt']))
    [('hg/r', '/opt/r'), ('hg/r/r', '/opt/r/r'), ('hg', '/opt')]
    >>> conv(urlrepos(b'', b'/opt', [b'/opt/r', b'/opt/r/r', b'/opt']))
    [('r', '/opt/r'), ('r/r', '/opt/r/r'), ('', '/opt')]
    r$   N)r0   r)   r4   r   r%   lenlstripr&   )r;   r=   r9   r)   s       r*   r8   r8   N   sk       ww%TMDMM$s8}*?@GGMM
%+t 	s   A1A3c                     |j                   }| j                  ddd      }|r|rt        | ||      ry| j                  ddd      }|rt        | ||      ryy)a  Check allow_read and deny_read config options of a repo's ui object
    to determine user permissions.  By default, with neither option set (or
    both empty), allow all users to read the repo.  There are two ways a
    user can be denied read access:  (1) deny_read is not empty, and the
    user is unauthenticated or deny_read contains user (or *), and (2)
    allow_read is not empty and the user is not in allow_read.  Return True
    if user is allowed to read the repo, else return False.   webs	   deny_readT	untrustedFs
   allow_read)
remoteuser
configlistr   )r   requser	deny_read
allow_reads        r*   readallowedrM   ^   s\     >>DfldCI$(2tY"?v}EJ"dJ7    c              #     K   | j                  dd      }| j                  dd      }t               }t               }|D ]  \  }}	|j                  |      s|t        |      d  }d}
d|v ri|s0|j	                  d      }|d   }|snM||v rN||v rnCd}
|}dj                  |dd        }|	d t        |       dz
   }		 t        j                  | |	       d}
|j                  j                  d      |j                  d      |j                  d      g}ddj                  d	 |D              z   dz   }|
r}	 t        |	      t        j                         d   f}d
d
|dz   ||d
d
||d   |d   z
  t#        j$                  g       dt#        j&                  g d      d}|j)                  |       | o| j+                         t-        j.                         r1	 j1                  t2        j4                  j                  |	dd             t<        j>                  ffd	}j                  ddd      rtA        |      s	 t        j                  | |	      }	 t        |jB                        t        j                         d   f}tE        |      } |dd      }|j)                  |        |dd|      }jG                  ddd      }|xs d|jI                         xs d||||xs d|jI                         xs d||d   |d   z
  tK        jL                  d|      d t#        j&                  |d      d}|  y # t        t        j                  f$ r Y w xY w# t         $ r Y &w xY w# t6        $ r*}j9                  t;        d      |	|fz         Y d }~Xd }~ww xY w# t        $ r! j9                  t;        d      |	z         Y t        j                  $ r! j9                  t;        d      |	z         Y w xY w# t         $ r Y w xY ww)NrD   s   descends   collapseFr$   r   Tr   c              3   &   K   | ]	  }|s|  y wN ).0ps     r*   	<genexpr>z"rawindexentries.<locals>.<genexpr>   s     5Q1q5s   rN   s   label)r(   )   contacts   contact_sort   names	   name_sort   url   descriptions   description_sort
   lastchanges   lastchange_sorts   archivess   isdirectory   labelss   .hgs   hgrcs   error reading %s/.hg/hgrc: %s
c                 .    j                  | ||d      S )NTrE   )config)sectionr(   defaultus      r*   getzrawindexentries.<locals>.get   s    88GT7d8CCrN   s   hiddenrE   s!   error accessing repository at %s
rY   rW   r[   s   unknowns   tip)'
configboolset
startswithrA   r1   joinr   
repositoryIOErrorr   	RepoErrorapppathr&   r
   r"   makedateOSErrorr   mappinglist
hybridlistaddcopyr   use_repo_hgrc
readconfigr0   r)   	Exceptionwarnr   uimod_unsetrM   spathr	   rH   upperr    archivelist)r   r:   rI   subdirdescendcollapse	seenreposseendirsr(   r)   	directory	namepartsrootname	discardedpartsurldrowera   rcontactdescriptionlabelsr`   s                           @r*   rawindexentriesr   u   s    mmFJ/G}}V[1HIuH {
dv&CKM"	4<

4(I |HX%Y& 	 !IIim4	 1s9~o12MM"d+ %I
 KKd#LLJJt

 TYY5%555< t_h&7&7&9!&<=  !$" #%( $%aD1Q4K)55b9 $'222HEC LLIGGI!RWW\\$@A
 (-|| 	D <<	T<:1c"	b$'A	177#X%6%6%8%;<A c"&.1d67D)fi4@-:$]]_:
'5:!,!2!2!4!B
 !!qt ,,Q< #..vHE
 	w{B  1   8  q;<ayHI   	FF1:;dBC 	FF1:;dBC	
  		s   B8P<L8AP1"MA>P0M(9P<N,O=?B9P8MPMP	M%!P$M%%P(	N1NPNP&O:P/O:6P9O::P=	P
P	P

Pc              #      K   t        ||||      }d}	|r|	||fk7  rd|z  t        |fd|      }t        |t        |            D ]  \  }
}||
d<   |
  y w)N)ry   NFs   %s_sortc                     |    S rQ   rR   )xsortkeys    r*   <lambda>z"_indexentriesgen.<locals>.<lambda>  s    !G* rN   )keyreverses   parity)r   sortedzipr   )contextr   r:   rI   stripecount
sortcolumn
descendingry   rowssortdefaultr   parityr   s               @r*   _indexentriesgenr      ss      2uc&9DKkj*%==z)d 4jI4;!78 VI	s   AAc                 J    | ||||||f}t        j                  t        |      S )N)args)r   mappinggeneratorr   )r   r:   rI   r   r   r   ry   r   s           r*   indexentriesr     s,     sKZHD(()9EErN   c                   D    e Zd ZdZddZd Zd Zd Zd Zd Z	dd	Z
d
 Zy)hgwebdirzHTTP server for multiple repositories.

    Given a configuration, different repositories will be served depending
    on the request path.

    Instances are typically used as WSGI applications.
    Nc                     || _         || _        d | _        d| _        d | _        | j                          d| _        |s?t        j                  | j                         t        j                  | j                         y y )Nr   )
confbaseuir   lastrefreshmotdrefreshrequests_countr   loadall
populateui)selfr   r   s      r*   __init__zhgwebdir.__init__  sc    		tww'!!$''* rN   c                    | j                   r| j                   j                  dd      }n"t        j                  d   d   }|j                  }|dkD  r%| j
                  |z   t        j                         kD  ry | j                  r| j                  j                         }nZt        j                   j                         }|j                  dddd       |j                  ddd	d       |j                  d
dd	d       t        | j                  t        t        t         f      sddi}t"        j$                  j'                  | j                        s+t)        j*                  t-        d      | j                  z        |j/                  | j                  |d       g }|j                  d      D ]/  \  }}|j1                  d|      D ]  }|j3                  ||f        1 nat        | j                  t        t         f      r| j                  }n4t        | j                  t              r| j                  j5                         }t7        j8                  |       t;              }	|j                  d      D ]  \  }
}t=        j>                  |
      }
tA        jB                  |d      D ]w  }t"        j$                  jE                  |      }t=        j>                  |      }|jG                  |
      r|tI        |
      d  }|	j3                  |jK                  d      |f       y  |	| _&        || _         | j                   j                  dd      | _'        d| _(        | j                   jS                  dd      tT        _*        | j                   jS                  dd      | _+        | j                   jS                  ddd      | _,        | j                   jS                  dd      | _-        | jZ                  rt]        | jZ                        | _-        | j                   jS                  dd      }
|
jG                  d      r|
dd  }
|
j_                  d      r|
d d }
|
| _0        t        j                         | _        y ) NrD   s   refreshintervalr   s   uis   report_untrusteds   offs   hgwebdirs   nonttys   trues   progresss   disables   hgwebs   pathss   hgweb-pathss   config file %s not found!T)remaptrusts   collections)r.   r$   s   experimentals    web.full-garbage-collection-rate   encoding   styles	   templatesFrE   s   stripess   prefixr   )1r   	configintr   	coreitemsr_   r   timer   ro   rt   load	setconfig
isinstancer   dictlisttupler0   r)   existsr   Abortr   rq   rH   r3   r'   r   r   r?   r   r%   r   r6   r4   rd   rA   rB   r:   gc_full_collect_rategc_full_collections_doner]   r   styletemplatepathr   intendswithr;   )r   refreshintervalitemr`   mapr9   r(   ignoredr)   r:   r;   r<   repos                r*   r   zhgwebdir.refresh%  s|   77"gg//8JKO((01CDD"llO a  ?2TYY[@;;  "AAKK2FKHKKy';? KKZ(C$))dD%%89^,C77>>$)),kk!$@"ADII"MNNLL#TL:E!"~!> /gLL> /DLL$.// 		D%=1IIE		4(IIOO%Ea % MM.9 	8LFD]]6*F))$$? 8ww''-}}T*??6*F.Ddkk$/678	8 
$(GG$5$5@%
! )*% GGNN6;?WW^^FH5
 GGNNLE + 
  77>>&*="4#3#34D	2T"ABZF??4 CR[F99;rN   c                     t         j                  j                  dd      j                  d      st	        d      t        j                  |        y )Ns   GATEWAY_INTERFACErN   s   CGI/1.sJ   This function is only intended to be called while running as a CGI script.)r   environra   rd   RuntimeErrorr!   launch)r   s    r*   runzhgwebdir.runl  sI    ##$8#>II
 9  	trN   c                     | j                   j                  dd      }t        j                  ||      }t        j                  ||      }| j                  ||      S )NrD      baseurl)
altbaseurl)r   r]   
requestmodparserequestfromenvwsgiresponserun_wsgi)r   envrespondbaseurlrI   ress         r*   __call__zhgwebdir.__call__v  sK    ''..4,,SWE%%c73}}S#&&rN   c              #     K   | j                   j                  dd      }t        j                  | j                   |      5  	 | j	                  ||      D ]  }|  	 | j
                  }| xj                  dz  c_        |dkD  r<| j                  |z  dk(  r*t        j                          | xj                  dz  c_	        nt        j                  d       	 d d d        y # | j
                  }| xj                  dz  c_        |dkD  r<| j                  |z  dk(  r*t        j                          | xj                  dz  c_	        w t        j                  d       w xY w# 1 sw Y   y xY ww)Ns	   profilings   enabled)enabledr   r   )
generation)
r   rb   r   profile_runwsgir   r   gccollectr   )r   rI   r   r   r   rates         r*   r   zhgwebdir.run_wsgi}  s-    ''$$\:>tww8 	--sC0 AG 00 ##q(#!8 3 3d :a ?JJL11Q61JJ!,7	- 	-  00 ##q(#!8 3 3d :a ?JJL11Q61JJ!,7	- 	-s7   >E) EC A9E	E) A:EEE&"E)c           	      @   | j                          t        | j                        \  }}|r||j                  d<   |j                  j                  d      | j                  ||      }	 |j                  ddt        j                  i      }d|_	        ||j                  d<   j                  d      sd|j                  v rmj                  d      rd	d  }n|j                  d   }| j                  j                  d
dd      }t        | j                  |||       |j                         ~S t!        | j"                        }	rdk(  r|	vr| j%                  |||      ~S j'                  d      r<|	vr8d t)        d        t+        fd|	D              r| j%                  |||      ~S fd}
 |
       D ]  }|	j-                  |      }|s|j.                  j1                         D ci c]  \  }}|j3                  d      | }}}t5        j6                  ||| j                  j                  d
d      |j8                        }	 t;        j<                  | j                  j?                         |      }tA        jB                  |      jE                  ||      c ~S  dz   |	D cg c]  }|j                        s| c}r| j%                  |||      ~S d|_	        |jW                  |jY                  ddi             |j                         ~S c c}}w # tF        $ r4}t        jH                  |jJ                        }tM        tN        |      d }~wtP        jR                  $ r}tM        tN        tU        |            d }~ww xY wc c}w # tL        $ rz}t[        |j\                  t_        j`                  |            |_	        |jW                  |jY                  dd|jb                  xs di             |j                         cY d }~~S d }~ww xY w# ~w xY w)Ns   Content-Security-Policyr$   s   mimetyper   s   200 Script output followss   Content-Types   static/s   static   rD   FrE      indexs   /indexc              3   @   K   | ]  }|j                          y wrQ   )rd   )rS   r   ry   s     r*   rU   z$hgwebdir._runwsgi.<locals>.<genexpr>  s     ;q||F+;s   c               3   R   K    t        j                        D ]  } |   y wrQ   )r   finddirs)rT   virtuals    r*   _virtualdirsz'hgwebdir._runwsgi.<locals>._virtualdirs  s+     !**73 AGs   $'latin1r   )reponamer   bodyfhs   404 Not Founds   notfounds   repos   errorrN   )2r   r   r   headersdispatchpathr&   r   renderr   statusrd   qsparamsr]   r   r   sendresponser   r:   	makeindexr   rA   anyra   rawenvr'   decoder   r   r   r   rf   ro   r   hgwebr   rg   
strtolocalstrerrorr   r   r   rh   bytes
setbodygengenerater   coder   bytestrmessage)r   rI   r   cspnoncetmplctypefnamestaticr:   r   virtualreporealkvuenvr   instmsgr   r   ry   r   s                        @@r*   r   zhgwebdir._runwsgi  s   tww'
U69CKK23""((.~~c5)P	KKk8;L;L-MNE 6CJ+0CKK( !!*-cll1J%%j1#ABKELL3E	UK4,,feSA'')B { $Ew(2u8L~~c35t m 	*we/C !1CM>2;U;;>>#sD&Af c  ,~ Lyy- ;>**:J:J:L26!Q*A-D  %88!,#'77>>&*#E  #zzCL!}}TWW\\^TB(t4==c3GG0 WL6 t^F 9aALL$89~~c3f=  *CJNN4==w6HIJ##% M # D&11$--@+,=sCC ?? L+,=uT{KKL
 :  	&&qvvx/?/?/BCCJNNh1993C(DE ##%%	& s   *CN .2N "AN /"N N /LA N AL N "
N ,NNN 9N N  	N)/MN.NNN 	PA.PPP PP Pc           	      \   | j                          g d}d\  }}d|j                  v r-|j                  d   }|j                  d      }|r|dd  }||vrd}|D cg c]  }d|z  d| xr ||k(  xr dxs d|fz  f  }	}| j                          t        | j                  | j
                  || j                  |||	      }
|
|t        j                  d
|z   | j                        ||d}|j                  |	       |j                  |j                  d|             |j                         S c c}w )N)rW   rY   rV   rZ   r   s   sort   -r   rN   s   sort_%ss   %s%s)r   r   ry   r$   )s   entriess   subdirs   pathdefs
   sortcolumns
   descendingr   )r   r   rd   r   r   r:   r   r   makebreadcrumbr;   updater   r   r   )r   rI   r   r  ry   sortabler   r   columnsortentriesmappings               r*   r   zhgwebdir.makeindex  sR   G!,
Jcll"g.J#..t4J'^
) 
 #

  V##^<*(<F$M#

 

 	GGJJ!!
  !00L%%
 	tt}}Xw78!!C

s   #D)c           	      ,     fdi }t        j                  | j                        \  }\  }}}||d   k(  r||d<   t        j                  |d      } dd      }	 dd      }
 dd      xs |j
                  j                  d	      d
z   }|j                  d	      s|d	z  }t        j                  |j
                  d	z   |	|
||||d}t        j                  |      } |dd       fd       }t        j                  j                  |||      S )Nc                  `    |j                  dd        j                  j                  | i |S )NrF   T)
setdefaultr   r]   )r   kwargsr   s     r*   r]   z"hgwebdir.templater.<locals>.config'  s-    k40!477>>42622rN   r   r      ?rD      logourl   logoimg	   staticurlr$   s   /static/)r   rX   r  r  r  s   sessionvarsr   s   nonce   motdrR   )requiresc              3   Z   K   j                   j                    y  dd       y w)NrD   r   )r   )r   r  r]   r   s     r*   r   z hgwebdir.templater.<locals>.motdH  s'     yy$iiVW--s   (+)fpdefaults)r   getstyler   r    sessionvarsri   rstripr   r   r   templatekeywordr   frommapfile)r   rI   r  varsstylesr   mapfiler#  r&  logourllogoimg	staticurlr$  r(  r   r]   s   `              @r*   r   zhgwebdir.templater&  s@   	3 '0'9'9**(
$$ F1I"DN))$5,,6<( 6{{!!$'+5 	 !!$'I "**KK$&#'	
 $33H=	2	.	. 
/	. ""..X / 
 	
rN   rQ   rN   )__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   rR   rN   r*   r   r     s4    +E'N'->Yv-"^+
rN   r   r0  )rN   FrN   )/r   r0   r   i18nr   commonr   r   r   r	   r
   r   r   r   r    r   r   r   r   r   r   r   r   r   r   r   r   r   r   rt   r   r   r   r   r    r!   utilsr"   r+   r?   r8   rM   r   r   r   r   rR   rN   r*   <module>r9     s    
 	  
 
 
    $  M& .@F" KNFB
 B
rN   