
    ?De                     ,   d Z ddlZddlmZ ddlZej        ej        ej        hZej        ej        hZ G d de	          Z
 G d d          Z G d d	e          Z G d
 de          Z G d de          Z G d de          Z G d de          ZdS )zg
ldap.asyncsearch - handle async LDAP search operations

See https://www.python-ldap.org/ for details.
    N)__version__c                       e Zd Zd Zd ZdS )WrongResultTypec                 V    || _         || _        t                              |            d S N)receivedResultTypeexpectedResultTypes	Exception__init__)selfr   r	   s      /./ldap/asyncsearch.pyr   zWrongResultType.__init__   s,    0D2Dt    c                 h    d                     | j        d                    | j                            S )Nz3Received wrong result type {} (expected one of {}).z, )formatr   joinr	   r   s    r   __str__zWrongResultType.__str__    s2    @GG

ii())  r   N)__name__
__module____qualname__r   r    r   r   r   r      s2          
    r   r   c                   L    e Zd ZdZd Z	 	 	 	 	 	 ddZd Zd Zd	 Zdd
Z	d Z
dS )AsyncSearchHandlerz`
  Class for stream-processing LDAP search results

  Arguments:

  l
    LDAPObject instance
  c                 0    || _         d | _        d| _        d S )N   )_l_msgId_afterFirstResultr   ls     r   r   zAsyncSearchHandler.__init__1   s    DGDKDr   Nr   c
                 b    | j                             |||||||	||	  	        | _        d| _        dS )a  
    searchRoot
        See parameter base of method LDAPObject.search()
    searchScope
        See parameter scope of method LDAPObject.search()
    filterStr
        See parameter filter of method LDAPObject.search()
    attrList=None
        See parameter attrlist of method LDAPObject.search()
    attrsOnly
        See parameter attrsonly of method LDAPObject.search()
    timeout
        Maximum time the server shall use for search operation
    sizelimit
        Maximum number of entries a server should return
        (request client-side limit)
    serverctrls
        list of server-side LDAP controls
    clientctrls
        list of client-side LDAP controls
    r   N)r   
search_extr   r   )
r   
searchRootsearchScope	filterStrattrList	attrsOnlytimeout	sizelimitserverctrlsclientctrlss
             r   startSearchzAsyncSearchHandler.startSearch6   sA    B '$$Yy[ DK D
Fr   c                     dS )zd
    Do anything you want after starting search but
    before receiving and processing results
    Nr   r   s    r   preProcessingz AsyncSearchHandler.preProcessing^         r   c                     dS )zh
    Do anything you want right after successfully receiving but before
    processing first result
    Nr   r   s    r   afterFirstResultz#AsyncSearchHandler.afterFirstResultd   r0   r   c                     dS )zI
    Do anything you want after receiving and processing all results
    Nr   r   s    r   postProcessingz!AsyncSearchHandler.postProcessingj   r0   r   c                    |                                   d}||z   }d}d}d| _        || _        	 d\  }}	|r|N|	sL| j                            | j        d|          \  }}	}
}| j        r|                                  d| _        ||	L|	snu|t          vrt          |t                    |	D ]F}||k     r| j        dz   | _        n)|dk    s||k     r| 
                    ||           nd}d} n|dz   }Gd\  }}	|| _        ||r*| j        dk    r| j                            | j                   n3# |r+| j        dk    r!| j                            | j                   w w w xY w|                                  |S )a1  
    ignoreResultsNumber
        Don't process the first ignoreResultsNumber results.
    processResultsCount
        If non-zero this parameters indicates the number of results
        processed is limited to processResultsCount.
    timeout
        See parameter timeout of ldap.LDAPObject.result()
    r   r   )NNN)r/   beginResultsDroppedendResultBreakr   result3r   r   r2   SEARCH_RESULT_TYPESr   _processSingleResultabandonr4   )r   ignoreResultsNumberprocessResultsCountr)   result_counterend_result_countergo_aheadpartialresult_typeresult_listresult_msgidresult_serverctrlsresult_items                r   processResultsz!AsyncSearchHandler.processResultso   s    	N,-@@HG D(D% )k+ -!+!DHGOOTXT_`abiDjDj
A+k,/A# '!!###%&D"	 !+!
  	
