
    5i~                     .   d Z ddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlmZ ddlmZmZ ddlmZ ddlmZ ddlmZmZ ddlmZmZ  G d	 d
          Z G d de          Z	 	 ddZ	 	 ddZd Z e!dk    r e              dS dS )aO  
WebDAV Server Example

This example demonstrates how to create a fully-featured WebDAV server using the 
HTTPServerHandler class. The server implements the WebDAV protocol (RFC 4918) with
support for:

- File and directory operations (GET, PUT, DELETE, MKCOL)
- WebDAV properties (PROPFIND, PROPPATCH)  
- File locking (LOCK, UNLOCK)
- File copying and moving (COPY, MOVE)
- WebDAV-compliant XML responses
- Integration with file managers and WebDAV clients

Usage:
    python webdavserver.py [directory_path] [host] [port]

Example:
    python webdavserver.py ./webdav-root 127.0.0.1 8080
    N)Path)datetimetimezone)ElementTree)minidom)	UniTargetUniProto)HTTPServerHandler
HTTPServerc                   &    e Zd ZdZddZd Zd ZdS )	
WebDAVLockz'Represents a WebDAV lock on a resource.  0c                     || _         || _        || _        || _        || _        || _        t          j                    | _        d S N)tokenscopetypeownertimeoutdepthtimecreated)selfr   r   	type_lockr   r   r   s          T/home/kali/Ninja/venv/lib/python3.11/site-packages/asysocks/examples/webdavserver.py__init__zWebDAVLock.__init__-   s=    

	

y{{    c                 J    t          j                     | j        z
  | j        k    S r   )r   r   r   )r   s    r   
is_expiredzWebDAVLock.is_expired6   s    y{{T\)DL88r   c                    t          j        dd          }t          j        |d          }t          j        |d| j                    t          j        |d          }t          j        |d| j                    t          j        |d          }| j        |_        t          j        |d          }| j        |_        t          j        |d	          }d
| j         |_        t          j        |d          }t          j        |d          }	d| j	         |	_        t          j        |d          }
t          j        |
d          }||_        |S )z"Convert lock to WebDAV XML format.zD:activelockDAV:)xmlnsz
D:locktypeD:zD:lockscopezD:depthzD:ownerz	D:timeoutSecond-zD:locktokenD:hrefzopaquelocktoken:z
D:lockroot)
ETElement
SubElementr   r   r   textr   r   r   )r   href	lock_elemlocktype_elemlockscope_elem
depth_elem
owner_elemtimeout_elemlocktoken_elem	href_elemlockroot_elemlockroot_hrefs               r   to_xmlzWebDAVLock.to_xml9   s,   J~V<<<	i>>
m%5$)%5%5666y-@@
n&74:&7&7888]9i88
*
]9i88
*
}Y<<4dl44y-@@M.(;;	8DJ88	i>>mX>>!r   N)r   r   )__name__
__module____qualname____doc__r   r    r6    r   r   r   r   *   sL        11# # # #9 9 9    r   r   c                        e Zd ZdZ	 	 d% fd	Zd&dZd	 Zd
 Zd Zd'dZ	d'dZ
d Zd Zd'dZd Zd Zd'dZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd  Zd! Zd" Zd# Z d$ Z! xZ"S )(WebDAVHandlerap  
    WebDAV server handler implementing RFC 4918 WebDAV specification.
    
    Features:
    - Complete WebDAV method support (PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK, UNLOCK)
    - XML property handling with namespace support
    - File locking mechanism
    - Directory traversal protection
    - MIME type detection
    - WebDAV-compliant error responses
    NTr   d   c                    t                                                       || _        || _        || _        || _        || _        i | _        ddd| _        | j        rt          j
                            | j                  | _        t          j
                            | j                  st          j        | j                   t          j
                            | j                  st          d| j                   dS dS )a  
        Initialize the WebDAV handler.
        
        Args:
            webdav_root (str): Root directory to serve WebDAV from
            enable_locks (bool): Whether to enable WebDAV locking
            default_lock_timeout (int): Default lock timeout in seconds
            max_depth (int): Maximum depth for PROPFIND operations
            print_cb (callable): Logging callback function
        r"   z$http://www.w3.org/XML/1998/namespace)Dxmlz WebDAV root is not a directory: N)superr   webdav_rootenable_locksdefault_lock_timeout	max_depthprint_cblocks
namespacesospathabspathexistsmakedirsisdir
ValueError)r   rC   rD   rE   rF   rG   	__class__s         r   r   zWebDAVHandler.__init__d   s     	&($8!"  
 9
 

  	X!wt/?@@D7>>$"233 .D,---7==!122 X !VDDT!V!VWWW	X 	X
X Xr    c                 R   K   | j         dS |                      |           d{V  dS )z-Log a message if print callback is available.N)rG   )r   msgs     r   printzWebDAVHandler.print   s=      = FmmC           r   c                 \   | j         sdS |s| j         S |                    dd          }g }|                    d          D ]Y                                rdk    rdk    r&t	          fddD                       r dS |                               Z| j         }|D ]"t          j                            |          }#t          j        	                    |          }	 t          j        
                    || j         g          }|| j         k    rdS n# t          $ r Y dS w xY w|S )a  
        Sanitize the requested path to prevent directory traversal attacks.
        
        Args:
            path_request (str): The requested file or directory path
            
        Returns:
            str or None: Safe absolute path or None if invalid
        N\/.z..c              3       K   | ]}|v V  	d S r   r;   ).0char	components     r   	<genexpr>z/WebDAVHandler._sanitize_path.<locals>.<genexpr>   s(      UU49$UUUUUUr   ):*?"<>|)rC   replacesplitstripanyappendrJ   rK   joinrL   
