
    >OOfsc                        d 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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 ddlmZmZmZmZ ddl m!Z! dZ"dZ#dZ$dZ%dZ&	 ddl'm(Z(m)Z)  G d de      Z+y# e*$ r ddl(m(Z(m)Z) Y w xY w)
    )datetime)linesep)ThreadLock)sleep   )RESTARTABLEget_config_parameterAUTO_BIND_DEFAULTAUTO_BIND_NONEAUTO_BIND_NO_TLSAUTO_BIND_TLS_AFTER_BINDAUTO_BIND_TLS_BEFORE_BIND   )BaseStrategy)ConnectionUsage)&LDAPConnectionPoolNameIsMandatoryError!LDAPConnectionPoolNotStartedErrorLDAPOperationResultLDAPExceptionErrorLDAPResponseTimeoutError)loglog_enabledERRORBASIC)LDAP_MAX_INTTERMINATE_REUSABLE_CONNECTION)QueueEmptyc                       e Zd ZdZ e       Zd Zd Zd Zd Z	d Z
 G d de      Z G d	 d
e      Z G d de      Zd ZddZd Zd ZddZd ZddZd Zd Zy)ReusableStrategya  
    A pool of reusable SyncWaitRestartable connections with lazy behaviour and limited lifetime.
    The connection using this strategy presents itself as a normal connection, but internally the strategy has a pool of
    connections that can be used as needed. Each connection lives in its own thread and has a busy/available status.
    The strategy performs the requested operation on the first available connection.
    The pool of connections is instantiated at strategy initialization.
    Strategy has two customizable properties, the total number of connections in the pool and the lifetime of each connection.
    When lifetime is expired the connection is closed and will be open again when needed.
    c                     t         NNotImplementedErrorselfs    X/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/ldap3/strategy/reusable.py	receivingzReusableStrategy.receivingA       !!    c                     t         r(   r)   r+   s    r-   _start_listenzReusableStrategy._start_listenD   r/   r0   c                     t         r(   r)   )r,   
message_idtimeouts      r-   _get_responsezReusableStrategy._get_responseG   r/   r0   c                     t         r(   r)   r+   s    r-   
get_streamzReusableStrategy.get_streamJ   r/   r0   c                     t         r(   r)   )r,   values     r-   
set_streamzReusableStrategy.set_streamM   r/   r0   c                   F    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)ReusableStrategy.ConnectionPoolz6
        Container for the Connection Threads
        c                    |j                   t        j                  v rt        j                  |j                      }|j                  s0t        j                  |j                   = t        j                  |       S |j                  r*|j                  |j                  k7  r|j                  |_        |j                  r*|j                  |j                  k7  r|j                  |_	        |j                  r:|j                  |j                  k7  r!|j                          |j                  |_
        |S t        j                  |       S r(   )	pool_namer&   poolsstartedobject__new__pool_keepalive	keepalivepool_lifetimelifetime	pool_sizeterminate_pool)cls
connectionpools      r-   rC   z'ReusableStrategy.ConnectionPool.__new__U   s    ##'7'='=='--j.B.BC||(..z/C/CD!>>#..,,:C\C\1\%/%>%>DN++AYAY0Y$.$<$<DM''DNNj>R>R,R'')%/%9%9DN~~c**r0   c                 \   t        | d      s|j                  | _        || _        g | _        |j
                  xs t        d      | _        |j                  xs t        d      | _        |j                  | _
        t               | _        d| _        d| _        d| _        t!               | _        d| _        |j&                  r
t)               nd | _        d| _        t/               | _        | t2        j4                  | j                  <   d| _        t9        t:              rt=        t:        d|        y y y )NworkersREUSABLE_THREADED_POOL_SIZEREUSABLE_THREADED_LIFETIMEFr   z!instantiated ConnectionPool: <%r>)hasattrr?   namemaster_connectionrN   rH   r   rF   rG   rD   rE   r#   request_queue	open_pool	bind_pooltls_pooldict	_incomingcounter_usager   terminated_usage
terminatedr   	pool_lockr&   r@   rA   r   r   r   )r,   rK   s     r-   __init__z(ReusableStrategy.ConnectionPool.__init__f   s    4+&00	)3&!!+!5!5!l9MNk9l * 8 8 n<PQm<n!+!:!:%*W"!&!& %!% =G=N=N(9TX%"'!%48 &&tyy1$u%BDI &% ,r0   c                    dt        | j                        z   dz   | j                  rdndz   }|dt        t        | j                              z   z  }|dt        | j
                        z   z  }|dt        | j                        z   z  }|dt        | j                        z   z  }|d	t        | j                        z   z  }|d
