Ë
    "ïàjJ  ã                   óÒ   — d Z ddlZddlZddlZddlZddlmZ ddlmZ ddl	m
Z
mZ ddlmZmZmZ dZ ej"                  e«      ZdZ G d	„ d
e«      Z G d„ de«      Z G d„ de«      Zy)aÆ  
Implementation of a DAV provider that serves resource from a file system.

:class:`~wsgidav.fs_dav_provider.FilesystemProvider` implements a DAV resource
provider that publishes a file system.

If ``readonly=True`` is passed, write attempts will raise HTTP_FORBIDDEN.

This provider creates instances of :class:`~wsgidav.fs_dav_provider.FileResource`
and :class:`~wsgidav.fs_dav_provider.FolderResource` to represent files and
directories respectively.
é    N)ÚList)Úutil)ÚHTTP_FORBIDDENÚDAVError)ÚDAVCollectionÚDAVNonCollectionÚDAVProviderÚreStructuredTexti    c                   ó–   ‡ — e Zd ZdZdededefˆ fd„Zd„ Zd„ Zd„ Z	d	„ Z
d
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zddœd„Zd„ Zd„ Zd„ Zd„ Zd„ Zˆ xZS )ÚFileResourcez~Represents a single existing DAV resource instance.

    See also _DAVResource, DAVNonCollection, and FilesystemProvider.
    ÚpathÚenvironÚ	file_pathc                 ó   •— t         ‰| �  ||«       || _        t        j                  | j                  «      | _        t        j                  j                  | j                  «      | _        t        j                  | j                  «      | _        y ©N)ÚsuperÚ__init__Ú
_file_pathÚosÚstatÚ	file_statr   ÚbasenameÚnamer   Úto_str©Úselfr   r   r   Ú	__class__s       €úF/srv/dav/.venv/lib/python3.12/site-packages/wsgidav/fs_dav_provider.pyr   zFileResource.__init__,   s[   ø€ Ü‰Ñ˜˜wÔ'Ø(ˆŒÜ)+¯©°·±Ó)AˆŒäŸ™×)Ñ)¨$¯/©/Ó:ˆŒ	Ü—K‘K §	¡	Ó*ˆ�	ó    c                 ó<   — | j                   t        j                     S r   )r   r   ÚST_SIZE©r   s    r   Úget_content_lengthzFileResource.get_content_length5   s   € Ø�~‰~œdŸl™lÑ+Ð+r   c                 ó`   — | j                   d   }t        j                  | j                  |«      S )Nzwsgidav.config)r   r   Úguess_mime_typer   )r   Úconfigs     r   Úget_content_typezFileResource.get_content_type8   s(   € Ø—‘Ð.Ñ/ˆÜ×#Ñ# D§I¡I¨vÓ6Ð6r   c                 ó<   — | j                   t        j                     S r   ©r   r   ÚST_CTIMEr"   s    r   Úget_creation_datezFileResource.get_creation_date<   ó   € Ø�~‰~œdŸm™mÑ,Ð,r   c                 ó   — | j                   S r   ©r   r"   s    r   Úget_display_namezFileResource.get_display_name?   ó   € Ø�y‰yÐr   c                 ó@   — t        j                  | j                  «      S r   )r   Úget_file_etagr   r"   s    r   Úget_etagzFileResource.get_etagB   s   € Ü×!Ñ! $§/¡/Ó2Ð2r   c                 ó<   — | j                   t        j                     S r   ©r   r   ÚST_MTIMEr"   s    r   Úget_last_modifiedzFileResource.get_last_modifiedE   r,   r   c                 óT   — t         j                  j                  | j                  «      S r   ©r   r   Úislinkr   r"   s    r   Úis_linkzFileResource.is_linkH   ó   € Ü�w‰w�~‰~˜dŸo™oÓ.Ð.r   c                  ó   — y©NT© r"   s    r   Úsupport_etagzFileResource.support_etagK   ó   € Ør   c                  ó   — yr>   r?   r"   s    r   Úsupport_rangeszFileResource.support_rangesN   rA   r   c                 óT   — | j                   rJ ‚t        | j                  dt        «      S )zUOpen content as a stream for reading.

        See DAVResource.get_content()
        Úrb)Úis_collectionÚopenr   ÚBUFFER_SIZEr"   s    r   Úget_contentzFileResource.get_contentQ   s(   € ð
 ×%Ò%Ð%Ð%ô �D—O‘O T¬;Ó7Ð7r   N)Úcontent_typec                óž   — | j                   rJ ‚| j                  j                  rt        t        «      ‚t        | j                  dt        «      S )zUOpen content as a stream for writing.

        See DAVResource.begin_write()
        Úwb)rF   ÚproviderÚreadonlyr   r   rG   r   rH   )r   rJ   s     r   Úbegin_writezFileResource.begin_write\   s@   € ð
 ×%Ò%Ð%Ð%Ø�=‰=×!Ò!Üœ>Ó*Ð*ô �D—O‘O T¬;Ó7Ð7r   c                 óÔ   — | j                   j                  rt        t        «      ‚t	        j
                  | j                  «       | j                  d¬«       | j                  d¬«       y)úZRemove this resource or collection (recursive).

        See DAVResource.delete()
        T©Ú	recursiveN)	rM   rN   r   r   r   Úunlinkr   Úremove_all_propertiesÚremove_all_locksr"   s    r   ÚdeletezFileResource.deleteh   sN   € ð
 �=‰=×!Ò!Üœ>Ó*Ð*Ü