commonpathrP   )r   path_requestnormalized_pathpath_components	safe_pathcommon_pathr]   s         @r   _sanitize_pathzWebDAVHandler._sanitize_path   s~     	4 	$## '..tS99 (..s33 	. 	.I!))I 	S 0 0D  UUUU1TUUUUU tt""9---- $	( 	; 	;IY	::IIGOOI..		',,i9I-JKKKd...t / 	 	 	44	 s   '1D 
D)(D)c                     | j         r|sdS 	 t          j                            || j                   }|dk    rdS d|                    t          j        d          z   S # t          $ r Y dS w xY w)z#Get relative path from WebDAV root.rX   rY   )rC   rJ   rK   relpathrf   seprP   )r   absolute_pathrel_paths      r   _get_relative_pathz WebDAVHandler._get_relative_path   s     	} 	3	w}d6FGGH3s))"&#6666 	 	 	33	s   +A "A 
A+*A+c                 8    t          j        |          \  }}|pdS )zGet the MIME type for a file.zapplication/octet-stream)	mimetypes
guess_type)r   filepath	mime_type_s       r   _get_mime_typezWebDAVHandler._get_mime_type   s"     +H55	1666r   c                     |t          j                     }t          j        |t          j                  }|                    d          S )zFormat timestamp as HTTP date.Ntzz%a, %d %b %Y %H:%M:%S GMTr   r   fromtimestampr   utcstrftimer   	timestampdts      r   _format_http_datezWebDAVHandler._format_http_date   s=    	I#I(,???{{6777r   c                     |t          j                     }t          j        |t          j                  }|                    d          S )z"Format timestamp as ISO 8601 date.Nr   z%Y-%m-%dT%H:%M:%SZr   r   s      r   _format_iso_datezWebDAVHandler._format_iso_date   s=    	I#I(,???{{/000r   c                 B   |D ]\  }}|                                 dk    r~|                    d                                          }|                                 dk    r dS 	 t          |          }|dk     r dS t	          |          c S # t
          $ r Y  dS w xY wdS )z$Parse the Depth header from request.s   depthasciiinfinityr   r   1)lowerdecoderh   intstrrP   )r   headersnamevalue	depth_strr   s         r   _parse_depth_headerz!WebDAVHandler._parse_depth_header   s    " 	 	KD%zz||x''!LL117799	??$$
22%::	NNEqyy"ssu::%%%!   333 ( ss   #B;B
BBc                     g }| j                                         D ].\  }}|                                r|                    |           /|D ]
}| j         |= dS )zRemove expired locks.N)rH   itemsr    rj   )r   expired_pathsrK   locks       r   _clean_expired_locksz"WebDAVHandler._clean_expired_locks   su    ***,, 	+ 	+JD$   +$$T***! 	! 	!D
4  	! 	!r   c                     |                                   || j        vrdS | j        |         }|r||j        k    rdS |j        dk    rdS dS )z-Check if there are lock conflicts for a path.FsharedT)r   rH   r   r   )r   rK   r   r   s       r   _check_lock_conflictsz#WebDAVHandler._check_lock_conflicts   sh    !!###tz!!5z$  	Udj((5 :!!5 tr   c                 &  K   g }	 | j                                          d{V }t          |t          j                  r"|j        r|                    |j                   nt          |t          j                  rnnxd                    |          S )zRead the full request body.TNr   )	_wrapper
next_event
isinstanceh11Datadatarj   EndOfMessagerk   )r   
body_partsevents      r   _read_request_bodyz WebDAVHandler._read_request_body  s      
	-2244444444E%** : 2%%ej111E3#344 	 xx
###r   c                 4   |                     dd           t          j        |d          }	 t          j        |          }|j                            d          }d |                    d          D             }d                    |          S #  |cY S xY w)	z Create a formatted XML response.xmlns:Dr"   unicode)encodingz  )indentc                 :    g | ]}|                                 |S r;   )rh   )r[   lines     r   
<listcomp>z6WebDAVHandler._create_xml_response.<locals>.<listcomp>(  s%    IIIdDJJLLITIIIr   
)	setr'   tostringr   parseStringdocumentElementtoprettyxmlrg   rk   )r   root_elementrough_stringreparsedprettyliness         r   _create_xml_responsez"WebDAVHandler._create_xml_response  s     	F+++ {<)DDD	 *<88H-999FFFIIfll4&8&8IIIE99U###	 s   A"B Bc                    	 t          j        |          }t           j                            |          }i }|rd|v r|                     |j                  |d<   |rd|v r$t           j                            |          pd|d<   |rd|v r|st          |j                  |d<   |rd|v r|s| 	                    |          |d<   |rd|v r| 
                    |j                  |d<   |rd|v rd|j         d	|j         d}||d<   |rd
|v r|rd|d
<   nd|d
<   |rd|v r| j        rd|d<   nd|d<   |rd|v rx|                     |          }|| j        v rU| j        |         }|                                s.|                     |                    |                    }	|	|d<   nd|d<   nd|d<   |S # t$          $ r i cY S w xY w)z.Get WebDAV properties for a file or directory.creationdatedisplaynameRootgetcontentlengthgetcontenttypegetlastmodifiedgetetagrb   -resourcetypez<D:collection/>rR   supportedlocka  
                        <D:lockentry>
                            <D:lockscope><D:exclusive/></D:lockscope>
                            <D:locktype><D:write/></D:locktype>
                        </D:lockentry>
                        <D:lockentry>
                            <D:lockscope><D:shared/></D:lockscope>
                            <D:locktype><D:write/></D:locktype>
                        </D:lockentry>
                    lockdiscovery)rJ   statrK   rO   r   st_ctimebasenamer   st_sizer   r   st_mtimerD   rx   rH   r    r   r6   OSError)
r   	file_pathrequested_propsr   is_dirpropsetagrw   r   lock_xmls
             r   _get_file_propertiesz"WebDAVHandler._get_file_properties-  s   A	79%%DW]]9--FE # Mn&G&G(,(=(=dm(L(Ln%" Mm&F&F')w'7'7	'B'B'Lfm$" B&8O&K&K B03DL0A0AE,-" M&6/&I&I M.2.A.A).L.LE*+" Q&7?&J&J+/+A+A$-+P+P'(" (i?&B&B:4=::4<:::#'i " /n&G&G /,=E.)),.E.)" 0o&H&H$ 0	.E/** .0E/*" 
0o&H&H229==tz)):h/D??,, 4#'#<#<T[[=R=R#S#S19o..13o..-/E/*L 	 	 	III	s   F,F/ /F>=F>c                   K   |                      d|j                                                    d{V  |                                 }|                    g d           t          j        d|          }| j                            |           d{V  | j                            t          j	                               d{V  dS )z7Handle OPTIONS request - advertise WebDAV capabilities.z[WEBDAV] OPTIONS N))Allowsb   OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, PROPFIND, PROPPATCH, COPY, MOVE, MKCOL, LOCK, UNLOCK)DAVs   1, 2)zMS-Author-Vias   DAVContent-Length   0   status_coder   )
rU   targetr   basic_headersextendr   Responser   sendr   )r   r   r   responses       r   
do_OPTIONSzWebDAVHandler.do_OPTIONSr  s      jjDU\-@-@-B-BDDEEEEEEEEE$$&& 
 
 
 	 	 	 <CAAAm  *********m  !1!3!344444444444r   c           	      V  K   t           j                            |j                            d                    }|                     d|            d{V  |                     |          }|s|                     dd           d{V  dS t          j	        
                    |          s|                     dd           d{V  dS |                     |j                  }|                                  d{V }d}|ro	 t          j        |                    d                    }|                                D ]*}|j                            d          rd	 |D             } n+n#  Y nxY wt          j        d
          }	|	                    dd           |                     |	||           d{V  |dk    rt          j	                            |          r	 t          j        |          D ]}
