o
    ßý°j@…  ã                   @   st  d Z ddlZddlmZ ddlmZ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 ddlmZmZmZmZmZm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)m*Z*m+Z+m,Z,m-Z-m.Z. ddl/m0Z0 ddl1m2Z2m3Z3 zddl4m5Z5 W n e6y™   ddl7m5Z5 Y nw z
ddlm8Z8 dZ9W n e6y¯   dZ9Y nw G dd„ de:ƒZ;dS )Ú
é    N)ÚLock)ÚdatetimeÚMINYEARé   )ÚDSAÚSCHEMAÚALLÚBASEÚget_config_parameterÚOFFLINE_EDIR_8_8_8ÚOFFLINE_EDIR_9_1_4ÚOFFLINE_AD_2012_R2ÚOFFLINE_SLAPD_2_4ÚOFFLINE_DS389_1_3_3ÚSEQUENCE_TYPESÚIP_SYSTEM_DEFAULTÚ
IP_V4_ONLYÚ
IP_V6_ONLYÚIP_V4_PREFERREDÚIP_V6_PREFERREDÚSTRING_TYPESé   )ÚLDAPInvalidServerErrorÚLDAPDefinitionErrorÚLDAPInvalidPortErrorÚ LDAPInvalidTlsSpecificationErrorÚLDAPSocketOpenErrorÚLDAPInfoError)Úformat_attribute_values)ÚLDAP_MAX_INT)Ú
SchemaInfoÚDsaInfo)ÚTls)ÚlogÚlog_enabledÚERRORÚBASICÚPROTOCOLÚNETWORK)Ú
to_unicode)Ú
check_portÚcheck_port_and_port_list)Úunquote)ÚAF_UNIXTFc                	   @   s   e Zd ZdZdZeƒ Zdddedddedf	dd„Z	e
dd„ ƒZd	d
„ Zdd„ Zedd„ ƒZdd„ Zdd„ Zd2dd„Ze
dd„ ƒZdd„ Zd3dd„Zdd„ Zd4dd„Zd4d d!„Zed"d#„ ƒZed$d%„ ƒZe
d5d&d'„ƒZd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Z dS )6ÚServera	  
    LDAP Server definition class

    Allowed_referral_hosts can be None (default), or a list of tuples of
    allowed servers ip address or names to contact while redirecting
    search to referrals.

    The second element of the tuple is a boolean to indicate if
    authentication to that server is allowed; if False only anonymous
    bind will be used.

    Per RFC 4516. Use [('*', False)] to allow any host with anonymous
    bind, use [('*', True)] to allow any host with same authentication of
    Server.
    r   NFc                 C   sœ  d| _ d}| ¡ }| ¡  d¡r|dd … | _d}d}n4| ¡  d¡r/|dd … | _d}d}n!| ¡  d¡r@tr@d| _ d}d}n| ¡  d¡rMtsMtdƒ‚|| _| j rqttu rdt	|dd … ƒ 
d	¡| _n	t	|dd … ƒ| _d | _nÇd
| jv r©| j d
¡dkr©| j d
¡\}}}zt|ƒp�|}W n ty¤   ttƒr ttd|ƒ tdƒ‚w || _n�|�r| j d¡�r| jdd …  d¡\}}}|dksÉ|  |¡s×ttƒrÔttd| jƒ tƒ ‚t|ƒ�r| d
¡sðttƒrìttd| jƒ tdƒ‚|dd …  ¡ �s	ttƒ�rttd| jƒ tdƒ‚t|dd … ƒ}|| _n#|�s |  | j¡�r n| j d
¡dk�r8ttƒ�r5ttd| jƒ tƒ ‚| j �sk| j d¡ |�sK|�sKd}n|�rS|�sSd}t|ƒ}|�rhttƒ�rdtt|ƒ t|ƒ‚|| _|d u �rsdg}t|tƒ�r—g | _|D ]}t|tƒ�r”t|d tƒ�r”| j |¡ �q~nt|tƒ�rªt|d tƒ�r©|g| _ng | _|�r²dnd| _ |�rÍt|t!ƒ�sÍttƒ�rÉttd|ƒ t"dƒ‚| j �r×|�s×t!ƒ n|| _#| j �s|  | j¡�rû| j �rëdndd | j d t| jƒ | _$n| j �rdndd | j d
 t| jƒ | _$n|| _$|| _%d | _&d | _'t(ƒ | _)|| _*|
