o
    j+                     @   s   d Z ddlmZ ddlmZ ddlmZ ddlmZmZ ddl	m
Z
 ddlmZ dd	lmZ ed
Zdd Zdd Zdd Zdd Zdd Zd+ddZd+ddZd+ddZd+ddZd+ddZd,d!d"Zd#d$ Zd%d& Zd'd( Zd)d* ZdS )-
    )	b64encode)datetime   )STRING_TYPES)LDAPLDIFErrorLDAPExtensionError)EntryChangeNotificationControl)decoder)get_config_parameterLDIF_LINE_LENGTHc                 C   sl   | sdS | d dks| d dv rdS d| v sd| v sd| v r dS | d d	kr(dS | D ]	}|dkr3 dS q*dS )
NTr      )r   
          :   <   Fr   r   r    )bytes_valuebyter   r   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/ldap3/protocol/rfc2849.pysafe_ldif_string(   s   r   c                 C   s   |sd}t |trt|dd}|st|s>zt|}W n ty*   tt|}Y nw t |ts6t|dd}| d | }|S tturIt|dd}nt|}| d | }|S )N zutf-8)encodingasciiz:: : )
isinstancer   	bytearrayr   r   	TypeErrorstrbytes)
descriptorvaluebase64encodedliner   r   r   _convert_to_ldif?   s&   

r'   c                 C   sX   g }| r*| D ]#}d|d  }|d|d rdnd 7 }|d r)| t||d | q|S )Nz	control: r       truefalser   )appendr'   )controls
all_base64linescontrolr&   r   r   r   add_controlsW   s   r1   c                 C   s   g }d }| D ]}|  dkr"| | D ]}|t||| q|} nq| D ]}||kr?|| v r?| | D ]}|t||| q3q%|S )Nobjectclass)lowerr,   r'   )
attributesr.   r/   oc_attrattrvalr   r   r   add_attributesc   s   r8   c                    s    rt |  fdddS | S )Nc                    s
   t |  S N)	ldif_sort)x
sort_orderr   r   <lambda>z   s   
 z!sort_ldif_lines.<locals>.<lambda>)key)sorted)r/   r=   r   r<   r   sort_ldif_linesw   s   rA   Nc                 C   s   g }| rI| D ]5}|r|d dkrqd|v r+| td|d | |t|d | ntd|r6t||}| d q|rI| dtt|   |S )NtypesearchResEntrydnraw_attributesz.unable to convert to LDIF-CONTENT - missing DNr   z# total number of entries: )r,   r'   extendr8   r   rA   r    len)entriesr.   r=   r/   entryr   r   r   search_response_to_ldif}   s   
rJ   c                 C   sv   g }d| v r7| td| d | t| d |}|r|| | d |t| d | |r5t||}|S td)NrI   rD   r-   zchangetype: addr4   z2unable to convert to LDIF-CHANGE-ADD - missing DN )r,   r'   r1   rF   r8   rA   r   rI   r.   r=   r/   control_linesr   r   r   add_request_to_ldif   s   


rM   c                 C   sb   g }d| v r-| td| d | t| d |}|r|| | d |r+t||}|S td)NrI   rD   r-   zchangetype: deletez5unable to convert to LDIF-CHANGE-DELETE - missing DN r,   r'   r1   rF   rA   r   rK   r   r   r   delete_request_to_ldif   s   


rO   c                 C   s   g }d| v rd| td| d | t| d |}|r|| | d d| v r]| d D ]0}| g d|d  d |d	 d
   |d	 d D ]}| t|d	 d
 || qG| d q,|rdt||}|S )NrI   rD   r-   zchangetype: modifychanges)adddeletereplace	increment	operationr   	attributerB   r#   -)r,   r'   r1   rF   rA   )rI   r.   r=   r/   rL   changer#   r   r   r   modify_request_to_ldif   s    

&
rY   c                 C   s   g }d| v re| td| d | t| d |}|r|| d| v r,| d r,| dn| d | td| d | | d	| d
 rEdnd  d| v r\| d r\| td| d | |rct||}|S td)NrI   rD   r-   newSuperiorzchangetype: modrdnzchangetype: moddnnewrdnnewRdnzdeleteoldrdn: deleteOldRdn10newsuperiorz4unable to convert to LDIF-CHANGE-MODDN - missing DN rN   rK   r   r   r   modify_dn_request_to_ldif   s    
"
ra   Fc              	      s   | dkrt |||}n.| dkrt|||}n#| dkr!t|||}n| dkr,t|||}n| dkr7t|||}ng }g }|D ]/  rg| dt  |t tkrc fddt	tt td	 D ng  q=|d
 q=|S )NsearchResponse
addRequest
delRequestmodifyRequestmodDNRequestr   c                    s$   g | ]}d  ||t  d   qS )r(   r)   )conf_ldif_line_length).0ir&   r   r   
<listcomp>   s   $ z%operation_to_ldif.<locals>.<listcomp>r)   r   )
rJ   rM   rO   rY   ra   r,   rg   rF   rG   range)operation_typerH   r.   r=   r/   ldif_recordr   rj   r   operation_to_ldif   s$   :ro   c                 C   s   | r|  dd | S )Nr   z
version: 1)insert)
ldif_linesr   r   r   add_ldif_header   s   rr   c                 C   s4   t |D ]\}}| r| |r|  S qt|d S )Nr)   )	enumerate
startswithrG   )r&   r=   ri   r"   r   r   r   r:      s
   r:   c                 C   s  d| v rd| d v rt  }tj| d d d t d\}}|r#td|d dkr.d|d< n+|d d	kr9d
|d< n |d dkrDd|d< n|d dkrOd|d< n
tdt|d  d|v rm|d d urm|d  rm|d nd |d< d|v r|d d ur|d  r|d nd |d< |S d S )Nr-   z2.16.840.1.113730.3.4.7r#   )asn1Specz3unprocessed value in EntryChangeNotificationControl
changeTyper)   rQ   r   rR      modify   z	modify dnz%unknown Persistent Search changeType changeNumber
previousDN)dictr
   decoder	   r   r    hasValue)rX   decodeddecoded_controlunprocessedr   r   r    decode_persistent_search_control  s$    



00r   c                 C   s   dt    g}t| }|r4|d r|dt|d   ||d  |d r4|dt|d   |td| g7 }|d d S )	Nz# rz   z# change number: rv   r{   z# previous dn: rb   r   )r   now	isoformatr   r,   r    ro   )rX   rq   r0   r   r   r   "persistent_search_response_to_ldif  s   r   r9   )FN)__doc__r$   r   r   r   r   core.exceptionsr   r   protocol.persistentSearchr	   
utils.asn1r
   utils.configr   rg   r   r'   r1   r8   rA   rJ   rM   rO   rY   ra   ro   rr   r:   r   r   r   r   r   r   <module>   s0    





	