o
    ßý°j%n  ã                   @   sT  d Z ddlmZ ddlmZ ddlmZmZmZm	Z	m
Z
mZmZmZmZmZmZ ddlmZmZmZmZ ddlmZ ddlmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7 dd	l8m9Z9 dd
l:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@ ddlAmBZB ddlCmDZDmEZE dZFdZGdZHdZIdZJdZKdZLdZMdZNdZOdZPdZQdZRdZSdZTG dd„ deUƒZVdd„ ZWdd„ ZXd d!„ ZYd"d#„ ZZ	$	$	%dLd&d'„Z[d(d)„ Z\d*d+„ Z]d,d-„ Z^d.d/„ Z_d0d1„ Z`d2d3„ Zad4d5„ Zbd6d7„ ZcdMd8d9„ZddMd:d;„Zed<d=„ Zfd>d?„ Zgd@dA„ ZhdBdC„ ZidDdE„ ZjdFdG„ ZkdHdI„ ZldJdK„ Zmd$S )NÚ
é    )Ú
whitespace)Úlinesepé   )ÚDEREF_NEVERÚBASEÚLEVELÚSUBTREEÚDEREF_SEARCHÚ
DEREF_BASEÚDEREF_ALWAYSÚNO_ATTRIBUTESÚSEQUENCE_TYPESÚget_config_parameterÚSTRING_TYPES)ÚLDAPInvalidFilterErrorÚLDAPAttributeErrorÚLDAPInvalidScopeErrorÚ"LDAPInvalidDereferenceAliasesError)ÚCaseInsensitiveDict)ÚSearchRequestÚLDAPDNÚScopeÚDerefAliasesÚInteger0ToMaxÚ	TypesOnlyÚAttributeSelectionÚSelectorÚEqualityMatchÚAttributeDescriptionÚAssertionValueÚFilterÚNotÚAndÚOrÚApproxMatchÚGreaterOrEqualÚLessOrEqualÚExtensibleMatchÚPresentÚSubstringFilterÚ
SubstringsÚFinalÚInitialÚAnyÚ
ResultCodeÚ	SubstringÚMatchingRuleÚTypeÚ
MatchValueÚDnAttributes)Úreferrals_to_list)Úava_to_dictÚattributes_to_listÚsearch_refs_to_listÚvalidate_assertion_valueÚprepare_filter_for_sendingÚsearch_refs_to_list_fast)Úformat_attribute_values)Ú
to_unicodeÚto_rawé   é   é   é   é   é   é   é	   é
   é   é   é   é   c                   @   s2   e Zd Zddd„Zdd„ Zddd„Zdd	d
„ZdS )Ú
FilterNodeNc                 C   s   || _ d | _|| _g | _d S ©N)ÚtagÚparentÚ	assertionÚelements)ÚselfrN   rP   © rS   ú‰/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/ldap3/operation/search.pyÚ__init__=   s   
zFilterNode.__init__c                 C   s   | |_ | j |¡ |S rM   )rO   rQ   Úappend)rR   Úfilter_noderS   rS   rT   rV   C   s   zFilterNode.appendr   c                 C   s   |   |¡ d S rM   )Ú__repr__)rR   ÚposrS   rS   rT   Ú__str__H   s   zFilterNode.__str__c                 C   sv   g d¢}d| d || j   d t| jƒ }| jr9|dtt| jƒƒ 7 }| jD ]}|td|  | |d ¡ 7 }q'|S )N)ÚROOTÚANDÚORÚNOTÚMATCH_APPROXÚMATCH_GREATER_OR_EQUALÚMATCH_LESS_OR_EQUALÚMATCH_EXTENSIBLEÚMATCH_PRESENTÚMATCH_SUBSTRINGÚMATCH_EQUALú ztag: z - assertion: z - elements: r   )rN   ÚstrrP   rQ   Úlenr   rX   )rR   rY   Ú	node_tagsÚrepresentationÚelementrS   rS   rT   rX   K   s   $
 zFilterNode.__repr__©NN)r   )Ú__name__Ú
__module__Ú__qualname__rU   rV   rZ   rX   rS   rS   rS   rT   rL   <   s
    

rL   c              	      s°  |   ¡  d¡\‰}}|stdƒ‚ˆ d¡r2t}ˆd d…   ¡ ‰|  ¡ }ˆtˆˆ|ˆˆ ˆˆƒdœ}	�n¡ˆ d¡rTt}ˆd d…   ¡ ‰|  ¡ }ˆtˆˆ|ˆˆ ˆˆƒdœ}	�nˆ d¡rvt}ˆd d…   ¡ ‰|  ¡ }ˆtˆˆ|ˆˆ ˆˆƒdœ}	�n]ˆ d¡�rFt}ˆd d…   ¡ ‰|  ¡ }ˆ 	d¡}
d	}d	}d	}|
d
 dkrËt
