
    Mh4                    z   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          Z7dS )$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TelnetServernumberintreturnbytesc                "    t          | f          S N)r)   )r&   s    d/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/prompt_toolkit/contrib/telnet/server.pyint2byter-   ,   s    &    
connectionsocket.socketNonec                   t          j        d           |                     t          t          z   t
          z              |                     t          t          z   t          z              |                     t          t          z   t
          z   t          z   t          d          z   t          z   t          z              |                     t          t          z   t          z              |                     t          t          z   t          z              |                     t          t          z   t          z              |                     t          t          z   t          z   t          z   t          z   t          z              d S )NzInitializing telnet connectionr   )r   infosendr   r   r   r#   r!   r   r   r-   r   r   r   r"   r    r/   s    r,   _initialize_telnetr6   0   s   
K0111 OOC"Hx'((( OOC$J!22333 OOC"Hx'$.!<sBRGHHH OOC$J%&&& OOC"HtO$$$ OOC"Hu$%%%
 OOC"Hu$t+c1B677777r.   c                  j    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dS )_ConnectionStdoutzk
    Wrapper around socket which provides `write` and `flush` methods for the
    Vt100_Output output.
    r/   r0   encodingstrr(   r1   c                L    || _         || _        d| _        g | _        d| _        d S )NstrictF)	_encoding_connection_errors_buffer_closed)selfr/   r9   s      r,   __init__z_ConnectionStdout.__init__S   s*    !%$&r.   datac                    |                     dd          }| j                            |                    | j        | j                             |                                  d S )N
z
)errors)replacer@   appendencoder=   r?   flushrB   rD   s     r,   writez_ConnectionStdout.writeZ   sP    ||D&))DKKt|KLLMMM

r.   boolc                    dS NT rB   s    r,   isattyz_ConnectionStdout.isatty_   s    tr.   c                    	 | j         s2| j                            d                    | j                             n.# t
          $ r!}t          j        d|            Y d }~nd }~ww xY wg | _        d S )Nr.   z Couldn't send data over socket: )rA   r>   r4   joinr@   OSErrorr   warning)rB   es     r,   rK   z_ConnectionStdout.flushb   s    	C< > %%chht|&<&<=== 	C 	C 	CNAaAABBBBBBBB	C s   9< 
A'A""A'c                    d| _         d S rP   )rA   rR   s    r,   closez_ConnectionStdout.closek   s    r.   c                    | j         S r+   )r=   rR   s    r,   r9   z_ConnectionStdout.encodingn   s
    ~r.   c                    | j         S r+   )r?   rR   s    r,   rG   z_ConnectionStdout.errorsr   s
    |r.   N)r/   r0   r9   r:   r(   r1   )rD   r:   r(   r1   )r(   rN   r(   r1   )r(   r:   )__name__
__module____qualname____doc__rC   rM   rS   rK   rZ   propertyr9   rG   rQ   r.   r,   r8   r8   M   s         
      
             X    X  r.   r8   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d#S )*TelnetConnectionz6
    Class that represents one Telnet connection.
    Tconnr0   addrtuple[str, int]interact7Callable[[TelnetConnection], Coroutine[Any, Any, None]]serverr%   r9   r:   styleBaseStyle | Nonevt100_inputr   
enable_cprrN   r(   r1   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  _        d S )NF(   O   rowscolumnsr(   r   c                      j         S r+   )sizerR   s   r,   get_sizez+TelnetConnection.__init__.<locals>.get_size   s    9r.   )r9   rD   r)   r1   c                <    j                             |            dS )z-TelnetProtocolParser 'data_received' callbackN)rm   
send_bytesrD   rB   s    r,   data_receivedz0TelnetConnection.__init__.<locals>.data_received   s     ''-----r.   rs   r'   rt   c                    t          | |          _        j        $j        rj                            d            dS dS dS )z-TelnetProtocolParser 'size_received' callbackrr   Nc                 B    t                                                      S r+   )r   
_on_resizerQ   r.   r,   <lambda>zBTelnetConnection.__init__.<locals>.size_received.<locals>.<lambda>   s    )=)=)?)? r.   )r   rv   vt100_outputcontextrun)rs   rt   rB   s     r,   size_receivedz0TelnetConnection.__init__.<locals>.size_received   sU    $888DI ,,  !?!?@@@@@ -,,,r.   ttyper:   c                t    t          j        |           _        j                                         dS )z.TelnetProtocolParser 'ttype_received' callback)termrn   N)r   stdoutr   _readyset)r   rn   rw   rB   s    r,   ttype_receivedz1TelnetConnection.__init__.<locals>.ttype_received   s?     ,XEj! ! !D KOOr.   )r(   r   rD   r)   r(   r1   )rs   r'   rt   r'   r(   r1   )r   r:   r(   r1   )re   rf   rh   rj   r9   rk   rA   asyncioEventr   rm   rn   r   r   rv   r6   r	   r   r8   r   r$   parserr   )rB   re   rf   rh   rj   r9   rk   rm   rn   r{   r   r   rw   s   `       `   @r,   rC   zTelnetConnection.__init__|   sK    		  
moo&$15 b"---	 	4   	 	 	 	 	 	 6#4TH#M#M#MNN	. 	. 	. 	. 	. 	.	A 	A 	A 	A 	A 	A	 	 	 	 	 	 	 	 +=-XX37r.   c                   K   d fd}t                      }|                     j        |           	  j                                         d{V  t           j         j                  5  t          j	                     _
                                         d{V  ddd           n# 1 swxY w Y                                     dS #                                   w xY w)z"
        Run application.
        r(   r1   c                     j                             d          } | r                    |            d S t          j         dj        j                                                     d S )Ni   z&Connection closed by client. {!r} {!r})re   recvfeedr   r3   formatrf   rZ   rz   s    r,   handle_incoming_dataz>TelnetConnection.run_application.<locals>.handle_incoming_data   sb    9>>$''D 		$ KDKTYWXXX

