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 r‹d| d v r‹t ƒ }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    





	