
    f4                    f   d Z ddlmZ ddlZddlZddl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 ddlmZ ddlmZ dd	lmZmZ dd
l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)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0 dgZ1ddZ2ddZ3 G d d      Z4 G d d      Z5ddZ6 G d d      Z7y)z
Telnet server.
    )annotationsN)get_running_loop)AnyCallable	CoroutineTextIOcast)create_app_sessionget_app)run_in_terminal)Size)AnyFormattedTextto_formatted_text)	PipeInputcreate_pipe_input)Vt100_Output)print_formatted_text)	BaseStyle
DummyStyle   )logger)DOECHOIACLINEMODEMODENAWSSBSESENDSUPPRESS_GO_AHEADTTYPEWILLTelnetProtocolParserTelnetServerc                    t        | f      S N)bytes)numbers    _/var/www/cvtools/html/venv/lib/python3.12/site-packages/prompt_toolkit/contrib/telnet/server.pyint2byter+   ,   s    &    c                   t        j                  d       | j                  t        t        z   t
        z          | j                  t        t        z   t        z          | j                  t        t        z   t
        z   t        z   t        d      z   t        z   t        z          | j                  t        t        z   t        z          | j                  t        t        z   t        z          | j                  t        t        z   t        z          | j                  t        t        z   t        z   t        z   t        z   t        z          y )NzInitializing telnet connectionr   )r   infosendr   r   r   r#   r!   r   r   r+   r   r   r   r"   r    
connections    r*   _initialize_telnetr2   0   s    
KK01 OOC"Hx'( OOC$J!223 OOC"Hx'$.!<sBRGH OOC$J%& OOC"HtO$ OOC"Hu$%
 OOC"Hu$t+c1B67r,   c                  \    e Zd ZdZd
dZddZddZddZddZe	dd       Z
e	dd       Zy	)_ConnectionStdoutzk
    Wrapper around socket which provides `write` and `flush` methods for the
    Vt100_Output output.
    c                J    || _         || _        d| _        g | _        d| _        y )NstrictF)	_encoding_connection_errors_buffer_closed)selfr1   encodings      r*   __init__z_ConnectionStdout.__init__S   s&    !%$&r,   c                    |j                  dd      }| j                  j                  |j                  | j                  | j
                               | j                          y )N
z
)errors)replacer:   appendencoder7   r9   flushr<   datas     r*   writez_ConnectionStdout.writeZ   sB    ||D&)DKKt||KLM

r,   c                     yNT r<   s    r*   isattyz_ConnectionStdout.isatty_   s    r,   c                    	 | j                   s4| j                  j                  dj                  | j                               g | _        y # t
        $ r)}t        j                  d|        Y d }~g | _        y d }~ww xY w)Nr,   z Couldn't send data over socket: )r;   r8   r/   joinr:   OSErrorr   warning)r<   es     r*   rE   z_ConnectionStdout.flushb   sk    	C<<  %%chht||&<=   	CNN=aSABB	Cs   A A
 
	A<A77A<c                    d| _         y rJ   )r;   rL   s    r*   closez_ConnectionStdout.closek   s	    r,   c                    | j                   S r'   )r7   rL   s    r*   r=   z_ConnectionStdout.encodingn   s    ~~r,   c                    | j                   S r'   )r9   rL   s    r*   rA   z_ConnectionStdout.errorsr   s    ||r,   N)r1   socket.socketr=   strreturnNone)rG   rX   rY   rZ   )rY   boolrY   rZ   )rY   rX   )__name__
__module____qualname____doc__r>   rH   rM   rE   rT   propertyr=   rA   rK   r,   r*   r4   r4   M   sH    

    r,   r4   c                  v    e Zd Z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y
)TelnetConnectionz6
    Class that represents one Telnet connection.
    c	                    | _         | _        | _        | _        | _        | _        d _        t        j                          _	        | _
         _        d  _        t        dd       _        t        |       d
 fdt!        t"        t%        ||             _        d fd}	d fd}
d fd	}t)        |	|
|       _        d  _        y )NF(   O   rowscolumnsc                      j                   S r'   )sizerL   s   r*   get_sizez+TelnetConnection.__init__.<locals>.get_size   s    99r,   )r=   c                <    j                   j                  |        y)z-TelnetProtocolParser 'data_received' callbackN)vt100_input
send_bytesrG   r<   s    r*   data_receivedz0TelnetConnection.__init__.<locals>.data_received   s    ''-r,   c                    t        | |      _        j                  *j                  rj                  j	                  d        yyy)z-TelnetProtocolParser 'size_received' callbackrg   Nc                 2    t               j                         S r'   )r   
_on_resizerK   r,   r*   <lambda>zBTelnetConnection.__init__.<locals>.size_received.<locals>.<lambda>   s    )=)=)? r,   )r   rk   vt100_outputcontextrun)rh   ri   r<   s     r*   size_receivedz0TelnetConnection.__init__.<locals>.size_received   s>    $8DI  ,  !?@ 2>,r,   c                v    t        j                  |       _        j                  j	                          y)z.TelnetProtocolParser 'ttype_received' callback)term
enable_cprN)r   stdoutrv   _readyset)ttyper|   rl   r<   s    r*   ttype_receivedz1TelnetConnection.__init__.<locals>.ttype_received   s-     ,XEj!D KKOOr,   )rY   r   rG   r(   rY   rZ   )rh   intri   r   rY   rZ   )r   rX   rY   rZ   )connaddrinteractserverr=   styler;   asyncioEventr~   rn   r|   rv   r   rk   r2   r	   r   r4   r}   r$   parserrw   )r<   r   r   r   r   r=   r   rn   r|   rq   ry   r   rl   s   `       `   @r*   r>   zTelnetConnection.__init__|   s     		  
mmo&$15 b"-	 	4 	 6#4TH#MN	.	A	 +=-X37r,   c                   K   d fd}t               }|j                   j                  |       	  j                  j	                          d{    t         j                   j                        5  t        j                          _
         j                          d{    ddd        j                          y7 q7 # 1 sw Y   xY w#  j                          w xY ww)z"
        Run application.
        c                     j                   j                  d      } | rj                  |        y t        j                   dj
                  j                          j                          y )Ni   z&Connection closed by client. {!r} {!r})r   recvfeedr   r.   formatr   rT   rp   s    r*   handle_incoming_dataz>TelnetConnection.run_application.<locals>.handle_incoming_data   sM    99>>$'D		$ KDKKTYYWX

r,   N)inputoutputr\   )r   
add_readerr   r~   waitr
   rn   rv   contextvarscopy_contextrw   r   rT   )r<   r   loops   `  r*   run_applicationz TelnetConnection.run_application   s     
	  !		#78	++""$$$#$*:*:4CTCTU **779mmD)))* JJL % ** * JJLsX   -C%C C %C 4.C"C#C'C /C% C CC	C C""C%c                :    | j                   j                  |       y)zF
        Handler for incoming data. (Called by TelnetServer.)
        N)r   r   rF   s     r*   r   zTelnetConnection.feed   s     	r,   c                   | j                   syd| _         | j                  j                          t               j	                  | j
                         | j
                  j                          | j                  j                          yy)z#
        Closed by client.
        TN)r;   rn   rT   r   remove_readerr   r}   rL   s    r*   rT   zTelnetConnection.close   s\     ||DL""$,,TYY7IIOOKK r,   c                    | j                   yt        |      }t        | j                   || j                  xs
 t	                      y)z*
        Send text to the client.
        N)rv   r   r   r   r   r<   formatted_texts     r*   r/   zTelnetConnection.send   s=     $*>:~tzz/IZ\	
r,   c                F     t               j                   fd      S )z\
        Send text to the client.
        This is asynchronous, returns a `Future`.
        c                 &    j                         S r'   )r/   )r   r<   s   r*   ru   z4TelnetConnection.send_above_prompt.<locals>.<lambda>   s    TYY~-F r,   )r   _run_in_terminalr   s   ``r*   send_above_promptz"TelnetConnection.send_above_prompt   s!    
 +>:$$%FGGr,   c                r    | j                   r!| j                   j                  t        |       y t        d      )Nz2Called _run_in_terminal outside `run_application`.)rw   rx   r   RuntimeError)r<   funcs     r*   r   z!TelnetConnection._run_in_terminal   s+     <<LL_d3STTr,   c                    | j                   y| j                   j                          | j                   j                  dd       | j                   j                          y)zB
        Erase the screen and move the cursor to the top.
        Nr   )rv   erase_screencursor_gotorE   rL   s    r*   r   zTelnetConnection.erase_screen   sM     $&&(%%a+!r,   N)T)r   rW   r   ztuple[str, int]r   7Callable[[TelnetConnection], Coroutine[Any, Any, None]]r   r%   r=   rX   r   BaseStyle | Nonern   r   r|   r[   rY   rZ   r\   r   )r   r   rY   rZ   )r   zCallable[[], None]rY   rZ   )r]   r^   r_   r`   r>   r   r   rT   r/   r   r   r   rK   r,   r*   rc   rc   w   s      5858 58 J	58
 58 58  58 58 58 
58n6
 	
HU"r,   rc   c                   K   y wr'   rK   r0   s    r*   _dummy_interactr     s	     s   c                  t    e Zd ZdZddedddf	 	 	 	 	 	 	 	 	 	 	 	 	 ddZedd       Zddd	Zdd
Z	ddZ
ddZy)r%   a  
    Telnet server implementation.

    Example::

        async def interact(connection):
            connection.send("Welcome")
            session = PromptSession()
            result = await session.prompt_async(message="Say something: ")
            connection.send(f"You said: {result}
")

        async def main():
            server = TelnetServer(interact=interact, port=2323)
            await server.run()
    z	127.0.0.1   zutf-8NTc                    || _         || _        || _        || _        || _        || _        d | _        g | _        t               | _	        y r'   )
hostportr   r=   r   r|   	_run_task_application_tasksr   connections)r<   r   r   r   r=   r   r|   s          r*   r>   zTelnetServer.__init__  sG     		  
$48<>25%r,   c                   t        j                   t         j                  t         j                        }|j                  t         j                  t         j
                  d       |j                  ||f       |j                  d       |S )Nr      )socketAF_INETSOCK_STREAM
setsockopt
SOL_SOCKETSO_REUSEADDRbindlisten)clsr   r   ss       r*   _create_socketzTelnetServer._create_socket2  sZ     MM&..&*<*<=	V&&(;(;Q?	d|	r,   c                   K    j                   j                   j                        t        j                  d j                   j                         t               j                   fd       |r |        	 t        j                          d{    t               j                          j                           j                  D ]  }|j                           t         j                        dkD  r9t        j                   j                  dt        j                         d{    yy7 7 # t               j                          j                           j                  D ]  }|j                           t         j                        dkD  r:t        j                   j                  dt        j                         d{  7   w w xY ww)z
        Run the telnet server, until this gets cancelled.

        :param ready_cb: Callback that will be called at the point that we're
            actually listening.
        z.Listening for telnet connections on %s port %rc                 &     j                        S r'   )_accept)r<   r   s   r*   ru   z"TelnetServer.run.<locals>.<lambda>H  s    dll66J r,   Nr   )timeoutreturn_when)r   r   r   r   r.   r   r   r   Futurer   rT   r   cancellenr   ALL_COMPLETED)r<   ready_cbtr   s   `  @r*   rx   zTelnetServer.run<  s     $$TYY		:<dii	
 	%%f.JKJ	..""",,V4FLLN ,, 
 4**+a/ll++  ' 5 5   0 # ,,V4FLLN ,, 
 4**+a/ll++  ' 5 5   0sP   A9G>D; D7D; BG0D91G7D; 9G;BGGGGc                v    | j                   yt               j                  | j                               | _         y)z}
        Deprecated: Use `.run()` instead.

        Start the telnet server (stop by calling and awaiting `stop()`).
        N)r   r   create_taskrx   rL   s    r*   startzTelnetServer.startc  s,     >>%)+77
Cr,   c                   K   | j                   0| j                   j                          	 | j                    d{    yy7 # t        j                  $ r Y yw xY ww)z
        Deprecated: Use `.run()` instead.

        Stop a telnet server that was started using `.start()` and wait for the
        cancellation to complete.
        N)r   r   r   CancelledErrorrL   s    r*   stopzTelnetServer.stopo  sU      >>%NN!!#nn$$ & %)) s7   'AA A A A A AAAAc                     |j                         \  t        j                  dg  d fd}t               j	                   |              j
                  j                         y)z1
        Accept new incoming connection.
        zNew connection %r %rc                   K   	 t               5 } t        j                  j                  j                  | j
                        }j                  j                  |       t        j                  dg  	 |j                          d {    j                  j                  |       t        j                  dg  	 d d d        j(                  j                         y 7 Z# j                  j                  |       t        j                  dg  w xY w# 1 sw Y   ]xY w# t        $ r t        j                  d       Y t        $ r t        j                  d       Y t        $ r@}t        dt!        |      j"                   |       dd l}|j'                          Y d }~d }~ww xY w# j(                  j                         w xY ww)N)r=   r   rn   r|   zStarting interaction %r %rzStopping interaction %r %rz)Unhandled EOFError in telnet application.z2Unhandled KeyboardInterrupt in telnet application.zGot r   )r   rc   r   r=   r   r|   r   addr   r.   r   removeEOFErrorKeyboardInterruptBaseExceptionprinttyper]   	traceback	print_excr   )rn   r1   rR   r   r   r   r<   tasks       r*   rx   z!TelnetServer._accept.<locals>.run  s    #5&( IK!1!%"jj$/#'??	"J $$((4KK <DtDI(88:::((//
;$@H4H%ID ''..t4' ;((//
;$@H4H%I I&  I
 GH$ RPQ  &T!W--./3 ##%%	& ''..t4s   G
D/ A-D#=C-C+C-1D#D/ G+C--3D  D##D,(D/ /F6F9 F6,F9 .F666F1,F9 1F66F9 9GGNr\   )acceptr   r.   r   r   r   rC   )r<   listen_socketrx   r   r   r   s   `  @@@r*   r   zTelnetServer._accept}  s_     #))+
d*2T2$	5 $	5L  !--ce4&&t,r,   )r   rX   r   r   r   r   r=   rX   r   r   r|   r[   rY   rZ   )r   rX   r   r   rY   rW   r'   )r   zCallable[[], None] | NonerY   rZ   r\   )r   rW   rY   rZ   )r]   r^   r_   r`   r   r>   classmethodr   rx   r   r   r   rK   r,   r*   r%   r%   
  s    $   "&88 8
	8 8  8 8 
8.  %N
D/-r,   )r)   r   rY   r(   )r1   rW   rY   rZ   )r1   rc   rY   rZ   )8r`   
__future__r   r   r   r   r   typingr   r   r   r   r	   "prompt_toolkit.application.currentr
   r   *prompt_toolkit.application.run_in_terminalr   prompt_toolkit.data_structuresr   prompt_toolkit.formatted_textr   r   prompt_toolkit.inputr   r   prompt_toolkit.output.vt100r   prompt_toolkit.rendererr   prompt_toolkit.stylesr   r   logr   protocolr   r   r   r   r   r   r   r   r    r!   r"   r#   r$   __all__r+   r2   r4   rc   r   r%   rK   r,   r*   <module>r      s    #    $ 9 9 J F / M = 4 P 7    " 
8:' 'TL" L"^	b- b-r,   