r.   N)inputoutputr]   )r   
add_readerre   r   waitr
   rm   r   contextvarscopy_contextr   rh   rZ   )rB   r   loops   `  r,   run_applicationz TelnetConnection.run_application   s;     
	 	 	 	 	 	  !!	#7888	+""$$$$$$$$$#$*:4CTUUU * **799mmD)))))))))* * * * * * * * * * * * * * * JJLLLLLDJJLLLLs/   :C .4B."C .B22C 5B26C C%rD   r)   c                :    | j                             |           dS )zF
        Handler for incoming data. (Called by TelnetServer.)
        N)r   r   rL   s     r,   r   zTelnetConnection.feed   s      	r.   c                   | j         szd| _         | j                                         t                                          | j                   | j                                         | j                                         dS dS )z#
        Closed by client.
        TN)rA   rm   rZ   r   remove_readerre   r   rR   s    r,   rZ   zTelnetConnection.close   s|     | 	 DL""$$$,,TY777IOOK	  	 r.   formatted_textr   c                    | j         dS t          |          }t          | j         || j        pt	                                 dS )z*
        Send text to the client.
        N)r   r   r   rk   r   rB   r   s     r,   r4   zTelnetConnection.send   sP     $F*>::~tz/IZ\\	
 	
 	
 	
 	
r.   c                V     t                                          fd          S )z\
        Send text to the client.
        This is asynchronous, returns a `Future`.
        c                 .                                    S r+   )r4   )r   rB   s   r,   r   z4TelnetConnection.send_above_prompt.<locals>.<lambda>   s    TYY~-F-F r.   )r   _run_in_terminalr   s   ``r,   send_above_promptz"TelnetConnection.send_above_prompt   s4    
 +>::$$%F%F%F%F%FGGGr.   funcCallable[[], None]c                r    | j         r"| j                             t          |           d S t          d          )Nz2Called _run_in_terminal outside `run_application`.)r   r   r   RuntimeError)rB   r   s     r,   r   z!TelnetConnection._run_in_terminal   s<     < 	UL_d33333STTTr.   c                    | j         dS | j                                          | j                             dd           | j                                          dS )zB
        Erase the screen and move the cursor to the top.
        Nr   )r   erase_screencursor_gotorK   rR   s    r,   r   zTelnetConnection.erase_screen   s[     $F&&(((%%a+++!!!!!r.   N)T)re   r0   rf   rg   rh   ri   rj   r%   r9   r:   rk   rl   rm   r   rn   rN   r(   r1   r]   r   )r   r   r(   r1   )r   r   r(   r1   )r^   r_   r`   ra   rC   r   r   rZ   r4   r   r   r   rQ   r.   r,   rd   rd   w   s           58 58 58 58 58n   6   
  
  
  
 	
 	
 	
 	
H H H HU U U U" " " " " "r.   rd   c                
   K   d S r+   rQ   r5   s    r,   _dummy_interactr     s      Dr.   c                  b    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dS )$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-8NThostr:   portr'   rh   ri   r9   rk   rl   rn   rN   r(   r1   c                    || _         || _        || _        || _        || _        || _        d | _        g | _        t                      | _	        d S r+   )
