
    qi                         S r SSKJr  SSKJr  SSKrSSKJr  SSKJ	r	  SSK
JrJrJr  SSKJr  S	r\	R"                  " \5      r " S
 S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      rg)a7  
Implementation of a WebDAV provider that provides a very basic, read-only
resource layer emulation of a MongoDB database.

Usage: add the following entries to wsgidav.conf::

    from wsgidav.samples.mongo_dav_provider import MongoResourceProvider
    mongo_dav_opts = {}
    addShare("mongo", MongoResourceProvider(mongo_dav_opts))

Valid options are (sample shows defaults)::

    opts = {"host": "localhost",       # MongoDB server
            "port": 27017,             # MongoDB port
            # This options are used with `mongod --auth`
            # The user must be created in the admin db with
            # > use admin
            # > db.addUser(user_name, password)
            "user": None,              # Authenticate with this user
            "pwd": None,               # ... and password
            }

    )StringIO)pformatN)ObjectId)util)DAVCollectionDAVNonCollectionDAVProvider)join_urireStructuredTextc                   8   ^  \ rS rSrSrU 4S jrS rS rSrU =r	$ )ConnectionCollection,   z+Root collection, lists all mongo databases.c                 Z   > [         TU ]  X5        U R                  R                  U l        g N)super__init__providerconnselfpathenviron	__class__s      W/home/kali/flask_env/lib/python3.13/site-packages/wsgidav/samples/mongo_dav_provider.pyr   ConnectionCollection.__init__/   s!    'MM&&	    c                 ~    U R                   R                  5        Vs/ s H  oR                  S5      PM     sn$ s  snf Nutf8)r   database_namesencoder   names     r   get_member_names%ConnectionCollection.get_member_names3   s0    04		0H0H0JK0JF#0JKKK   :c                 V    [        [        U R                  U5      U R                  5      $ r   )DbCollectionr
   r   r   r"   s     r   
get_memberConnectionCollection.get_member6   s    HTYY5t||DDr   )r   )
__name__
__module____qualname____firstlineno____doc__r   r$   r)   __static_attributes____classcell__r   s   @r   r   r   ,   s    5'LE Er   r   c                   >   ^  \ rS rSrSrU 4S jrS rS rS rSr	U =r
$ )r(   :   z+Mongo database, contains mongo collections.c                    > [         TU ]  X5        U R                  R                  U l        U R                  U R                     U l        g r   )r   r   r   r   r#   dbr   s      r   r   DbCollection.__init__=   s5    'MM&&	))DII&r   c                 
    SS0$ )NtypezMongo database r   s    r   get_display_infoDbCollection.get_display_infoB       ())r   c                 ~    U R                   R                  5        Vs/ s H  oR                  S5      PM     sn$ s  snf r   )r6   collection_namesr!   r"   s     r   r$   DbCollection.get_member_namesE   s0    040H0H0JK0JF#0JKKKr&   c                 v    U R                   U   n[        [        U R                  U5      U R                  U5      $ r   )r6   CollCollectionr
   r   r   )r   r#   colls      r   r)   DbCollection.get_memberH   s-    wwt}htyy$7tLLr   )r   r6   r+   r,   r-   r.   r/   r   r<   r$   r)   r0   r1   r2   s   @r   r(   r(   :   s"    5'