�	‰	�$—/‘/Ô"Ø×"Ñ"¨TÐ"Ô2Ø×Ñ¨ÐÕ-r   c                óŠ  — | j                   j                  rt        t        «      ‚| j                   j	                  || j
                  «      }t        j                  | j                  |«      rJ ‚t        j                  | j                  |«       | j                   j                  }|rž| j                   j                  || j
                  «      }|r<|j                  | j                  «       |j                  «       d| j
                  ¬«       y|j!                  | j                  «       |j                  «       | j
                  «       yy)ú"See DAVResource.copy_move_single()F©Úwith_childrenr   N)rM   rN   r   r   Ú_loc_to_file_pathr   r   Úis_equal_or_child_urir   ÚshutilÚcopy2r   Úprop_managerÚget_resource_instÚmove_propertiesÚget_ref_urlÚcopy_properties©r   Ú	dest_pathÚis_moveÚfpDestÚpropManÚdestRess         r   Úcopy_move_singlezFileResource.copy_move_singles   sø   € à�=‰=×!Ò!Üœ>Ó*Ð*Ø—‘×0Ñ0°¸D¿L¹LÓIˆÜ×-Ñ-¨d¯i©i¸ÔCÐCÐCä�‰�T—_‘_ fÔ-ð —-‘-×,Ñ,ˆÙØ—m‘m×5Ñ5°iÀÇÁÓNˆGÙØ×'Ñ'Ø×$Ñ$Ó&Ø×'Ñ'Ó)Ø"'Ø ŸL™Lð	 (õ ð ×'Ñ'Ø×$Ñ$Ó&¨×(;Ñ(;Ó(=¸t¿|¹|õð r   c                  ó   — y©zCReturn True, if move_recursive() is available (see comments there).Tr?   ©r   rf   s     r   Úsupport_recursive_movez#FileResource.support_recursive_moveŒ   ó   € àr   c                 óÄ  — | j                   j                  rt        t        «      ‚| j                   j	                  || j
                  «      }t        j                  | j                  |«      rJ ‚t        j                  j                  |«      rJ ‚t        j                  d| j                  › d|› d�«       t        j                  | j                  |«       | j                   j                   rv| j                   j#                  || j
                  «      }| j                   j                   j%                  | j'                  «       |j'                  «       d| j
                  ¬«       yy©z See DAVResource.move_recursive()zmove_recursive(z, ú)TrZ   N©rM   rN   r   r   r\   r   r   r]   r   r   ÚexistsÚ_loggerÚdebugr   r^   Úmover`   ra   rb   rc   ©r   rf   rh   rj   s       r   Úmove_recursivezFileResource.move_recursive�   ó  € à�=‰=×!Ò!Üœ>Ó*Ð*Ø—‘×0Ñ0°¸D¿L¹LÓIˆÜ×-Ñ-¨d¯i©i¸ÔCÐCÐCÜ—7‘7—>‘> &Ô)Ð)Ð)Ü�‰˜¨¯©Ð'8¸¸6¸(À!ÐDÔEÜ�‰�D—O‘O VÔ,ð �=‰=×%Ò%Ø—m‘m×5Ñ5°iÀÇÁÓNˆGØ�M‰M×&Ñ&×6Ñ6Ø× Ñ Ó"Ø×#Ñ#Ó%Ø"ØŸ™ð	 7õ ð &r   c                ó¾   — t        |t        «      r|nt        j                  |«      }t        |t        «      sJ ‚|s"t	        j
                  | j                  ||f«       y©z@Set last modified time for destPath to timeStamp on epoch-formatT©Ú
isinstanceÚintr   Úparse_time_stringr   Úutimer   ©r   rf   Ú
time_stampÚdry_runÚsecss        r   Úset_last_modifiedzFileResource.set_last_modified¤   óT   € ô
 ˜*¤cÔ*ñ ä×'Ñ'¨
Ó3ð 	ô
 ˜$¤Ô$Ð$Ð$ÙÜ�H‰H�T—_‘_ t¨T lÔ3Ør   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚdictr   r#   r'   r+   r/   r3   r7   r;   r@   rC   rI   rO   rW   rk   ro   rz   r‡   Ú__classcell__©r   s   @r   r   r   &   sw   ø„ ñð
+˜Sð +¨4ð +¸Cõ +ò,ò7ò-òò3ò-ò/òòò	8ð +/ô 
8ò	.òò2òö(r   r   c                   ó¨   ‡ — e Zd ZdZdedefˆ fd„Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zdee   fd„Zdedefd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zˆ xZS )ÚFolderResourcez…Represents a single existing file system folder DAV resource.

    See also _DAVResource, DAVCollection, and FilesystemProvider.
    r   r   c                 óB  •— t         ‰| �  ||«       || _        t        j                  | j                  «      | _        | j                  | _        t        j                  j                  | j                  «      | _
        t        j                  | j                  «      | _
        y r   )r   r   r   r   r   r   rM   Úfs_optsr   r   r   r   r   r   s       €r   r   zFolderResource.__init__»   sf   ø€ Ü‰Ñ˜˜wÔ'Ø(ˆŒÜ)+¯©°·±Ó)AˆŒØ—}‘}ˆŒä—G‘G×$Ñ$ T§_¡_Ó5ˆŒ	Ü—K‘K §	¡	Ó*ˆ�	r   c                 ó<   — | j                   t        j                     S r   r)   r"   s    r   r+   z FolderResource.get_creation_dateÅ   r,   r   c                 ó   — | j                   S r   r.   r"   s    r   r/   zFolderResource.get_display_nameÈ   r0   r   c                  ó   — y r   r?   r"   s    r   Úget_directory_infoz!FolderResource.get_directory_infoË   rA   r   c                  ó   — y r   r?   r"   s    r   r3   zFolderResource.get_etagÎ   rA   r   c                 óT   — t        j                  | j                  «      j                  S r   )r^   Ú
disk_usager   Úusedr"   s    r   Úget_used_byteszFolderResource.get_used_bytesÑ   ó   € Ü× Ñ  §¡Ó1×6Ñ6Ð6r   c                 óT   — t        j                  | j                  «      j                  S r   )r^   r›   r   Úfreer"   s    r   Úget_available_bytesz"FolderResource.get_available_bytesÔ   rž   r   c                 ó<   — | j                   t        j                     S r   r5   r"   s    r   r7   z FolderResource.get_last_modified×   r,   r   c                 óT   — t         j                  j                  | j                  «      S r   r9   r"   s    r   r;   zFolderResource.is_linkÚ   r<   r   Úreturnc                 ó@  — g }t        j                  | j                  «      sJ ‚t        j                  | j                  «      D �]W  }t        j                  |«      s#|j                  t        j                  «       «      }t        j                  |«      sJ ‚t        j                  j                  | j                  |«      }| j                  j                  j                  d«      s8t        j                  j                  |«      rt        j                  d|›�«       ŒÚt        j                  j!                  |«      s9t        j                  j#                  |«      st        j                  d|›�«       �Œ2t        j$                  |«      }|j'                  |«       �ŒZ |S )zuReturn list of direct collection member names (utf-8 encoded).

        See DAVCollection.get_member_names()
        Úfollow_symlinkszSkipping symlink zSkipping non-file )r   Úis_strr   r   ÚlistdirÚdecodeÚsysÚgetfilesystemencodingr   ÚjoinrM   r”   Úgetr:   rv   ÚinfoÚisdirÚisfiler   Úappend)r   ÚnameListr   Úfps       r   Úget_member_nameszFolderResource.get_member_namesÝ   s!  € ð ˆä�{‰{˜4Ÿ?™?Ô+Ð+Ð+ô —J‘J˜tŸ™Ó/ó 	"ˆDÜ—;‘;˜tÔ$Ø—{‘{¤3×#<Ñ#<Ó#>Ó?�Ü—;‘;˜tÔ$Ð$Ð$ä—‘—‘˜dŸo™o¨tÓ4ˆBØ—=‘=×(Ñ(×,Ñ,Ð->Ô?ÄBÇGÁGÇNÁNÐSUÔDVÜ—‘Ð0°°Ð7Ô8ØÜ—7‘7—=‘= Ô$¬R¯W©W¯^©^¸BÔ-?Ü—‘Ð1°"°Ð8Ô9Ùä—;‘;˜tÓ$ˆDØ�O‰O˜DÖ!ð	"ð ˆr   r   c                 óÄ   — t        j                  |«      sJ |›«       ‚| j                  j                  t        j                  | j
                  |«      | j                  «      S )zjReturn direct collection member (DAVResource or derived).

        See DAVCollection.get_member()
        )r   r§   rM   ra   Újoin_urir   r   )r   r   s     r   Ú
get_memberzFolderResource.get_memberÿ   sL   € ô
 �{‰{˜4Ô Ð- T HÓ-Ð Ø�}‰}×.Ñ.Ü�M‰M˜$Ÿ)™) TÓ*¨D¯L©Ló
ð 	
r   c                 óh  — d|vsJ ‚| j                   j                  rt        t        «      ‚t	        j
                  | j                  |«      }| j                   j                  || j                  «      }t        |d«      }|j                  «        | j                   j                  || j                  «      S )z^Create an empty (length-0) resource.

        See DAVResource.create_empty_resource()
        ú/rL   )rM   rN   r   r   r   r¶   r   r\   r   rG   Úclosera   )r   r   r   r³   Úfs        r   Úcreate_empty_resourcez$FolderResource.create_empty_resource  s…   € ð
 ˜$‰ÐˆØ�=‰=×!Ò!Üœ>Ó*Ð*Ü�}‰}˜TŸY™Y¨Ó-ˆØ�]‰]×,Ñ,¨T°4·<±<Ó@ˆÜ��T‹NˆØ	�‰Œ	Ø�}‰}×.Ñ.¨t°T·\±\ÓBÐBr   c                 ó  — d|vsJ ‚| j                   j                  rt        t        «      ‚t	        j
                  | j                  |«      }| j                   j                  || j                  «      }t        j                  |«       y)z`Create a new collection as member of self.

        See DAVResource.create_collection()
        r¹   N)rM   rN   r   r   r   r¶   r   r\   r   r   Úmkdir)r   r   r   r³   s       r   Úcreate_collectionz FolderResource.create_collection  sa   € ð
 ˜$‰ÐˆØ�=‰=×!Ò!Üœ>Ó*Ð*Ü�}‰}˜TŸY™Y¨Ó-ˆØ�]‰]×,Ñ,¨T°4·<±<Ó@ˆÜ
�‰��r   c                 óØ   — | j                   j                  rt        t        «      ‚t	        j
                  | j                  d¬«       | j                  d¬«       | j                  d¬«       y)rQ   F)Úignore_errorsTrR   N)	rM   rN   r   r   r^   Úrmtreer   rU   rV   r"   s    r   rW   zFolderResource.delete%  sP   € ð
 �=‰=×!Ò!Üœ>Ó*Ð*Ü�‰�d—o‘o°UÕ;Ø×"Ñ"¨TÐ"Ô2Ø×Ñ¨ÐÕ-r   c                óV  — | j                   j                  rt        t        «      ‚| j                   j	                  || j
                  «      }t        j                  | j                  |«      rJ ‚t        j                  j                  |«      st        j                  |«       	 t        j                  | j                  |«       | j                   j$                  }|rž| j                   j'                  || j
                  «      }|r<|j)                  | j+                  «       |j+                  «       d| j
                  ¬«       y|j-                  | j+                  «       |j+                  «       | j
                  «       yy# t        $ r% t         j#                  d| j                  › �«       Y Œäw xY w)rY   zCould not copy folder stats: FrZ   N)rM   rN   r   r   r\   r   r   r]   r   r   ru   r¾   r^   Úcopystatr   Ú	Exceptionrv   Ú	exceptionr`   ra   rb   rc   rd   re   s         r   rk   zFolderResource.copy_move_single0  sJ  € à�=‰=×!Ò!Üœ>Ó*Ð*Ø—‘×0Ñ0°¸D¿L¹LÓIˆÜ×-Ñ-¨d¯i©i¸ÔCÐCÐCä�w‰w�~‰~˜fÔ%Ü�H‰H�VÔð	Qô �O‰O˜DŸO™O¨VÔ4ð
 —-‘-×,Ñ,ˆÙØ—m‘m×5Ñ5°iÀÇÁÓNˆGÙØ×'Ñ'Ø×$Ñ$Ó&Ø×'Ñ'Ó)Ø"'Ø ŸL™Lð	 (õ ð ×'Ñ'Ø×$Ñ$Ó&¨×(;Ñ(;Ó(=¸t¿|¹|õð øô ò 	QÜ×ÑÐ =¸d¿o¹oÐ=NÐOÖPð	Qús   Â# E: Å:+F(Æ'F(c                  ó   — yrm   r?   rn   s     r   ro   z%FolderResource.support_recursive_moveP  rp   r   c                 óÄ  — | j                   j                  rt        t        «      ‚| j                   j	                  || j
                  «      }t        j                  | j                  |«      rJ ‚t        j                  j                  |«      rJ ‚t        j                  d| j                  › d|› d�«       t        j                  | j                  |«       | j                   j                   rv| j                   j#                  || j
                  «      }| j                   j                   j%                  | j'                  «       |j'                  «       d| j
                  ¬«       yyrr   rt   ry   s       r   rz   zFolderResource.move_recursiveT  r{   r   c                ó¾   — t        |t        «      r|nt        j                  |«      }t        |t        «      sJ ‚|s"t	        j
                  | j                  ||f«       yr}   r~   rƒ   s        r   r‡   z FolderResource.set_last_modifiedh  rˆ   r   )r‰   rŠ   r‹   rŒ   r�   rŽ   r   r+   r/   r˜   r3   r�   r¡   r7   r;   r   r´   r   r·   r¼   r¿   rW   rk   ro   rz   r‡   r�   r�   s   @r   r’   r’   µ   sŒ   ø„ ñð
+˜Sð +¨4õ +ò-òòòò7ò7ò-ò/ð  $ s¡)ó  ðD
˜sð 
 |ó 
òCò
ò	.òò@òö(r   r’   c                   óv   ‡ — e Zd ZdZdddœˆ fd„
Zd„ Zed„ «       Zded	e	fd
„Z
dded	e	fd„Zded	e	defd„Zˆ xZS )ÚFilesystemProvidera  Default implementation of a filesystem DAVProvider.

    Args:
        root_folder (str)
        readonly (bool)
        fs_opts (dict | None): defaults to `config.fs_dav_provider`
        shadow (dict):  @deprecated (Use option `fs_provider.shadow_map` instead)
    FN)rN   r”   c                óX  •— t         j                  j                  |«      }|rt         j                  j                  |«      st	        d|› �«      ‚t
        ‰| �  «        || _        t         j                  j                  |«      | _	        || _
        |€t        j                  | › d�«       i }|| _        | j                  j                  d«      xs i | _        | j                  rB| j                  j!                  «       D ��ci c]  \  }}|j#                  «       |“Œ c}}| _        y y c c}}w )NzInvalid root path: z/: no `fs_opts` parameter passed to constructor.Ú
shadow_map)r   r   Úabspathru   Ú
ValueErrorr   r   Úroot_folder_pathÚrealpathÚroot_folder_path_realrN   rv   Úwarningr”   r­   rÍ   ÚitemsÚlower)r   Úroot_folderrN   r”   ÚkÚvr   s         €r   r   zFilesystemProvider.__init__ƒ  sé   ø€ ô —g‘g—o‘o kÓ2ˆÙ¤"§'¡'§.¡.°Ô"=ÜÐ2°;°-Ð@ÓAÐAä‰ÑÔà +ˆÔÜ%'§W¡W×%5Ñ%5°kÓ%BˆÔ"Ø ˆŒØˆ?Ü�O‰O˜t˜fÐ$SÐTÔUØˆGØˆŒàŸ,™,×*Ñ*¨<Ó8Ò>¸BˆŒØ�?Š?Ø8<¿¹×8MÑ8MÓ8O×P±°°1˜qŸw™w›y¨!™|ÓPˆD�Oð ùÛPs   Ä D&c                 ót   — | j                   rdnd}| j                  j                  › d| j                  ›d|› d�S )Nz	Read-Onlyz
Read-Writez
 for path z (rs   )rN   r   r‰   rÐ   )r   Úrws     r   Ú__repr__zFilesystemProvider.__repr__˜  s<   € Ø ŸMšM‰[¨|ˆØ—.‘.×)Ñ)Ð*¨*°T×5JÑ5JÐ4MÈRÐPRÈtÐSTÐUÐUr   c                 ój   — 	 t         j                  j                  | |g«      | k(  S # t        $ r Y yw xY w)NF)r   r   Ú
commonpathrÏ   )Ú	root_pathr   s     r   Ú_is_equal_or_child_pathz*FilesystemProvider._is_equal_or_child_pathœ  s8   € ð	Ü—7‘7×%Ñ% y°)Ð&<Ó=ÀÑJÐJøÜò 	Ùð	ús   ‚#& ¦	2±2r   r   c                 óÈ  — | j                   j                  |j                  «       «      }|sd|fS d}|d   j                  «       }|dvrd|› d|› d|›d�}nTt        j
                  j                  |«      rd|› d|› d	|›d�}n(t        j
                  j                  |«      s	d|› d|› d
�}|rt        j                  |«       d|fS t        j                  d|› d|› �«       d|fS )z4File not found: See if there is a shadow configured.FNÚREQUEST_METHOD)ÚGETÚHEADÚOPTIONSzShadow z -> z: ignored for method ú.z : ignored for existing resource z: does not exist.T)
rÍ   r­   rÕ   Úupperr   r   ru   rv   rÓ   r®   )r   r   r   r   ÚshadowÚerrÚmethods          r   Ú_resolve_shadow_pathz'FilesystemProvider._resolve_shadow_path£  sõ   € à—‘×$Ñ$ T§Z¡Z£\Ó2ˆáØ˜)Ð#Ð#àˆØÐ)Ñ*×0Ñ0Ó2ˆØÐ3Ñ3Ø˜D˜6  f XÐ-BÀ6À*ÈAÐN‰CÜ�W‰W�^‰^˜IÔ&Ø˜D˜6  f XÐ-MÈiÈ]ÐZ[Ð\‰CÜ—‘—‘ Ô'Ø˜D˜6  f XÐ->Ð?ˆCáÜ�O‰O˜CÔ Ø˜)Ð#Ð#Ü�‰�w˜t˜f D¨¨Ð1Ô2Ø�Vˆ|Ðr   c                 óŽ  — | j                   }|€J ‚t        j                  |«      sJ ‚t        j                  |«      sJ ‚|j                  d«      j	                  d«      }t
        j                  j                  t        j                  j                  |g|¢­Ž «      }| j                  |||«      \  }}|s|| j                  j                  d«      r| j                  ||«      }n9| j                  | j                  t
        j                  j                  |«      «      }|st        t         d|›�«      ‚t        j"                  |«      }|S )zÂConvert resource path to a unicode absolute file path.
        Optional environ argument may be useful e.g. in relation to per-user
        sub-folder chrooting inside root_folder_path.
        r¹   r¦   z$Access outside root is not allowed: )rÐ   r   r§   ÚstripÚsplitr   r   rÎ   r¬   rê   r”   r­   rß   rÒ   rÑ   r   r   Úto_unicode_safe)r   r   r   rÞ   Ú
