Ë
    "ïàjÜ  ã                   óx   — d Z ddlmZ ddlZddlmZ dZ ej                  e«      Z	dZ
dZd„ Zd	„ Z G d
„ d«      Zy)aâ  
Implements a property manager based on MongoDB.

Usage: add this lines to wsgidav.conf::

    from wsgidav.prop_man.mongo_property_manager import MongoPropertyManager
    prop_man_opts = {}
    property_manager = MongoPropertyManager(prop_man_opts)

Valid options are (sample shows defaults)::

    opts = {"host": "localhost",       # MongoDB server
            "port": 27017,             # MongoDB port
            "dbName": "wsgidav-props", # Name of DB to store the properties
            # This options are used with `mongod --auth`
            # The user must be created with db.addUser()
            "user": None,              # Authenticate with this user
            "pwd": None,               # ... and password
            }

é    )ÚquoteN)ÚutilÚreStructuredText)Ú_idÚ_urlÚ_titleú^c                 óB   — t         | vsJ ‚| j                  dt         «      S )zAReturn an encoded version of `s` that may be used as MongoDB key.ú.)Ú
DOT_ESCAPEÚreplace)Úss    úV/srv/dav/.venv/lib/python3.12/site-packages/wsgidav/prop_man/mongo_property_manager.pyÚencode_mongo_keyr   +   s!   € ä˜QÑÐÐØ�9‰9�Sœ*Ó%Ð%ó    c                 ó.   — | j                  t        d«      S )z7Decode a string that was encoded by encode_mongo_key().r   )r   r   )Úkeys    r   Údecode_mongo_keyr   1   s   € à�;‰;”z 3Ó'Ð'r   c                   ó~   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	dd„Z
dd
„Zdd„Zdd„Z	 dd„Zdd„Zdd„Zdd„Zdd„Zy	)ÚMongoPropertyManagerz/Implements a property manager based on MongoDB.c                 ó2   — || _         | j                  «        y ©N)ÚoptionsÚ_connect)Úselfr   s     r   Ú__init__zMongoPropertyManager.__init__<   s   € ØˆŒØ�‰�r   c                 ó$   — | j                  «        y r   )Ú_disconnect©r   s    r   Ú__del__zMongoPropertyManager.__del__@   s   € Ø×ÑÕr   c                 óN  — | j                   }t        j                  |j                  d«      |j                  d«      «      | _        t
        j                  | j                  j                  «       «       | j                  |j                  dd«         | _        |j                  d«      r­| j                  j                  |j                  d«      |j                  d«      «      s4t        d| j                  j                  ›d|j                  d«      ›�«      ‚t
        j                  d	| j                  j                  ›d
|j                  d«      ›d�«       | j                  d   | _        t
        j                  d| j                  z  «       | j                  j                  d«       y )NÚhostÚportÚdbNamezwsgidav-propsÚuserÚpwdzFailed to logon to db z	 as user zLogged on to mongo db 'z' as user 'ú'Ú
propertiesz!MongoPropertyManager connected %rr   )r   ÚpymongoÚ
ConnectionÚgetÚconnÚ_loggerÚdebugÚserver_infoÚdbÚauthenticateÚRuntimeErrorÚnameÚinfoÚ
collectionÚensure_index)r   Úoptss     r   r   zMongoPropertyManager._connectC   s!  € Ø�|‰|ˆÜ×&Ñ& t§x¡x°Ó'7¸¿¹À&Ó9IÓJˆŒ	Ü�‰�d—i‘i×+Ñ+Ó-Ô.Ø—)‘)˜DŸH™H X¨Ó?Ñ@ˆŒà�8‰8�FÔØ—7‘7×'Ñ'¨¯©°Ó(8¸$¿(¹(À5»/ÔJÝ"à—w‘w—|“| T§X¡X¨fÔ%5ð7óð ô �LŠLà—7‘7—<“< §¡¨&Õ!1ð3ôð
 Ÿ'™' ,Ñ/ˆŒÜ�‰Ð8¸4¿?¹?ÑJÔKØ�‰×$Ñ$ VÕ,r   c                 ó^   — | j                   r| j                   j                  «        d | _         y r   )r,   Ú