r   r   rh   r9   rk   rn   	_run_task_application_tasksr   connections)rB   r   r   rh   r9   rk   rn   s          r,   rC   zTelnetServer.__init__  sO     		  
$48<>25%%r.   r0   c                   t          j         t           j        t           j                  }|                    t           j        t           j        d           |                    ||f           |                    d           |S )Nr      )socketAF_INETSOCK_STREAM
setsockopt
SOL_SOCKETSO_REUSEADDRbindlisten)clsr   r   ss       r,   _create_socketzTelnetServer._create_socket2  s`     M&.&*<==	V&(;Q???	d|	r.   ready_cbCallable[[], None] | Nonec                ~   K                          j         j                  t          j        d j         j                   t                                           fd           |r
 |             	 t          j                     d{V  t                      	                                j
                      j        D ]}|                                 t           j                  dk    r.t          j         j        dt          j                   d{V  dS dS # t                      	                                j
                      j        D ]}|                                 t           j                  dk    r-t          j         j        dt          j                   d{V  w w xY 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                 .                                    S r+   )_accept)rB   r   s   r,   r   z"TelnetServer.run.<locals>.<lambda>H  s    dll66J6J r.   Nr   )timeoutreturn_when)r   r   r   r   r3   r   r   r   Futurer   rZ   r   cancellenr   ALL_COMPLETED)rB   r   tr   s   `  @r,   r   zTelnetServer.run<  s      $$TY	::<di	
 	
 	
 	%%f.J.J.J.J.JKKK 	HJJJ	.""""""""",,V444FLNNN ,  



 4*++a//l+  ' 5            0/ ,,V444FLNNN ,  



 4*++a//l+  ' 5           0s   8D' 'BF<c                    | j         dS t                                          |                                           | _         dS )z}
        Deprecated: Use `.run()` instead.

        Start the telnet server (stop by calling and awaiting `stop()`).
        N)r   r   create_taskr   rR   s    r,   startzTelnetServer.startc  s8     >%F)++77

CCr.   c                   K   | j         ?| j                                          	 | j          d{V  dS # t          j        $ r Y dS w xY wdS )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   CancelledErrorrR   s    r,   stopzTelnetServer.stopo  sv       >%N!!###n$$$$$$$$$)   	 &%s   3 AAlisten_socketc                     |                                 \  t          j        dgR   d fd}t                                           |                       j                                       dS )z1
        Accept new incoming connection.
        zNew connection %r %rr(   r1   c                   K   	 t                      5 } t          j        j        j        | j                  }j                            |           t          j	        dgR   	 |
                                 d {V  j                            |           t          j	        dgR   n1# j                            |           t          j	        dgR   w xY w	 d d d            n# 1 swxY w Y   n# t          $ r t          j	        d           Y nrt          $ r t          j	        d           Y nSt          $ rG}t          dt!          |          j         |           dd l}|                                 Y d }~nd }~ww xY wj                                       d S # j                                       w xY w)N)r9   rk   rm   rn   zStarting interaction %r %rzStopping interaction %r %rz)Unhandled EOFError in telnet application.z2Unhandled KeyboardInterrupt in telnet application.zGot r   )r   rd   rh   r9   rk   rn   r   addr   r3   r   removeEOFErrorKeyboardInterruptBaseExceptionprinttyper^   	traceback	print_excr   )rm   r/   rX   r   rf   re   rB   tasks       r,   r   z!TelnetServer._accept.<locals>.run  s     #5&(( IK!1!%"j$/#'?	" 	" 	"J $((444K <DtDDDDI(88:::::::::(//
;;;$@H4HHHHH (//
;;;$@H4HHHHHH%I I I I I I I I I I I I I I I&  I I I
 GHHHHH$ R R RPQQQQQ  & & &/T!WW-//333    ##%%%%%%%%	& '..t44444'..t4444s   C= AC1,B3-C13.C!!C1%C= 1C55C= 8C59C= <F+ =FF+ F:F+ <	F=FF+ FF+ +GNr]   )acceptr   r3   r   r   r   rI   )rB   r   r   rf   re   r   s   `  @@@r,   r   zTelnetServer._accept}  s     #))++
d*2T2222$	5 $	5 $	5 $	5 $	5 $	5 $	5 $	5 $	5L  !!--ccee44&&t,,,,,r.   )r   r:   r   r'   rh   ri   r9   r:   rk   rl   rn   rN   r(   r1   )r   r:   r   r'   r(   r0   r+   )r   r   r(   r1   r]   )r   r0   r(   r1   )r^   r_   r`   ra   r   rC   classmethodr   r   r   r   r   rQ   r.   r,   r%   r%   
  s         $   "&8 8 8 8 8.    [% % % % %N
D 
D 
D 
D   /- /- /- /- /- /-r.   )r&   r'   r(   r)   )r/   r0   r(   r1   )r/   rd   r(   r1   )8ra   
__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-   r6   r8   rd   r   r%   rQ   r.   r,   <module>r      s    # " " " " "       $ $ $ $ $ $ 9 9 9 9 9 9 9 9 9 9 9 9 9 9 J J J J J J J J F F F F F F / / / / / / M M M M M M M M = = = = = = = = 4 4 4 4 4 4 P P P P P P 7 7 7 7 7 7 7 7                                   " 
   8 8 8 8:' ' ' ' ' ' ' 'TL" L" L" L" L" L" L" L"^	 	 	 	b- b- b- b- b- b- b- b- b- b-r.   