o
    ßý°j™3  ã                   @   st   d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	m
Z
mZmZ dd	lmZmZmZmZ G d
d„ deƒZdS )Ú
é    )ÚsleepNé   )Úget_config_parameteré   )ÚSyncStrategy)ÚLDAPSocketOpenErrorÚLDAPOperationResultÚLDAPMaximumRetriesErrorÚLDAPStartTLSError)ÚlogÚlog_enabledÚERRORÚBASICc                   @   sb   e Zd Zdd„ Zddd„Zd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	S )ÚRestartableStrategyc                 C   sf   t  | |¡ d| _d| _d| _d| _tdƒ| _tdƒ| _d| _	d | _
d | _d | _d | _d | _g | _d S )NTFÚRESTARTABLE_SLEEPTIMEÚRESTARTABLE_TRIES)r   Ú__init__ÚsyncÚno_real_dsaÚpooledÚ
can_streamr   Úrestartable_sleep_timeÚrestartable_triesÚ_restartingÚ_last_bind_controlsÚ_current_message_typeÚ_current_requestÚ_current_controlsÚ_restart_tlsÚexception_history)ÚselfÚldap_connection© r#   ú�/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/ldap3/strategy/restartable.pyr   %   s   


zRestartableStrategy.__init__FTc                 C   s   t  | ||¡ d S ©N)r   Úopen)r!   Úreset_usageÚread_server_infor#   r#   r$   r&   5   s   zRestartableStrategy.openc              
   C   s˜  zt  | |||¡ |  ¡  W dS  ty8 } zttƒr.ttd|| jƒ |  t	|ƒt
|ƒƒ¡ W Y d}~nd}~ww | j�sJd| _| j}|dk�r*ttƒrWttd| j| | jƒ t| jƒ | jjsœz| j ¡  W n4 tjtfys   Y n) ty› } zttƒr†ttd|| jƒ |  t	|ƒt
|ƒƒ¡ W Y d}~nd}~ww zF| jjrÀ| jj | j¡}| jj|krÀ|| j_| jjrÀ| jj jd7  _t  | |||¡ | jjrÕ| jj jd7  _d| j_d| _|  ¡  W dS  t�y } z+ttƒr÷ttd|| jƒ |  t	|ƒt
|ƒƒ¡ | jj�r| jj jd7  _W Y d}~nd}~ww t| jtƒ�s&|d8 }|dksHd| _d| j_ttƒ�r@ttd	| jj| jƒ t | jj| j!| jƒ‚dS )
zà
        Try to open and connect a socket to a Server
        raise LDAPExceptionError if unable to open or connect socket
        if connection is restartable tries for the number of restarting requested or forever
        Nú<%s> while restarting <%s>Tr   z+try #%d to open Restartable connection <%s>r   Fz;restartable connection strategy failed while opening socketú<%s> for <%s>)"r   Ú_open_socketÚ_reset_exception_historyÚ	Exceptionr   r   r   Ú
connectionÚ_add_exception_to_historyÚtypeÚstrr   r   r   r   r   ÚclosedÚunbindÚsocketÚerrorr   Úserver_poolÚ
get_serverÚserverÚusageÚ_usageÚservers_from_poolÚrestartable_successesÚrestartable_failuresÚ
isinstanceÚboolÚ
last_errorr
   r    )r!   ÚaddressÚuse_sslÚunix_socketÚeÚcounterÚ
new_serverr#   r#   r$   r+   8   sv   €ý

"€ý
€ûÞ#
Öz RestartableStrategy._open_socketNc           
   
   C   s¢  || _ || _|| _| js| jj| _|dkr|| _zt | |||¡}|  	¡  |W S  t