t          j	                            ||
          }|                     |	||           d{V  |dk    r=t          j	                            |          r|                     |	||d           d{V  n# t4          $ r Y nw xY wd}||                     |	          z  }|                    d          }|                                 }|                    ddt?          tA          |                                        d          fg           tC          j"        d|          }| j#        $                    |           d{V  | j#        $                    tC          j%        |                     d{V  | j#        $                    tC          j&                               d{V  dS )z6Handle PROPFIND request - get properties of resources.utf-8z[WEBDAV] PROPFIND N  Invalid path  	Not Foundpropc                 N    g | ]"}|j                             d           d         #S )})tagrg   )r[   childs     r   r   z-WebDAVHandler.do_PROPFIND.<locals>.<listcomp>  s+    *[*[*[59??3+?+?+C*[*[*[r   zD:multistatusr   r"   r   r      '<?xml version="1.0" encoding="utf-8"?>
Content-Types   application/xml; charset=utf-8r   r      r   r   )'urllibparseunquoter   r   rU   rr   _serve_errorrJ   rK   rM   r   r   r   r'   
fromstringiterr   endswithr(   r   _add_propfind_responserO   listdirrk   _add_propfind_recursivePermissionErrorr   encoder   r   r   lenr   r   r   r   r   r   )r   r   rK   rp   r   bodyr   root	prop_elemmultistatusitem
child_pathxml_contentr   r   s                  r   do_PROPFINDzWebDAVHandler.do_PROPFIND  s     |##EL$7$7$@$@AAjj4d44555555555''--	 	##C888888888Fw~~i(( 	##C555555555F ((77 ,,........ 		}T[[%9%9::!%  I }--f55 *[*[QZ*[*[*[ j11	6*** ))+y/RRRRRRRRR C<<BGMM)44<	Jy11 h hD!#i!>!>J55k:_________ 
**rw}}Z/H/H*"::;
Tcefgggggggggh #    At00===!!'**$$&&?s3t99~~44W==>
 	 	 	
 <CAAAm  *********m  t!4!4!4555555555m  !1!3!344444444444s    A&E* *E.BI6 6
JJc                   K   t          j        |d          }|                     |          }t          j        |d          }||_        t          j        |d          }t          j        |d          }|                     ||          }	|	                                D ]@\  }
}|s|dk    r1t          j        |d|
           }|