111,?@@
@& 		, 		,K///'+'?'AD$$"A%%8J)J)J%%k+>>>>HGE)!+.."+K,-  -0 
 %T[$&&$$$ 
 %T[$&&$$$$%&Ns   CD+ +0Ec                     dS )zv
    Process single entry

    resultType
        result type
    resultItem
        Single item of a result list
    Nr   r   
resultType
resultItems      r   r:   z'AsyncSearchHandler._processSingleResult   s	     	Dr   )Nr   r!   r   NN)r   r   r!   )r   r   r   __doc__r   r-   r/   r2   r4   rG   r:   r   r   r   r   r   '   s            & & & &P      
. . . .`		 		 		 		 		r   r   c                       e Zd ZdZd Zd ZdS )Listz
  Class for collecting all search results.

  This does not seem to make sense in the first place but think
  of retrieving exactly a certain portion of the available search
  results.
  c                 J    t                               | |           g | _        d S r   )r   r   
allResultsr   s     r   r   zList.__init__   #    Q'''DOOOr   c                 >    | j                             ||f           d S r   )rP   appendrI   s      r   r:   zList._processSingleResult   s#    OJz233333r   Nr   r   r   rL   r   r:   r   r   r   rN   rN      s<           4 4 4 4 4r   rN   c                       e Zd ZdZd Zd ZdS )DictzJ
  Class for collecting all search results into a dictionary {dn:entry}
  c                 J    t                               | |           i | _        d S r   )r   r   
allEntriesr   s     r   r   zDict.__init__   rQ   r   c                 :    |t           v r|\  }}|| j        |<   d S d S r   )ENTRY_RESULT_TYPESrX   r   rJ   rK   dnentrys        r   r:   zDict._processSingleResult   s1    '''hb!dob ('r   NrT   r   r   r   rV   rV      s<           " " " " "r   rV   c                        e Zd ZdZddZd ZdS )IndexedDictz
  Class for collecting all search results into a dictionary {dn:entry}
  and maintain case-sensitive equality indexes to entries
  Nc                     t                               | |           |pd| _        i                     | j        i           | _        d S )Nr   )rV   r   indexed_attrsfromkeysindex)r   r    ra   s      r   r   zIndexedDict.__init__   s?    MM$q&,"DT/33DJJJr   c                     |t           v rp|\  }}|| j        |<   | j        D ][}||v rS||         D ]J}	 | j        |         |                             |           *# t
          $ r |g| j        |         |<   Y Gw xY wZd S d S r   )rZ   rX   ra   rc   rS   KeyError)r   rJ   rK   r\   r]   avs          r   r:   z IndexedDict._processSingleResult   s    '''hb!dob! ( (!::8 ( (a(jmA%%b)))) ( ( (#%djmA( ('( (s   &AA65A6r   rT   r   r   r   r_   r_      sA         
4 4 4 4
( ( ( ( (r   r_   c                   &    e Zd ZdZddZd Zd ZdS )
FileWriterz
  Class for writing a stream of LDAP search results to a file object

  Arguments:
  l
    LDAPObject instance
  f
    File object instance where the LDIF data is written to
   c                 f    t                               | |           || _        || _        || _        d S r   )r   r   _f	headerStr	footerStr)r   r    frm   rn   s        r   r   zFileWriter.__init__   s1    Q'''DGDNDNNNr   c                 D    | j                             | j                   dS )zs
    The headerStr is written to output after starting search but
    before receiving and processing results.
    N)rl   writerm   r   s    r   r/   zFileWriter.preProcessing        
 	GMM$.!!!!!r   c                 D    | j                             | j                   dS )zX
    The footerStr is written to output after receiving and
    processing results.
    N)rl   rq   rn   r   s    r   r4   zFileWriter.postProcessing   rr   r   Nrj   rj   )r   r   r   rL   r   r/   r4   r   r   r   ri   ri      sP            " " "" " " " "r   ri   c                        e Zd ZdZddZd ZdS )
LDIFWriterz
  Class for writing a stream LDAP search results to a LDIF file

  Arguments:

  l
    LDAPObject instance
  writer_obj
    Either a file-like object or a ldif.LDIFWriter instance used for output
  rj   c                     t          |t          j                  r|| _        nt          j        |          | _        t                              | || j        j        ||           d S r   )
isinstanceldifrv   _ldif_writerri   r   _output_file)r   r    
writer_objrm   rn   s        r   r   zLDIFWriter.__init__  s[    *T_-- 6$d/*55dQt0=i	RRRRRr   c                 \    |t           v r"|\  }}| j                            ||           d S d S r   )rZ   rz   unparser[   s        r   r:   zLDIFWriter._processSingleResult  s>    '''hb
5))))) ('r   Nrt   rT   r   r   r   rv   rv     sE        	 	S S S S* * * * *r   rv   )rL   ldapr   ry   RES_SEARCH_ENTRYRES_SEARCH_RESULTRES_SEARCH_REFERENCEr9   rZ   r
   r   r   rN   rV   r_   ri   rv   r   r   r   <module>r      s                   i   A	 A	 A	 A	 A	 A	 A	 A	H4 4 4 4 4 4 4 4"" " " " " " " " ( ( ( ( ($ ( ( (2" " " " "# " " "@* * * * * * * * * *r   