
    	^c3E                        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 ddlm	Z ddlmZmZ e	j        Ze	j        Ze	j        ZdZdZd	Zd
Ze
j        Zd Z ej        e
j                   G d d                      Zd Zd Zd Zd Z d Z!d Z"d Z# ej        e
j                   G d d                      Z$d Z% G d d          Z&dS )    N   )_)encodingerrorpycompatutilwireprototypeswireprotov1server)r   )compression
stringutil   s   application/mercurial-0.1s   application/mercurial-0.2s   application/hg-errorc                     g }d}	 | j                             d||fz            }|n-|                    t          j        |                     |dz  }Od                    |          S )zjDecode a long value from multiple HTTP request headers.

    Returns the value as a bytes, not a str.
    r   Ts   %s-%dN    )headersgetappendr   bytesurljoin)reqheaderprefixchunksivs        ;/usr/lib/python3/dist-packages/mercurial/wireprotoserver.pydecodevaluefromheadersr   )   sw    
 F	AKOOHa'88999h'**+++	Q 88Fr   c                   t    e Zd Zd Zed             Zd Zd Zd Zd Z	e
j        d             Zd Zd	 Zd
 ZdS )httpv1protocolhandlerc                 >    || _         || _        || _        d | _        d S N)_req_ui
_checkperm
_protocaps)selfr   ui	checkperms       r   __init__zhttpv1protocolhandler.__init__<   s"    	#r   c                     dS )Ns   http-v1 r$   s    r   namezhttpv1protocolhandler.nameB   s    zr   c                     |                                  }i |                                }|D ]S}|dk    r:i }|                                D ]}|dk    r||vr||         d         ||<   |d<   B||         d         |<   Tfd|D             S )N   *   cmdr   c                      g | ]
}|         S r)   r)   .0kdatas     r   
<listcomp>z1httpv1protocolhandler.getargs.<locals>.<listcomp>S       &&&AQ&&&r   )_argssplitkeys)r$   args	knownargsr8   r2   starkeyr3   s          @r   getargszhttpv1protocolhandler.getargsF   s    JJLL	zz|| 	* 	*ADyy$>>++ 6 6Cf}}D$-cN1$5S	!T

#A,q/Q&&&&&&&&r   c                    | j         j                                        }t          | j         j                            dd                    }|rN|                    t                              | j         j	        
                    |          d                     |S t          | j         d          }|                    t                              |d                     |S )N   X-HgArgs-Postr   T)keep_blank_valuess   X-HgArg)r    qsparamsasdictoflistsintr   r   updateurlreqparseqsbodyfhreadr   )r$   r9   postlenargvalues       r   r6   zhttpv1protocolhandler._argsU   s    y!//11di'++,<a@@AA 	KKI$))'22d     
 K)$)Z@@FNN8tNDDEEEr   c                     | j         <t          | j        d          }t          |                    d                    | _         | j         S )Ns	   X-HgProto    )r#   r   r    setr7   )r$   values     r   getprotocapsz"httpv1protocolhandler.getprotocapsd   s>    ?"*49lCCE!%++d"3"344DOr   c                     t          | j        j        d                   }|t          | j        j                            dd                    z  }t	          j        | j        j        |          S )Ns   Content-Lengthr?   r   )limit)rC   r    r   r   r   filechunkiterrG   )r$   lengths     r   