t        | j                        z   z  }|dt        | j                        z   t        z   z  }|dt        | j                        z   t        z   z  }|dz  }| j                  rRt        | j                        D ]8  \  }}|t        t        |      j                  d      z   dz   t        |      z   z  }: |S |t        dz   z  }|S )NzPOOL: z - status: rA   r]   z - responses in queue: z - pool size: z - lifetime: z - keepalive: z	 - open: z	 - bind: z - tls: zMASTER CONN: zWORKERS:   z: z    no active workers in pool)strrR   rA   lenrY   rH   rG   rE   rU   rV   rW   r   rS   rN   	enumeraterjust)r,   siworkers       r-   __str__z'ReusableStrategy.ConnectionPool.__str__|   sp   3tyy>)M9$,,Y\hiA*ST^^1D-EEEA!C$777A3t}}#555A!C$777As4>>222As4>>222Ac$--007::A3t'='=#>>HHAOA||!*4<<!8 HIAv3q6<<?2T9CKGGAH
 H W>>>Hr0   c                 "    | j                         S r(   )ri   r+   s    r-   __repr__z(ReusableStrategy.ConnectionPool.__repr__   s    <<>!r0   c                    | j                   D ]f  }|j                  5  |j                  j                  j                  r |j                  j                  j
                  sd|_        nd|_        d d d        h y # 1 sw Y   sxY wNTF)rN   worker_lockrK   serverschemainfoget_info_from_serverr,   rh   s     r-   rr   z4ReusableStrategy.ConnectionPool.get_info_from_server   sq    ,, <'' <!,,33::&BSBSBZBZB_B_6:36;3	< <<< <s   AA77B 	c           	      n   | j                   D ]  }|j                  5  |j                  j                  | j                  j
                  | j                  j                  | j                  j                  | j                  j                  | j                  j                         d d d         y # 1 sw Y   xY wr(   )
rN   rn   rK   rebindrS   userpasswordauthenticationsasl_mechanismsasl_credentialsrs   s     r-   rebind_poolz+ReusableStrategy.ConnectionPool.rebind_pool   s    ,, V'' V%%,,T-C-C-H-H-1-C-C-L-L-1-C-C-R-R-1-C-C-R-R-1-C-C-T-T	VV VVV Vs   BB++B4	c                 2   | j                   s| j                          | j                  D ]1  }|j                  5  |j                  j                          d d d        3 d| _         d| _        t        t              rt        t        d|        yy# 1 sw Y   mxY w)NTFzworker started for pool <%s>)
rA   create_poolrN   rn   threadstartr]   r   r   r   rs   s     r-   
start_poolz*ReusableStrategy.ConnectionPool.start_pool   s    <<  ""ll .F++ .++-. ..  $"'u%=tD. .s   BB	c                     t        t              rt        t        d|        t        | j                        D cg c],  }t
        j                  | j                  | j                        . c}| _	        y c c}w )Nzcreated pool <%s>)