dk    rX|rV	 |                                r2t          j        d| d	          }|D ]}|                    |           w#  ||_        Y xY w|
d
k    rQ|rO	 |                                r2t          j        d| d	          }|D ]}|                    |           #  Y xY w|
dk    rJ|rH	 |                                r)t          j        |          }|                    |           $#  Y )xY wt          |          |_        Bt          j        |d          }d|_        dS )z7Add a single resource response to PROPFIND multistatus.z
D:responser&   z
D:propstatD:proprR   r$   r   z<temp xmlns:D="DAV:">z</temp>r   r   zD:statuszHTTP/1.1 200 OKN)
r'   r)   rx   r*   r   r   rh   r   rj   r   )r   r  r   r   response_elemrw   r3   propstat_elemr  r   	prop_name
prop_valueprop_sub_elem	temp_elemr   status_elems                   r   r  z$WebDAVHandler._add_propfind_response  sM     k<@@ **955M-::	!	 m\BBM-::	 )))_EE%*[[]] 	9 	9!Iz 9Z2-- "i9Ii9I9I J J..:.8%++-- <(*6aj6a6a6a(b(bI)2 < < - 4 4U ; ; ; ;8-7***/11j1%++-- <(*6aj6a6a6a(b(bI)2 < < - 4 4U ; ; ; ;/11j1%++-- <(*j(A(AI)00;;;),ZM& mM:>>,s&   AD	D+AE22E6=GGc                 ~  K   || j         k    rdS 	 t          j        |          D ]}t          j                            ||          }|                     |||           d{V  t          j                            |          r!|                     ||||dz              d{V  dS # t          t          f$ r Y dS w xY w)z9Recursively add PROPFIND responses with depth protection.Nr   )
rF   rJ   r  rK   rk   r  rO   r  r  r   )r   r  dir_pathr   current_depthr  r  s          r   r  z%WebDAVHandler._add_propfind_recursive  s      4>))F	
8,, t tW\\(D99
11+z?[[[[[[[[[7==,, t66{JP_anqrarssssssssst t  ) 	 	 	DD	s   BB' 'B<;B<c                    K   t           j                            |j                            d                    }|                     d|            d{V  |                     dd           d{V  dS )z:Handle PROPPATCH request - modify properties of resources.r   z[WEBDAV] PROPPATCH N  z#Property modification not supported)r   r   r   r   r   rU   r   )r   r   rK   s      r   do_PROPPATCHzWebDAVHandler.do_PROPPATCH	  s      |##EL$7$7$@$@AAjj5t55666666666 %JKKKKKKKKKKKr   c                   K   t           j                            |j                            d                    }|                     d|            d{V  |                     |          }|s|                     dd           d{V  dS t          j	        
                    |          r|                     dd           d{V  dS t          j	                            |          }t          j	        
                    |          s|                     dd	           d{V  dS |                     |          }|                     |          r|                     d
d           d{V  dS 	 t          j        |           |                     d|            d{V  |                                 }|                    d           t#          j        d|          }| j                            |           d{V  | j                            t#          j                               d{V  dS # t,          $ r7}|                     ddt/          |                      d{V  Y d}~dS d}~ww xY w)z*Handle MKCOL request - create a directory.r   z[WEBDAV] MKCOL Nr   r   r  zResource already exists   Parent collection does not exist  Resource is lockedz[WEBDAV] Created directory: r      r     zFailed to create directory: )r   r   r   r   r   rU   rr   r   rJ   rK   rM   dirnamerx   r   rN   r   rj   r   r   r   r   r   r   r   )	r   r   rK   rp   
parent_dirrw   r   r   es	            r   do_MKCOLzWebDAVHandler.do_MKCOL  s     |##EL$7$7$@$@AAjj1411222222222''--	 	##C888888888F 7>>)$$ 	##C)BCCCCCCCCCF W__Y//
w~~j)) 	##C)KLLLLLLLLLF **955%%h// 	##C)=>>>>>>>>>F	RK	"""**GIGGHHHHHHHHH ((**GNN3444|WEEEH-$$X.........-$$S%5%7%788888888888 	R 	R 	R##C)PA)P)PQQQQQQQQQQQQQQQ	Rs   /CH3 3
I4=,I//I4c                 R  K   t           j                            |j                            d                    }|                     d|            d{V  |                     |          }|s|                     dd           d{V  dS t          j	        
                    |          s|                     dd           d{V  dS t          j	                            |          r|                     |           d{V  dS |                     ||j                   d{V  dS )z$Handle GET request - download files.r   z[WEBDAV] GET Nr   r   r   r   )r   r   r   r   r   rU   rr   r   rJ   rK   rM   rO   _serve_directory_listing_serve_filer   )r   r   rK   rp   s       r   do_GETzWebDAVHandler.do_GET=  sW     |##EL$7$7$@$@AAjj///000000000''--	 	##C888888888Fw~~i(( 	##C555555555F7==## 	=//	::::::::::: ""9em<<<<<<<<<<<r   c                   K   t           j                            |j                            d                    }|                     d|            d{V  |                     |          }|s|                     dd           d{V  dS t          j	        
                    |          s|                     dd           d{V  dS 	 t          j        |          }|                     |          }|                                 }|                    d|                    d	          fd
t!          |j                                      d	          fd|                     |j                                      d	          fdd|j         d|j         d                    d	          fg           t)          j        d|          }| j                            |           d{V  | j                            t)          j                               d{V  dS # t2          $ r7}|                     ddt!          |                      d{V  Y d}~dS d}~ww xY w)z/Handle HEAD request - get headers without body.r   z[WEBDAV] HEAD Nr   r   r   r   r   r   r   Last-ModifiedETagrb   r   r   r   r&  zError accessing file: )r   r   r   r   r   rU   rr   r   rJ   rK   rM   r   r   r   r   r  r   r   r   r   r   r   r   r   r   r   )	r   r   rK   rp   r   r}   r   r   r)  s	            r   do_HEADzWebDAVHandler.do_HEADR  s     |##EL$7$7$@$@AAjj0$00111111111''--	 	##C888888888Fw~~i(( 	##C555555555F	L79%%D++I66I((**GNN!1!1'!:!:;!3t|#4#4#;#;G#D#DE $"8"8"G"G"N"Nw"W"WX<T]<<T\<<<CCGLLM	    |WEEEH-$$X.........-$$S%5%7%788888888888 	L 	L 	L##C)J#a&&)J)JKKKKKKKKKKKKKKK	Ls   EH 
I#,IIc                   K   t           j                            |j                            d                    }|                     d|            d{V  |                     |          }|s|                     dd           d{V  dS |                     |          }| 	                    |          r|                     dd           d{V  dS t          j                            |          }t          j                            |          s|                     dd	           d{V  dS t          j                            |           }	 t          |d
          5 }	 | j                                         d{V }t#          |t$          j                  r"|j        r|                    |j                   nt#          |t$          j                  rnnxddd           n# 1 swxY w Y   |                     d|rdnd d|            d{V  |rdnd}|                                 }	|	                    d           t%          j        ||	          }
| j                            |
           d{V  | j                            t%          j                               d{V  dS # t6          $ r7}|                     ddt9          |                      d{V  Y d}~dS d}~ww xY w)z)Handle PUT request - upload/create files.r   z[WEBDAV] PUT Nr   r   r#  r$  r!  r"  wbTz	[WEBDAV] CreatedUpdatedz file: r%     r   r   r&  zFailed to write file: )r   r   r   r   r   rU   rr   r   rx   r   rJ   rK   r'  rM   openr   r   r   r   r   r   writer   r   rj   r   r   r   r   )r   r   rK   rp   rw   r(  is_new_filefr   r   r   r)  s               r   do_PUTzWebDAVHandler.do_PUTs  s     |##EL$7$7$@$@AAjj///000000000''--	 	##C888888888F **955%%h// 	##C)=>>>>>>>>>F W__Y//
w~~j)) 	##C)KLLLLLLLLLF'..333	Li&& 	!"&-":":"<"<<<<<<<E!%22  : 0GGEJ///#E3+;<< 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 **dk)PyddYbddeeeeeeeee "-5###K((**GNN3444|WMMMH-$$X.........-$$S%5%7%788888888888 	L 	L 	L##C)J#a&&)J)JKKKKKKKKKKKKKKK	Ls>   J0 "A:G(J0 (G,,J0 /G,0B>J0 0
K1:,K,,K1c                   K   t           j                            |j                            d                    }|                     d|            d{V  |                     |          }|s|                     dd           d{V  dS t          j	        
                    |          s|                     dd           d{V  dS |                     |          }|                     |          r|                     dd	           d{V  dS 	 t          j	                            |          r8d
dl}|                    |           |                     d|            d{V  n2t          j        |           |                     d|            d{V  || j        v r| j        |= |                                 }|                    d           t)          j        d|          }| j                            |           d{V  | j                            t)          j                               d{V  dS # t2          $ r7}|                     ddt5          |                      d{V  Y d}~dS d}~ww xY w)z5Handle DELETE request - delete files and directories.r   z[WEBDAV] DELETE Nr   r   r   r   r#  r$  r   z[WEBDAV] Deleted directory: z[WEBDAV] Deleted file: r   r7  r   r&  zFailed to delete: )r   r   r   r   r   rU   rr   r   rJ   rK   rM   rx   r   rO   shutilrmtreeremoverH   r   rj   r   r   r   r   r   r   r   )	r   r   rK   rp   rw   r>  r   r   r)  s	            r   	do_DELETEzWebDAVHandler.do_DELETE  s     |##EL$7$7$@$@AAjj2D22333333333''--	 	##C888888888Fw~~i(( 	##C555555555F **955%%h// 	##C)=>>>>>>>>>F	Hw}}Y'' Hi(((jj!K	!K!KLLLLLLLLLL 	)$$$jj!F9!F!FGGGGGGGGG 4:%%Jx( ((**GNN3444|WEEEH-$$X.........-$$S%5%7%788888888888 	H 	H 	H##C)Fc!ff)F)FGGGGGGGGGGGGGGG	Hs   D*H? ?
J 	,I;;J c                 
  K   t           j                            |j                            d                    }|                     d|            d{V  d}d}|j        D ]\  }}|                                dk    r3t           j                            |                    d                    }P|                                dk    r+|                    d                                          dk    }|s| 	                    d	d
           d{V  dS | 
                    |          }| 
                    |          }|r|s| 	                    d	d           d{V  dS t          j                            |          s| 	                    dd           d{V  dS t          j                            |          }	|	r |s| 	                    dd           d{V  dS |                     |          }
|                     |
          r| 	                    dd           d{V  dS 	 t          j                            |          rSddl}|	r|                    |           |                    ||           |                     d| d|            d{V  nddl}t          j                            |          }t          j                            |          st          j        |           |                    ||           |                     d| d|            d{V  |	rdnd}|                                 }|                    d           t3          j        ||          }| j                            |           d{V  | j                            t3          j                               d{V  dS # t<          $ r7}| 	                    ddt?          |                      d{V  Y d}~dS d}~ww xY w)z%Handle COPY request - copy resources.r   z[WEBDAV] COPY NT   destination	   overwriter   Tr   Destination header requiredr   r   Source not found  )Destination exists and overwrite is falser#  zDestination is lockedr   z[WEBDAV] Copied directory:  -> z[WEBDAV] Copied file: r7  r%  r   r   r&  zFailed to copy: ) r   r   r   r   r   rU   r   r   upperr   rr   rJ   rK   rM   rx   r   rO   r>  r?  copytreer'  rN   copy2r   rj   r   r   r   r   r   r   r   )r   r   rK   destination	overwriter   r   safe_source	safe_destdest_existsrel_destr>  r(  r   r   r   r)  s                    r   do_COPYzWebDAVHandler.do_COPY  s     |##EL$7$7$@$@AAjj0$00111111111 	 = 	A 	AKD%zz||~--$l225<<3H3HII--!LL117799S@	 	##C)FGGGGGGGGGF))$//''44	 	) 	##C888888888Fw~~k** 	##C);<<<<<<<<<F gnnY// 	y 	##C)TUUUUUUUUUF **955%%h// 	##C)@AAAAAAAAAF	Fw}}[)) X -MM),,,Y777jj![{![![PY![![\\\\\\\\\\ W__Y77
w~~j11 ,K
+++[)444jj!V+!V!V9!V!VWWWWWWWWW "-5###K((**GNN3444|WMMMH-$$X.........-$$S%5%7%788888888888 	F 	F 	F##C)DCFF)D)DEEEEEEEEEEEEEEE	Fs   *FO 
P,O==Pc                 Z  K   t           j                            |j                            d                    }|                     d|            d{V  d}d}|j        D ]\  }}|                                dk    r3t           j                            |                    d                    }P|                                dk    r+|                    d                                          dk    }|s| 	                    d	d
           d{V  dS | 
                    |          }| 
                    |          }|r|s| 	                    d	d           d{V  dS t          j                            |          s| 	                    dd           d{V  dS t          j                            |          }	|	r |s| 	                    dd           d{V  dS |                     |          }
|                     |          }|                     |
          s|                     |          r| 	                    dd           d{V  dS 	 t          j                            |          }t          j                            |          st          j        |           |	rMt          j                            |          rddl}|                    |           nt          j        |           t          j        ||           |                     d| d|            d{V  |
| j        v r| j        |
         | j        |<   | j        |
= |	rdnd}|                                 }|                    d           t5          j        ||          }| j                            |           d{V  | j                            t5          j                               d{V  dS # t>          $ r7}| 	                    ddtA          |                      d{V  Y d}~dS d}~ww xY w)z,Handle MOVE request - move/rename resources.r   z[WEBDAV] MOVE NTrC  rD  r   rE  r   rF  r   r   rG  rH  rI  r#  r$  r   z[WEBDAV] Moved: rJ  r7  r%  r   r   r&  zFailed to move: )!r   r   r   r   r   rU   r   r   rK  r   rr   rJ   rK   rM   rx   r   r'  rN   rO   r>  r?  r@  renamerH   r   rj   r   r   r   r   r   r   r   )r   r   rK   rN  rO  r   r   rP  rQ  rR  
rel_sourcerS  r(  r>  r   r   r   r)  s                     r   do_MOVEzWebDAVHandler.do_MOVE  s     |##EL$7$7$@$@AAjj0$00111111111 	 = 	A 	AKD%zz||~--$l225<<3H3HII--!LL117799S@	 	##C)FGGGGGGGGGF))$//''44	 	) 	##C888888888Fw~~k** 	##C);<<<<<<<<<F gnnY// 	y 	##C)TUUUUUUUUUF ,,[99
**955%%j11 	T5O5OPX5Y5Y 	##C)=>>>>>>>>>F 	F33J7>>*-- (J'''  )7==++ )!MMMMM),,,,Ii(((Ik9---**LLLLLMMMMMMMMM TZ'''+z*'=
8$Jz* "-5###K((**GNN3444|WMMMH-$$X.........-$$S%5%7%788888888888 	F 	F 	F##C)DCFF)D)DEEEEEEEEEEEEEEE	Fs   FO) )
P*3,P%%P*c           	      	  K   | j         s|                     dd           d{V  dS t          j                            |j                            d                    }|                     d|            d{V  |                     |          }|s|                     dd           d{V  dS | 	                    |          }| 
                                 d{V }|s|                     dd           d{V  dS 	 t          j        |                    d                    }d	}d
}d}	| j        }
|                                D ]|}|j                            d	          rd	}|j                            d          rd}<|j                            d
          rd
}Y|j                            d          r	|j        pd}	}|j        D ]p\  }}|                                dk    rS|                    d          }|                    d          r)	 t+          |dd                   }
`# t,          $ r Y lw xY wq|                     |          r|                     dd           d{V  dS t1          t3          j                              }t7          ||||	|
          }|| j        |<   |                     d| d|            d{V  t          j        d          }|                    dd           t          j        |d          }|                     |!                    |                     d}|| "                    |          z  }|#                    d          }| $                                }|%                    ddt1          tM          |                    #                    d          fdd| d#                    d          fg           tO          j(        d |!          }| j)        *                    |           d{V  | j)        *                    tO          j+        |"                     d{V  | j)        *                    tO          j,                               d{V  dS # t          j-        $ r  |                     dd#           d{V  Y dS t\          $ r7}|                     d$d%t1          |                      d{V  Y d}~dS d}~ww xY w)&z%Handle LOCK request - lock resources.r  Locking not supportedNr   z[WEBDAV] LOCK r   r   zLock request body required	exclusiver9  unknownr   r   s   timeoutr   r%      r#  zResource already lockedz[WEBDAV] Created lock z on r  r   r"   zD:lockdiscoveryr   r   r   z
Lock-Token<opaquelocktoken:rd   r   r   r   zInvalid XML in lock requestr&  zLock error: )/rD   r   r   r   r   r   r   rU   rr   rx   r   r'   r   rE   r  r   r  r*   r   r   
startswithr   rP   r   r   uuiduuid4r   rH   r(   r   r)   rj   r6   r   r  r   r   r  r   r   r   r   r   r   
ParseError	Exception)r   r   rK   rp   rw   r	  r
  
lock_scope	lock_typer   r   elemr   r   timeout_str
lock_tokenr   r  lockdiscovery_elemr  r   r   r)  s                          r   do_LOCKzWebDAVHandler.do_LOCKj  s       	##C)@AAAAAAAAAF|##EL$7$7$@$@AAjj0$00111111111''--	 	##C888888888F**955 ,,........ 	##C)EFFFFFFFFFFC	B=W!5!566D %JIE/G		 3 38$$[11 3!,JJX&&x00 3!)JJX&&w// 3 'IIX&&w// 3 I2E  %} ! !e::<<:--"',,w"7"7K"--i88 !!&)+abb/&:&:GG) ! ! ! D! ))(33 ''-FGGGGGGGGG TZ\\**Jj*iPPD#'DJx **PjPPhPPQQQQQQQQQ 
8,,IMM)V,,,!#y:K!L!L%%dkk(&;&;<<<DK444Y???K%%g..D((**GNNC!3s4yy>>#8#8#A#AB@:@@@GGPPQ    |WEEEH-$$X.........-$$SX4%8%8%8999999999-$$S%5%7%788888888888} 	H 	H 	H##C)FGGGGGGGGGGGG 	B 	B 	B##C)@A)@)@AAAAAAAAAAAAAAA	BsJ   DQ6 H.-Q6 .
H;8Q6 :H;;5Q6 2HQ6 6+S$$	S$-,SS$c                   K   | j         s|                     dd           d{V  dS t          j                            |j                            d                    }|                     d|            d{V  |                     |          }|s|                     dd           d{V  dS | 	                    |          }d}|j
        D ]h\  }}|                                dk    rK|                    d	          }|                    d
          r|                    d          r
|dd         } ni|s|                     dd           d{V  dS || j        vr|                     dd           d{V  dS | j        |         }	|	j        |k    r|                     dd           d{V  dS | j        |= |                     d| d|            d{V  |                                 }
|
                    d           t%          j        d|
          }| j                            |           d{V  | j                            t%          j                               d{V  dS )z)Handle UNLOCK request - unlock resources.r  rZ  Nr   z[WEBDAV] UNLOCK r   r   s
   lock-tokenr   r^  rd      r   zLock-Token header requiredr!  zResource not lockedi  zInvalid lock tokenz[WEBDAV] Removed lock z from r   r7  r   )rD   r   r   r   r   r   r   rU   rr   rx   r   r   r_  r  rH   r   r   rj   r   r   r   r   r   )r   r   rK   rp   rw   rh  r   r   	token_strr   r   r   s               r   	do_UNLOCKzWebDAVHandler.do_UNLOCK  s       	##C)@AAAAAAAAAF|##EL$7$7$@$@AAjj2D22333333333''--	 	##C888888888F**955 
 = 	 	KD%zz||},,!LL11	''(;<< 2ASASTWAXAX 2!*2b5!1J -  	##C)EFFFFFFFFFF 4:%%##C)>?????????Fz(#:####C)=>>>>>>>>>F Jx jjN*NNHNNOOOOOOOOO $$&&/000<CAAAm  *********m  !1!3!344444444444r   c                   K   	 t           j                            |          }|                     |          }t          j        |          }d}|D ]4\  }}|                                dk    r|                    d          } n5d}	|dz
  }
d}|ry|                    d          rd	 |dd         }d	|v r=|                    d	d          \  }}|rt          |          }	|rt          |          }
d
}n# t          t          f$ r Y nw xY w|
|	z
  dz   }|                                 }|                    d|                    d          fdt          |                              d          fdd|                     |j                                      d          fdd|j         d	|j         d                    d          fg           |d
k    r3|                    dd|	 d	|
 d|                     d          f           t)          j        ||          }| j                            |           d{V  d}d}t1          |d          5 }|	dk    r|                    |	           ||k     rvt5          |||z
            }|                    |          }|snK| j                            t)          j        |                     d{V  |t;          |          z  }||k     vddd           n# 1 swxY w Y   | j                            t)          j                               d{V  dS # t>          $ r7}|                      ddt          |                      d{V  Y d}~dS d}~ww xY w)z Serve a file with range support.Ns   ranger   r   r   r   zbytes=   r      r   r   )zAccept-Rangess   bytesr0  r1  rb   zContent-Rangezbytes rX   r   i   rbr   r&  zError serving file: )!rJ   rK   getsizer   r   r   r   r_  rg   r   rP   
IndexErrorr   r   r  r   r   r   r   rj   r   r   r   r   r8  seekminreadr   r  r   r   r   )r   r   request_headers	file_sizer}   r   range_headerr   r   
start_byteend_byter   
range_specstartendcontent_lengthr   r   
chunk_size
bytes_sentr;  	read_sizechunkr)  s                           r   r-  zWebDAVHandler._serve_file  sR     D	J	22I++I66I79%%D  L.  e::<<8++#(<<#8#8LE , J 1}HK   7 7 A A 
!-abb!1Jj((%/%5%5c1%=%=
s  4),UJ 0'*3xxH&)"J/   D &
2Q6N((**GNN!1!1'!:!:;!3~#6#6#=#=g#F#FG+ $"8"8"G"G"N"Nw"W"WX<T]<<T\<<<CCGLLM    c!!1]*1]1]x1]1]R[1]1]1d1del1m1mnooo|WMMMH-$$X......... #JJi&& -!>>FF:&&& >11 #J0K L LIFF9--E  -,,SX5-A-A-ABBBBBBBBB#e**,J !>11	- - - - - - - - - - - - - - - -$$S%5%7%788888888888 	J 	J 	J##C)HA)H)HIIIIIIIIIIIIIII	Jsc   B!L. &AC2 1L. 2DL. DEL. BK0$L. 0K44L. 7K484L. .
M/8,M**M/c                   K   	 |                      |          }dt          j        |           dt          j        |           d}|dk    rNd                    |                    d                              d          dd                   pd}|d| dz  }t          t          j        |                    D ]}t          j	                            ||          }t          j
        |          }t          j	                            |          r#d	}d
}	|                    d          dz   |z   dz   }
n1d}t          |j                  }	|                    d          dz   |z   }
|                     |j                  }|dt          j        |
           dt          j        |           d| d|	 d| dz  }|dz  }|                    d          }|                                 }|                    ddt          t'          |                                        d          fg           t)          j        d|          }| j                            |           d{V  | j                            t)          j        |                     d{V  | j                            t)          j                               d{V  dS # t4          $ r7}|                     ddt          |                      d{V  Y d}~dS d}~ww xY w)z&Serve a simple HTML directory listing.z;<!DOCTYPE html>
<html>
<head>
    <title>WebDAV Directory: a  </title>
    <style>
        body { font-family: Arial, sans-serif; margin: 40px; }
        h1 { color: #333; }
        table { border-collapse: collapse; width: 100%; }
        th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
        th { background-color: #f2f2f2; }
        a { text-decoration: none; color: #0066cc; }
        a:hover { text-decoration: underline; }
    </style>
</head>
<body>
    <h1>WebDAV Directory: z</h1>
    <table>
        <tr>
            <th>Name</th>
            <th>Type</th>
            <th>Size</th>
            <th>Modified</th>
        </tr>
rX   Nr   z'
        <tr>
            <td><a href="zj">../</a></td>
            <td>Directory</td>
            <td>-</td>
            <td>-</td>
        </tr>
	Directoryr   Filez">z</a></td>
            <td>z</td>
            <td>z</td>
        </tr>
zZ
    </table>
    <p><small>WebDAV Server powered by asysocks</small></p>
</body>
</html>
r   r   s   text/html; charset=utf-8r   r   r   r   r   r&  zError listing directory: )rx   htmlescaperk   rstriprg   sortedrJ   r  rK   r   rO   r   r   r   r   r  r   r   r  r   r   r   r   r   r   r   r   )r   r  rw   html_contentparent_pathr  	item_path	item_stat	item_type	item_sizeitem_urlmodifiedr	  r   r   r)  s                   r   r,  z&WebDAVHandler._serve_directory_listingA  s     U	O..x88H #k(33   ;x00  L4 3!hhxs';';'A'A#'F'Fss'KLLSPS !%! ! !  rz(3344  GLL488	GI..	7==++ A +I #I's33c9D@3FHH &I #I$5 6 6I's33c9D@H11)2DEE !+h//! !37;t3D3D! ! ! ! 	! !
 ! ! !    L  &&w//D((**GNN=!3s4yy>>#8#8#A#AB   
 |WEEEH-$$X.........-$$SX4%8%8%8999999999-$$S%5%7%788888888888 	O 	O 	O##C)MSVV)M)MNNNNNNNNNNNNNNN	Os   KK 
L	,LL	c           	        K   	 d| d| dt          j        |           d                    d          }|                                 }|                    ddt          t          |                                        d          fg           t          j        ||	          }| j	        
                    |           d
{V  | j	        
                    t          j        |                     d
{V  | j	        
                    t          j                               d
{V  d
S # t          $ r)}|                     d|            d
{V  Y d
}~d
S d
}~ww xY w)zServe an error response.z6<!DOCTYPE html>
<html>
<head>
    <title>WebDAV Error z&</title>
</head>
<body>
    <h1>Error z</h1>
    <p>zY</p>
    <hr>
    <p><small>WebDAV Server powered by asysocks</small></p>
</body>
</html>r   r  r   r   r   Nr   zError serving error response: )r  r  r  r   r   r   r  r   r   r   r   r   r   rc  rU   )r   r   messager	  r   r   r)  s          r   r   zWebDAVHandler._serve_error  s     	C %    	G   6'??  ((**GNN=!3s4yy>>#8#8#A#AB   
 |WMMMH-$$X.........-$$SX4%8%8%8999999999-$$S%5%7%788888888888 	C 	C 	C**AaAABBBBBBBBBBBBBBB	Cs   D%D+ +
E5EE)NTr   r>   N)rR   r   )#r7   r8   r9   r:   r   rU   rr   rx   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r*  r.  r2  r<  rA  rT  rX  rj  rn  r-  r,  r   __classcell__)rQ   s   @r   r=   r=   W   sm       
 
 RV)-"X "X "X "X "X "XH! ! ! !. . .`
 
 