| _+g | _,t-t.ddƒ| _/d | _0|| _1|	| _2|  3d ¡ tt4ƒ�rLtt4d | ƒ d S d S )!NFzldap://é   Tzldaps://é   zldapi://z6LDAP over IPC not available - UNIX sockets non presentzutf-8ú:r   zport <%s> must be an integerzport must be an integerú[ú]z$invalid IPv6 server address for <%s>z#invalid URL in server name for <%s>zinvalid URL in server namez port must be an integer for <%s>zinvalid server address for <%s>ú/i…  i|  )Ú*Tzinvalid tls specification: <%s>zinvalid Tls objectÚldapsÚldapz://[z]:z://zinstantiated Server: <%r>)5ÚipcÚstripÚlowerÚ
startswithÚhostÚunix_socket_availabler   ÚstrÚbytesr-   ÚdecodeÚportÚcountÚ	partitionÚintÚ
ValueErrorr%   r&   r$   r   Ú_is_ipv6r   ÚlenÚ	isdecimalÚrstripr+   Ú
isinstancer   Úallowed_referral_hostsÚtupleÚboolÚappendÚsslr#   r   ÚtlsÚnameÚget_infoÚ	_dsa_infoÚ_schema_infor   Údit_lockÚcustom_formatterÚcustom_validatorÚ_address_infor   r   Ú_address_info_resolved_timeÚcurrent_addressÚconnect_timeoutÚmodeÚget_info_from_serverr'   )Úselfr=   rB   Úuse_sslrL   rS   rQ   Ú	formatterr\   r]   Ú	validatorÚ	url_givenÚhostnameÚ_ÚhostportÚsepÚport_errÚreferral_host© rj   ú„/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/ldap3/core/server.pyÚ__init__I   sÚ   ý






€ý€
,,

ÿzServer.__init__c              
   C   s2   z
t  t j| ¡ W dS  t jttfy   Y dS w )NFT)ÚsocketÚ	inet_ptonÚAF_INET6ÚerrorÚAttributeErrorrF   )r=   rj   rj   rk   rG   Î   s   þÿzServer._is_ipv6c                 C   s@   | j r| j| jr
dnd | jrd }|S d }|S t | ¡}|S )Nz - sslz - cleartextz - unix socketÚ )r=   rR   rP   r9   ÚobjectÚ__str__)r_   Úsrj   rj   rk   rt   Ö   s   ý
ÿzServer.__str__c                 C   s’   d  | ¡}|| jsdnd  | ¡7 }|| jd u rdnd  | ¡7 }|| js%dnd  | ¡7 }|| js1dnd  | ¡7 }|| js=dnd  | ¡7 }|d7 }|S )	Nz:Server(host={0.host!r}, port={0.port!r}, use_ssl={0.ssl!r}rr   z5, allowed_referral_hosts={0.allowed_referral_hosts!r}z, tls={0.tls!r}z, get_info={0.get_info!r}z', connect_timeout={0.connect_timeout!r}z, mode={0.mode!r}ú))ÚformatrL   rQ   rS   r\   r]   )r_   Úrrj   rj   rk   Ú__repr__Ý   s   
zServer.__repr__c              	   C   sÜ  t dƒ}| jrt ¡ | j j|krëd }zW| jr$tjtj	dd | j
d fg}nE| jtkr=t | j
| jtjtj	tjtjtjB ¡}n,| jtkrVt | j
| jtjtj	tjtjtjB ¡}nt | j
| jtjtj	tjtjtjB ¡}W n tjtfyv   Y nw |s¼z8| jtkrŽt | j
| jtjtj	tj¡}n"| jtkr¢t | j
| jtjtj	tj¡}nt | j
| jtjtj	tj¡}W n
 tjy»   Y nw |rÌdd„ |D ƒ| _t ¡ | _n
