o
    j]                     @   s  d Z ddlZddl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 dd
lmZ ddlm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#m$Z$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/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z< ddl=m>Z> ddl?m@Z@mAZAmBZB ddlCmDZD ddlEmFZFmGZG ddlHmIZI ddlJmKZKmLZLmMZMmNZN ddlOmPZP ddl&mQZQ ddlRmSZS ddlTmUZUmVZVmWZW ddlXmYZY dgZZdZ[dd  Z\G d!d" d"e]Z^G d#d$ d$e]Z_dS )%
    N)SystemRandom)OctetString   )SEQUENCE_TYPESALL_ATTRIBUTES)bind_request_to_dict)delete_request_to_dict)add_request_to_dict)compare_request_to_dict)modify_dn_request_to_dict)modify_request_to_dict)extended_request_to_dict)search_request_to_dictparse_filterROOTANDORNOTMATCH_APPROXMATCH_GREATER_OR_EQUALMATCH_LESS_OR_EQUALMATCH_EXTENSIBLEMATCH_PRESENTMATCH_SUBSTRINGMATCH_EQUAL)	json_hook
to_unicodeto_raw)LDAPDefinitionErrorLDAPPasswordIsMandatoryErrorLDAPInvalidValueErrorLDAPSocketOpenError)RESULT_SUCCESSRESULT_OPERATIONS_ERROR%RESULT_UNAVAILABLE_CRITICAL_EXTENSIONRESULT_INVALID_CREDENTIALSRESULT_NO_SUCH_OBJECTRESULT_ENTRY_ALREADY_EXISTSRESULT_COMPARE_TRUERESULT_COMPARE_FALSERESULT_NO_SUCH_ATTRIBUTERESULT_UNWILLING_TO_PERFORMRESULT_PROTOCOL_ERRORRESULT_CONSTRAINT_VIOLATIONRESULT_NOT_ALLOWED_ON_RDN)CaseInsensitiveDict)to_dnsafe_dnsafe_rdn)validate_simple_password)find_attribute_validatorformat_attribute_values)paged_search_control)loglog_enabledERRORBASIC)encode)ldap_escape_to_bytes)BaseStrategy)LDAPMessage
ProtocolOp	MessageID)build_controls_list1.2.840.113556.1.4.319utf-8c                   C   s   t t  dd  S )Ni)r   r   random rF   rF   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/ldap3/strategy/mockBase.pyrandom_cookiez   s   rH   c                   @   s   e Zd Zdd ZdddZdS )PagedSearchSetc                 C   s"   || _ || _d | _d| _d| _d S )Nr   F)sizeresponsecookiesentdone)selfrK   rJ   criticalityrF   rF   rG   __init__   s
   
zPagedSearchSet.__init__Nc                 C   s   |r|| _ d}| j| j| j| j   }|  j| j 7  _| jt| jkr*d| _d| _nt | _tdt| j| j}tdt	|t
d t|gd}||fS )N TF)
resultCode	matchedDNdiagnosticMessagereferralcontrols)rJ   rK   rM   lenrN   rL   rH   r7   r#   r   SERVER_ENCODINGr>   decode_control)rO   rJ   messagerK   response_controlresultrF   rF   rG   next   s"   
zPagedSearchSet.nextN)__name__
__module____qualname__rQ   r^   rF   rF   rF   rG   rI   ~   s    rI   c                   @   s   e Zd ZdZdd Zdd Zdd Zd.d	d
Zdd Zd.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ed)d* Zd/d,d-Zd+S )0MockBaseStrategyz,
    Base class for connection strategy
    c                 C   sx   t | jjdst | jj_| jjj| _d| _d | _d | _dg| _	| j
