
    ^h4                    l   S r SSKJr  SSKrSSKrSSKrSSKJr  SSKJrJ	r	J
r
JrJr  SSKJrJr  SSKJr  SSKJr  SS	KJrJr  SS
KJrJr  SSKJr  SSKJr  SSKJrJ r   SSK!J"r"  SSK#J$r$J%r%J&r&J'r'J(r(J)r)J*r*J+r+J,r,J-r-J.r.J/r/J0r0  S/r1SS jr2SS jr3 " S S5      r4 " S S5      r5SS jr6 " S S5      r7g)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                    [        U 45      $ N)bytes)numbers    ^/home/james-whalen/.local/lib/python3.13/site-packages/prompt_toolkit/contrib/telnet/server.pyint2byter+   ,   s    &    c                   [         R                  " S5        U R                  [        [        -   [
        -   5        U R                  [        [        -   [        -   5        U R                  [        [        -   [
        -   [        -   [        S5      -   [        -   [        -   5        U R                  [        [        -   [        -   5        U R                  [        [        -   [        -   5        U R                  [        [        -   [        -   5        U R                  [        [        -   [        -   [        -   [        -   [        -   5        g )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                  r    \ rS rSrSrSS jrSS jrSS jrSS jrSS jr	\
SS j5       r\
SS	 j5       rS
rg)_ConnectionStdoutM   z_
Wrapper around socket which provides `write` and `flush` methods for the
Vt100_Output output.
c                F    X l         Xl        SU l        / U l        SU l        g )NstrictF)	_encoding_connection_errors_buffer_closed)selfr1   encodings      r*   __init___ConnectionStdout.__init__S   s"    !%$&r,   c                    UR                  SS5      nU R                  R                  UR                  U R                  U R
                  S95        U R                  5         g )N
z
)errors)replacer;   appendencoder8   r:   flushr=   datas     r*   write_ConnectionStdout.writeZ   sB    ||D&)DKKt||KLM

r,   c                    gNT r=   s    r*   isatty_ConnectionStdout.isatty_   s    r,   c                     U R                   (       d4  U R                  R                  SR                  U R                  5      5        / U l        g ! [
         a#  n[        R                  " SU 35         S nAN0S nAff = f)Nr,   z Couldn't send data over socket: )r<   r9   r/   joinr;   OSErrorr   warning)r=   es     r*   rG   _ConnectionStdout.flushb   sd    	C<<  %%chht||&<=   	CNN=aSABB	Cs   AA 
A<A77A<c                    SU l         g rM   )r<   rO   s    r*   close_ConnectionStdout.closek   s	    r,   c                    U R                   $ r'   )r8   rO   s    r*   r>   _ConnectionStdout.encodingn   s    ~~r,   c                    U R                   $ r'   )r:   rO   s    r*   rC   _ConnectionStdout.errorsr   s    ||r,   )r;   r<   r9   r8   r:   N)r1   socket.socketr>   strreturnNone)rI   r`   ra   rb   )ra   boolra   rb   )ra   r`   )__name__
__module____qualname____firstlineno____doc__r?   rJ   rP   rG   rY   propertyr>   rC   __static_attributes__rN   r,   r*   r4   r4   M   sH    

    r,   r4   c                      \ rS rSrSr S                 SS jjrSS jrSS jrSS jrSS jr	SS jr
SS	 jrSS
 jrSrg)TelnetConnectionw   z.
Class that represents one Telnet connection.
c	                  ^ ^^ UT l         UT l        UT l        UT l        UT l        UT l        ST l        [        R                  " 5       T l	        UT l
        TT l        S T l        [        SSS9T l        [        U5        S
U 4S jjm[!        ["        [%        XS95      T l        SU 4S jjn	SU 4S jjn
SUUU 4S	 jjn[)        XU5      T l        S T l        g )NF(   O   rowscolumnsc                    > T R                   $ r'   )sizerO   s   r*   get_size+TelnetConnection.__init__.<locals>.get_size   s    99r,   )r>   c                <   > TR                   R                  U 5        g)z-TelnetProtocolParser 'data_received' callbackN)vt100_input
send_bytesrI   r=   s    r*   data_received0TelnetConnection.__init__.<locals>.data_received   s    ''-r,   c                   > [        XS9Tl        TR                  b/  TR                  (       a  TR                  R	                  S 5        ggg)z-TelnetProtocolParser 'size_received' callbackrr   Nc                 2    [        5       R                  5       $ r'   )r   
_on_resizerN   r,   r*   <lambda>BTelnetConnection.__init__.<locals>.size_received.<locals>.<lambda>   s    )=)=)?r,   )r   rv   vt100_outputcontextrun)rs   rt   r=   s     r*   size_received0TelnetConnection.__init__.<locals>.size_received   s<    $8DI  ,  !?@ 2>,r,   c                p   > [        TR                  TU TS9Tl        TR                  R	                  5         g)z.TelnetProtocolParser 'ttype_received' callback)term
enable_cprN)r   stdoutr   _readyset)ttyper   rw   r=   s    r*   ttype_received1TelnetConnection.__init__.<locals>.ttype_received   s-     ,XEj!D KKOOr,   )ra   r   rI   r(   ra   rb   )rs   intrt   r   ra   rb   )r   r`   ra   rb   )connaddrinteractserverr>   styler<   asyncioEventr   rz   r   r   r   rv   r2   r	   r   r4   r   r$   parserr   )r=   r   r   r   r   r>   r   rz   r   r}   r   r   rw   s   `       `   @r*   r?   TelnetConnection.__init__|   s     		  
mmo&$15 b"-	 	4 	 6#4T#MN	.	A	 	 +=X37r,   c                  ^ #    SU 4S jjn[        5       nUR                  T R                  U5         T R                  R	                  5       I Sh  vN   [        T R                  T R                  S9   [        R                  " 5       T l
        T R                  T 5      I Sh  vN   SSS5        T R                  5         g No N! , (       d  f       N#= f! T R                  5         f = f7f)z
Run application.
c                    > TR                   R                  S5      n U (       a  TR                  U 5        g [        R                  " SR
                  " TR                  6 5        TR                  5         g )Ni   z&Connection closed by client. {!r} {!r})r   recvfeedr   r.   formatr   rY   r|   s    r*   handle_incoming_data>TelnetConnection.run_application.<locals>.handle_incoming_data   sJ    99>>$'D		$ DKKTYYWX

r,   N)inputoutputrd   )r   
add_readerr   r   waitr
   rz   r   contextvarscopy_contextr   r   rY   )r=   r   loops   `  r*   run_application TelnetConnection.run_application   s     
	  !		#78	++""$$$#$*:*:4CTCTU*779mmD))) V JJL % * VU JJLsX   /C*C C "C 3/C"C#C'C /C* C C
CC C''C*c                :    U R                   R                  U5        g)z6
Handler for incoming data. (Called by TelnetServer.)
N)r   r   rH   s     r*   r   TelnetConnection.feed   s     	r,   c                   U R                   (       dy  SU l         U R                  R                  5         [        5       R	                  U R
                  5        U R
                  R                  5         U R                  R                  5         gg)z
Closed by client.
TN)r<   rz   rY   r   remove_readerr   r   rO   s    r*   rY   TelnetConnection.close   s\     ||DL""$,,TYY7IIOOKK r,   c                    U R                   c  g[        U5      n[        U R                   XR                  =(       d
    [	        5       5        g)z
Send text to the client.
N)r   r   r   r   r   r=   formatted_texts     r*   r/   TelnetConnection.send   s;     $*>:~zz/IZ\	
r,   c                H   ^ ^ [        T5      mT R                  UU 4S j5      $ )zD
Send text to the client.
This is asynchronous, returns a `Future`.
c                 &   > TR                  T 5      $ r'   )r/   )r   r=   s   r*   r   4TelnetConnection.send_above_prompt.<locals>.<lambda>   s    TYY~-Fr,   )r   _run_in_terminalr   s   ``r*   send_above_prompt"TelnetConnection.send_above_prompt   s!    
 +>:$$%FGGr,   c                |    U R                   (       a!  U R                   R                  [        U5        g [        S5      e)Nz2Called _run_in_terminal outside `run_application`.)r   r   r   RuntimeError)r=   funcs     r*   r   !TelnetConnection._run_in_terminal   s+     <<LL_d3STTr,   c                    U R                   c  gU R                   R                  5         U R                   R                  SS5        U R                   R                  5         g)z2
Erase the screen and move the cursor to the top.
Nr   )r   erase_screencursor_gotorG   rO   s    r*   r   TelnetConnection.erase_screen   sM     $&&(%%a+!r,   )r<   r   r   r   r   r   r>   r   r   r   rv   r   r   rz   r   N)T)r   r_   r   ztuple[str, int]r   7Callable[[TelnetConnection], Coroutine[Any, Any, None]]r   r%   r>   r`   r   BaseStyle | Nonerz   r   r   rc   ra   rb   rd   r   )r   r   ra   rb   )r   zCallable[[], None]ra   rb   )re   rf   rg   rh   ri   r?   r   r   rY   r/   r   r   r   rk   rN   r,   r*   rm   rm   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,   rm   c                   #    g 7fr'   rN   r0   s    r*   _dummy_interactr     s     s   c                      \ rS rSrSrSS\SSS4             SS jjr\SS	 j5       rSSS
 jjr	SS jr
SS jrSS jrSrg)r%   i
  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                    Xl         X l        X0l        X@l        XPl        X`l        S U l        / U l        [        5       U l	        g r'   )
hostportr   r>   r   r   	_run_task_application_tasksr   connections)r=   r   r   r   r>   r   r   s          r*   r?   TelnetServer.__init__  s;     		  
$48<>25%r,   c                   [         R                   " [         R                  [         R                  5      nUR                  [         R                  [         R
                  S5        UR                  X45        UR                  S5        U$ )Nr      )socketAF_INETSOCK_STREAM
setsockopt
SOL_SOCKETSO_REUSEADDRbindlisten)clsr   r   ss       r*   _create_socketTelnetServer._create_socket2  sX     MM&..&*<*<=	V&&(;(;Q?	|	r,   c                  ^ ^#    T R                  T R                  T R                  5      m[        R                  " ST R                  T R                  5        [        5       R                  TU U4S j5        U(       a  U" 5          [        R                  " 5       I Sh  vN   [        5       R                  T5        TR                  " 5         T R                   H  nUR                  5         M     [        T R                  5      S:  a7  [        R                  " T R                  S[        R                  S9I Sh  vN   gg N N! [        5       R                  T5        TR                  " 5         T R                   H  nUR                  5         M     [        T R                  5      S:  a8  [        R                  " T R                  S[        R                  S9I Sh  vN    f f = f7f)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                 &   > T R                  T5      $ r'   )_accept)r=   r   s   r*   r   "TelnetServer.run.<locals>.<lambda>H  s    dll66Jr,   Nr   )timeoutreturn_when)r   r   r   r   r.   r   r   r   Futurer   rY   r   cancellenr   ALL_COMPLETED)r=   ready_cbtr   s   `  @r*   r   TelnetServer.run<  sq     $$TYY		:<dii	
 	%%f.JKJ	..""",,V4LLN ,,
 - 4**+a/ll++  ' 5 5   0 # ,,V4LLN ,,
 - 4**+a/ll++  ' 5 5   0sP   B G'E E E "BG'9E:G' E G'BG$GG$$G'c                x    U R                   b  g[        5       R                  U R                  5       5      U l         g)ze
Deprecated: Use `.run()` instead.

Start the telnet server (stop by calling and awaiting `stop()`).
N)r   r   create_taskr   rO   s    r*   startTelnetServer.startc  s,     >>%)+77
Cr,   c                   #    U R                   b0  U R                   R                  5          U R                   I Sh  vN   gg N! [        R                   a     gf = f7f)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   CancelledErrorrO   s    r*   stopTelnetServer.stopo  sT      >>%NN!!#nn$$ & %)) s7   (AA AA AA AAAAc                   ^ ^^^ UR                  5       u  mm[        R                  " S/TQ76   SUUU U4S jjn[        5       R	                  U" 5       5      mT R
                  R                  T5        g)z!
Accept new incoming connection.
zNew connection %r %rc                   >#     [        5        n [        TTTR                  TTR                  TR                  U TR
                  S9nTR                  R                  U5        [        R                  " S/TQ76    UR                  5       I S h  vN   TR                  R                  U5        [        R                  " S/TQ76    S S S 5        TR(                  R                  T5        g  N[! TR                  R                  U5        [        R                  " S/TQ76   f = f! , (       d  f       Nc= f! [         a    [        R                  " S5         N[         a    [        R                  " S5         N[         a@  n[        S[!        U5      R"                   3U5        SS KnUR'                  5          S nANS nAff = f! TR(                  R                  T5        f = f7f)N)r>   r   rz   r   zStarting interaction %r %rzStopping interaction %r %rz)Unhandled EOFError in telnet application.z2Unhandled KeyboardInterrupt in telnet application.zGot r   )r   rm   r   r>   r   r   r   addr   r.   r   removeEOFErrorKeyboardInterruptBaseExceptionprinttypere   	traceback	print_excr   )rz   r1   rV   r   r   r   r=   tasks       r*   r   !TelnetServer._accept.<locals>.run  s    #5&(K!1!%"jj$/#'??	"J $$((4KK <DtDI(88:::((//
;$@H4H% )D ''..t4' ;((//
;$@H4H% )(&  I
 GH$ RPQ  &T!W--./3 ##%%	& ''..t4s   G#
D4 A+D#;C,C*C,2D#D4 G#*C,,4D  D##
D1-D4 0G 1D4 4 G G G 5G 7	G  6F;6G ;G  G G  G#Nrd   )acceptr   r.   r   r   r   rE   )r=   listen_socketr   r   r   r   s   `  @@@r*   r   TelnetServer._accept}  s_     #))+
d*2T2$	5 $	5L  !--ce4&&t,r,   )	r   r   r   r   r>   r   r   r   r   )r   r`   r   r   r   r   r>   r`   r   r   r   rc   ra   rb   )r   r`   r   r   ra   r_   r'   )r   zCallable[[], None] | Nonera   rb   rd   )r  r_   ra   rb   )re   rf   rg   rh   ri   r   r?   classmethodr   r   r   r   r   rk   rN   r,   r*   r%   r%   
  s    $   "&88 8
	8 8  8 8 
8.  %N
D/-r,   )r)   r   ra   r(   )r1   r_   ra   rb   )r1   rm   ra   rb   )8ri   
__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   rm   r   r%   rN   r,   r*   <module>r     s    #    $ 9 9 J F / M = 4 P 7    " 
8:' 'TL" L"^	b- b-r,   