g | _ttddƒ| _ttƒrë| jD ]}ttd| |d d… ƒ qÝ| jS )NÚADDRESS_INFO_REFRESH_TIMEr   c                 S   s   g | ]
}t |ƒd d g ‘qS ©N)Úlist©Ú.0Úaddressrj   rj   rk   Ú
<listcomp>  s    z'Server.address_info.<locals>.<listcomp>r   z!address for <%s> resolved as <%r>éþÿÿÿ)r   rY   r   ÚnowrZ   Úsecondsr9   rm   r.   ÚSOCK_STREAMr=   r]   r   ÚgetaddrinforB   ÚAF_INETÚIPPROTO_TCPÚAI_ADDRCONFIGÚAI_V4MAPPEDr   ro   Ú	AF_UNSPECÚgaierrorrq   r   r%   r'   r$   )r_   Úconf_refresh_intervalÚ	addressesr   rj   rj   rk   Úaddress_infoè   sF   
(
(&€ÿ

€ÿ
zServer.address_infoc                 C   sj   d}|t | jƒk r3| j| |kr&|rdnd| j| d< t ¡ | j| d< d S |d7 }|t | jƒk s	d S d S )Nr   TFé   é   r   )rH   rY   rŽ   r   r‚   )r_   r   Ú	availableÚcontrj   rj   rk   Úupdate_availability  s   ûzServer.update_availabilityc                 C   s    | j D ]
}d |d< d |d< qd S )Nr�   r�   )rY   )r_   r   rj   rj   rk   Úreset_availability  s   

þzServer.reset_availabilityc                 C   sŠ  t ||ƒ}|rttƒrtt|ƒ t|ƒ‚|dur|nd}dg}|dur'|g}n
|dur1|dd… }tdƒ}d}|  ¡  |  ¡ D �]}	d}zÆtj|	dd… Ž }
d}d}|D ].}z|
 	||f¡ d}W  n  t
y‚ } z|}ttƒrxttd|||ƒ W Y d}~qTd}~ww |sšttƒr‘ttd	|||ƒ td
 |||¡ƒ‚| jr¤|
 | j¡ n|
 |¡ z8z	|
 |	d ¡ W n tjy¿   d}Y nw W zz|
 tj¡ W n tjyÖ   d}Y nw W |
 ¡  n,|
 ¡  w z!z|
 tj¡ W n tjy÷   d}Y nw W |
 ¡  w W |
 ¡  w |
 ¡  w W n tj�y   d}Y nw |�r0ttƒ�r'ttd| |	ƒ |  |	d¡  |S |  |	d¡ ttƒ�rBttd| |	ƒ q?|S )a¼  
        Tries to open, connect and close a socket to specified address and port to check availability.
        Timeout in seconds is specified in CHECK_AVAILABITY_TIMEOUT if not specified in
        the Server object.
        If specified, use a specific address, port, or list of possible ports, when attempting to check availability.
        NOTE: This will only consider multiple ports from the source port list if the first ones we try to bind to are
              already in use. This will not attempt using different ports in the list if the server is unavailable,
              as that could result in the runtime of check_availability significantly exceeding the connection timeout.
        Nrr   r   ÚCHECK_AVAILABILITY_TIMEOUTFTé   zFUnable to bind to local address <%s> with source port <%s> due to <%s>zZUnable to locally bind to local address <%s> with any of the source ports <%s> due to <%s>zUUnable to bind socket locally to address {} with any of the source ports {} due to {}é   zserver <%s> available at <%r>z!server <%s> not available at <%r>)r,   r%   r&   r$   r   r   r”   Úcandidate_addressesrm   ÚbindÚ	Exceptionr)   r   rw   r\   Ú
settimeoutÚconnectrp   ÚshutdownÚ	SHUT_RDWRÚcloser‹   r'   r“   )r_   Úsource_addressÚsource_portÚsource_port_listÚsource_port_errÚbind_addressÚcandidate_bind_portsÚconf_availability_timeoutr‘   r   Útemp_socketÚlast_bind_excÚsocket_bind_succeededÚ	bind_portÚbind_exrj   rj   rk   Úcheck_availability   s    


	ÿ€ýÿ
