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 )zcontrols 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rd	|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 rz|d
d dkr|d dkrt
|dd }||}
W n ty   td||f w |
du rtd||f |
dur|
}|r|| jv r| j| j|v s| |	v rt|}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    



	!