|
ƒdkr°|
d  ¡   ¡ dkr°|
d }njt
|
ƒdkrÇ|
d  ¡   ¡ dkrÇd}|
d }nStdƒ‚t
|
ƒdk�rt
|
ƒdkrÝ|
d
 }n=t
|
ƒdkrù|
d
 }|
d  ¡   ¡ dkrôd}n&|
d }n!t
|
ƒdk�r|
d  ¡   ¡ dk�r|
d
 }d}|
d }ntdƒ‚|�s$|�s$tdƒ‚|�r+|  ¡ nd	}|�r4|  ¡ nd	}|tˆ||ˆˆ ˆˆƒ||dœ}	n�|dk�rVt}ˆ  ¡ ‰dˆi}	n}d|v �r¼t}ˆ  ¡ ‰|  ¡ }| 	d¡}|d
 �r{tˆˆ|d
 ˆˆ ˆˆƒnd }|d �rŽtˆˆ|d ˆˆ ˆˆƒnd }‡ ‡‡‡‡‡fdd„|dd… D ƒ}dˆi}	|�r­||	d< |�r´||	d< |�r»||	d< nt}ˆ  ¡ ‰|  ¡ }ˆtˆˆ|ˆˆ ˆˆƒdœ}	t||	ƒS )Nú=zinvalid matching assertionú~éÿÿÿÿ)ÚattrÚvalueú>ú<ú:Fr   Ú r   r?   Údnr@   Tzinvalid extensible filter)rs   rt   ÚmatchingRuleÚdnAttributesÚ*rs   c              
      s$   g | ]}|rt ˆˆ|ˆˆ ˆˆƒ‘qS rS   )r9   )Ú.0Ú	substring©Úauto_encodeÚauto_escapeÚcheck_namesÚ	left_partÚschemaÚ	validatorrS   rT   Ú
<listcomp>˜   s   $ z"evaluate_match.<locals>.<listcomp>ÚinitialÚanyÚfinal)ÚstripÚ	partitionr   Úendswithr_   r9   r`   ra   rb   Úsplitrh   Úlowerrc   rd   re   rL   )Úmatchr„   r�   r€   r…   r‚   Ú
equal_signÚ
right_partrN   rP   Úextended_filter_listÚmatching_ruleÚdn_attributesÚattribute_nameÚ
substringsr‡   r‰   Ú
any_stringrS   r   rT   Úevaluate_matchU   s˜   



 
 


$
 



&&$€
r˜   c              
   C   sØ  t turt| tƒrt| ƒ} |  ¡ } | rè|  d¡|  d¡krè|  d¡rè|  d¡rèt}t	t