yP } zttƒr;ttd|| jƒ |  t|ƒt|ƒƒ¡ W Y d }~nd }~ww | j�s´d| _| j}|dk�r±ttƒrottd| j| | jƒ t| jƒ | jjs´z| j ¡  W n4 tjtfy‹   Y n) t
y³ } zttƒržttd|| jƒ |  t|ƒt|ƒƒ¡ W Y d }~nd }~ww d}z\| jjddd� | jrë| jjdd�sëd	| jjrÔd
| jj nd }ttƒrâttd|| ƒ | j ¡  t|ƒ‚|dkrø| jjd| jd� | jj j!�s
| jj j"�s
| j #¡  n| jj$dd� W n- t
�y? } z ttƒ�r(ttd|| jƒ |  t|ƒt|ƒƒ¡ d}W Y d }~nd }~ww |�s‘z | j |||¡}	| jj%�rZ| jj& j'd7  _'d| _|  	¡  |	W S  t
�y� } z ttƒ�ryttd|| jƒ |  t|ƒt|ƒƒ¡ d}W Y d }~nd }~ww |�r¢| jj%�r¢| jj& j(d7  _(t)| jt*ƒ�s­|d8 }|dks`d| _d| j_ttƒ�rÇttd| jj| jƒ t+| jj| j,| jƒ‚)NÚbindRequestr)   Tr   z.try #%d to send in Restartable connection <%s>F)r'   r(   )r(   z)restart tls in restartable not successfulz - Ú z%s for <%s>)r(   Úcontrols)Ú	read_infor   z%restartable connection failed to sendr*   )-r   r   r   r   r.   Útls_startedr   r   Úsendr,   r-   r   r   r   r/   r0   r1   r   r   r   r   r   r2   r3   r4   r5   r   r&   Ú	start_tlsr@   r   Úbindr8   ÚschemaÚinfoÚrefresh_server_infoÚ_fire_deferredr9   r:   r<   r=   r>   r?   r
   r    )
r!   Úmessage_typeÚrequestrI   Ú
message_idrD   rE   Úfailurer5   Ú	ret_valuer#   r#   r$   rL   s   s¦   
"€ý

"€ý
€
€ü

€üË7
zRestartableStrategy.sendc              
   C   s  zt  | |¡}|  ¡  |W S  ty6 } zttƒr!ttd|| jƒ |  t	|ƒt
|ƒƒ¡ W Y d }~nd }~ww zt  | |  | j| j| j¡¡}|  ¡  |W S  ty‡ } z/ttƒr`ttd|| jƒ |  t	|ƒt
|ƒƒ¡ t|tƒstd| j_ttƒr‚ttd| jj| jƒ ‚ d }~ww )Nr)   zCrestartable connection strategy failed in post_send_single_responser*   )r   Úpost_send_single_responser,   r-   r   r   r   r.   r/   r0   r1   rL   r   r   r   r>   r	   r@   ©r!   rU   rW   rD   r#   r#   r$   rX   Å   s2   "€ý
€øz-RestartableStrategy.post_send_single_responsec              
   C   s  zt  | |¡}|  ¡  |W S  ty6 } zttƒr!ttd|| jƒ |  t	|ƒt
|ƒƒ¡ W Y d }~nd }~ww zt  | | j | j| j| j¡¡}|  ¡  |W S  tyŠ } z1ttƒrattd|| jƒ |  t	|ƒt
|ƒƒ¡ t|tƒsv|j| j_ttƒr„ttd| jj| jƒ |‚d }~ww )Nr)   r*   )r   Úpost_send_searchr,   r-   r   r   r   r.   r/   r0   r1   rL   r   r   r   r>   r	   Úargsr@   rY   r#   r#   r$   rZ   Þ   s2   "€ý

€øz$RestartableStrategy.post_send_searchc                 C   s.   t | jtƒst |tƒs| j |¡ d S d S d S r%   )r>   r   r?   r
   r    Úappend)r!   Úexcr#   r#   r$   r/   ÷   s
   
þz-RestartableStrategy._add_exception_to_historyc                 C   s   | j rg | _ d S d S r%   )r    ©r!   r#   r#   r$   r,   ü   s   
ÿz,RestartableStrategy._reset_exception_historyc                 C   ó   t ‚r%   ©ÚNotImplementedErrorr^   r#   r#   r$   Ú
get_stream   ó   zRestartableStrategy.get_streamc                 C   r_   r%   r`   )r!   Úvaluer#   r#   r$   Ú
set_stream  rc   zRestartableStrategy.set_stream)FT)FFr%   )Ú__name__Ú
__module__Ú__qualname__r   r&   r+   rL   rX   rZ   r/   r,   rb   re   r#   r#   r#   r$   r   $   s    


;Rr   )Ú__doc__Útimer   r4   rH   r   r   r   Úcore.exceptionsr   r	   r
   r   Ú	utils.logr   r   r   r   r   r#   r#   r#   r$   Ú<module>   s    