getpayloadz httpv1protocolhandler.getpayloadj   s_    TY&'89:: 	#di'++,<a@@AAA!$)"2&AAAAr   c              #     K   | j         j        }| j         j        }t          j                    }	 || j         _        || j         _        |V  || j         _        || j         _        d S # || j         _        || j         _        w xY wr   )r!   foutferrr   stringio)r$   oldoutolderrouts       r   mayberedirectstdioz(httpv1protocolhandler.mayberedirectstdios   sz      moo	#DHMDHMIII"DHM"DHMMM #DHM"DHM""""s   A% %A?c                     d| j         j        t                              | j         j        pd          t                              | j         j        pd          fz  S )Ns   remote:%s:%s:%sr   )r    	urlschemerE   quote
remotehost
remoteuserr*   s    r   clientzhttpv1protocolhandler.client   sN    !ILL-455LL-455%
 
 	
r   c                    |                     d           |                     d|j                            dd          z             |j                            dd          r|                     d           |                     d           t	          j        |j        t          j                  }|r7d                    d	 |D                       }|                     d
|z             |S )N   batchs   httpheader=%d   servers   maxhttpheaderlens   experimentals   httppostargss   httpmediatype=0.1rx,0.1tx,0.2tx   ,c              3   x   K   | ]5}t                               |                                j                  V  6d S r   )rE   r_   wireprotosupportr+   )r1   es     r   	<genexpr>z8httpv1protocolhandler.addcapabilities.<locals>.<genexpr>   sN       " "<=Q//11677" " " " " "r   s   compression=%s)	r   r%   	configint
configboolr	   supportedcompenginesr   
SERVERROLEr   )r$   repocapscompengines	comptypess        r   addcapabilitiesz%httpv1protocolhandler.addcapabilities   s    Htw00<OPPP	
 	
 	
 7o?? 	)KK((( 	6777$9G[+
 
  	7		 " "AL" " "  I KK)I5666r   c                 ,    |                      |          S r   )r"   r$   perms     r   r&   zhttpv1protocolhandler.checkperm   s    t$$$r   N)__name__
__module____qualname__r'   propertyr+   r=   r6   rO   rT   
contextlibcontextmanagerr\   rb   rs   r&   r)   r   r   r   r   :   s             X' ' '    B B B # # #
 
 
  0% % % % %r   r   c                     | t           j        v S r   )r
   commands)cmds    r   iscmdr      s    #,,,r   c                     ddl m}  j        }dj        vrdS j        d         }t	          |          sdS j        rC|                    d          |_        t          |j	        d<   |
                    ddz             d	S t          |j         fd
          }	 t          ||||           n# |j        $ r}}|j	        D ]\  }	}
|
|j	        |	<   |                    |j        t!          j        |                    |_        |
                    dt!          j        |          z             Y d}~nd}~ww xY wd	S )a  Possibly process a wire protocol request.

    If the current request is a wire protocol request, the request is
    processed by this function.

    ``req`` is a ``parsedrequest`` instance.
    ``res`` is a ``wsgiresponse`` instance.

    Returns a bool indicating if the request was serviced. If set, the caller
    should stop processing the request, as a response has already been issued.
    r   commonr.   Fi     Content-Type   0
%s
s	   Not FoundTc                      |           S r   r)   )rv   r&   rctxr   s    r   <lambda>z#handlewsgirequest.<locals>.<lambda>   s    99T3#=#= r   N)hgwebr   ro   rA   r   dispatchpathstatusmessagestatusHGTYPEr   setbodybytesr   r%   	_callhttpErrorResponsecoder   forcebytestr)r   r   resr&   hgwebcommonro   r   protori   r2   r   s   `` `       r   handlewsgirequestr      s    -,,,,,9D
 S\!!u
,v
C :: u   ..s33
'-O$ 	l2333t!TW====== E
B$S%----$ B B BI 	 	DAqCKNN ..FJ+A..
 


 	j&=a&@&@@AAAAAAAAB 4s    B4 4
D;>A3D66D;c                    d|                                 v r|rt          t          j                    i fS t	          j        |          }t          j        | t          j                  D ]]}|	                                j
        |v r@i }|                     dd|
                                z            }|||d<   t          ||fc S ^d|                     dd          i}t          t          j        d         |fS )zDetermine the appropriate response type and compression settings.

    Returns a tuple of (mediatype, compengine, engineopts).
    s   0.2re   s   %slevelNs   levels	   zliblevels   zlib)rO   HGTYPE2r   _noopenginer
   clientcompressionsupportr	   rm   rn   rh   r+   rk   r   r   rq   )r%   r   prefer_uncompressedcompformatsengineoptslevels          r   _httpresponsetyper      s    ##%%%% 	:K355r99 (@GG$9&
 
 		- 		-F &&((-<<Y
V[[]]0JKK$%*DN,,,, = bll9l;;<D4#G,d22r   c                 *   ddl m d }dfd	}t          j                            ||          s& |t
          t          t          d                     d S |                    t          j        |         j	                   t          j
        | ||          }t          |t                    r |t
          t          |           d S t          |t          j                  r |t
          t          |j                   d S t          |t          j                  r |t
          t          |j                   d S t          |t          j                  ri|j        }t)          | j        ||j                  \  }	}
}|
                    ||          }|	t0          k    r |||
|          } |t
          |	|           d S t          |t          j                  r+d|j        |j        fz  } |t
          t          |           d S t          |t          j                  r+d	|j        z  }d
_         |t
          t          |           d S t          |t          j                  r |t
          t          |j                   d S tA          j!        d|          )Nr   r   c              3      K   |                                 j        }dt          |          cxk     rdk     sn J t          j        dt          |                    V  |V  | D ]}|V  d S )Nr         B)rh   r+   lenstructpack)genr   
engineoptsr+   chunks        r   genversion2z_callhttp.<locals>.genversion2  s       &&((-3t99""""s""""""k$D		*****


 	 	EKKKK	 	r   c                     | t           k    rd_        n                    |           _        |j        d<   |                    |           |                    |           d S d S )Ns   200 Script output followsr   )HTTP_OKr   r   r   r   
setbodygen)r   contenttype	bodybytesbodygenr   r   s       r   setresponsez_callhttp.<locals>.setresponse&  sv    7??5CJJ$22488CJ'2O$ Y'''NN7##### r   s:   requested wire protocol command is not available over HTTP)r   )r   s   %d
%sr   Ts   hgweb.protocol internal failure)NN)"r   r   r
   r~   commandavailabler   	HGERRTYPEr   r&   
permissiondispatch
isinstancebytesr   r	   bytesresponser3   streamreslegacyr   	streamresr   r%   r   compressstreamr   pushresr   outputpusherrdrainooberrormessager   ProgrammingError)ro   r   r   r   r   r   r   rspr   	mediatyper   r   r   s     `         @r   r   r     s   ,,,,,,	 	 	$ $ $ $ $ $ $ %66sEBB 	 	
 	
 	
 		OO%.s3>???

$T5#
6
6C#u NGVs333333	C5	6	6 NGVsx888888	C7	8	8 NGVSW555555	C1	2	2 Ng ):GUC3)
 )
%	6: ##C44+c6:66CGY444444	C/	0	0 
N37CJ//GVs333333	C/	0	0 N37"	GVs333333	C0	1	1 NGY#+>>>>>>$%GMMMr   c                     |                      dt          |          z             |                      |           |                                  dS )z-Send a bytes response for protocol version 1.s   %d
N)writer   flush)rV   rN   s     r   _sshv1respondbytesr   c  sB    JJwU#$$$JJuJJLLLLLr   c                 f    | j         }|j        D ]} ||           |                                  d S r   )r   r   r   )rV   sourcer   r   s       r   _sshv1respondstreamr   j  s:    JE  eJJLLLLLr   c                     |                     d|z             |                                 |                      d           |                                  d S )Ns   %s
-
   
)r   r   )rV   rW   r   s      r   _sshv1respondooberrorr   q  sI    JJzC   JJLLLJJuJJLLLLLr   c                   r    e Zd ZdZd Zed             Zd Zd Zd Z	e
j        d             Zd Zd	 Zd
 ZdS )sshv1protocolhandlerz<Handler for requests services via version 1 of SSH protocol.c                 V    || _         || _        || _        t                      | _        d S r   )r!   _fin_foutrM   r#   )r$   r%   finrV   s       r   r'   zsshv1protocolhandler.__init__|  s&    	
%%r   c                     t           j        S r   )r	   SSHV1r*   s    r   r+   zsshv1protocolhandler.name  s    ##r   c                   
 i 
|                                 }t          t          |                    D ] }| j                                        d d         }|                                 \  }}||vr$t          j        t          d          |z            |dk    ri }t          t          |                    D ]f}| j                                        d d         }|                                 \  }}| j        	                    t          |                    }	|	||<   g|
d<   | j        	                    t          |                    }	|	
|<   "
fd|D             S )Ns   unexpected parameter %rr-   c                      g | ]
}|         S r)   r)   r0   s     r   r4   z0sshv1protocolhandler.getargs.<locals>.<listcomp>  r5   r   )
r7   ranger   r   readliner   Abortr   rC   rH   )r$   r9   r8   narglinearglr;   r2   valr3   s             @r   r=   zsshv1protocolhandler.getargs  sI   zz||s4yy!! 	  	 Ai((**3B3/G]]__FC$k!$>"?"?#"EFFFd{{s1vv $ $A"i00223B37G$]]__FC)..Q00C #DII!T

innSVV,,S		&&&&&&&&r   c                     | j         S r   )r#   r*   s    r   rO   z!sshv1protocolhandler.getprotocaps  s
    r   c              #     K   t          | j        d           t          | j                                                  }|rF| j                            |          V  t          | j                                                  }|Dd S d S )Nr   )r   r   rC   r   r   rH   )r$   counts     r   rT   zsshv1protocolhandler.getpayload  s       	4:s+++ DI&&(()) 	.)..'''''	**,,--E  	. 	. 	. 	. 	.r   c              #      K   d V  d S r   r)   r*   s    r   r\   z'sshv1protocolhandler.mayberedirectstdio  s      




r   c                     t           j                            dd                              dd          d         }d|z   S )Ns
   SSH_CLIENTr   rL   r   r   s   remote:ssh:)r   environr   r7   )r$   rb   s     r   rb   zsshv1protocolhandler.client  s:    !%%mS99??aHHK&&r   c                     | j         t          j        k    r|                    d           |                    d           |S )Ns	   protocapsrd   )r+   r	   r   r   )r$   ro   rp   s      r   rs   z$sshv1protocolhandler.addcapabilities  s;    9,,,KK%%%Hr   c                     d S r   r)   ru   s     r   r&   zsshv1protocolhandler.checkperm  s    r   N)rw   rx   ry   __doc__r'   rz   r+   r=   rO   rT   r{   r|   r\   rb   rs   r&   r)   r   r   r   r   x  s        FF      $ $ X$' ' '*  . . .    ' ' '      r   r   c                    d}t          | ||          }|                                sR|dk    r|                                d d         }|sd}=t          j                            ||          }|st          |d           pt          j        |||          }	|j        j	        
                                 |j        j        
                                 t          |	t                    rt          ||	           ngt          |	t          j                  rt          ||	j                   n6t          |	t          j                  rt%          ||	           n
t          |	t          j                  rt%          ||	           nt          |	t          j                  r)t          |d           t          |d|	j        z             nt          |	t          j                  rt          ||	j                   nlt          |	t          j                  rt1          || j        |	j                   n6t5          j        d|	z            |dk    rd S t5          j        d|z            |                                Pd S d S )Ns   protov1-servingr   s   shutdownr   s   %ds6   unhandled response type from wire protocol command: %ss   unhandled ssh server state: %s)r   is_setr   r
   r~   r   r   r   r%   rV   r   rW   r   r   r	   r   r3   r   r   r   r   r   r   r   r   r   r   r   )
r%   ro   r   rV   evstater   request	availabler   s
             r   _runsshserverr     s   $ E S$//Eiikk 3&&&llnnSbS)G  #)2CC I  "4---#,T5'BBCGL   GL   #u%% "4----C!=>> "42222C!9:: #D#....C!?@@ #D#....C!788 "4---"49999C!788 "41111C!899 %dBGS[AAAA,1367  
 k!!E (1E9  c iikk 3 3 3 3 3r   c                   "    e Zd ZddZd Zd ZdS )	sshserverNc                     || _         || _        |                                \  | _        | _        |rFt          j        || j        dd          | _        t          j        ||j        dd          |_        d S d S )N   oT)logdata   e)r!   _repoprotectfinoutr   r   r   makeloggingfileobjectrW   )r$   r%   ro   logfhs       r   r'   zsshserver.__init__  s    
 " 0 0 2 2	4:  	3tz4  DJ 0rwd  BGGG		 	r   c                     |                      t          j                               | j                            | j        | j                   d S r   )
serveuntil	threadingEventr!   restorefinoutr   r   r*   s    r   serve_foreverzsshserver.serve_forever  s>    	))***ty$*55555r   c                 T    t          | j        | j        | j        | j        |           dS )z%Serve until a threading.Event is set.N)r   r!   r   r   r   )r$   r   s     r   r   zsshserver.serveuntil  s&    dh
DItz2FFFFFr   r   )rw   rx   ry   r'   r  r   r)   r   r   r   r     sK           6 6 6G G G G Gr   r   )'r{   r   r   i18nr    r   r   r   r   r	   r
   
interfacesinterfaceutilutilsr   r   rX   urlerrrE   r   r   r   r   r   r   implementerbaseprotocolhandlerr   r   r   r   r   r   r   r   r   r   r   r)   r   r   <module>r     sh                                 . - - - - -       
 =		
	%
&#	  " >=>>g% g% g% g% g% g% g% ?>g%\- - -C C CL!3 !3 !3HIN IN INX       >=>>D D D D D D D ?>DNH H HVG G G G G G G G G Gr   