r   r   r   rangerH   r&   PooledConnectionWorkerrS   rT   rN   )r,   _s     r-   r}   z+ReusableStrategy.ConnectionPool.create_pool   sm    5!E.5y~  @D  @N  @N  zO  Ptu,CCDDZDZ\`\n\no  PDL  Ps   1A2c           	         | j                   st        t              rt        t        d|        d| _        | j
                  j                          t        t        | j                  D cg c]  }|j                  j                         s|! c}            D ]%  }| j
                  j                  t        d d d f       ' | j
                  j                          d| _         t        t              rt        t        d|        y y y c c}w )Nzterminating pool <%s>FTzpool terminated for <%s>)r]   r   r   r   rA   rT   joinr   rc   rN   r~   is_aliveputTERMINATE_REUSABLE)r,   rh   r   s      r-   rI   z.ReusableStrategy.ConnectionPool.terminate_pool   s    ??u%6=$""'')s#bvI_I_IaF#bcd SA&&**,>dD+QRS""'')"&u%94@ & #
 $cs   &DDN)__name__
__module____qualname____doc__rC   r_   ri   rk   rr   r{   r   r}   rI    r0   r-   ConnectionPoolr=   Q   s8    		+"	J,	&	"	<	V		P
	Ar0   r   c                       e Zd ZdZd Zd Zy)'ReusableStrategy.PooledConnectionThreadz
        The thread that holds the Reusable connection and receive operation request via the queue
        Result are sent back in the pool._incoming list when ready
        c                     t        j                  |        d| _        || _        || _        t        t              rt        t        d|        y y )NTz)instantiated PooledConnectionThread: <%r>)r   r_   daemonrh   rS   r   r   r   )r,   rh   rS   s      r-   r_   z0ReusableStrategy.PooledConnectionThread.__init__   s>    OOD!DK DK%6D"5!EFM "r0   c           	         d| j                   _        d}| j                  j                  j                  }|s	 |j
                  j                  d| j                  j                  j                  j                        \  }}}}| j                   j                  5  d| j                   _        |t        k(  rid}| j                   j                  j                  r	 | j                   j                  j!                          t#        t$              rt'        t$        d       nt+        j,                         | j                   j.                  z
  j0                  | j                  j                  j                  j2                  k\  r^	 | j                   j                  j!                          | j                   j5                          t#        t$              rt'        t$        d       |dvr	 |j6                  r| j                   j                  j                  r| j                   j                  j9                  d       |j:                  rF| j                   j                  j<                  s&| j                   j                  j?                  d       |j@                  r| j                   j                  j                  s| j                   j                  jC                  d       n~|j6                  rr| j                   j                  j                  sR|j:                  rF| j                   j                  j<                  s&| j                   j                  j?                  d       | j                   jD                  r7|r5| j                   j                  jG                          d| j                   _"        d }d }|d	k(  rK| j                   j                  jI                  | j                   j                  jK                  |||            }nJ| j                   j                  jM                  | j                   j                  jK                  |||            }| j                   j                  jN                  }|jP                  5  ||tS        jT                  |||      f|jV                  |<   d d d        d| j                   _        |j
                  j[                          | j                   xj\                  d
z  c_.        d d d        |st#        t$              rt'        t$        d       | j                  j^                  r3|xj`                  | j                   j                  j^                  z  c_0        d| j                   _        y # t        $ rI | j                   j                  j                  s%| j                   j                  j                  d       Y w xY w# t(        $ r Y 1w xY w# t(        $ r Y <w xY w# 1 sw Y   OxY w# tX        $ r?}	|jP                  5  |	d d f|jV                  |<   d d d        n# 1 sw Y   nxY wY d }	~	d }	~	ww xY w# 1 sw Y   UxY w)NTF)blockr5   r   zthread terminatedzthread respawn)bindRequestunbindRequestread_server_infosearchRequestr   )1rh   runningrS   strategyrL   rT   getrE   r$   rK   closedabandonrn   busyr   boundunbindr   r   r   r   r   nowcreation_timesecondsrG   new_connectionrU   openrW   tls_started	start_tlsrV   bindrr   refresh_server_infopost_send_searchsendpost_send_single_responseresultr^   r   decode_requestrY   r   	task_donetask_counterusager\   )
r,   	terminaterL   rZ   message_typerequestcontrolsresponser   es
             r-   runz+ReusableStrategy.PooledConnectionThread.run   s   "&DKKI))2277D?C?Q?Q?U?U\`jn  kA  kA  kJ  kJ  kO  kO  kY  kY?U  @Z<G\7H [[,, 92'+DKK$"44$(	;;1177% $ 6 6 = = ?#.u#5$'/B$C %LLNT[[-F-FFOOSWSiSiSrSrSwSw  TA  TA  A% $ 6 6 = = ? !KK668*51 #E+; <'/OON#'>>dkk6L6L6S6S$(KK$:$:$?$?QV$?$W'+}}T[[=S=S=_=_(,(>(>(H(HZ_(H(`'+~~dkk>T>T>Z>Z(,(>(>(C(CUZ(C([%)^^DKK<R<R<Y<Y'+}}T[[=S=S=_=_(,(>(>(H(HZ_(H(`#';;#C#C$(KK$:$:$N$N$PGLDKK$D+/)-#/?#B/3{{/E/E/V/VW[WbWbWmWmWrWrs  BI  KS  XT  0UH/3{{/E/E/_/_`d`k`k`v`v`{`{  }I  KR  T\  a]  0^H)-)?)?)F)F%)^^ !O?GQ]QlQlmy  |C  EM  RN  ?ODNN7$;!O (-DKK$&&002KK,,1,s92  D 5!E./%%++%%)?)?)E)EE%"'DKKG  ;;1188..66q9 $6 % $% $6 % $%4!O !O#6 N%)^^ !N?@$oDNN7$;!N !N !NNW92 92s   A
U, >X9AWA"X9=$W!>X9 JW.,(W!W.A
X9,AV>=V>	W
X9WX9	WX9WX9!W+	&W..	X67X1X	X1X($X1+X91X66X99YN)r   r   r   r   r_   r   r   r0   r-   PooledConnectionThreadr      s    		NJ	(r0   r   c                   "    e Zd ZdZd Zd Zd Zy)'ReusableStrategy.PooledConnectionWorkerz
        Container for the restartable connection. it includes a thread and a lock to execute the connection in the pool
        c                 >   || _         || _        d| _        d| _        d| _        d | _        d | _        d| _        | j                          t        j                  | | j                         | _        t               | _        t        t              rt!        t        d|        y y )NFr   z)instantiated PooledConnectionWorker: <%s>)rS   rT   r   r   rr   rK   r   r   r   r&   r   r~   r   rn   r   r   r   )r,   rK   rT   s      r-   r_   z0ReusableStrategy.PooledConnectionWorker.__init__   s    %/D"!.D DLDI(-D%"DO!%D !D!*AA$H^H^_DK#vD5!EFM "r0   c                    dt        | j                        z   t        z   dz   }|| j                  rdndz  }|d| j                  rdndz   z  }|dd| j
                  j                         z   z   z  }|d	t        | j                  j                  j                  j                  t        j                         | j
                  z
  j                  z
        z   z  }|d