ƒ}|}d }	d}
d}t| ƒD ]¡\}}|
rD|tv rDq9|tksL|tkrU|dkrUt}d}q9|tkrƒ|dv rƒ|dkri| t	tƒ¡}n|dkru| t	tƒ¡}n|dkr€| t	tƒ¡}t}q9|tks‹|tkrÂ|dkrÂ|r•|j}n(d}d}
|}|	r½|jtkr­t|jƒd	kr­td
ƒ‚| t| |	|… |||||ƒ¡ d }	t}q9|tksÊ|tkr×|dvr×d}
|	sÔ|}	t}q9tdƒ‚t|jƒdkrætdƒ‚|S tdƒ‚)Nú(ú)TFz&!|ú&ú|ú!r   z+NOT (!) clause in filter cannot be multiplez()zmalformed filterr?   z"missing boolean operator in filterzinvalid filter)rg   ÚbytesÚ
isinstancer=   rŠ   ÚcountÚ
startswithrŒ   ÚSEARCH_OPEN_OR_CLOSErL   r[   Ú	enumerater   ÚSEARCH_OPENÚSEARCH_MATCH_OR_CONTROLrV   r\   r]   r^   ÚSEARCH_MATCH_OR_CLOSErO   rN   rh   rQ   r   r˜   )Úsearch_filterr„   r�   r€   r…   r‚   ÚstateÚrootÚcurrent_nodeÚ	start_posÚskip_white_spaceÚjust_closedrY   ÚcÚend_posrS   rS   rT   Úparse_filterª   s\   , r°   c                 C   sˆ  t ƒ }| jtkr#tƒ }d}| jD ]}t|ƒ||< |d7 }q||d< |S | jtkrCtƒ }d}| jD ]}t|ƒ||< |d7 }q0||d< |S | jtkr^t	ƒ }t| jd ƒ|d< |j
d|dd� |S | jtkr€tƒ }t| jd	 ƒ|d
< tt| jd ƒƒ|d< ||d< |S | jtkr¢tƒ }t| jd	 ƒ|d
< tt| jd ƒƒ|d< ||d< |S | jtkrÄtƒ }t| jd	 ƒ|d
< tt| jd ƒƒ|d< ||d< |S | jtk�rtƒ }| jd rÛt| jd ƒ|d< | jd	 rét| jd	 ƒ|d< tt| jd ƒƒ|d< t| jd ƒ|d< ||d< |S | jtk�rtt| jd	 ƒƒ}||d< |S | jtk�r›tƒ }t| jd	 ƒ|d< tƒ }d}d| jv �rO| jd �rOt ƒ  
dt!t| jd ƒƒ¡||< |d7 }d| jv �ru| jd �ru| jd D ]}t ƒ  
dt"t|ƒƒ¡||< |d7 }�q`d| jv �r‘| jd �r‘t ƒ  
dt#t| jd ƒƒ¡||< ||d< ||d< |S | jt$k�rÀt%ƒ }t| jd	 ƒ|d
< tt| jd ƒƒ|d< | 
d|¡ |S t&dƒ‚)zMBuilds ASN1 structure for filter, converts from filter LDAP escaping to bytesr   r?   ÚandÚorÚinnerNotFilterÚ	notFilterF)ÚverifyConstraintsrs   ÚattributeDescrt   ÚassertionValueÚapproxMatchÚgreaterOrEqualÚlessOrEqualrz   ÚtypeÚ
matchValuer{   ÚextensibleMatchÚpresentr‡   rˆ   r‰   r–   ÚsubstringFilterÚequalityMatchzunknown filter node tag)'r!   rN   r\   r#   rQ   Úcompile_filterr]   r$   r^   r"   ÚsetComponentByNamer_   r%   r   rP   r    r:   r`   r&   ra   r'   rb   r(   r1   r2   r3   r4   rc   r)   rd   r*   r+   r0   r-   r.   r,   re   r   r   )rW   Úcompiled_filterÚboolean_filterrY   rk   Úmatching_filterr–   r~   rS   rS   rT   rÁ   Þ   sœ   


@
Á

9
È5
Í/
Ò*
×%Ü

