o
    ßý°j<  ã                   @   s:  d Z ddlmZ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 zddlZW n ey>   eeƒr:e
edƒ edƒ‚w z
dd	lmZmZ W n eyg   dd
lmZ ddlmZ eeƒree
edƒ Y nw zddlmZmZ dZW n eyˆ   dZeeƒr†e
edƒ Y nw ddlmZ G dd„ deƒZdd„ ZdS )Ú
é   )ÚLDAPSSLNotSupportedErrorÚLDAPSSLConfigurationErrorÚLDAPCertificateErrorÚstart_tls_exception_factoryÚLDAPStartTLSErroré   )ÚSEQUENCE_TYPES)ÚlogÚlog_enabledÚERRORÚBASICÚNETWORKé    Nz,SSL not supported in this Python interpreter)Úmatch_hostnameÚCertificateError)r   )r   zusing tls_backport)Úcreate_default_contextÚPurposeTFzSSLContext unavailable)Úpathc                   @   s^   e Zd ZdZddejdddddddddfdd„Zdd„ Zdd„ Zdd
d„Z	dd„ Z
dd„ ZdS )ÚTlsa¸  
    tls/ssl configuration for Server object
    Starting from python 2.7.9 and python 3.4 uses the SSLContext object
    that tries to read the CAs defined at system level
    ca_certs_path and ca_certs_data are valid only when using SSLContext
    local_private_key_password is valid only when using SSLContext
    ssl_options is valid only when using SSLContext
    sni is the server name for Server Name Indication (when available)
    Nc                 C   s–  |d u rg }|| _ |tjtjtjfv r|| _n|r'ttƒr#ttd|ƒ t	dƒ‚|r2t
 |¡r2|| _n|rBttƒr>ttd|ƒ t	dƒ‚d | _|rRtrRt
 |¡rR|| _n$|rctscttƒr_ttdƒ tdƒ‚|rsttƒrottd|ƒ t	dƒ‚d | _|	r~tr~|	| _n|	r�ttƒr‰ttdƒ tdƒ‚d | _|
r˜tr˜|
| _n|
r§ttƒr£ttd	ƒ td
ƒ‚d | _|| _|| _|| _|| _|| _|| _ttƒrÉttd|  ƒ d S d S )Nzinvalid validate parameter <%s>zinvalid validate parameterzinvalid CA public key file <%s>zinvalid CA public key filez8cannot use CA public keys path, SSLContext not availablez invalid CA public keys path <%s>zinvalid CA public keys pathz,cannot use CA data, SSLContext not availablez?cannot use local private key password, SSLContext not availablezBcannot use local private key password, SSLContext is not availablezinstantiated Tls: <%r>)Ússl_optionsÚsslÚ	CERT_NONEÚCERT_OPTIONALÚCERT_REQUIREDÚvalidater   r   r
   r   r   ÚexistsÚca_certs_fileÚuse_ssl_contextÚca_certs_pathr   Úca_certs_dataÚprivate_key_passwordÚversionÚprivate_key_fileÚcertificate_fileÚvalid_namesÚciphersÚsnir   )ÚselfÚlocal_private_key_fileÚlocal_certificate_filer   r"   r   r   r%   r   r    Úlocal_private_key_passwordr&   r'   © r,   ú�/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/ldap3/core/tls.pyÚ__init__F   sd   


ÿzTls.__init__c                 C   sª   dt | jƒ d| jrdnd d| jrdnd d| jrdnd d| jr$dnd d| jr,dnd d	| jr4dnd d
t | jƒ dt | j	ƒ dt | j
ƒ dt | jƒ g}d |¡S )Nz
protocol: zclient private key: zpresent znot presentzclient certificate: zprivate key password: zCA certificates file: zCA certificates path: zCA certificates data: zverify mode: zvalid names: z	ciphers: zsni: z - )Ústrr"   r#   r$   r!   r   r   r    r   r%   r&   r'   Újoin)r(   Úsr,   r,   r-   Ú__str__Ž   s   õ
zTls.__str__c                 C   s  | j d u rdnd | ¡}|| jd u rdnd | ¡7 }|| jd u r"dnd | ¡7 }|| jd u r0dnd | ¡7 }|| jd u r>dnd | ¡7 }|| jd u rLdnd | ¡7 }|| jd u rZdnd | ¡7 }|| jd u rhdnd	 | ¡7 }|| j	d u rvdnd
 | ¡7 }d|dd …  d }|S )NÚ z/, local_private_key_file={0.private_key_file!r}z/, local_certificate_file={0.certificate_file!r}z, validate={0.validate!r}z, version={0.version!r}z#, ca_certs_file={0.ca_certs_file!r}z#, ca_certs_path={0.ca_certs_path!r}z#, ca_certs_data={0.ca_certs_data!r}z, ciphers={0.ciphers!r}z, sni={0.sni!r}zTls(r   ú))