7 7 7
8 8 8 81 1 1 1   ! ! !   ($ $ $      $C C C CJ5 5 5 B5 B5 B5H2- 2- 2-h  L L L)R )R )RV= = =*L L LB1L 1L 1Lf,H ,H ,H\FF FF FFPLF LF LF\YB YB YBv25 25 25hFJ FJ FJPWO WO WOrC C C C C C Cr   r=   Tr   c                    K   	 fd}t          ||           }t          d           |                                 d{V S # t          $ r}d|fcY d}~S d}~ww xY w)a[  
    Run the WebDAV server from a target.
    
    Args:
        target: Server target configuration
        webdav_root (str): Root directory for WebDAV operations
        log_callback: Logging callback function
        enable_locks (bool): Whether to enable WebDAV locking
        default_lock_timeout (int): Default lock timeout in seconds
    c                  *    t                     S )N)rD   rE   rG   )r=   )rE   rD   log_callbackrC   s   r   <lambda>z/run_webdav_server_from_target.<locals>.<lambda>  s"    -%!5!	#
 #
 #
 r   )r  z.WebDAV server starting... Press Ctrl+C to stopN)r   rU   serverc  )r   rC   r  rD   rE   handler_factoryserverr)  s    ````   r   run_webdav_server_from_targetr    s      
 
 
 
 
 
 
 OV,OOO>???\\^^#######   Qws   AA 