t        | j                        z   z  }|S )NzCONN: z       THREAD: r   haltedz - r   	availablezcreated at: z - time to live: z - requests served: )rb   rK   r   r   r   r   	isoformatrS   r   rL   rG   r   r   r   r   )r,   rf   s     r-   ri   z/ReusableStrategy.PooledConnectionWorker.__str__/  s    3t//'9<MMAdll8ADII&;??A.4+=+=+G+G+IIJJA$s4+A+A+J+J+O+O+X+X\d\h\h\jmqmm\  \I  \I  ,I  (J  J  JA'#d.?.?*@@@AHr0   c                 R   ddl m} t        j                         | _         |di d| j
                  j                  r| j
                  j                  n| j
                  j                  d| j
                  j                  d| j
                  j                  dt        d| j
                  j                  d| j
                  j                  d	t        d
| j
                  j                  d| j
                  j                  d| j
                  j                   d| j
                  j"                  d| j
                  j$                  d| j
                  j&                  d| j
                  j(                  d| j
                  j*                  ddd| j
                  j,                  d| j
                  j.                  d| j
                  j0                  | _        | j
                  j4                  rN| j
                  j4                  t        t6        fvr+t9        t:              rt=        t:        d| j2                         | j2                  j?                  d       | j
                  j4                  t@        k(  r| j2                  jC                  d       n| j
                  j4                  tD        k(  r9| j2                  jG                  d       | j2                  jC                  d       nU| j
                  j4                  tH        k(  r8| j2                  jC                  d       | j2                  jG                  d       | j
                  j                  rU| j
                  j                  | j2                  _        | j2                  j                  jK                  | j2                         y y )Nr	   )
Connectionro   rv   rw   	auto_bindversionrx   client_strategyauto_referrals
auto_rangery   rz   check_namescollect_usage	read_onlyraise_exceptionslazyFfast_decoderreceive_timeoutreturn_empty_attributesz"performing automatic bind for <%s>r   r   )&core.connectionr   r   r   r   rS   server_poolro   rv   rw   r   r   rx   r
   r   r   ry   rz   r   r[   r   r   r   r   empty_attributesrK   r   r   r   r   r   r   r   r   r   r   r   
initialize)r,   r   s     r-   r   z6ReusableStrategy.PooledConnectionWorker.new_connection9  s*   4!)D( jVZVlVlVxVx0F0F0R0R  C  U  U  \  \ j.2.D.D.I.Ij262H2H2Q2Qj 4Bj 261G1G1O1O	j
 9=8N8N8]8]j :Ej 9=8N8N8]8]j 594J4J4U4Uj 9=8N8N8]8]j ;?:P:P:a:aj 6:5K5K5W5Wj 8<7M7M7T7Tj 483I3I3S3Sj ;?:P:P:a:aj /4j  7;6L6L6Y6Y!j" :>9O9O9_9_#j$ BFAWAWAhAh%jDO* %%//D4J4J4T4T]km~\4u%CT__U$$e$<))337GGOO((%(@++559RROO--u-EOO((%(@++559QQOO((%(@OO--u-E%%11.2.D.D.P.P+++66tG 2r0   N)r   r   r   r   r_   ri   r   r   r0   r-   r   r     s    		N	(	Hr0   r   c                     t        j                  | |       d| _        d| _        d| _        d| _        t        |d      r'|j                  rt        j                  |      | _
        y t        t              rt        t        d       t        d      )NFTr?   z)reusable connection must have a pool_name)r   r_   syncno_real_dsapooled