ÿ
ÿ€ÿ€ûÿÿ
þÿ
ü
€zServer.check_availabilityc                   C   sv   t j�- t  jd7  _t jtkrdt _ttƒr'ttdt jƒ W d  ƒ t jS W d  ƒ t jS 1 s3w   Y  t jS )zM
        LDAP messageId is unique for all connections to same server
        r   znew message id <%d> generatedN)r/   Ú_message_id_lockÚ_message_counterr    r%   r(   r$   rj   rj   rj   rk   Únext_message_id~  s   

ûý
üùzServer.next_message_idc                 C   s  |j jrdS |j jsŠ|jddtg d¢dd�}|j jr!|\}}}}n|}|j}|j}| j�I |j j	rE|r@t
|d d |d d	 ƒn| j| _n)|rn| |¡\}}t|ƒd
krnd|d v rnd	|d v rnt
|d d |d d	 ƒ| _W d  ƒ n1 sxw   Y  ttƒrŒttd| |ƒ dS dS dS )zJ
        Retrieve DSE operational attribute as per RFC4512 (5.1).
        Nrr   ú(objectClass=*))Ú	altServerÚnamingContextsÚsupportedControlÚsupportedExtensionÚsupportedFeaturesÚsupportedCapabilitiesÚsupportedLdapVersionÚsupportedSASLMechanismsÚ
vendorNameÚvendorVersionÚsubschemaSubentryr6   ú+T)Úsearch_baseÚsearch_filterÚsearch_scopeÚ
attributesÚget_operational_attributesr   rÀ   Úraw_attributesr   zDSA info read for <%s> via <%s>)ÚstrategyÚno_real_dsaÚpooledÚsearchr
   Úthread_safeÚresultÚresponserV   Úsyncr"   rT   Úget_responserH   r%   r'   r$   )r_   Ú
connectionrÈ   ÚstatusrÉ   re   Úresultsrj   rj   rk   Ú_get_dsa_infoŒ  s6   ð($€úÝ"zServer._get_dsa_inforr   c           
      C   s  |j jrdS d}| jr.|dkr.t| jjtƒr#| jjr | jjd nd}n| jjr+| jjnd}nt|j|dtdgdd�}|j jrD|\}}}}n|}|j	}|j
}|j jrq|rpd|d d v rpt|d d d ƒdkrp|d d d d }n1| |¡\}}t|ƒd	kr¢d|d v r¢d|d d
 v r¢t|d d d ƒdkr¢|d d d d }|�r†|j j�sˆt|tƒr¹ttur¹t|dd�}|j|dtg d¢dd�}|j jrÐ|\}}}}n|}|j	}|j
}| j�” d| _|�rh|j jröt||d d
 |d d ƒ| _n+| |¡\}}t|ƒd	k�r!d
|d v �r!d|d v �r!t||d d
 |d d ƒ| _| j�r.| j ¡ �s.d| _| j�rh| jjD ]}	t| j|	| jj|	 | jƒ| jj|	< �q6| j�rh| jjD ]}	t| j|	| jj|	 | jƒ| jj|	< �qSW d  ƒ n	1 �ssw   Y  ttƒ�rŠttd| |ƒ dS dS dS dS )z�
        Retrieve schema from subschemaSubentry DSE attribute, per RFC
        4512 (4.4 and 5.1); entry = '' means DSE.
        Nrr   r   r°   r»   T)rÀ   rÁ   rÂ   r   rÀ   )Úfrom_serverz(objectClass=subschema))ÚobjectClassesÚattributeTypesÚldapSyntaxesÚmatchingRulesÚmatchingRuleUseÚdITContentRulesÚdITStructureRulesÚ	nameFormsÚcreateTimestampÚmodifyTimestampr6   )r¾   r¿   rÀ   rÁ   zschema read for <%s> via <%s>)rÃ   rÄ   rT   rK   Úschema_entryr   rÆ   r
   rÇ   rÈ   rÉ   rÊ   rH   rË   rÅ   r@   r?   r*   rV   rU   r!   Úis_validÚotherr   ÚrawrW   r%   r'   r$   )
