
    qi                        S r SSKJrJr  SSKJrJr  SSKJrJ	r	J
r
JrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJr  SSKJrJr  Sr\R@                  " \!5      r"Sr# " S S	5      r$g
)z:
WSGI application that handles one single WebDAV request.
    )unquoteurlparse)util	xml_tools)HTTP_BAD_GATEWAYHTTP_BAD_REQUESTHTTP_CONFLICTHTTP_CREATEDHTTP_FAILED_DEPENDENCYHTTP_FORBIDDENHTTP_INTERNAL_ERRORHTTP_MEDIATYPE_NOT_SUPPORTEDHTTP_METHOD_NOT_ALLOWEDHTTP_NO_CONTENTHTTP_NOT_FOUNDHTTP_NOT_IMPLEMENTEDHTTP_OKHTTP_PRECONDITION_FAILEDHTTP_RANGE_NOT_SATISFIABLEDAVError#PRECONDITION_CODE_LockTokenMismatch%PRECONDITION_CODE_PropfindFiniteDepthas_DAVErrorget_http_status_string)checked_etagetreereStructuredTexti    c                       \ rS rSrS rS rSS jrS rS rS r	S	 r
S
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rSrg)RequestServer-   c                 8   Xl         SU l        SU l        [        U l        / SQU l        U R                   R                  5       (       dS  U R
                  R                  / SQ5        U R                   R                  b  U R
                  R                  SS/5        g g g )NT   )OPTIONSHEADGETPROPFIND)PUTDELETECOPYMOVEMKCOL	PROPPATCHPOSTLOCKUNLOCK)	_davProviderallow_propfind_infinite_verboseDEFAULT_BLOCK_SIZE
block_size_possible_methodsis_readonlyextendlock_manager)selfdav_providers     K/home/kali/flask_env/lib/python3.13/site-packages/wsgidav/request_server.py__init__RequestServer.__init__.   s    ('+$, "H   ,,..""))O
   --9&&--vx.@A : /    c              #   $  #    SU;   d   eU R                   nSU;  a  [        R                  S5        UR                  SS5      US'   US   nUS   R                  S[        5      U l        UR                  S	5      b  US	   R                  5       US	'   UR                  S
5      b  US
   R                  5       US
'   SU;   a   S nX@R                  ;   a  SU 3n[        XS 5      nU(       d*  [        R                  S5        U R                  [        5        UR                  S5      (       a   UR                  S5      (       ae  SSKJn  U" 5       nUR                  UR                   XU5      n	UR#                  SS9  U	 S h  vN   [%        U	S5      (       a  U	R'                  5         g UR!                  XU5      n
 U
 S h  vN   [%        U
S5      (       a  U
R'                  5         g  Ne N(! [%        U
S5      (       a  U
R'                  5         f f = f7f)Nzwsgidav.verbosezwsgidav.auth.user_namez+Missing 'wsgidav.auth.user_name' in environ	anonymouswsgidav.user_nameREQUEST_METHODwsgidav.configr4   
HTTP_DEPTHHTTP_OVERWRITEHTTP_EXPECTdo_z%Invalid HTTP method {requestmethod!r}wsgidav.debug_breakzwsgidav.debug_profiler   )Profile   )sortclose)r0   _loggerwarninggetr3   r4   lowerupperr5   getattrerror_failr   cProfilerI   runcallcustom_request_handlerprint_statshasattrrL   )r9   environstart_responseproviderrequestmethodmethodmethod_namerI   profileresapp_iters              r;   __call__RequestServer.__call__E   s     G+++$$ $72OOIJ'.{{$k(
#$   01!"2377,

 ;;|$0$+L$9$?$?$AGL!;;'(4(/0@(A(G(G(IG$%G# 222/KT5FMMABJJ./;;,--;;.//(iG////&C Q'NNsG$$		 227FS	! x)) 3    x))  *s<   E=H?G% 8H9G) >G'?G) #H'G) )$HHNc                 2    [         R                  " UUUUS9  g)z$Wrapper to raise (and log) DAVError.)src_exceptionerr_conditionN)r   fail)r9   valuecontext_inforf   rg   s        r;   rT   RequestServer._fail   s    		''		
r>   c                 z   U[         [        [        4;   d   eU(       d  [        R                  " XU5      $ [        U5      S:X  a7  US   S   UR                  5       :X  a  [        R                  " XUS   S   5      $ [        R                  " 5       nU H  u  pxUR                  S5      (       d   e[        U[        5      (       d   e[        R                  " US5      n	U[        R                  " U	S5      l        S[        U5       3[        R                  " U	S5      l        M     [        R                   " XU5      $ )a3  Send WSGI response (single or multistatus).

- If error_list is None or [], then <success_code> is send as response.
- If error_list contains a single error with a URL that matches root_res,
  then this error is returned.
- If error_list contains more than one error, then '207 Multi-Status' is
  returned.
   r   /z{DAV:}responsez
{DAV:}hrefz	HTTP/1.1 z{DAV:}status)r
   r   r   r   send_status_responselenget_hrefr   make_multistatus_el
startswith
isinstancer   r   
SubElementtextr   send_multi_status_response)
r9   rZ   r[   root_ressuccess_code
error_listmultistatusELrefurle
responseELs
             r;   _send_responseRequestServer._send_response   s    owGGGG,,WlSSz?aJqM!$48I8I8K$K,,WjQRmTUFVWW "557#IF$$S))))a****))-9IJJ>DEZ6;21567 Z8= $ ..wVVr>   c                     U R                   R                  nUb  Uc  gUR                  5       nSU;  a  [        R                  " U5        UR                  UUUS   US   S9  g)zuRaise DAVError(HTTP_LOCKED), if res is locked.

If depth=='infinity', we also raise when child resources are locked.
NTwsgidav.conditions.ifwsgidav.ifLockTokenListrA   )urldepth
token_list	principal)r0   r8   get_ref_urlr   parse_if_header_dictcheck_write_permission)r9   ra   r   rZ   lock_manref_urls         r;   _check_write_permission%RequestServer._check_write_permission   sq    
 $$11s{//#"'1%%g. 	''8912	 	( 	
r>   c                 n   SU;  a  [         R                  " U5        Uc  gUS   nSnUR                  5       b  [        UR                  5       5      n[	        UR                  5       SS9nUc  SnSU;   d  SU;   d  S	U;   d  S
U;   a  [         R                  " XXR5        SU;  a  gUR                  5       nU R                  R                  n/ nU(       a/  UR                  XbS   S9n	U	 H  n
UR                  U
S   5        M     [         R                  " XXhU5      (       d  U R                  [        S5        g)a  Apply HTTP headers on <path>, raising DAVError if conditions fail.

Add environ['wsgidav.conditions.if'] and environ['wsgidav.ifLockTokenList'].
Handle these headers:

  - If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since:
    Raising HTTP_PRECONDITION_FAILED or HTTP_NOT_MODIFIED
  - If:
    Raising HTTP_PRECONDITION_FAILED

@see http://www.webdav.org/specs/rfc4918.html#HEADER_If
@see util.evaluate_http_conditionals
r   NT
allow_none[]HTTP_IF_MODIFIED_SINCEHTTP_IF_UNMODIFIED_SINCEHTTP_IF_MATCHHTTP_IF_NONE_MATCHHTTP_IFrA   )r   tokenz'If' header condition failed.)r   r   get_last_modifiedintr   get_etagevaluate_http_conditionalsr   r0   r8   get_indirect_url_lock_listappendtest_if_header_dictrT   r   )r9   ra   rZ   if_dictlast_modifiedetagr   r   locktoken_listlockListlocks              r;   _evaluate_if_headers"RequestServer._evaluate_if_headers   s>    #'1%%g. ;12   ". 5 5 78MCLLNt<<D %/)W4')#w.++CNG# //#$$11::+>#? ; H !%%d7m4 ! ''gtTTJJ/1PQr>   c                    US   nU R                   R                  X15      nUR                  SS5        US   S;  a(  U R                  [        SR                  US   5      5        US   S:X  a*  U R                  (       d  U R                  [        S[        S9  Uc  U R                  [        U5        UR                  S	5      (       a   U R                  XA5        [        R                  " US
S9nUc  [        R                  " S5      nUR                   S:w  a  U R                  [        5        / nSnU H  nUR                   S:X  a   U(       a  U R                  [        5        SnM3  UR                   S:X  a   U(       a  U R                  [        5        SnMc  UR                   S:X  d  Mu  US;  a  U R                  [        5        SnU H  n	UR#                  U	R                   5        M      M     UR%                  US   S
S9n
[&        R(                  " 5       n/ nU
 Hj  nUS:X  a  UR+                  S5      nO(US:X  a  UR+                  S5      nOUR+                  SUS9nUR-                  5       n[        R.                  " XU5        Ml     U(       a+  SR1                  U5      [        R2                  " US5      l        [        R6                  " XU5      $ )zt
TODO: does not yet support If and If HTTP Conditions
@see http://www.webdav.org/specs/rfc4918.html#METHOD_PROPFIND
	PATH_INFOrD   infinity)01r   zInvalid Depth header: {!r}.z6PROPFIND 'infinite' was disabled for security reasons.rg   NrH   Tallow_emptyz4<D:propfind xmlns:D='DAV:'><D:allprop/></D:propfind>z{DAV:}propfindz{DAV:}allpropallpropz
{DAV:}namename
{DAV:}prop)Nnamedr   )r   add_self)	name_list
{DAV:}responsedescription)r0   get_resource_inst
setdefaultrT   r   formatr1   r   r   r   rO   r   r   parse_xml_bodyr   XMLtagr   get_descendantsr   rr   get_propertiesrq   add_property_responsejoinru   rv   rw   )r9   rZ   r[   pathra   	requestELpropNameListpropFindModepfnodepfpnodereslistr{   responsedescriptionchildpropListhrefs                   r;   do_PROPFINDRequestServer.do_PROPFIND  s   
 {#11$@ 	<4< (>>JJ -44W\5JK
 < J.t7S7SJJHC   ;JJ~t,;;,--!!#/ ''TB	 		FI ==,,JJ'(Fzz_,JJ/0( |+JJ/0%|+6JJ/0&%G ''4  &-  6 %%GL,AD%Q "557 Ey( //	:' //7 //</P>>#D&&}HE  		-. ],GHM ..wVVr>   c                    US   nU R                   R                  X15      nUR                  SS5        US   S:w  a  U R                  [        S5        Uc  U R                  [
        U5        U R                  XA5        U R                  USU5        [        R                  " U5      nUR                  S:w  a  U R                  [        5        / nU H  nSnUR                  S:X  a  SnO)UR                  S	:X  a  S
nOU R                  [        S5        U H  n	U	R                  S:w  a  U R                  [        S5        U	 HR  n
SnUS:X  a(  Sn[        U
5      S:  a  U R                  [        S5        OU
nUR                  U
R                  U45        MT     M     M     Sn/ nU H8  u  p UR                  XSS9  SnUR                  X45        U=(       a    US:H  nM:     / n/ nU(       dj  U Hc  u  nnUS:X  a  [!        ["        5      nO4[%        U[         5      (       a  UR                  UR'                  5       5        UR                  UU45        Me     O/U H)  u  p UR                  XSS9  UR                  US45        M+     [(        R*                  " 5       nUR-                  5       n[        R.                  " UUU5        U(       a+  SR1                  U5      [2        R4                  " US5      l        [        R8                  " XU5      $ ! [         a  n[        U5      n SnAGNiSnAff = f! [         aI  n[        U5      nUR                  UU45        UR                  UR'                  5       5         SnAGM$  SnAff = f)zvHandle PROPPATCH request to set or remove a property.

@see http://www.webdav.org/specs/rfc4918.html#METHOD_PROPPATCH
r   rD   r   Depth must be '0'.Nz{DAV:}propertyupdatez{DAV:}removeremovez	{DAV:}setsetz)Unknown tag (expected 'set' or 'remove').r   zUnknown tag (expected 'prop').r   z(prop element must be empty for 'remove'.T)dry_run200 OKFr   r   )r0   r   r   rT   r   r   r   r   r   r   r   rp   r   set_property_value	Exceptionr   r   r   rt   get_user_infor   rr   rq   r   r   r   ru   rv   rw   )r9   rZ   r[   r   ra   r   propupdatelistppnodepropupdatemethodpropnodepropertynode	propvaluesuccessflagwriteresultlistr   writeresultr}   propResponseListr   resultr{   r   s                         r;   do_PROPPATCHRequestServer.do_PROPPATCHu  sI   
 {#11$@ 	<-< C'JJ')=>;JJ~t,!!#/$$S#w7 ''0	==22JJ'( F#zz^+#+ {*#( 

$&Q #<<</JJ/1QR$,L $I'83$(	|,q0 !JJ 0 J
 %1	"))<+;+;Y*GH %-	 #  D -OD'&&t&E '""D#67%A+*AK  .   /fX%%&<=F11'..v/C/C/EF ''v7 !0 $2B**4E*J$++T4L9	 $2 "557||~""=$8HI		-. ],GHM
 ..wVV[  -)!n-< ! B#AA$++T1I6'..q/@AABs0   &L#L)
L&L!!L&)
M<3=M77M<c                    US   nU R                   n[        R                  " U5      S:w  a  U R                  [        S5        UR                  SS5      S:w  a  U R                  [        S5        UR                  X15      (       a  U R                  [        S5        UR                  [        R                  " U5      U5      nU(       a  UR                  (       d  U R                  [        S5        U R                  USU5        UR                  [        R                  " U5      5        [        R                   " X["        5      $ )	zmHandle MKCOL request to create a new collection.

@see http://www.webdav.org/specs/rfc4918.html#METHOD_MKCOL
r   r   ,The server does not handle any body content.rD   r   r   z.MKCOL can only be executed on an unmapped URL.z&Parent must be an existing collection.)r0   r   get_content_lengthrT   r   r   r   existsr   r   get_uri_parentis_collectionr	   r   create_collectionget_uri_namero   r
   )r9   rZ   r[   r   r\   	parentRess         r;   do_MKCOLRequestServer.do_MKCOL  s   
 {#$$ ""7+q0JJ,> lC0C7JJ')=>??4))JJ'@
 ..t/B/B4/H'R		 7 7JJ}&NO
 	$$YW=##D$5$5d$;<((,OOr>   c                 .    U R                  [        5        g)zj
@see http://www.webdav.org/specs/rfc4918.html#METHOD_POST
@see http://stackoverflow.com/a/22606899/19166
N)rT   r   r9   rZ   r[   s      r;   do_POSTRequestServer.do_POST  s    
 	

*+r>   c                    US   nU R                   nUR                  X15      n[        R                  " U5      S:w  a  U R	                  [
        S5        Uc  U R	                  [        U5        UR                  (       a-  UR                  SS5      S:w  a  U R	                  [        S5        O,UR                  SS5      S	;  a  U R	                  [        S
5        U R                  XQ5        UR                  [        R                  " U5      U5      nU(       a  U R                  USU5        OU R                  USU5        / n UR                  5       nUS;   d  [        U5      [        L d   e[        U5      [        L a  UnSnU(       a  U R'                  XU[(        U5      $ UR+                  SUS   SS9n
UR                  (       au  UR-                  5       (       a`  SnU
 H(  n U R                  X5        U R                  USU5        M*     U(       d)   UR/                  5       nU R'                  XU[(        U5      $ 0 nU
 H  nUR0                  U;   aH  [2        R5                  SUR0                   S35        SU[        R                  " UR0                  5      '   M[   U R                  X5        U R                  USU5        UR/                  5         UR7                  UR0                  U5      (       a  [9        [:        S5      eM     U R'                  XU[(        U5      $ ! [          a)  n	UR#                  5       [%        U	5      4/nSn Sn	A	GNSn	A	ff = f! [          a    Sn   GMX  f = f! [          a'  n	UR#                  5       [%        U	5      4/n Sn	A	GNpSn	A	ff = f! [8         aY  n	UR=                  UR#                  5       [%        U	5      45        SU[        R                  " UR0                  5      '    Sn	A	GM  Sn	A	ff = f)z>
@see: http://www.webdav.org/specs/rfc4918.html#METHOD_DELETE
r   r   r   NrD   r   z2Only Depth: infinity is supported for collections.r   r   r   z<Only Depth: 0 or infinity are supported for non-collections.TFT)depth_firstr   r   Fz	Skipping z (contains error child) zResource could not be deleted.)r0   r   r   r   rT   r   r   r   r   r   r   r   r   handle_deletetypelistr   rq   r   r   r   r   support_recursive_deletedeleter   rM   debugr   r   r   r   )r9   rZ   r[   r   r\   ra   r   rz   handledr}   reverse_child_isthas_conflicts	child_resignore_dicts                 r;   	do_DELETERequestServer.do_DELETE  s    {#$$((7 ""7+q0JJ,> ;JJ~t, !!,
;zI

$H
 !!,4<MM

$R
 	!!#/ ..t/B/B4/H'R	((CA ((c7;
 
	'')Gm+tG}/DDDG}$$
 &&oz   //GL$9D 0 
 !=!=!?!?!M.	--iA00CI / !D!$J **S/:  *I~~,	)..)99PQRCED//	?@H )))=,,YWE  "??9>>7;;"+-M  < +. ""S/:
 	
}  	<<>;q>:;JG	, ! $(M ! D#&<<>;q>"B!CJD6  H!!9#5#5#7Q"HICGD//	?@@Hs]   >A L $MM# A%N
M"MMM M #
N-NN
O:!AO55O:c              #   d   #     US   R                  U5      nUS:X  a  OSUS'   Uv   M&  SUS'   g7f)zGet the data.
wsgi.inputr>   rm   zwsgidav.some_input_readwsgidav.all_input_readN)read)r9   rZ   r4   bufs       r;   _stream_dataRequestServer._stream_data  sI     ,',,Z8Ccz12G-.I  -.()s   .0c                 X   US   nU R                   nUR                  X15      nUR                  [        R                  " U5      U5      nUSL nSU;   a  [        R                  " [
        S5        SU;   a  [        R                  " [        S5        U(       a(  UR                  (       a  U R                  [        S5        O*Ub  UR                  (       d  U R                  [        S5        U R                  XQ5        U(       a9  U R                  US	U5        UR                  [        R                  " U5      5      nOU R                  US	U5        S
n U R                  XR                   5      n	UR#                  UR%                  S5      S9n
['        U
SS5      (       a  U
R)                  U	5        OU	 H  nU
R+                  U5        M     U
R-                  5         UR1                  US9  SnUR7                  5       (       a$  [9        UR;                  5       SS9nUb	  SSU S34/nU(       a  [        R<                  " X[>        US9$ [        R<                  " X[@        US9$ ! [.         aD  nUR1                  SS9  [2        R5                  S5        [        R                  " U5         SnANSnAff = f)z;
@see: http://www.webdav.org/specs/rfc4918.html#METHOD_PUT
r   NHTTP_CONTENT_ENCODINGz)Content-encoding header is not supported.HTTP_CONTENT_RANGEz4Content-range header is not allowed on PUT requests.zCannot PUT to a collectionzPUT parent must be a collectionr   FCONTENT_TYPE)content_type
writelinesT)with_errorszPUT: byte copy failedr   ETag")add_headers)!r0   r   r   r   rh   r   r   r   rT   r   r	   r   r   create_empty_resourcer   r  r4   begin_writerO   rR   r  writerL   r   	end_writerM   	exceptionsupport_etagr   r   ro   r
   r   )r9   rZ   r[   r   r\   ra   r   	isnewfile	hasErrorsdata_streamfileobjdatar}   headersr   s                  r;   do_PUTRequestServer.do_PUT  sL    {#$$((7..t/B/B4/H'R	4K	 #g-II*,WX  7*II "X 3$$JJ.0LMY%<%<JJ}&GH!!#/((CA11$2C2CD2IJC((c7;		++G__EKoo7;;~3NoOG wd33"";/'DMM$' ( MMO 	),4@D"avQK01,,7  ((_'
 	
#  	MMdM+56IIaLL	s   BI 
J)%:J$$J)c                 &    U R                  XS5      $ )NF_copy_or_mover   s      r;   do_COPYRequestServer.do_COPY  s    !!'5AAr>   c                 &    U R                  XS5      $ )NTr'  r   s      r;   do_MOVERequestServer.do_MOVE  s    !!'4@@r>   c                 P  ^  US   nT R                   nUR                  XA5      nUR                  [        R                  " U5      U5      nU 4S jnUc  T R	                  [
        U5        SU;  a  T R	                  [        S5        UR                  SS5      S;  a  T R	                  [        S	5        [        R                  " U5      S
:w  aJ  US   R                  [        R                  " U5      5      n	SUS'   [        R                  SU	SS < S35        UR                  (       aX  UR                  SS5        US   S;  a  T R	                  [        S5        U(       a  US   S:w  a  T R	                  [        S5        O6UR                  SS5        US   S;  a  T R	                  [        S5        SUS'   [        US   5      n
[        U
SS9u  nnnnnnUR                  (       a  UR                  S5      S-   nU(       a  UR!                  5       OSnUS   R!                  5       nUR#                  SS5      R!                  5       nU(       a  UR!                  5       OSnUS   R!                  5       nUR#                  SS5      R!                  5       nU(       a  UUU4;  a  T R	                  [$        S5        O%U(       a  UUU4;  a  T R	                  [$        S 5        UR'                  UR(                  UR*                  -   S-   5      (       a&  U[-        UR(                  UR*                  -   5      S nOUR(                  (       aY  UR'                  UR(                  S-   5      (       a6  UnU[-        UR(                  5      S n[        R                  S!U S"U 35        OT R	                  [$        S#5        UR'                  S5      (       d   eUR                  X5      nUSLnUR                  [        R                  " U5      U5      nU(       a  UR                  (       d  T R	                  [.        S$5        T R1                  Xa5        T R1                  UU5        U(       a-  T R3                  USU5        U(       a  T R3                  USU5        U(       d  T R3                  USU5        T R3                  USU5        XM:X  a  T R	                  [4        S%5        O1[        R6                  " XM5      (       a  T R	                  [4        S&5        U(       a  US   S:w  a  T R	                  [8        S'5        / n[:        nU(       a  [<        n U(       a  UR?                  U5      nOUS   S:H  nURA                  UUS(9nUS);   d  [C        U5      [D        L d   e[C        U5      [D        L a  UnS*nU(       a  T RM                  XU[<        U5      $ URO                  S*S+9n[-        U5      n[-        U5      n U(       a  U(       d"  UR                  (       a  UR                  (       d,  [        RQ                  S,U< 35        URS                  5         SnOURO                  S*SS-9n!U V"s/ s H  n"U"RT                  PM     n#n"[        RQ                  S.U# 35        U! H_  n$[        RQ                  S/U$ 35        U$RT                  U S n%UU%-   n&U&U#;  d  M7  [        RQ                  S0U$ 35        U$RS                  5         Ma     U(       a}  URW                  U5      (       ag  Sn'U H  n" T R1                  U"U5        M     U'(       dB   [        RQ                  S1U S"U< 35        URY                  U5      nT RM                  XUUU5      $ 0 n(U H  n)Sn*U(R[                  5        H-  n+[        R6                  " U+U)RT                  5      (       d  M+  S*n*  O   U*(       a&  [        RQ                  S2U)RT                  < S335        Ms   U)RT                  US n%UU%-   n,T R1                  U)U5        U)R]                  U,US49  U(       a%  U)R                  (       d  U)RS                  5         M  M  M     U(       a  USS n-U-Ra                  5         [        RQ                  S5U( 35        U- H  n)U)R                  (       d  M  Sn.U(R[                  5        H-  n+[        R6                  " U)RT                  U+5      (       d  M+  S*n.  O   U.(       a&  [        RQ                  S6U)RT                  < S735        M   [        RQ                  S8U) 35        U)RS                  5         M     [        RQ                  S9U 35        T RM                  XUUU5      $ ! [F         a1  nU" U5        URI                  5       [K        U5      4/nS*n SnAGNSnAff = fs  sn"f ! [F         a  nU" U5        S*n' SnA  GM  SnAff = f! [F         a/  nU" U5        URI                  5       [K        U5      4/n SnAGNSnAff = f! [F         aM  nU" U5        S*U(U)RT                  '   UR_                  U)RI                  5       [K        U5      45         SnAGM  SnAff = f! [F         a>  nU" U5        UR_                  URI                  5       [K        U5      45         SnAGM  SnAff = f):zw
@see: http://www.webdav.org/specs/rfc4918.html#METHOD_COPY
@see: http://www.webdav.org/specs/rfc4918.html#METHOD_MOVE
r   c                    > [        U [        5      (       a&  TR                  S:  a  [        R	                  S5        gTR                  S:  a  [        R	                  S5        g)zGLog internal exceptions with stacktrace that otherwise would be hidden.   _debug_exceptionr"   N)rt   r   r2   rM   r  )r}   r9   s    r;   r1  5RequestServer._copy_or_move.<locals>._debug_exception  sP    !X&&==A%%%&89  ==A%%%&89r>   NHTTP_DESTINATIONz$Missing required Destination header.rE   T)r4  FzInvalid Overwrite header.r   r  rm   r	  zIgnored copy/move  body: 2   z...rD   r   r   zInvalid Depth header.z4Depth header for MOVE collection must be 'infinity'.r   F)allow_fragmentsrn   r   zwsgi.url_schemeHTTP_X_FORWARDED_PROTO	HTTP_HOSTHTTP_X_FORWARDED_HOSTzSource and destination must have the same scheme.
If you are running behind a reverse proxy, you may have to rewrite the 'Destination' header.
(See https://github.com/mar10/wsgidav/issues/183)z4Source and destination must have the same host name.zRewrite DESTINATION path z -> z'Inter-realm copy/move is not supported.z(Destination parent must be a collection.z#Cannot copy/move source onto itselfz$Cannot copy/move source below itselfz8Destination already exists and Overwrite is set to false)depth_infinityr   T)r   zRemove dest before move: )r   r   zcheck src_path_list: z"check unmatched dest before copy: z#Remove unmatched dest before copy: zRecursive move: zCopy: skipping z, because of parent error)is_movezDelete after move, ignore_dict=zDelete after move: skipping z, because of child errorzRemove collection after move: zErrorList: )1r0   r   r   r   rT   r   r   r   r   r
  rM   infor   r   r   rstriprP   rO   r   rs   
mount_path
share_pathrp   r	   r   r   r   is_equal_or_child_urir   r
   r   handle_movehandle_copyr   r   r   rq   r   r   r   r   r   r   support_recursive_movemove_recursivekeyscopy_move_singler   reverse)/r9   rZ   r[   r<  src_pathr\   src_ressrc_parent_resr1  bodyhttp_destinationdest_schemedest_netloc	dest_path_dest_params_dest_query
_dest_frag
url_scheme
fwd_schemeurl_hostfwd_host_prevdest_resdest_existsdest_parent_resrz   ry   r   
isInfinityr}   src_listsrc_root_lendest_root_lenreverse_dest_listssrc_path_listdresrel_urlspr  r  sresparent_error
ignorePathdpathreverse_src_listchild_errors/   `                                              r;   r(  RequestServer._copy_or_move  s	   
 ;'$$,,X?!33)7
	 ?JJ~x0W,JJ')OP.4JFJJ')DE""7+q0
 <(--d.E.Eg.NOD01G,-LL4T#2YMEF  
 |Z8|$,==

+-DE7<0J>

$J |S1|$,==

+-DE$'GL! #7+=#>? %u=	
   !((-3I-8k'')b./557
[[!92>DDF
 .9k'')b;'--/;;6;AAC;z:.FFJJ D [80DDJJ "X  3 3h6I6I IC OPP!#h&9&9H<O<O&O"P"RSI ""y';';H<O<ORU<U'V'V!%c(*=*=&>&@A	8tI;OP

+-VW##C(((( --iAd*"44	*G
 o&C&CJJ}&PQ!!'3!!(G4 ((*gF,,^S'J ((#wG$$Xz7C JJ~'LM''<<JJ~'MN7#34;JJ(J 
#*L	!--i8$\2j@
!--i
-Sm+tG}/DDDG}$$

 &&/:  **D*98}Ih44G<Q<Q  9(FG! %-$<$< $u %= %! 2: :A : 5m_EF-DMM$Ftf"MN"ii7G!G+B.(KD6&RS . w55i@@!M--a9  !HMM$4WIT)"OP!(!7!7	!BJ
 **WlJ  D L)..0
--j$))DD#'L 1 		}<UVWE))LM2!G+))$8
 %%eW%= 4#5#5KKM $677 P '{$$&MM;K=IJ())#"-"2"2"4J11$))ZHH&* #5 MM6tyymC[\ LMM$B4&"IJKKM% ). MMK
|45 ""WlJ
 	
{  	Q"++-{1~>?JG	H !;( ! $Q'$(M ! H$Q'#*#3#3#5{1~"F!GJHf  E #)-DII&
 !!4==?KN"CDDEB ! L$Q'%%w'7'7'9;q>&JKKLs   ?A!e  ff#,-g %Ah(i 
f*&ff#
g-
f??g
h $g;;h 
iAii
j%'2j  j%c                 	   US   nU R                   nUR                  X15      nUR                  nUc  U R                  [        S5        U(       a+  UR                  5       (       a  U R                  [        S5        UR                  SS5      S;  a  U R                  [        S5        U R                  XQ5        [        R                  " UR                  S	S
5      5      nUS   n[        R                  " USS9n	U	GcB  SUS'   Uc  U R                  [        S5        [        U5      S:w  a  U R                  [        S5        OAUR                  UR!                  5       US   5      (       d  U R                  ["        S[$        S9  UR'                  US   US9n
UR)                  U
S   5      nUR                  X5      n[*        R,                  " 5       nUR/                  S5      nUR1                  U5        [*        R2                  " U5      nU" SSS[5        [        U5      5      4S[        R6                  " 5       4/5        U/$ U	R8                  S:w  a  U R                  [        5        SnSn[        R:                  " S
5      nUR                  SS5      nU	 H  nUR8                  S:X  a1  U H)  nUR8                  S:X  a  SnOUR8                  S :X  a  S!n  M@     MD  UR8                  S":X  a  U H  nUR8                  S#:X  a  S$n  Mn     Mr  UR8                  S%:X  a  [*        R2                  " US&S'9nM  U R                  [        S(UR8                  < S)35        M     U(       d  U R                  [        S*5        U(       d  U R                  [        S+5        UR                  S,5      (       a   S&nUc{  UR                  [        R<                  " U5      U5      nU(       a  UR>                  (       d  U R                  [@        S-5        URC                  [        RD                  " U5      5      nSnURG                  UR!                  5       UUUUUUS.   US/9n
[*        R,                  " 5       nUR/                  S5      nUR1                  U5        SnU(       a  S0n[*        R2                  " U5      nU" US1S[5        [        U5      5      4S2U
S3   4S[        R6                  " 5       4/5        U/$ )4z<
@see: http://www.webdav.org/specs/rfc4918.html#METHOD_LOCK
r   Nz$This realm does not support locking.z'This resource does not support locking.rD   r   r   z"Expected Depth: 'infinity' or '0'.HTTP_TIMEOUTr   r   Tr   r   z/LOCK refresh must specify an existing resource.rm   zAExpected a lock token (only one lock may be refreshed at a time).r   zLock token does not match URL.r   )timeoutrootz{DAV:}lockdiscoveryr   )Content-Typezapplication/xml; charset=utf-8Content-LengthDatez{DAV:}lockinfoz{DAV:}lockscopez{DAV:}exclusive	exclusivez{DAV:}sharedsharedz{DAV:}locktypez{DAV:}writer  z{DAV:}ownerF)prettyzInvalid node .zMissing or invalid lockscope.zMissing or invalid locktype.rH   z"LOCK-0 parent must be a collectionrA   )r   	lock_type
lock_scope
lock_depth
lock_ownerro  r   r   z201 Created)rq  zapplication; charset=utf-8z
Lock-Tokenr   )$r0   r   r8   rT   r   prevent_lockingr   r   r   r   r   read_timeout_value_headerrO   r   rp   is_url_locked_by_tokenr   r   r   refreshref_url_to_pathr   make_prop_elemget_property_valuer   xml_to_bytesstrget_rfc1123_timer   to_bytesr   r   r	   r  r   acquire)r9   rZ   r[   r   r\   ra   r   timeout_secssubmitted_token_listlockinfo_elr   	lock_pathlock_resprop_ellockdiscovery_elxmlrx  ry  r{  rz  linodelsnodeltnodecreatedNewResourcer   respcodes                             r;   do_LOCKRequestServer.do_LOCKK  s    {#$$((7((JJ+-ST3&&((JJ~'PQlJ7?PPJJ')MN!!#/55gkk.RT6UV&'@A))'tD  %(GL!{

$&W '(A-

$W 44!#7#:  

,4"E   ##$8$;\#RD !00f>I11)EH..0G'::;PQNN+, ((1CF%s3s8}5T2245 5L ??..JJ'(	
]]2&
''jA
!Fzz..$Fzz%66%0
~5%-
 % //$Fzz]2$+	 %
 },&33F5I
 

+}VZZN!-LM' "* JJ')HIJJ')GH;;,-- #; 2243F3Ft3LgVII$;$;

=*NO11$2C2CD2IJC!%
 !!!! 12+   	
 **,112GH'($H$$W->!3s3x=1tG}-..01		
 ur>   c                    US   nU R                   nU R                   R                  X15      nUR                  nUc  U R                  [        S5        Og[
        R                  " U5      S:w  a  U R                  [        S5        O6Uc  U R                  [        U5        OSU;  a  U R                  [        S5        U R                  XQ5        US   R                  S5      nUR                  5       nUR                  X5      (       d  U R                  [        S[        S	9  UR!                  XqS
   5      (       d  U R                  ["        S5        UR%                  U5        [
        R&                  " X[(        5      $ )z>
@see: http://www.webdav.org/specs/rfc4918.html#METHOD_UNLOCK
r   z$This share does not support locking.r   r   HTTP_LOCK_TOKENzMissing lock token.z<>z Resource is not locked by token.r   rA   z"Token was created by another user.)r0   r   r8   rT   r   r   r   r   r   r   r   stripr   r~  r	   r   is_token_locked_by_userr   releasero   r   )	r9   rZ   r[   r   r\   ra   r   
lock_tokenr   s	            r;   	do_UNLOCKRequestServer.do_UNLOCK  sO    {#$$11$@((JJ+-ST$$W-2JJ,> [JJ~t,g-JJ')>?!!#/./55d;
//#..wCCJJ2A   // 34
 

 JJ~'KL 	$((/RRr>   c                 *   US   nU R                   nUS   n[        R                  " USSS9nUR                  X15      nSnUb"  UR	                  5       (       d  UR
                  c  SnSS	S
U4S[        R                  " 5       4/n	US:H  n
US:X  a0  UR                  S5      nU(       a  Sn
O[        R                  S5        U
(       a  U" SU	5        S/$ S/nU(       am  UR                  (       a\  UR                  / SQ5        UR	                  5       (       d3  UR                  / SQ5        UR
                  b  UR                  SS/5        OU(       a  UR                  / SQ5        UR	                  5       (       d3  UR                  / SQ5        UR
                  b  UR                  SS/5        UR                  5       (       a  U	R                  S5        OjUR                  [        R                  " U5      U5      (       a)  UR	                  5       (       d  UR                  SS/5        OU R                  [         U5        U	R                  SSR#                  U5      45        US   R                  SS5      (       a  U	R                  S5        U" SU	5        S/$ ) z:
@see http://www.webdav.org/specs/rfc4918.html#HEADER_DAV
r   rC   hotfixesT)as_dictz1,2r   )rq  ztext/html; charset=utf-8)rr  r   DAVrs  *rn   treat_root_options_as_asteriskzGot OPTIONS '/' requestr   r>   r#   )r$   r%   r&   )r(   r)   r*   r,   r.   r/   )r'   r(   r)   r*   r,   zAccept-Rangesbytesr'   r+   Allowz, add_header_MS_Author_ViaF)zMS-Author-Viar  )r0   r   get_dict_valuer   r6   r8   r  rO   rM   r=  r   r7   support_rangesr   r   rT   r   r   )r9   rZ   r[   r   r\   configr  ra   dav_compliance_levelr#  is_asterisk_optionstreat_as_asteriskallows                r;   
do_OPTIONSRequestServer.do_OPTIONSA  sU    {#$$)*&&vz4H((7$x33559N9N9V#&  9#()T**,-	
 #ck3; (-M N &*#67 8W-5L 3$$LL45 ''))DE ((4LL&(!34LL45 ''))KL ((4LL&(!34!!##9:##D$7$7$=wGG ''))eW-.JJ~t,5!123#$(()CUKKNN34x)ur>   c                 "    U R                  XSS9$ )NFis_head_method_send_resourcer   s      r;   do_GETRequestServer.do_GET  s    ""75"QQr>   c                 "    U R                  XSS9$ )NTr  r  r   s      r;   do_HEADRequestServer.do_HEAD  s    ""74"PPr>   c           	   #   	  #    US   nU R                   R                  XA5      n[        R                  " U5      S:w  a  U R	                  [
        S5        OnUR                  SS5      S:w  a  U R	                  [        S5        OAUc  U R	                  [        U5        O'UR                  (       a  U R	                  [        S5        U R                  XQ5        UR                  5       nUc  S	nUR                  5       nUc  S	n[        UR                  5       S
S9nUc  SnUR                  5       (       + =(       d!    UR!                  5       (       + =(       d    US:H  n	SU;   a\  SU;   aV  U	(       dO  US   n
[        R"                  " U
5      nU(       a  [%        U5      U:w  a  S
n	OU
R'                  S5      n
Ub  X:w  a  S
n	SnSU;   aT  U	(       dM  S
n[        R(                  " US   U5      u  p[+        U5      S:X  a  U R	                  [,        S5        US   u  nnnO	SUS-
  UnnnUR/                  5       n/ nUR                  5       (       a  UR1                  S[3        U5      45        UR5                  5       (       a'  UR1                  S[        R6                  " U5      45        UR1                  SU45        UR1                  S[        R6                  " 5       45        UR9                  5       (       a  UR1                  SSU S345        UR!                  5       (       a  UR1                  S5        SUS   ;   a'  US   S   nU H  u  nnUR1                  UU45        M     UR;                  UU5        U(       a&  UR1                  SSU SU SU 345        U" S U5        O	U" S!U5        U(       a  S"v   gUR=                  5       nU	(       d  UR?                  U5        Un  US:  d  UU R@                  :  a  URC                  U R@                  5      nOURC                  U5      n[        RD                  " U5      (       d   eUv   U[+        U5      -  n[+        U5      S:X  d  US:X  a  OM  URG                  5         g! URG                  5         f = f7f)#z
If-Range
    If the entity is unchanged, send me the part(s) that I am missing;
    otherwise, send me the entire new entity
    If-Range: "737060cd8c284d8af7ad3082f209582d"

@see: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.27
r   r   r   rD   r   zOnly Depth: 0 supported.NzDirectory browsing is not enabled.(to enable it add WsgiDavDirBrowser to the middleware_stack option and set dir_browser.enabled = True option.)r   Tr   r   
HTTP_RANGEHTTP_IF_RANGEz" FzNo valid ranges presentrm   rr  zLast-Modifiedrq  rs  r  r  r  response_headersrC   zContent-Rangezbytes -rn   z206 Partial Contentr   r>   )$r0   r   r   r   rT   r   r   r   r   r   r   r   r   r   r   support_content_lengthr  parse_time_stringr   r  obtain_content_rangesrp   r   get_content_typer   r  support_modifiedr  r  finalize_headersget_contentseekr4   r
  is_bytesrL   )r9   rZ   r[   r  r   ra   filesizer   r   do_ignore_rangesif_rangesecstimeis_partial_rangeslist_ranges_totallengthrange_start	range_endrange_lengthmimetyper  custom_headersheaderri   r!  contentlengthremaining
readbuffers                             r;   r  RequestServer._send_resource  sa     {#11$@""7+q0JJ,> c2c9JJ')CD[JJ~t,JJE 	!!#/))+H--/ MCLLNt<<D **,, %%''1} 	 G#7*$/H--h7H}%1'+$ $>>$/<8#3'+$!7"+; $(,(B(B%x)%K ;1$

57PQ 6A^2[)\67Ax\)[ '')%%''##%5s<7H$IJ!!## $"7"7"FG 	 :;)>)>)@ AB##Vqa[$9:##$>?)9!::$%567IJN!/ ''8 "0 	W&67###[M9+QxjA 02BC8%56 I//#LL%!-	*Q.-?!(doo!>J!(.D!EJ}}Z0000  &#j/9&z?a'+AQ+F   MMO MMOs   ORBQ3 "R3RR)r0   r5   r2   r1   r4   )NNN)__name__
__module____qualname____firstlineno__r<   rc   rT   r   r   r   r   r   r   r   r  r  r$  r)  r,  r(  r  r  r  r  r  r  __static_attributes__ r>   r;   r   r   -   s    B.IV
 WD
,?BaWFqWf%PN,z
x.N
`BAW
r
bR+SZUnRQWr>   r   N)%__doc__urllib.parser   r   wsgidavr   r   wsgidav.dav_errorr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   wsgidav.utilr   r   __docformat__get_module_loggerr  rM   r3   r   r  r>   r;   <module>r     s\   
 + #     , -"

 
 
* H Hr>   