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rt
|
dkr|
d    dkr|
d }njt
|
dkr|
d    dkrd}|
d }nStdt
|
dkrt
|
dkr|
d
 }n=t
|
dkr|
d
 }|
d    dkrd}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 rt}  |  }|	d}|d
 r{t|d
  nd }|d rt|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rt}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rt|jd	krtd
|t| |	| ||||| d }	t}q9|tks|tkr|dvrd}
|	s|}	t}q9tdt|jdkrt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rt }t| jd	 |d
< tt| jd |d< ||d< |S | jtkrt }t| jd	 |d
< tt| jd |d< ||d< |S | jtkrt }t| jd	 |d
< tt| jd |d< ||d< |S | jtkrt }| jd rt| jd |d< | jd	 rt| 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rt }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 rt  
dt#t| jd ||< ||d< ||d< |S | jt$krt% }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< |rtdntd|d< tt||
||	||jd |d< t|tst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rt|d ndt|d  7 }|d7 }qs|dkr|dt|d  7 }qsng|dkrt| d }||d
 d |d  7 }nP|dkrt| 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