o
    ßý°j—&  ã                   @   s  d Z ddlmZ ddlmZmZmZ ddlmZm	Z	m
Z
mZ ddlmZmZ ddlmZmZmZmZ ddlmZ d	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Z dd „ Z!d!d"„ Z"d#d$„ Z#d%d&„ Z$d'd(„ Z%d)d*„ Z&d3d-d.„Z'd/d0„ Z(d1d2„ Z)d+S )4Ú
é    )ÚPyAsn1Erroré   )ÚSEQUENCE_TYPESÚSTRING_TYPESÚget_config_parameter)ÚLDAPControlErrorÚLDAPAttributeErrorÚLDAPObjectClassErrorÚLDAPInvalidValueError)ÚControlsÚControl)Úto_rawÚ
to_unicodeÚescape_filter_charsÚis_filter_escaped)Úfind_attribute_validatorc                 C   s"   zt | ƒW S    |  dd¡ Y S )z½ Attempt to convert value to a string. If that would error, convert it to normalized unicode.
    Python 3 string conversion handles unicode -> str without issue, but python 2 doesn't.
    ÚasciiÚbackslashreplace)ÚstrÚencode)Úval© r   ú‰/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/ldap3/protocol/convert.pyÚto_str_or_normalized_unicode"   s   
r   c                 C   óV   zt | d ƒdd„ | d D ƒdœW S  ty*   t | d ƒdd„ | d D ƒdœ Y S w )NÚtypec                 S   ó   g | ]}t |ƒ‘qS r   ©r   ©Ú.0r   r   r   r   Ú
<listcomp>.   ó    z%attribute_to_dict.<locals>.<listcomp>Úvals)r   Úvaluesc                 S   r   r   ©Úbytesr   r   r   r   r!   0   r"   ©r   r   )Ú	attributer   r   r   Úattribute_to_dict,   ó
   "$ÿr)   c                 C   s,   t ƒ }| D ]}t|ƒ}|d ||d < q|S )Nr$   r   )Údictr)   )Ú
attributesÚattributes_dictr(   Úattribute_dictr   r   r   Úattributes_to_dict3   s
   r/   c                 C   sB   t | tƒr| rdd„ | D ƒS d S | d ur|  ¡ rdd„ | D ƒS d S )Nc                 S   ó   g | ]}|rt |ƒ‘qS r   ©r   ©r    Úreferralr   r   r   r!   =   ó    z%referrals_to_list.<locals>.<listcomp>c                 S   r0   r   r1   r2   r   r   r   r!   ?   r4   )Ú
isinstanceÚlistÚhasValue)Ú	referralsr   r   r   Úreferrals_to_list;   s   
"r9   c                 C   ó   | r	dd„ | D ƒS d S )Nc                 S   r0   r   r1   ©r    Ú
search_refr   r   r   r!   C   r4   z'search_refs_to_list.<locals>.<listcomp>r   ©Úsearch_refsr   r   r   Úsearch_refs_to_listB   ó   r?   c                 C   r:   )Nc                 S   r0   r   )r   r;   r   r   r   r!   G   r4   z,search_refs_to_list_fast.<locals>.<listcomp>r   r=   r   r   r   Úsearch_refs_to_list_fastF   r@   rA   c                 C   s:   t | d ƒ| d d ur| d  ¡ rt| d ƒdœS d dœS )NÚ	mechanismÚcredentials)rB   rC   )r   r7   r&   )Úsaslr   r   r   Úsasl_to_dictJ   s   :rE   c                 C   s>   |   ¡ dkrt| d ƒnd |   ¡ dkrt| d ƒdœS d dœS )NÚsimplerD   )rF   rD   )ÚgetNamer   rE   )Úauthentication_choicer   r   r   Úauthentication_choice_to_dictN   s   >rI   c                 C   r   )Nr   c                 S   r   r   r   ©r    Úvaluer   r   r   r!   T   r"   z-partial_attribute_to_dict.<locals>.<listcomp>r#   )r   rK   c                 S   r   r   r%   rJ   r   r   r   r!   V   r"   r'   )Úmodificationr   r   r   Úpartial_attribute_to_dictR   r*   rM   c                 C   s   t | d ƒt| d ƒdœS )NÚ	operationrL   )rN   r(   )ÚintrM   )Úchanger   r   r   Úchange_to_dictY   s   rQ   c                 C   ó   dd„ | D ƒS )Nc                 S   r   r   )rQ   )r    rP   r   r   r   r!   ^   r"   z#changes_to_list.<locals>.<listcomp>r   )Úchangesr   r   r   Úchanges_to_list]   ó   rT   c                 C   rR   )Nc                 S   r   r   r1   )r    r(   r   r   r   r!   b   r"   z&attributes_to_list.<locals>.<listcomp>r   )r,   r   r   r   Úattributes_to_lista   rU   rV   c                 C   s†   zt | d ƒtt | d ƒƒdœW S  tyB   zt | d ƒtt| d ƒƒdœW  Y S  tyA   t | d ƒt| d ƒdœ Y  Y S w w )NÚattributeDescÚassertionValue)r(   rK   )r   r   Ú	Exceptionr&   )Úavar   r   r   Úava_to_dicte   s    $"ÿýr[   c                 C   sJ   | d r| d nd| d rdd„ | d D ƒnd| d r!| d dœS ddœS )NÚinitialÚ Úanyc                 S   s   g | ]}|‘qS r   r   )r    Úmiddler   r   r   r!   p   s    z%substring_to_dict.<locals>.<listcomp>Úfinal)r\   r^   r`   r   )Ú	substringr   r   r   Úsubstring_to_dicto   s   Jrb   c                 C   sN   t ƒ }| D ]}|d d }||vrg ||< ||  |d |d d f¡ q|S )Nr(   r   rN   rK   )r+   Úappend)rS   ÚpreparedrP   Úattribute_namer   r   r   Úprepare_changes_for_requests   s    rf   c                 C   s²   | sdS t | tƒstdƒ‚tƒ }t| ƒD ]B\}}t |tƒr$| ||¡ qt|ƒdkrSt |d tƒrStƒ }|d |d< |d |d< |d durL|d |d	< | ||¡ qtd
ƒ‚|S )z«controls is a sequence of Control() or sequences
    each sequence must have 3 elements: the control OID, the criticality, the value
    criticality must be a boolean
    Nzcontrols must be a sequenceé   é   r   ÚcontrolTypeÚcriticalityr   ÚcontrolValueztcontrol must be a sequence of 3 elements: controlType, criticality (boolean) and controlValue (None if not provided))	r5   r   r   r   Ú	enumerater   ÚsetComponentByPositionÚlenÚbool)ÚcontrolsÚbuilt_controlsÚidxÚcontrolÚbuilt_controlr   r   r   Úbuild_controls_list}   s"   