path_partsr   Ú	is_shadowÚ
is_in_roots           r   r\   z$FilesystemProvider._loc_to_file_path¹  s  € ð
 ×)Ñ)ˆ	ØÐ$Ð$Ð$Ü�{‰{˜9Ô%Ð%Ð%Ü�{‰{˜4Ô Ð Ð à—Z‘Z “_×*Ñ*¨3Ó/ˆ
Ü—G‘G—O‘O¤B§G¡G§L¡L°Ð$H¸ZÒ$HÓIˆ	ð  $×8Ñ8¸¸wÈ	ÓRÑˆ	�9áØ�|‰|×ÑÐ 1Ô2Ø!×9Ñ9¸)ÀYÓO‘
à!×9Ñ9Ø×.Ñ.´·±×0@Ñ0@ÀÓ0Kó�
ñ ÜÜ"Ø:¸9¸-ÐHóð ô ×(Ñ(¨Ó3ˆ	ØÐr   r¤   c                 óœ  — | xj                   dz  c_         | j                  ||«      }t        j                  j	                  |«      sy| j
                  j                  d«      s2t        j                  j                  |«      rt        t        d|›�«      ‚t        j                  j                  |«      rt        |||«      S t        |||«      S )zVReturn info dictionary for path.

        See DAVProvider.get_resource_inst()
        é   Nr¦   zSymlink support is disabled: )Ú_count_get_resource_instr\   r   r   ru   r”   r­   r:   r   r   r¯   r’   r   )r   r   r   r³   s       r   ra   z$FilesystemProvider.get_resource_instÚ  sŸ   € ð
 	×%Ò%¨Ñ*Õ%Ø×#Ñ# D¨'Ó2ˆä�w‰w�~‰~˜bÔ!ØØ�|‰|×ÑÐ 1Ô2´r·w±w·~±~ÀbÔ7IÜœ>Ð-JÈ2È&Ð+QÓRÐRÜ�7‰7�=‰=˜ÔÜ! $¨°Ó4Ð4Ü˜D '¨2Ó.Ð.r   r   )r‰   rŠ   r‹   rŒ   r   rÛ   Ústaticmethodrß   r�   rŽ   rê   r\   r   ra   r�   r�   s   @r   rË   rË   y  sp   ø„ ñð 16¸tö Qò*Vð ñó ðð¨ð °tó ñ, cð °Dó ðB/ cð /°Dð /¸\÷ /r   rË   )rŒ   r   r^   r   rª   Útypingr   Úwsgidavr   Úwsgidav.dav_errorr   r   Úwsgidav.dav_providerr   r   r	   Ú__docformat__Úget_module_loggerr‰   rv   rH   r   r’   rË   r?   r   r   ú<module>rü      sp   ðñ
ó 
Û Û Û 
Ý å ß 6ß MÑ Mà"€à
 ˆ$×
 Ñ
  Ó
*€à€ôIÐ#ô Iô^~�]ô ~ôHo/˜õ o/r   