disconnectr   s    r   r   z MongoPropertyManager._disconnectX   s    € Ø�9Š9Ø�I‰I× Ñ Ô"Øˆ�	r   c                 ó    — d| j                   z  S )NzMongoPropertyManager(%s))r0   r   s    r   Ú__repr__zMongoPropertyManager.__repr__]   s   € Ø)¨D¯G©GÑ3Ð3r   c                  ó   — y r   © r   s    r   Ú_synczMongoPropertyManager._sync`   ó   € Ør   c                  ó   — y r   r=   )r   Úmsgs     r   Ú_checkzMongoPropertyManager._checkc   r?   r   Nc                  ó   — y r   r=   )r   rA   Úouts      r   Ú_dumpzMongoPropertyManager._dumpf   r?   r   c                 óè   — t         j                  d|z  «       | j                  j                  d|i«      }g }|r8|j	                  «       D ]%  }|t
        vsŒ|j                  t        |«      «       Œ' |S )Nzget_properties(%s)r   )r-   r.   r5   Úfind_oneÚkeysÚHIDDEN_KEYSÚappendr   )r   Únorm_urlÚenvironÚdocÚ	propNamesr3   s         r   Úget_propertiesz#MongoPropertyManager.get_propertiesi   sn   € Ü�‰Ð*¨XÑ5Ô6Ø�o‰o×&Ñ&¨°Ð'9Ó:ˆØˆ	ÙØŸ™›
ò =�Øœ{Ò*Ø×$Ñ$Ô%5°dÓ%;Õ<ð=ð Ðr   c                 ó²   — t         j                  d|› d|› d�«       | j                  j                  d|i«      }|sy |j	                  t        |«      «      }|S )Nzget_property(ú, ú)r   )r-   r.   r5   rG   r+   r   )r   rK   r3   rL   rM   Úprops         r   Úget_propertyz!MongoPropertyManager.get_propertys   sU   € Ü�‰˜ h Z¨r°$°°qÐ9Ô:Ø�o‰o×&Ñ&¨°Ð'9Ó:ˆÙØØ�w‰wÔ'¨Ó-Ó.ˆØˆr   c           
      óV  — |r|j                  d«      sJ ‚|sJ ‚|€J ‚|t        vs
J d|z  «       ‚t        j                  d|›d|›d|›d|›�«       |ry | j                  j                  d|i«      }|s|t        |«      dœ}||t        |«      <   | j                  j                  |«       y )	Nú/zMongoDB key is protected: '%s'zwrite_property(rQ   ú
, dry_run=z):
	r   )r   r   )	Ú