r_   rÌ   ÚentryrÛ   rÈ   rÍ   rÉ   re   rÎ   Ú	attributerj   rj   rk   Ú_get_schema_info¸  st   €(ò *&&€ð
Õ*zServer._get_schema_infoc                 C   s|  |r!|j s!| jttfv r|  |¡ | jttfv r|  |¡ dS dS | jtkr@ddlm	}m
} |  t |¡¡ |  t |¡¡ dS | jtkr_ddlm}m} |  t |¡¡ |  t |¡¡ dS | jtkr~ddlm}m} |  t |¡¡ |  t |¡¡ dS | jtkr�ddlm}m}	 |  t |¡¡ |  t |	¡¡ dS | jtkr¼ddlm}
m} |  t |
¡¡ |  t |¡¡ dS dS )z8
        reads info from DSE and from subschema
        r   )Úedir_8_8_8_schemaÚedir_8_8_8_dsa_info)Úedir_9_1_4_schemaÚedir_9_1_4_dsa_info)Úad_2012_r2_schemaÚad_2012_r2_dsa_info)Úslapd_2_4_schemaÚslapd_2_4_dsa_info)Úds389_1_3_3_schemaÚds389_1_3_3_dsa_infoN) ÚclosedrS   r   r	   rÏ   r   rá   r   Úprotocol.schemas.edir888râ   rã   Úattach_schema_infor!   Ú	from_jsonÚattach_dsa_infor"   r   Úprotocol.schemas.edir914rä   rå   r   Úprotocol.schemas.ad2012R2ræ   rç   r   Úprotocol.schemas.slapd24rè   ré   r   Úprotocol.schemas.ds389rê   rë   )r_   rÌ   râ   rã   rä   rå   ræ   rç   rè   ré   rê   rë   rj   rj   rk   r^     s6   

ÿ




ýzServer.get_info_from_serverc                 C   s0   t |tƒr|| _ttƒrttd| ƒ d S d S d S )Nz attached DSA info to Server <%s>)rK   r"   rT   r%   r'   r$   )r_   Údsa_inforj   rj   rk   rð   #  s   
ýzServer.attach_dsa_infoc                 C   s,   t |tƒr|| _ttƒrttd| ƒ d S d S )Nz#attached schema info to Server <%s>)rK   r!   rU   r%   r'   r$   )r_   Ú
dsa_schemarj   rj   rk   rî   )  s
   
ÿzServer.attach_schema_infoc                 C   ó   | j S r{   )rT   ©r_   rj   rj   rk   Úinfo/  ó   zServer.infoc                 C   r÷   r{   )rU   rø   rj   rj   rk   Úschema3  rú   zServer.schemac                 C   s,  t | tƒrt| d ||||td�}n
t| ||||td�}t |tƒr%||_nt |tƒrBzt |¡|_W n tyA   t 	|¡|_Y nw |j
sSttƒrOttd| ƒ tdƒ‚t |tƒr\||_nt |tƒryzt |¡|_W n tyx   t 	|¡|_Y nw |jsŠttƒr†ttd| ƒ tdƒ‚ttƒr”ttd|ƒ |S )a¬  
        Define a dummy server with preloaded schema and info
        :param host: host name
        :param dsa_info: DsaInfo preloaded object or a json formatted string or a file name
        :param dsa_schema: SchemaInfo preloaded object or a json formatted string or a file name
        :param port: fake port
        :param use_ssl: use_ssl
        :param formatter: custom formatters
        :return: Server object
        r   )r=   rB   r`   ra   rb   rS   zinvalid DSA info for %szinvalid dsa infozinvalid schema info for %szinvalid schema infoz#created server <%s> from definition)rK   r   r/   r	   r"   rT   r   rï   rš   Ú	from_filerù   r%   r&   r$   r   r!   rU   rû   r'   )r=   rõ   rö   rB   r`   ra   rb   Údummyrj   rj   rk   Úfrom_definition7  s<   