åè  	øþrÁ   c                 C   s    dd„ t dƒD ƒ}tƒ }t| ƒD ]=\}}|rG|jrGd|v r6|d| d¡… |jvr5| ¡ |vr5td| ƒ‚n||jvrG| ¡ |vrGtd| ƒ‚t|ƒ||< q|S )Nc                 S   s   g | ]}|  ¡ ‘qS rS   )rŽ   )r}   ÚvrS   rS   rT   r†   +  ó    z-build_attribute_selection.<locals>.<listcomp>ÚATTRIBUTES_EXCLUDED_FROM_CHECKú;r   z*invalid attribute type in attribute list: )r   r   r£   Úattribute_typesÚindexrŽ   r   r   )Úattribute_listr„   Ú#conf_attributes_excluded_from_checkÚattribute_selectionrË   Ú	attributerS   rS   rT   Úbuild_attribute_selection*  s   
$€rÐ   NFc                 C   sf  t ƒ }t| ƒ|d< |tks|dkrtdƒ|d< n"|tks |dkr'tdƒ|d< n|tks/|dkr6tdƒ|d< ntdƒ‚|tksB|dkrItd	ƒ|d
< n1|t	ksQ|dkrXtdƒ|d
< n"|t
ks`|dkrgtdƒ|d
< n|tkso|dkrvtdƒ|d
< ntdƒ‚t|ƒ|d< t|ƒ|d< |rŒtdƒntdƒ|d< tt||
||	||ƒjd ƒ|d< t|tƒsªtg}t||
ƒ|d< |S )NÚ
baseObjectr   Úscoper?   ÚsingleLevelr   ÚwholeSubtreezinvalid scope typeÚneverDerefAliasesÚderefAliasesÚderefInSearchingÚderefFindingBaseObjr@   ÚderefAlwaysz invalid dereference aliases typeÚ	sizeLimitÚ	timeLimitTFÚ	typesOnlyÚfilterÚ
attributes)r   r   r   r   r   r	   r   r   r   r
   r   r   r   r   r   rÁ   r°   rQ   rŸ   r   r   rÐ   )Úsearch_baser§   Úsearch_scopeÚdereference_aliasesrÞ   Ú
size_limitÚ
time_limitÚ
types_onlyr�   r€   r„   r…   r‚   ÚrequestrS   rS   rT   Úsearch_operation;  s4    
ræ   c                 C   s6   z| rdd„ | D ƒW S d W S  t y   t| ƒ Y S w )Nc                 S   s   g | ]}|rt |ƒ‘qS rS   ©rg   ©r}   ÚvalrS   rS   rT   r†   ~  ó    zdecode_vals.<locals>.<listcomp>)ÚUnicodeDecodeErrorÚdecode_raw_vals©ÚvalsrS   rS   rT   Údecode_vals|  s
   ÿrï   c                 C   sH   z| rdd„ | D ƒW S d W S  t y#   | rdd„ | D ƒ Y S d  Y S w )Nc                 S   s    g | ]}|rt |d  dd�‘qS )r@   T©Úfrom_server)r=   rè   rS   rS   rT   r†   „  s     z$decode_vals_fast.<locals>.<listcomp>c                 S   s   g | ]}|r|d  ‘qS ©r@   rS   rè   rS   rS   rT   r†   †  rê   )rë   rí   rS   rS   rT   Údecode_vals_fast‚  s
   ÿró   c                 C   ó>   t dƒ}|r	tƒ ntƒ }| D ]}t|d ƒ|t|d ƒ< q|S ©NÚ CASE_INSENSITIVE_ATTRIBUTE_NAMESrî   r»   )r   r   Údictrï   rg   ©rÌ   Ú conf_case_insensitive_attributesrÞ   rÏ   rS   rS   rT   Úattributes_to_dict‰  s
   rú   c                 C   óR   t dƒ}|r	tƒ ntƒ }| D ]}t|d d d ƒ|t|d d d dd�< q|S ©Nrö   r@   r?   r   Trð   )r   r   r÷   ró   r=   rø   rS   rS   rT   Úattributes_to_dict_fast‘  ó
   .rý   c                 C   ó   | r	dd„ | D ƒS d S )Nc                 S   s   g | ]}t |ƒ‘qS rS   ©rž   rè   rS   rS   rT   r†   ›  rÇ   z#decode_raw_vals.<locals>.<listcomp>rS   rí   rS   rS   rT   rì   š  ó   rì   c                 C   rÿ   )Nc                 S   s   g | ]}t |d  ƒ‘qS rò   r   rè   rS   rS   rT   r†   Ÿ  rê   z(decode_raw_vals_fast.<locals>.<listcomp>rS   rí   rS   rS   rT   Údecode_raw_vals_fastž  r  r  c                 C   rô   rõ   )r   r   r÷   rì   rg   rø   rS   rS   rT   Úraw_attributes_to_dict¢  s
   r  c                 C   rû   rü   )r   r   r÷   r  r=   rø   rS   rS   rT   Úraw_attributes_to_dict_fast¬  rþ   r  c                 C   sP   t dƒ}|r	tƒ ntƒ }| D ]}t|d ƒ}t||t|d ƒp g |ƒ||< q|S )Nrö   r»   rî   )r   r   r÷   rg   r<   rì   ©rÌ   r„   Úcustom_formatterrù   Úchecked_attributesrÏ   ÚnamerS   rS   rT   Úchecked_attributes_to_dictµ  s    r	  c                 C   sd   t dƒ}|r	tƒ ntƒ }| D ]!}t|d d d dd�}t||t|d d d ƒp*g |ƒ||< q|S )Nrö   r@   r   Trð   r?   )r   r   r÷   r=   r<   r  r  rS   rS   rT   Úchecked_attributes_to_dict_fast¿  s   (r
  c                 C   s   t | ƒS rM   rç   )Úmatching_rule_assertionrS   rS   rT   Ú!matching_rule_assertion_to_stringÉ  s   r  c                 C   sp  |   ¡ }d}|dkr|d7 }| d D ]}|t|ƒ7 }q�n|dkr3|d7 }| d D ]}|t|ƒ7 }q)nö|dkrD|dt| d d ƒ 7 }nå|d	kr[t| d	 ƒ}||d
 d |d  7 }nÎ|dkrÂ| d d }|t|ƒd 7 }| d d D ]M}|  ¡ }|| d urÀ||  ¡ rÀ|dkr”|t|d ƒd 7 }qs|dkr²|| d¡r¤t|d ƒndt|d ƒ 7 }|d7 }qs|dkrÀ|dt|d ƒ 7 }qsng|dkrÙt| d ƒ}||d
 d |d  7 }nP|dkrðt| d ƒ}||d
 d |d  7 }n9|dkrÿ|t| d ƒd 7 }n*|dk�rt| d ƒ}||d
 d |d  7 }n|dk�r%|t| d ƒ7 }ntdƒ‚|d7 }ttu �r6t	|ƒ}|S )Nr™   r±   r›   r²   rœ   r´   r�   r³   rÀ   rÏ   rp   rt   r¿   r»   r–   r‡   r|   rˆ   r‰   r¹   z>=rº   z<=r¾   z=*r¸   z~=r½   z!error converting filter to stringrš   )
ÚgetNameÚfilter_to_stringr6   rg   ÚhasValuerŒ   r  r   rž   r=   )Úfilter_objectÚfilter_typeÚfilter_stringÚfÚavarÏ   r~   Ú	componentrS   rS   rT   r  Í  sd   ÿÿ*
€÷



r  c              
   C   sV   t | d ƒt| d ƒt| d ƒt| d ƒt| d ƒt| d ƒt| d ƒt| d ƒd	œS )
NrÑ   rÒ   rÖ   rÚ   rÛ   rÜ   rÝ   rÞ   )ÚbaserÒ   ÚdereferenceAliasrÚ   rÛ   rÜ   rÝ   rÞ   )rg   ÚintÚboolr  r7   )rå   rS   rS   rT   Úsearch_request_to_dict  s   







ùr  c                 C   s¸   t ƒ }| d r4t| d tƒrt| d ƒ|d< t| d ƒ|d< nt| d ƒ|d< tt| d ƒdd�|d< nd|d< d|d< t| d ƒ|d	< |rRt| d ||ƒ|d< |S t	| d ƒ|d< |S )
NÚobjectÚraw_dnry   Trð   ó    rx   rÞ   Úraw_attributes)
r÷   rŸ   r   r>   r=   rg   rž   r  r	  rú   )Úresponser„   r  r‚   ÚentryrS   rS   rT   Ú$search_result_entry_response_to_dict  s   þr!  c                 C   sx   t | d ƒtƒ  ¡  | d ¡t| d ƒt| d ƒt| d ƒdœ}d| v r:tƒ |d< | d D ]}|d |d |d < q-|S )	NÚ
resultCodeÚdiagnosticMessageÚ	matchedDNÚreferral)ÚresultÚdescriptionÚmessagery   Ú	referralsÚcontrolsr?   r   )r  r/   ÚgetNamedValuesr  rg   r5   r÷   )r  r&  ÚcontrolrS   rS   rT   Ú#search_result_done_response_to_dict"  s   



ü
r-  c                 C   s   dt | ƒiS )NÚuri)r8   ©r  rS   rS   rT   Ú(search_result_reference_response_to_dict1  s   r0  c                 C   sz   t ƒ }| d d |d< t| d d dd�|d< t| d d ƒ|d< |r1t| d d ||ƒ|d	< |S t| d d ƒ|d	< |S )
Nr   r@   r  Trð   ry   r?   r  rÞ   )r÷   r=   r  r
  rý   )r  r„   r  r‚   Ú
entry_dictrS   rS   rT   Ú)search_result_entry_response_to_dict_fast5  s   þr2  c                 C   s   dt dd„ | D ƒƒiS )Nr.  c                 S   s   g | ]}|d  ‘qS rò   rS   )r}   ÚrrS   rS   rT   r†   C  rÇ   zAsearch_result_reference_response_to_dict_fast.<locals>.<listcomp>)r;   r/  rS   rS   rT   Ú-search_result_reference_response_to_dict_fastB  r  r4  )NNFrl   )nÚ__doc__Ústringr   Úosr   rx   r   r   r   r	   r
   r   r   r   r   r   r   Úcore.exceptionsr   r   r   r   Úutils.ciDictr   Úprotocol.rfc4511r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   Úoperation.bindr5   Úprotocol.convertr6   r7   r8   r9   r:   r;   Úprotocol.formatters.standardr<   Ú
utils.convr=   r>   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   r¤   r¢   r¦   r¥   r  rL   r˜   r°   rÁ   rÐ   ræ   rï   ró   rú   rý   rì   r  r  r  r	  r
  r  r  r  r!  r-  r0  r2  r4  rS   rS   rS   rT   Ú<module>   sj    4„ U4L
ôA	

	


4