startswithrI   r-   r.   r5   rG   r   r   Úsave)r   rK   r3   Úproperty_valueÚdry_runrL   rM   s          r   Úwrite_propertyz#MongoPropertyManager.write_property{   s´   € ñ ˜H×/Ñ/°Ô4Ð4Ð4ÙˆˆtØÐ)Ð)Ð)Øœ;Ñ&ÐOÐ(HÈ4Ñ(OÓOÐ&ä�Šâššw©ð8ô	
ñ Øà�o‰o×&Ñ&¨°Ð'9Ó:ˆÙØ#¬u°X«Ñ?ˆCØ&4ˆÔ˜TÓ"Ñ#Ø�‰×Ñ˜SÕ!r   c           	      ó
  — t         j                  d|› d|› d|› d�«       |ry| j                  j                  d|i«      }|r|j	                  t        |«      «      €y|t        |«      = | j                  j                  |«       y)ú zremove_property(rQ   rW   rR   Nr   )r-   r.   r5   rG   r+   r   rY   )r   rK   r3   r[   rL   rM   s         r   Úremove_propertyz$MongoPropertyManager.remove_property�   s}   € ä�‰Ð(¨¨
°"°T°F¸*ÀWÀIÈQÐOÔPÙàØ�o‰o×&Ñ&¨°Ð'9Ó:ˆá�c—g‘gÔ.¨tÓ4Ó5Ð=ØØÔ  Ó&Ð'Ø�‰×Ñ˜SÕ!r   c                 ó¨   — t         j                  d|z  «       | j                  j                  d|i«      }|r| j                  j	                  |«       y )Nzremove_properties(%s)r   )r-   r.   r5   rG   Úremove)r   rK   rL   rM   s       r   Úremove_propertiesz&MongoPropertyManager.remove_properties�   sE   € Ü�‰Ð-°Ñ8Ô9Ø�o‰o×&Ñ&¨°Ð'9Ó:ˆÙØ�O‰O×"Ñ" 3Ô'Ør   c                 ó
  — | j                   j                  d|i«      }|st        j                  d|› d|› d�«       y t        j                  d|› d|› d�«       |j	                  «       }| j                   j                  |«       y )Nr   zcopy_properties(rQ   z): src has no propertiesrR   )r5   rG   r-   r.   ÚcopyÚinsert)r   ÚsrcUrlÚdestUrlrL   rM   Údoc2s         r   Úcopy_propertiesz$MongoPropertyManager.copy_properties¤   s{   € Ø�o‰o×&Ñ&¨°Ð'7Ó8ˆÙÜ�M‰MØ" 6 (¨"¨W¨IÐ5MÐNôð Ü�‰Ð(¨¨°°7°)¸1Ð=Ô>Ø�x‰x‹zˆØ�‰×Ñ˜tÕ$r   c           	      óZ  — t         j                  d|› d|› d|› d�«       |r£d|j                  d«      z   dz   }dd|idd|iigi}| j                  j	                  |«      }|D ]_  }|d   j                  ||«      }	t         j                  d	j                  |d   |	«      «       |	|d<   | j                  j                  |«       Œa y | j                  j                  d|i«      }|rHt         j                  d	j                  |d   |«      «       ||d<   | j                  j                  |«       y )
Nzmove_properties(rQ   rR   r	   rV   z$orr   z$regexzmove property {} -> {})	r-   r.   Úrstripr5   Úfindr   ÚformatrY   rG   )
r   rf   rg   Úwith_childrenrL   Ú
matchBeginÚqueryÚdocListrM   ÚnewDests
             r   Úmove_propertiesz$MongoPropertyManager.move_properties¯   s.  € Ü�‰Ð(¨¨°°7°)¸2¸m¸_ÈAÐNÔOÙà˜vŸ}™}¨SÓ1Ñ1°CÑ7ˆJØ˜f fÐ-°¸À:Ð8NÐ/OÐPÐQˆEØ—o‘o×*Ñ*¨5Ó1ˆGØò *�Ø˜f™+×-Ñ-¨f°gÓ>�Ü—‘Ð6×=Ñ=¸cÀ&¹kÈ7ÓSÔTØ%��F‘Ø—‘×$Ñ$ SÕ)ð	*ð 	ð —/‘/×*Ñ*¨F°FÐ+;Ó<ˆCÙÜ—‘Ð6×=Ñ=¸cÀ&¹kÈ7ÓSÔTØ%��F‘Ø—‘×$Ñ$ SÔ)Ør   )Ú )rt   Nr   )FN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r    r   r   r;   r>   rB   rE   rO   rT   r\   r_   rb   ri   rs   r=   r   r   r   r   9   sW   „ Ù9òòò-ò*ò
4òóóóóð FJó"ó*"óó	%ôr   r   )rx   Úurllib.parser   r)   Úwsgidavr   Ú__docformat__Úget_module_loggerru   r-   rI   r   r   r   r   r=   r   r   ú<module>r}      sP   ðñõ, ã å à"€à
 ˆ$×
 Ñ
  Ó
*€ð (€ð €
ò&ò(÷Jò Jr   