can_streamrQ   r?   r&   r   rL   r   r   r   r   )r,   ldap_connections     r-   r_   zReusableStrategy.__init__d  sr    dO4	 ?K0_5N5N(77HDI5!EFG89deer0   c                 8   d| j                   _        | j                   j                          d| j                  _        | j                  j
                  rH|s | j                  j                  j                  s%| j                  j                  j                          y y y rm   )	rL   rU   r   rK   r   r   r[   initial_connection_start_timer   )r,   reset_usager   s      r-   r   zReusableStrategy.openq  sm    "				!&??  $//"8"8"V"V&&,,. #W !r0   c                     | j                   j                          d| j                   _        d| j                  _        d| j                  _        d| j                   _        d| j                   _        y )NFT)rL   rI   rU   rK   r   r   rV   rW   r+   s    r-   r   zReusableStrategy.terminatez  sN    		  "#		 %!%#		"		r0   c                     d| j                   _        | j                   j                  r*| j                   j                  xj                  dz  c_        yy)z1
        Doesn't really close the socket
        Tr   N)rK   r   r   r[   closed_socketsr+   s    r-   _close_socketzReusableStrategy._close_socket  s=     "&??  OO""11Q61 !r0   Nc                    | j                   j                  r*|dk(  rd| j                   _        t        }|S |dk(  rd| j                   _        t        }|S |dk(  rt
        }|S |dk(  r/| j                  j                  rd| j                   _        t        }|S | j                   j                  5  | j                   xj                  dz  c_        | j                   j                  t        kD  rd| j                   _        | j                   j                  }d d d        | j                   j                  j                  |||f       |S t        t               rt#        t         d       t%        d      # 1 sw Y   ^xY w)	Nr   Tr   FabandonRequestextendedReqr   z$reusable connection pool not started)rL   rA   rV   