ÿ

ÿzServer.from_definitionc                 C   sr  t dƒ}| jr| j}ttƒrttd| | jƒ |S | jD ]}|d r4t ¡ |d  j	|kr4d |d< d |d< q| jd d … }g }|r¡| j
tkrM| |d ¡ nT| j
tkrZdd„ |D ƒ}nG| j
tkrgdd„ |D ƒ}n:| j
tkr}d	d„ |D ƒ}|d
d„ |D ƒ7 }n$| j
tkr“dd„ |D ƒ}|dd„ |D ƒ7 }nttƒr�ttd| ƒ tdƒ‚ttƒr·|D ]}ttd| |d d… | j
ƒ q§|S )NÚRESET_AVAILABILITY_TIMEOUTz6candidate address for <%s>: <%s> with mode UNIX_SOCKETr�   r�   r   c                 S   ó2   g | ]}|d  t jkr|d s|d du r|‘qS ©r   r�   N©rm   r†   r}   rj   rj   rk   r€   z  ó   2 z.Server.candidate_addresses.<locals>.<listcomp>c                 S   r   r  ©rm   ro   r}   rj   rj   rk   r€   |  r  c                 S   r   r  r  r}   rj   rj   rk   r€   ~  r  c                 S   r   r  r  r}   rj   rj   rk   r€     r  c                 S   r   r  r  r}   rj   rj   rk   r€   �  r  c                 S   r   r  r  r}   rj   rj   rk   r€   ‚  r  zinvalid server mode for <%s>zinvalid server modez6obtained candidate address for <%s>: <%r> with mode %sr�   )r   r9   rŽ   r%   r'   r$   rR   r   r‚   rƒ   r]   r   rO   r   r   r   r   r&   r   )r_   Úconf_reset_availability_timeoutÚ
candidatesr   r�   Ú	candidaterj   rj   rk   r˜   f  sB    
ã€




zServer.candidate_addressesc                 C   sˆ   | j stdƒ‚|dkr| jj}n|dkr| jj}n|dkr"| jj}ntdƒ‚|D ]}||d ks>|d rA| ¡ |d  ¡ krA dS q(d	S )
Nzserver info not loadedÚcontrolÚ	extensionÚfeaturezinvalid info categoryr   r   TF)rT   r   rù   Úsupported_controlsÚsupported_extensionsÚsupported_featuresr;   )r_   ÚkindrR   Ú
propertiesÚproprj   rj   rk   Ú_check_info_property�  s   


(€zServer._check_info_propertyc                 C   ó   |   d|¡S )Nr  ©r  )r_   r  rj   rj   rk   Úhas_control   ó   zServer.has_controlc                 C   r  )Nr	  r  )r_   r	  rj   rj   rk   Úhas_extension£  r  zServer.has_extensionc                 C   r  )Nr
  r  )r_   r
  rj   rj   rk   Úhas_feature¦  r  zServer.has_feature)NNN)rr   r{   )NFNN)!Ú__name__Ú
__module__Ú__qualname__Ú__doc__r®   r   r­   r   r   rl   ÚstaticmethodrG   rt   ry   ÚpropertyrŽ   r“   r”   r¬   r¯   rÏ   rá   r^   rð   rî   rù   rû   rþ   r˜   r  r  r  r  rj   rj   rj   rk   r/   5   sT    
ö 

)	
^

,M



.'r/   )<r  rm   Ú	threadingr   r   r   rr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   Ú
exceptionsr   r   r   r   r   r   Úprotocol.formatters.standardr   Úprotocol.rfc4511r    Úprotocol.rfc4512r!   r"   rQ   r#   Ú	utils.logr$   r%   r&   r'   r(   r)   Ú
utils.convr*   Úutils.port_validatorsr+   r,   Úurllib.parser-   ÚImportErrorÚurllibr.   r>   rs   r/   rj   rj   rj   rk   Ú<module>   s2    L  ÿÿ