A#AA#A#	127.0.0.1  Fc                 <  K   	 d}|rd }| rEt          d| d|            t          dt          j                            |                       nt          d| d| d           |rt          d           t          d           t          d	|rd
nd            |rt          d| d           t	          ||t
          j                  }t          || |||           d{V \  }}	t          d|            |	|	| d{V  nC# t          $ r t          d           Y n(t          $ r}
t          d|
            Y d}
~
nd}
~
ww xY w||
                                 t          d           dS # ||
                                 t          d           w xY w)ad  
    Run the WebDAV server.
    
    Args:
        webdav_root (str): Root directory for WebDAV operations
        host (str): Host to bind to
        port (int): Port to bind to
        debug (bool): Enable debug logging
        enable_locks (bool): Whether to enable WebDAV locking
        default_lock_timeout (int): Default lock timeout in seconds
    Nc                 .   K   t          d|             d S )Nz[WEBDAV-SERVER] )rU   )rT   s    r   r  z'run_webdav_server.<locals>.log_callback  s#      .../////r   zStarting WebDAV server on r_   zWebDAV root directory: z (no root directory)z+Debug mode enabled - verbose logging activezWebDAV features:z  - File locking: EnabledDisabledz  - Default lock timeout:  seconds)rC   r  rD   rE   zServer task: 
WebDAV server stopped by userzServer error: zWebDAV server stopped)rU   rJ   rK   rL   r   r	   
SERVER_TCPr  KeyboardInterruptrc  cancel)rC   hostportdebugrD   rE   r  r   server_taskerrr)  s              r   run_webdav_serverr    si     (' 	00 0 0  	R<t<<d<<===JBGOOK,H,HJJKKKKPtPPdPPPQQQ 	A?@@@!"""N#L99*NNOOO 	OM/CMMMNNN4x':;;!>#%%!5"
 "
 "
 
 
 
 
 
 
S 	+k++,,,?I 1 1 1/00000 $ $ $"q""########$ "   %&&&&& "   %&&&&s<   DD
 	E4 
E
#E4 %	E
.E E4 E

E4 4'Fc            
      	   ddl } ddl}|                     d| j        d          }|                    ddd	           |                    d
ddd           |                    ddt
          dd           |                    dddd           |                    ddd           |                    dt
          dd           |                    ddd d!"           |                                }|j        rt          j	        
                    |j                  sxt          d#|j                    	 t          j        |j                   n# t          $ r9}t          d$|j         d%|            |                    d&           Y d}~nYd}~ww xY wt          j	                            |j                  s-t          d'|j         d(           |                    d&           |j        d&k     s|j        d)k    r,t          d*|j                    |                    d&           |j        d&k     r,t          d+|j                    |                    d&           t          d,           t          d-           |j        r5t          d.t          j	                            |j                              nt          d/           t          d0|j         d1|j                    |j        rt          d2           t          d3|j        rd4nd5            |j        st          d6|j         d7           t          d-           t          d8           t          d9|j         d1|j         d:           t          d;|j         d1|j         d:           t          d<           t          d=           t          d>           t          d?           t          d-           	 t-          j        t1          |j        |j        |j        |j        |j         |j        @                     dS # t2          $ r t          dA           Y dS t4          $ r2}t          dB|            |                    d&           Y d}~dS d}~ww xY w)Cz1
    Main entry point for the WebDAV server.
    r   Nz9Asysocks WebDAV Server - RFC 4918 compliant WebDAV serveru  
Examples:
  %(prog)s                                    # Start server on 127.0.0.1:8080 (no root)
  %(prog)s /home/user/webdav                 # Serve WebDAV from directory
  %(prog)s /home/user/webdav --host 0.0.0.0  # Bind to all interfaces
  %(prog)s /home/user/webdav --port 9000     # Use custom port
  %(prog)s /home/user/webdav --debug         # Enable debug logging
  %(prog)s /home/user/webdav --no-locks      # Disable file locking
  %(prog)s --help                           # Show this help message

WebDAV Features:
  • RFC 4918 compliant WebDAV implementation
  • File and directory operations (GET, PUT, DELETE, MKCOL)
  • Property queries and modification (PROPFIND, PROPPATCH)
  • Resource copying and moving (COPY, MOVE)
  • File locking and unlocking (LOCK, UNLOCK)
  • Directory traversal protection
  • Integration with file managers and WebDAV clients
  • Range request support for large files

Client Compatibility:
  • Windows Explorer (Map Network Drive)
  • macOS Finder (Connect to Server)
  • Linux file managers (Nautilus, Dolphin, etc.)
  • WebDAV command-line tools (cadaver, davfs2)
  • Programming libraries (Python requests-webdav, etc.)
        )descriptionformatter_classepilog	directoryra   z WebDAV root directory (optional))nargshelpz--hostz-Hr  z$Host to bind to (default: 127.0.0.1))defaultr  z--portz-pr  zPort to bind to (default: 8080))r   r  r  z--debugz-d
store_truez5Enable debug logging (shows detailed server activity))actionr  z
--no-locksz#Disable WebDAV file locking supportz--lock-timeoutr   z/Default lock timeout in seconds (default: 3600)z	--versionz-vversionzAsysocks WebDAV Server 1.0.0)r  r  z Creating WebDAV root directory: z Error: Cannot create directory 'z': r   zError: 'z' is not a directoryi  z-Error: Port must be between 1 and 65535, got z3Error: Lock timeout must be at least 1 second, got zAsysocks WebDAV Serverz2==================================================zWebDAV Root: z$WebDAV Root: None (server-only mode)zAddress: http://r_   zDebug: EnabledzFile Locking: r  r  zLock Timeout: r  z
WebDAV URLs:z  Web Browser: http://rX   z  WebDAV URL:  http://z
Client Setup Examples:z<  Windows Explorer: Map Network Drive -> http://server:port/z>  macOS Finder: Go -> Connect to Server -> http://server:port/z8  Linux: davfs2, cadaver, or file manager WebDAV support)rD   rE   r  zFailed to start WebDAV server: )argparsesysArgumentParserRawDescriptionHelpFormatteradd_argumentr   
parse_argsr  rJ   rK   rM   rU   rN   r   exitrO   r  lock_timeoutrL   r  r  no_locksasynciorunr  r  rc  )r  r  parserargsr)  s        r   mainr    sN    OOOJJJ $$O < %  F@ /    
 $3    
 $.	     4D    
 2    
 >	     T.     D ~ 
w~~dn-- 		ET^EEFFFDN++++   OOOAOOPPP t~.. 	AT^AAABBBHHQKKK y1}}	E))IdiIIJJJ 1WDDUWWXXX 

"###	(OOO~ 6?bgoodn==??@@@@4555	
4TY
4
4
4
4555z  	
GE::I
G
GHHH= <:t0:::;;;	(OOO	
	
;49
;
;ty
;
;
;<<<	
;49
;
;ty
;
;
;<<<	
$%%%	
HIII	
JKKK	
DEEE	(OOO%NIIJ!]*!%!2
 
 
 	 	 	 	 	  1 1 1/000000   333444s7   5E 
F/FF!AP) )R 	R 'Q;;R __main__)NNTr   )Nr  r  FTr   )"r:   r  rJ   urllib.parser   rz   r  r   tempfilerer`  r   jsonpathlibr   r   r   	xml.etreer   r'   xml.domr   asysocks.unicomm.common.targetr   r	   0asysocks.unicomm.protocol.server.http.httpserverr
   r   r   r=   r  r  r  r7   r;   r   r   <module>r     s   *  				          



  				          ' ' ' ' ' ' ' ' ' ' ' ' ' '       > > > > > > > > Z Z Z Z Z Z Z Z* * * * * * * *Z_C _C _C _C _C% _C _C _CD# PTPT   4 RWCG5' 5' 5' 5'pM M M` zDFFFFF r   