BOGUS_BINDBOGUS_UNBINDBOGUS_ABANDONrK   starting_tlsrW   BOGUS_EXTENDEDr^   rZ   r   rT   r   r   r   r   r   )r,   r   r   r   rZ   s        r-   r   zReusableStrategy.send  sC   99},&*		#$  N 0&+		#& N !11' N .4??3O3O%)		"( N YY(( 0II%%*%yy((<7,-		)"ii//G	0
 		''++WlGX,VWNu=>/0VWW0 0s   +A$E,,E5c                 H   | j                   j                  | j                  j                  j                  k7  s| j                   j                  | j                  j                  j                  k7  s| j                   j
                  | j                  j                  j
                  k7  so| j                   j                  | j                  j                  j                  k7  s8| j                   j                  | j                  j                  j                  k7  r| j                   j                  | j                  j                  _        | j                   j                  | j                  j                  _        | j                   j
                  | j                  j                  _        | j                   j                  | j                  j                  _        | j                   j                  | j                  j                  _        | j                  j                          | j                  j                  d   j                   }|j                  }d|_
        | j                   j                  j                  r | j                   j                  j                  s4| j                  j                  d   j                   j                  |      }n4| j                  j                  d   j                   j                  |d      }|j                          ||_
        |rd| j                  _        |S )Nr   F)r   )r   r   T)rK   rv   rL   rS   rw   rx   ry   rz   r{   rN   r   ro   rp   rq   r   r   rV   )r,   r   temp_connectionold_lazyr   s        r-   validate_bindzReusableStrategy.validate_bind  s   OO  DII$?$?$D$DD((DII,G,G,P,PP..$))2M2M2\2\\..$))2M2M2\2\\00DII4O4O4`4``/3/C/CDII'',37??3K3KDII''09=9W9WDII''69=9W9WDII''6;???;[;[DII''8II!!#))++A.99"''$%%,,DOO4J4J4O4OYY&&q)449989LFYY&&q)44998^c9dF '"&DIIr0   c           	         t        d      }d }|t        d      }|t        k(  rt               }dd ddddd d}n|t        k(  rd }d }n|t        k(  rt               }dd d	d
ddddd}n|t
        k(  r't               }dd d	d
ddddd}d| j                  _        nd }d }|dk\  rr	 | j                  j                  j                  j                  5  | j                  j                  j                  j                  j                  |      \  }}}d d d        	 |dk  r*t        t               rt#        t         d       t%        d      t'        |t(              r||r|||fS ||fS # 1 sw Y   VxY w# t        $ r t        |       ||z  }Y w xY w)NRESPONSE_SLEEPTIMERESPONSE_WAITING_TIMEOUTsuccessbindResponser    z<bogus Bind response>)description	referralstyper   dnmessage	saslCredsz1.3.6.1.4.1.1466.20037extendedRespNonez<bogus StartTls response>)r   r   responseNamer   r   responseValuer   r   Fz6no response from worker threads in Reusable connection)r   r   listr   r   r   rK   r   r   rL   r^   rY   popKeyErrorr   r   r   r   r   
isinstancer   )r,   rZ   r5   get_request	sleeptimer   r   r   s           r-   get_responsezReusableStrategy.get_response  s   ()=>	?*+EFGj vH%.T>efnp  ~U  dh  iF$HF%vH !F^hv  HQ  dj  rt  A\  ]F&vH !F^hv  HQ  dj  rt  A\  ]F+0DOO(HFQ,1166@@ i48OO4L4L4Q4Q4[4[4_4_`g4h1&'i !|u%WX./ghhh 34NVW,,'i i )$y(Gs*   !*E* >E	E* E'#E* *FFc                     |S r(   r   r,   rZ   s     r-   r   z*ReusableStrategy.post_send_single_response      r0   c                     |S r(   r   r  s     r-   r   z!ReusableStrategy.post_send_search  r  r0   )TTr(   )NF)r   r   r   r   rX   r@   r.   r2   r6   r8   r;   rB   r   r   r   r   r_   r   r   r   r   r   r  r   r   r   r0   r-   r&   r&   5   s     FE"""""oA oAbX( X(tEH EHPf/#7X26* Xr0   r&   N),r   r   osr   	threadingr   r   timer   r   r
   r   r   r   r   r   r   baser   
core.usager   core.exceptionsr   r   r   r   r   	utils.logr   r   r   r   protocol.rfc4511r   r   r   r   r   r   queuer#   r$   ImportErrorr&   r   r0   r-   <module>r     s   2   "  [  [  [  ( k  k 6 6 +4 
#"z| z  #""#s   &A: :B
	B