*LM Mr   r(   c                   >   ^  \ rS rSrSrU 4S jrS rS rS rSr	U =r
$ )rC   M   z,Mongo collections, contains mongo documents.c                 f   > [         TU ]  X5        U R                  R                  U l        X0l        g r   )r   r   r   r   rD   )r   r   r   rD   r   s       r   r   CollCollection.__init__P   s&    'MM&&		r   c                 
    SS0$ )Nr9   zMongo collectionr:   r;   s    r   r<   CollCollection.get_display_infoU   s    *++r   c                     / nU R                   R                  5        H+  nUR                  [        R                  " US   5      5        M-     U$ )N_id)rD   findappendr   to_str)r   resdocs      r   r$   CollCollection.get_member_namesX   s:    99>>#CJJt{{3u:./ $
r   c                     U R                   R                  [        U5      5      n[        [	        U R
                  U5      U R                  U5      $ r   )rD   find_oner   DocResourcer
   r   r   )r   r#   rS   s      r   r)   CollCollection.get_member^   s8    ii  $08DIIt4dllCHHr   )rD   r   rF   r2   s   @r   rC   rC   M   s!    6
,I Ir   rC   c                   J   ^  \ rS rSrSrU 4S jrS rS rS rS r	S r
S	rU =r$ )
rW   c   z2Mongo document, returned as virtual text resource.c                 0   > [         TU ]  X5        X0l        g r   )r   r   rS   )r   r   r   rS   r   s       r   r   DocResource.__init__f   s    'r   c                 l    S[        U R                  5      -   S-   n[        UR                  S5      5      $ )Nz<pre>z</pre>r   )r   rS   r   r!   )r   htmls     r   get_contentDocResource.get_contentj   s.    **X5F+,,r   c                 P    [        U R                  5       R                  5       5      $ r   )lenr_   readr;   s    r   get_content_lengthDocResource.get_content_lengthn   s    4##%**,--r   c                     g)Nz	text/htmlr:   r;   s    r   get_content_typeDocResource.get_content_typeq   s    r   c                 R   U R                   nUR                  S5      (       a  US   R                  S5      $ UR                  S5      (       a  US   R                  S5      $ UR                  S5      (       a  [        R                  " US   5      $ [        R                  " US   5      $ )N_titler   titlerN   key)rS   getr!   r   rQ   )r   rS   s     r   get_display_nameDocResource.get_display_namet   s    hh778x=''//WWWw<&&v..WWU^^;;s5z**{{3u:&&r   c                 
    SS0$ )Nr9   zMongo documentr:   r;   s    r   r<   DocResource.get_display_info~   r>   r   )rS   )r+   r,   r-   r.   r/   r   r_   rd   rg   rn   r<   r0   r1   r2   s   @r   rW   rW   c   s)    <-.'* *r   rW   c                   2   ^  \ rS rSrSrU 4S jrS rSrU =r$ )MongoResourceProvider   z-DAV provider that serves a MongoDB structure.c                 d  > [         TU ]  5         Xl        [        R                  " UR                  S5      UR                  S5      5      U l        UR                  S5      (       a  U R                  S   nUR                  UR                  S5      UR                  S5      5      nU(       d,  [        SUR                  < SUR                  S5      < 35      e[        R                  SUR                  < S	UR                  S5      < S
35        [        R                  SU R                  -  5        g )NhostportuseradminpwdzFailed to logon to db z	 as user zLogged on to mongo db 'z' as user ''z%MongoResourceProvider connected to %s)r   r   optionspymongo
Connectionrm   r   authenticateRuntimeErrorr#   _loggerinfo)r   r|   r6   rR   r   s       r   r   MongoResourceProvider.__init__   s    &&w{{6':GKK<OP	;;v7#B//'++f"5w{{57IJC"wwF 35  LL77GKK/1 	<tyyHIr   c                     [         R                  SU-  5        U =R                  S-  sl        [        SU5      nUR	                  SU5      $ )zIReturn DAVResource object for path.

See DAVProvider.get_resource_inst()
zget_resource_inst('%s')   /)r   r   _count_get_resource_instr   resolve)r   r   r   roots       r   get_resource_inst'MongoResourceProvider.get_resource_inst   sD    
 	.56%%*%#C1||C&&r   )r   r|   )	r+   r,   r-   r.   r/   r   r   r0   r1   r2   s   @r   rs   rs      s    7J&' 'r   rs   )r/   ior   pprintr   r}   bson.objectidr   wsgidavr   wsgidav.dav_providerr   r   r	   wsgidav.utilr
   __docformat__get_module_loggerr+   r   r   r(   rC   rW   rs   r:   r   r   <module>r      s}   .    "  M M !"

 
 
*E= EM= M&I] I,*" *D'K 'r   