ru   c                 C   s<   t |ƒ}|rd|v rt|ƒst|ƒ}t| |||||d�}|S )Nú\)Ú	validatorÚcheck_names)r   r   r   Úvalidate_attribute_value)ÚschemaÚnamerK   Úauto_escapeÚauto_encoderw   rx   r   r   r   Úvalidate_assertion_valueš   s   r~   NFc                 C   sœ  dd„ t dƒD ƒ}dd„ t dƒD ƒ}t dƒ}dd„ t dƒD ƒ}	| rÊ| jrÊd	|v r/| d	¡d
 }|rR| jrR| ¡ dkrRt|ƒ ¡ |vrQt|ƒ| jvrQtdt|ƒ ƒ‚n_|re|| jvre| ¡ |vretd| ƒ‚t	| ||ƒ}||ƒ}
|
du rŸz|d
d… dkrŽ|d dkrŽt
|dd… ƒ}||ƒ}
W n tyž   td||f ƒ‚w |
du r«td||f ƒ‚|
dur±|
}|rÊ|| jv rÀ| j| j|v sÆ| ¡ |	v rÊt|ƒ}t
|ƒS )Nc                 S   ó   g | ]}|  ¡ ‘qS r   ©Úlower©r    Úvr   r   r   r!   ¤   r"   z,validate_attribute_value.<locals>.<listcomp>ÚCLASSES_EXCLUDED_FROM_CHECKc                 S   r   r   r€   r‚   r   r   r   r!   ¥   r"   ÚATTRIBUTES_EXCLUDED_FROM_CHECKÚUTF8_ENCODED_SYNTAXESc                 S   r   r   r€   r‚   r   r   r   r!   §   r"   ÚUTF8_ENCODED_TYPESú;r   Úobjectclassz(invalid class in objectClass attribute: zinvalid attribute Fr   zb'éÿÿÿÿú'z'value '%s' non valid for attribute '%s'T)r   Úattribute_typesÚsplitÚobject_classesr�   r   r
   r   r	   r   r   rY   r   Úsyntax)rz   r{   rK   r}   rw   rx   Ú conf_classes_excluded_from_checkÚ#conf_attributes_excluded_from_checkÚconf_utf8_syntaxesÚconf_utf8_typesÚ	validatedr   r   r   ry   £   s>   
€€ÿ*ry   c                 C   sð   d}g }t | ƒ} |t| ƒk rf| | dks| | dkrG|t| ƒd k rGz| t| |d |d … dƒ¡ |d7 }W n# tyF   | d¡ Y nw tturS| | | ¡ n	| t| | ƒ¡ |d7 }|t| ƒk stturnt|ƒS d d	d
„ |D ƒ¡S )Nr   é\   rv   r   rh   rg   é   r]   c                 s   s   � | ]}t |ƒV  qd S ©N)Úchr)r    Úxr   r   r   Ú	<genexpr>Ù   s   € z-prepare_filter_for_sending.<locals>.<genexpr>)	r   rn   rc   rO   Ú
ValueErrorr   r&   ÚordÚjoin)Ú
raw_stringÚiÚintsr   r   r   Úprepare_filter_for_sendingÄ   s&   ( ÿôr¡   c                 C   s   t | tƒr	t| ƒS | S r—   )r5   r   r   )rž   r   r   r   Úprepare_for_sendingÜ   r@   r¢   )NF)*Ú__doc__Úpyasn1.errorr   r]   r   r   r   Úcore.exceptionsr   r	   r
   r   Úprotocol.rfc4511r   r   Ú
utils.convr   r   r   r   Úprotocol.formatters.standardr   r   r)   r/   r9   r?   rA   rE   rI   rM   rQ   rT   rV   r[   rb   rf   ru   r~   ry   r¡   r¢   r   r   r   r   Ú<module>   s6    



	!