
    qi                     x    S r SSKJr  SSKrSSKJr  Sr\R                  " \5      r	Sr
SrS rS	 r " S
 S5      rg)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                 F    [         U ;  d   eU R                  S[         5      $ )zAReturn an encoded version of `s` that may be used as MongoDB key..)
DOT_ESCAPEreplace)ss    \/home/kali/flask_env/lib/python3.13/site-packages/wsgidav/prop_man/mongo_property_manager.pyencode_mongo_keyr   *   s!    Q99S*%%    c                 .    U R                  [        S5      $ )z7Decode a string that was encoded by encode_mongo_key().r   )r   r   )keys    r   decode_mongo_keyr   0   s    ;;z3''r   c                       \ rS rSrSrS rS rS rS rS r	S r
SS	 jrSS jrSS jrSS jr SS jrSS jrSS jrSS jrSS jrSrg
)MongoPropertyManager8   z/Implements a property manager based on MongoDB.c                 0    Xl         U R                  5         g N)options_connect)selfr   s     r   __init__MongoPropertyManager.__init__;   s    r   c                 $    U R                  5         g r   )_disconnectr   s    r   __del__MongoPropertyManager.__del__?   s    r   c                 l   U R                   n[        R                  " UR                  S5      UR                  S5      5      U l        [
        R                  U R                  R                  5       5        U R                  UR                  SS5         U l        UR                  S5      (       a  U R                  R                  UR                  S5      UR                  S5      5      (       d6  [        SU R                  R                  < SUR                  S5      < 35      e[
        R                  S	U R                  R                  < S
UR                  S5      < S35        U R                  S   U l        [
        R                  SU R                  -  5        U R                  R                  S5        g )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   MongoPropertyManager._connectB   s'   ||&&txx'7&9IJ	dii++-.))DHHX?@88F77''(8$((5/JJ"ww||TXXf%57  LL77<<&!13
 '',/84??JK$$V,r   c                 h    U R                   (       a  U R                   R                  5         S U l         g r   )r/   
disconnectr!   s    r   r     MongoPropertyManager._disconnectW   s     99II  "	r   c                      SU R                   -  $ )NzMongoPropertyManager(%s))r3   r!   s    r   __repr__MongoPropertyManager.__repr__\   s    )DGG33r   c                     g r    r!   s    r   _syncMongoPropertyManager._sync_       r   c                     g r   rC   )r   msgs     r   _checkMongoPropertyManager._checkb   rF   r   Nc                     g r   rC   )r   rH   outs      r   _dumpMongoPropertyManager._dumpe   rF   r   c                     [         R                  SU-  5        U R                  R                  SU05      n/ nU(       a=  UR	                  5        H)  nU[
        ;  d  M  UR                  [        U5      5        M+     U$ )Nzget_properties(%s)r   )r0   r1   r8   find_onekeysHIDDEN_KEYSappendr   )r   norm_urlenvirondoc	propNamesr6   s         r   get_properties#MongoPropertyManager.get_propertiesh   si    *X56oo&&'9:	
{*$$%5d%;< # r   c                     [         R                  SU SU S35        U R                  R                  SU05      nU(       d  g UR	                  [        U5      5      nU$ )Nzget_property(, )r   )r0   r1   r8   rP   r.   r   )r   rT   r6   rU   rV   props         r   get_property!MongoPropertyManager.get_propertyr   sU    hZr$q9:oo&&'9:ww'-.r   c           
         U(       a  UR                  S5      (       d   eU(       d   eUc   eU[        ;  d
   SU-  5       e[        R                  SU< SU< SU< SU< 35        U(       a  g U R                  R                  SU05      nU(       d  U[        U5      S.nX6[        U5      '   U R                  R                  U5        g )	N/zMongoDB key is protected: '%s'zwrite_property(r[   
, dry_run=z):
	r   )r   r   )	
startswithrR   r0   r1   r8   rP   r   r   save)r   rT   r6   property_valuedry_runrU   rV   s          r   write_property#MongoPropertyManager.write_propertyz   s     H//4444t)));&O(H4(OO&w8	
 oo&&'9:#uX?C&4T"#S!r   c           	          [         R                  SU SU SU S35        U(       a  gU R                  R                  SU05      nU(       a  UR	                  [        U5      5      c  gU[        U5      	 U R                  R                  U5        g) zremove_property(r[   rb   r\   Nr   )r0   r1   r8   rP   r.   r   rd   )r   rT   r6   rf   rU   rV   s         r   remove_property$MongoPropertyManager.remove_property   s}    (
"TF*WIQOPoo&&'9:cgg.t45= &'S!r   c                     [         R                  SU-  5        U R                  R                  SU05      nU(       a  U R                  R	                  U5        g )Nzremove_properties(%s)r   )r0   r1   r8   rP   remove)r   rT   rU   rV   s       r   remove_properties&MongoPropertyManager.remove_properties   sE    -89oo&&'9:OO""3'r   c                    U R                   R                  SU05      nU(       d  [        R                  SU SU S35        g [        R                  SU SU S35        UR	                  5       nU R                   R                  U5        g )Nr   zcopy_properties(r[   z): src has no propertiesr\   )r8   rP   r0   r1   copyinsert)r   srcUrldestUrlrU   rV   doc2s         r   copy_properties$MongoPropertyManager.copy_properties   s{    oo&&'78MM"6("WI5MN (7)1=>xxzt$r   c           	      l   [         R                  SU SU SU S35        U(       a  SUR                  S5      -   S-   nSSU0SSU00/0nU R                  R	                  U5      nU H^  nUS   R                  X5      n	[         R                  S	R                  US   U	5      5        XS'   U R                  R                  U5        M`     g U R                  R                  SU05      nU(       aG  [         R                  S	R                  US   U5      5        X(S'   U R                  R                  U5        g )
Nzmove_properties(r[   r\   r	   ra   z$orr   z$regexzmove property {} -> {})	r0   r1   rstripr8   findr   formatrd   rP   )
r   rt   ru   with_childrenrU   
matchBeginquerydocListrV   newDests
             r   move_properties$MongoPropertyManager.move_properties   s#   (7)2m_ANOv}}S11C7Jff-:8N/OPQEoo**51Gf+--f>6==c&k7ST%F$$S)	  	 //**FF+;<C6==c&k7ST%F$$S)r   )r8   r/   r3   r   )rj   )rj   Nr   )FN)__name__
__module____qualname____firstlineno____doc__r   r"   r   r    r@   rD   rI   rM   rX   r^   rg   rk   ro   rw   r   __static_attributes__rC   r   r   r   r   8   sW    9-*
4 FJ"*"	%r   r   )r   urllib.parser   r,   wsgidavr   __docformat__get_module_loggerr   r0   rR   r   r   r   r   rC   r   r   <module>r      sN   *   "

 
 
* ( 
&(J Jr   