r#   Úformatr$   r   r"   r   r   r    r&   r'   )r(   Úrr,   r,   r-   Ú__repr__ž   s   zTls.__repr__Fc                 C   s"  t r•| jdu rttj| j| j| jd�}n&t 	| j¡}| js#| js#| jr.| 
| j| j| j¡ n| jtjkr:| tj¡ | jrH|j| j| j| jd� d|_| j|_| jD ]	}| j|O  _qR| jrrz| | j¡ W n
 tjyq   Y nw | jr�|j|jd|| jd�}n	|j|jd|d�}ttƒr”ttd|ƒ n]| jdu r£ttdƒr£tj | _| jrÒztj|j| j| jd| j| j| j|| jd	�	}W n tjyÆ   ‚  t!yÑ   d| _Y nw | jsètj|j| j| jd| j| j| j|d
�}ttƒròttd|ƒ |�r| jtj"k�s| jtj#k�rt||j$j%| j&ƒ ||_dS )z3
        Adds TLS to the connection socket
        N)ÚpurposeÚcafileÚcapathÚcadata)ÚkeyfileÚpasswordF)Úserver_sideÚdo_handshake_on_connectÚserver_hostname)r>   r?   z1socket wrapped with SSL using SSLContext for <%s>ÚPROTOCOL_SSLv23)r<   Úcertfiler>   Ú	cert_reqsÚssl_versionÚca_certsr?   r&   )r<   rB   r>   rC   rD   rE   r?   z socket wrapped with SSL for <%s>)'r   r"   r   r   ÚSERVER_AUTHr   r   r    r   Ú
SSLContextÚload_verify_locationsr   r   Úload_default_certsr$   Úload_cert_chainr#   r!   Úcheck_hostnameÚverify_moder   Úoptionsr&   Úset_ciphersÚSSLErrorr'   Úwrap_socketÚsocketr   r   r
   ÚhasattrrA   Ú	TypeErrorr   r   ÚserverÚhostr%   )r(   Ú
connectionÚdo_handshakeÚssl_contextÚoptionÚwrapped_socketr,   r,   r-   rP   «   s‚   
ý
ÿ€
ø	
ÿù"zTls.wrap_socketc                 C   s  |j jrdS |jr|jr|jjs|jrttƒrt	td| ƒ dS d|_
ttƒr,t	td|ƒ |jjs3d|_| d¡}|jjs]| |¡}|dkrQttƒrOt	td|ƒ dS ttƒr[t	td|ƒ dS |jd	 d
vrdt|jd	 ƒ |_ttƒrzt	td|j|ƒ t|jƒ‚ttƒr‰t	td|ƒ |  |¡S )NFz;can't start tls because operations are in progress for <%s>Tzstarting tls for <%s>z1.3.6.1.4.1.1466.20037)NNztls started for <%s>ztls not started for <%s>Údescription)ÚsuccesszstartTLS failed - z%s for <%s>)rT   r   Útls_startedÚ_executing_deferredÚstrategyÚ_outstandingÚsasl_in_progressr   r   r
   Ústarting_tlsr   ÚsyncÚ_awaiting_for_async_start_tlsÚextendedÚget_responseÚresultr/   Ú
last_errorr   Ú
_start_tls)r(   rV   rg   Úresponser,   r,   r-   Ú	start_tlsõ   s:   



zTls.start_tlsc              
   C   s”   z5z	| j |dd� W n& ty0 } zdt|ƒ |_ttƒr%ttd|j|ƒ t|ƒ|jƒ‚d }~ww W d|_nd|_w |j	rE|j
 jd7  _d|_dS )NT)rW   zwrap socket error: z*error <%s> wrapping socket for TLS in <%s>Fr   )rP   Ú	Exceptionr/   rh   r   r   r
   r   rb   ÚusageÚ_usageÚwrapped_socketsr]   )r(   rV   Úer,   r,   r-   ri     s   €üÿzTls._start_tls)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r.   r2   r7   rP   rk   ri   r,   r,   r,   r-   r   ;   s(    
ôH
J%r   c                 C   sú   |   ¡ }ttƒrttd| |ƒ |r|gt|tƒr|n|g }n|g}|D ]E}|s)q$|dkr9ttƒr6ttdƒ  d S zt||ƒ ttƒrIttd|ƒ W  d S  tyi } zttƒr_ttt|ƒƒ W Y d }~q$d }~ww tt	ƒrstt	dƒ t
d|t|ƒf ƒ‚)Nzcertificate found for %s: %sÚ*zcertificate matches * wildcardz"certificate matches host name <%s>z"hostname doesn't match certificatez,certificate %s doesn't match any name in %s )Úgetpeercertr   r   r
   Ú
isinstancer	   r   r   r/   r   r   )ÚsockÚserver_nameÚadditional_namesÚserver_certificateÚ
host_namesÚ	host_namerp   r,   r,   r-   rK   +  s4   

€þ
rK   )rt   Ú
exceptionsr   r   r   r   r   r3   r	   Ú	utils.logr
   r   r   r   r   r   ÚImportErrorr   r   Úutils.tls_backportr   r   r   Úosr   Úobjectr   rK   r,   r,   r,   r-   Ú<module>   sB    
ý
€ü
€ý q