dg dd g | _ttr:ttd| jj|  d S d S )NditTentryDN	cn=schemaFvalidatezinstantiated <%s>: <%s>)hasattr
connectionserverr0   rd   entriesno_real_dsaboundcustom_validatorsoperational_attributes	add_entry_paged_setsr9   r;   r8   	__class__r`   rO   rF   rF   rG   rQ      s   zMockBaseStrategy.__init__c                 C   2   d| j _d| j _| j jr| j j jd7  _d S d S )NTF   )rj   	listeningclosedusage_usageopen_socketsrt   rF   rF   rG   _start_listen   
   zMockBaseStrategy._start_listenc                 C   ru   )NFTrv   )rj   rw   rx   ry   rz   closed_socketsrt   rF   rF   rG   _stop_listen   r}   zMockBaseStrategy._stop_listenTc                 C   sl   |r t | jjj|| j}||}|du rtd| |dur |}t|}t|ts4td|t	||f |S )z
        Prepare a value for being stored in the mock DIT
        :param value: object to store
        :return: raw value to store in the DIT
        Fz"value non valid for attribute '%s'TzvThe value "%s" of type %s for "%s" must be bytes or an offline schema needs to be provided when Mock strategy is used.)
r5   rj   rk   schemaro   r!   r   
isinstancebytestype)rO   attribute_typevaluerh   	validator	validated	raw_valuerF   rF   rG   _prepare_value   s   
zMockBaseStrategy._prepare_valuec                 C   s   d S r_   rF   )rO   dnr   r   rF   rF   rG   _update_attribute   s   z"MockBaseStrategy._update_attributec                    sT  j jj t|}|j jjvrt }|D ]  jv r qt|  ts.|  g| < j jj	rMj jj	j
  jrMt|  dkrM W d    dS   dkrj jj	rt }|  D ]\}j jj	jry|j jj	jvry  W d    dS || d}|t|krt }	t|}|D ]}
j jj	j|
 jr|	j jj	j|
 j q||	 |t|ksdd |D |d< q_q fdd|  D | < qt|d	d
D ]+}|d |vrt|d g||d < qt|d }|||d  vr||d  | qt|g|d< |j jj|< 	 W d    d	S 	 W d    dS 1 s#w   Y  d S )Nrv   Fobjectclassr   c                 S      g | ]}t |qS rF   r   .0r   rF   rF   rG   
<listcomp>       z.MockBaseStrategy.add_entry.<locals>.<listcomp>objectClassc                    s   g | ]	}  |qS rF   )r   r   	attributerO   rh   rF   rG   r          T	decomposere   )rj   rk   dit_lockr2   rd   r0   rp   r   r   r   attribute_typessingle_valuerX   lowersetobject_classesaddsuperiorupdater3   r   append)rO   r   
attributesrh   
escaped_dn	new_entry	class_setobject_classclass_set_sizenew_classes
class_namerdnraw_rdnrF   r   rG   rq      sZ   
,

 '&zMockBaseStrategy.add_entryc                 C   sf   | j jj$ t|}|| j jjv r | j jj|= 	 W d    dS 	 W d    dS 1 s,w   Y  d S NTF)rj   rk   r   r2   rd   )rO   r   r   rF   rF   rG   remove_entry   s   $zMockBaseStrategy.remove_entryc                 C   s  t |d}tj|td}d|vr(d| j_ttr"ttd| jj| j t	| jj| jj
js3t | jj
_|d D ]F}d|vrUd| j_ttrOttd| jj| j t	| jjd|vrqd	| j_ttrkttd| jj| j t	| jj| j|d |d d
d q7|  d S )Nr)object_hookrl   z2invalid JSON definition, missing "entries" section<%s> for <%s>rawz.invalid JSON definition, missing "raw" sectionr   z-invalid JSON definition, missing "dn" sectionFrg   )openjsonloadr   rj   
last_errorr9   r:   r8   r   rk   rd   r0   rq   close)rO   json_entry_filetarget
definitionentryrF   rF   rG   entries_from_json  s,   

z"MockBaseStrategy.entries_from_jsonc                 C   s  t |}|d }d|d v r&z
t|d d }W n% ty%   d}d}Y nw d| j_ttr8ttd| jj| j t| jj|| jj	j
v rgd| jj	j
| v rb| |d|r]t}d}|| _nt}d	}nt}d
}n|dkrst}d}|| _nt}d}|dt|td d dS )NnamesimpleauthenticationrR   z<anonymous>z)only Simple Bind allowed in Mock strategyr   userPasswordzinvalid credentialszmissing userPassword attributezmissing object)rS   rT   rU   rV   serverSaslCreds)r   r4   r    rj   r   r9   r:   r8   r   rk   rd   equalr#   rn   r&   r   rY   )rO   request_messagerW   requestidentitypasswordresult_coder[   rF   rF   rG   	mock_bind  sF   zMockBaseStrategy.mock_bindc                 C   sT   t |}t|d }|| jjjv r| jjj|= t}d}nt}d}|dt|td dS )Nr   rR   object not foundrS   rT   rU   rV   )	r	   r2   rj   rk   rd   r#   r'   r   rY   )rO   r   rW   r   r   r   r[   rF   rF   rG   mock_deleteT  s   zMockBaseStrategy.mock_deletec                 C   sf   t |}t|d }|d }|| jjjvr%| ||r t}d}n	t}d}nt}d}|dt	|t
d dS )Nr   r   rR   zerror adding entryzentry already existr   )r
   r2   rj   rk   rd   rq   r#   r$   r(   r   rY   )rO   r   rW   r   r   r   r   r[   rF   rF   rG   mock_addk  s    	zMockBaseStrategy.mock_addc           	      C   s   t |}t|d }|d }t|d }|| jjjv r:|| jjj| v r5| |||r0t}d}nt}d}n	t	}d}nt
}d}|dt|td dS )Nr   r   r   rR   zattribute not foundr   r   )r   r2   r   rj   rk   rd   r   r)   r*   r+   r'   r   rY   )	rO   r   rW   r   r   r   r   r   r[   rF   rF   rG   mock_compare  s(   	zMockBaseStrategy.mock_comparec                 C   s  t |}t|d }|d }|d }|d rt|d nd}t|}|| jjjv r|r`|r`t|d d | }	| jjj|  | jjj|	< | jjj|	 }
|rT| jjj|= t}d}t|	g|
d	< nV|r|st|d t|d
d   }	| jjj|  | jjj|	< | jjj|	 }| jjj|= t|	g|d	< t	|	ddD ]}t|d
 g||d < qt}d}n	t
}d}nt}d}|dt|td dS )Nr   newRdndeleteOldRdnnewSuperiorrR   r   ,zentry movedre   rv   Tr   zentry rdn renamedznewRdn or newSuperior missingr   r   )r   r2   r1   rj   rk   rd   copyr#   r   r3   r,   r'   r   rY   )rO   r   rW   r   r   new_rdndelete_old_rdnnew_superiordn_componentsnew_dnmoved_entryr   r[   renamed_entryr   rF   rF   rG   mock_modify_dn  sF   zMockBaseStrategy.mock_modify_dnc                    s  t |}t|d }|d }d}d}dd t|ddD }|| jjjv r{| jjj| }	|	 }
|D ]<}|d	 }|d
 d }|d
 d  |dkr||	vrx rx| jjjrn| jjjjrn| jjjj| j	rnt
 dkrnt}d}q2dd  D |	|< q2| jjjr| jjjjr| jjjj| j	rt}d}q2|	| dd  D  q2|dkr||	vrt}d}q2||v rt}d}q2 s|	|= q2 D ]}t|}| |||r|	| | qd}d}q|	| s|	|= q2|dkr;||	vr r| jjjr| jjjjr| jjjj| j	rt
 dkrt}d}q2dd  D |	|< q2 s%||v r%t}d}q2 s1||	v r0|	|= q2dd  D |	|< q2|dkro||	vrJt}d}q2t
 dkrVt}d}q2z fdd|	| D |	|< W q2   t}d}Y q2q2|rz|
| jjj|< nt}d}|dt|td dS )Nr   changesr   rR   c                 S   s   g | ]}|d  qS )r   rF   )r   r   rF   rF   rG   r     r   z0MockBaseStrategy.mock_modify.<locals>.<listcomp>Tr   	operationr   r   r   rv   zattribute is single-valuedc                 S   r   rF   r   r   elementrF   rF   rG   r     r   c                 S   r   rF   r   r   rF   rF   rG   r     r   z-attribute must exists for deleting its valueszcannot delete an rdnzvalue to delete not foundr   c                 S   r   rF   r   r   rF   rF   rG   r   &  r   zcannot replace an rdnc                 S   r   rF   r   r   rF   rF   rG   r   .  r      z1attribute must exists for incrementing its valuesz#only one increment value is allowedc                    s,   g | ]}t tt|t d   ddqS )r   rD   )encoding)r   strintr   elementsrF   rG   r   9  s   , zunable to increment valuer   r   )r   r2   r3   rj   rk   rd   r   r   r   r   rX   r.   extendr+   r/   r   r   remover-   r,   r'   r   rY   )rO   r   rW   r   r   r   r   r[   rdnsr   original_entrymodificationr   r   r   raw_elementrF   r   rG   mock_modify  s   
4(
<


zMockBaseStrategy.mock_modifyc           
         s  t |}|r fdd|D }|D ]}|d d r9|d tvr9dt|d  d }tdt|td d	}g |f  S |d d
kr|d d d s |\}}|d tkr}t|t	|d d d |d d }	|	
 \}}|	jrq~	n j|	 ||f  S g |f  S  jD ]$}	|	j|d d d kr|	
 \}}|	jr j|	 ||f    S qd}tdt|td d	}g |f  S qd S  |S )Nc                    s   g | ]	}|r  |qS rF   )rZ   )r   controlrt   rF   rG   r   l  r   z0MockBaseStrategy.mock_search.<locals>.<listcomp>rv   rP   r   zCritical requested control z not availablerR   r   rC   r   rL   rS   rJ   z%Invalid cookie in simple paged search)r   SEARCH_CONTROLSr   r%   r   rY   _execute_searchr#   rI   r   r^   rN   rr   r   rL   r   r$   )
rO   r   rW   r   decoded_controlsdecoded_controlr[   r]   rK   	paged_setrF   rt   rG   mock_searchJ  sP    $

'zMockBaseStrategy.mock_searchc                    sb  g }t d }d }d  d v r j  d dd d D  td jjjdd	jjjjj	d
}g }|dkrU|jjj
v sO| dkrT|| nB|dkr}jjj
D ]}| | r{d|d t| d  vr{|| q^n|dkrjjj
D ]}| | r|| q|st}d}	nt||}
jjrdd   k rt|
k rn nd}d}	nU|
D ]N| fddjjj
 D d d vrjD ],}|  v rqt|t|d  d D ]\}}|d |kr|t|d  d |= qqqd}d}	|dt|	td d}d dkr-|d d  |fS ||fS )Nbasescoper   +c                 S   s   g | ]}|  qS rF   )r   )r   attrrF   rF   rG   r     r   z4MockBaseStrategy._execute_search.<locals>.<listcomp>filterTF)auto_escapeauto_encoder   check_namesr   rf   rv   r   r   zincorrect base object	sizeLimit   zsize limit exceededc                    sD   g | ]}|   v st v r|d  rg njjj | dqS )	typesOnly)r   vals)r   r   rj   rk   rd   )r   r   r   matchr   rO   rF   rG   r     s    )objectr   r   rR   r   )r2   r   rp   r   r   rj   rk   r   custom_validatorr   rd   r   r   endswithrX   r'   evaluate_filter_noderaise_exceptions	enumerater   rY   )rO   r   	responsesr   r   filter_root
candidatesr   r   r[   matchedop_attrir   r]   rF   r   rG   r     sr   
(
,

(

 *z MockBaseStrategy._execute_searchc           	      C   s   t |}t}d}d }d }| jjjrK| jjjjD ]3}|d |d krJ|d dkr5d}d}td}t| j}n|d dkrHd}d}td}t| j} nq|dt|t	d ||dS )	Nznot implementedr   r   z2.16.840.1.113719.1.27.100.31rR   z2.16.840.1.113719.1.27.100.32z1.3.6.1.4.1.4203.1.11.3)rS   rT   rU   rV   responseNameresponseValue)
r   r,   rj   rk   infosupported_extensionsr   rn   r   rY   )	rO   r   rW   r   r   r[   response_nameresponse_value	extensionrF   rF   rG   mock_extended  s6   

zMockBaseStrategy.mock_extendedc                 C   sN  t  |_t  |_|jr|jD ]}| || q|jtkr"|jd jS |jtkrT|jd }|j|j |j|j |jdd D ]}|j	|j |j	|j qAdS |jt
kro|jD ]}|j|j |j|j q\dS |jtkr|jd j|_|jd j|_dS |jtkr|jd }|jd }|D ]P}|| jjj| v r| jjj| | D ];}| r| rt|t|kr|j| q|j| qt|t t|t kr|j| q|j| qqdS |jtkrV|jd }|jd }|D ]Y}|| jjj| v rS| jjj| | D ]C}| r4| r4t|t|kr,|j| q|j| qt|t t|t krK|j| q|j| qqdS |jtkrud| j_ttrottd| jj| j t| jj|jtkr|jd }|D ]}|| jjj| v r|j| q|j| qdS |jtkrg|jd }d|jv r|jd durt !t|jd t}	nd	}	d
|jv r|jd
 dur|jd
 D ]}
|	dt !t|
t 7 }	qd|jv r|jd dur|	dt !t|jd t 7 }	|	r|j"d
ds|j"dds|	d7 }	t j#|	t j$t j%B d}|D ]9}|| jjj| v r]| jjj| | D ]}|&t|trS|j| q@|j| q@q+|j| q+dS |jt'kss|jt(kr|jd }|jd }|D ]%}|| jjj| v r| )|||r|j| q|j| qdS dS )a  After evaluation each 2 sets are added to each MATCH node, one for the matched object and one for unmatched object.
        The unmatched object set is needed if a superior node is a NOT that reverts the evaluation. The BOOLEAN nodes mix the sets
        returned by the MATCH nodesr   rv   Nr   r   z-Extensible match not allowed in Mock strategyr   initialrR   anyz.*final)flags)*r   r
  	unmatchedr   r  tagr   r   r   intersection_updater   r   r   	assertionrj   rk   rd   isdigitr   r   r   rY   r   r   r   r   r9   r:   r8   r   r   r   reescapegetcompileUNICODE
IGNORECASEr   r   r   r   )rO   noder	  r   first_element	attr_name
attr_value	candidater   substring_filtermiddleregex_filterrF   rF   rG   r    s   














&	

$z%MockBaseStrategy.evaluate_filter_nodec                 C   sd   | j jj| | }t|ts|g}t|}|D ]}| ||r" dS | | |||r/ dS qdS r   )rj   rk   rd   r   r   r=   _check_equalityr   )rO   r   r   value_to_checkattribute_valuesescaped_value_to_checkattribute_valuerF   rF   rG   r   j  s   
zMockBaseStrategy.equalc                 C   sv   | |krdS t |  rt | rt| t|krdS zt| t t|t kr.W dS W dS  ty:   Y dS w r   )r   r  r   r   rY   r   UnicodeError)value1value2rF   rF   rG   r,  w  s   z MockBaseStrategy._check_equalityNc                 C   s   |  |||| j_| jjrN| jj }| jjrHt }t||d< t	 
|||d< t|}|d ur5||d< t |||}| jj|tt| ||||fS d| j_ttr`ttd| jj| j t| jj)N	messageID
protocolOprW   z.unable to send message, connection is not openr   )decode_requestrj   r   rw   rk   next_message_idry   r?   rA   r@   setComponentByNamerB   r>   rz   update_transmitted_messagerX   r<   r   r9   r:   r8   r"   )rO   message_typer   rW   
message_idldap_messagemessage_controlsasn1_requestrF   rF   rG   send  s"   zMockBaseStrategy.send)Tr_   )r`   ra   rb   __doc__rQ   r|   r   r   r   rq   r   r   r   r   r   r   r   r   r   r   r  r  r   staticmethodr,  r?  rF   rF   rF   rG   rc      s0    

*6"4jL=*m
rc   )`r@  r   r  rE   r   pyasn1.type.univr   rR   r   r   operation.bindr   operation.deleter	   operation.addr
   operation.comparer   operation.modifyDnr   operation.modifyr   operation.extendedr   operation.searchr   r   r   r   r   r   r   r   r   r   r   r   r   
utils.convr   r   r   core.exceptionsr   r    r!   r"   core.resultsr#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   utils.ciDictr0   utils.dnr1   r2   r3   protocol.sasl.saslr4   protocol.formatters.standardr5   r6   protocol.rfc2696r7   	utils.logr8   r9   r:   r;   
utils.asn1r<   r=   strategy.baser>   protocol.rfc4511r?   r@   rA   protocol.convertrB   r   rY   rH   r  rI   rc   rF   rF   rF   rG   <module>   sB    <<: