
    f                        d Z ddlm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ZddlmZmZ ddlmZ ddlmZmZ dd	lmZ d
dgZ G d d
ej0                        Z G d dej4                        Zy)zI
Utility for running a prompt_toolkit application in an asyncssh server.
    )annotationsN)get_running_loop)AnyCallable	CoroutineTextIOcast)
AppSessioncreate_app_session)Size)	PipeInputcreate_pipe_input)Vt100_OutputPromptToolkitSSHSessionPromptToolkitSSHServerc                  l    e Zd Z	 	 	 	 	 	 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	)r   c                    | _         | _        d  _        d  _        d  _        d  _        d  _         G  fdd      }t        t         |              _	        y )Nc                  @    e Zd Zd fdZddZddZed	 fd       Zy)
0PromptToolkitSSHSession.__init__.<locals>.Stdoutc                    	 j                   ,j                   j                  |j                  dd             y y # t        $ r Y y w xY w)N
z
)_chanwritereplaceBrokenPipeError)sdataselfs     \/var/www/cvtools/html/venv/lib/python3.12/site-packages/prompt_toolkit/contrib/ssh/server.pyr   z6PromptToolkitSSHSession.__init__.<locals>.Stdout.write,   sF    zz-

((dF)CD .& s   7< 	AAc                     yNT r   s    r   isattyz7PromptToolkitSSHSession.__init__.<locals>.Stdout.isatty3   s        c                     y Nr"   r#   s    r   flushz6PromptToolkitSSHSession.__init__.<locals>.Stdout.flush6   s    r%   c                    j                   J t        j                   j                  j                         d         S )Nr   )r   str
_orig_changet_encoding)r   r   s    r   encodingz9PromptToolkitSSHSession.__init__.<locals>.Stdout.encoding9   s6    zz---4::00==?BCCr%   N)r   r*   returnNoner.   boolr.   r/   )r.   r*   )__name__
__module____qualname__r   r$   r(   propertyr-   r   s   r   Stdoutr   +   s(     D Dr%   r8   )
interact
enable_cprinteract_taskr   app_session_input_outputr	   r   stdout)r   r9   r:   r8   s   `   r   __init__z PromptToolkitSSHSession.__init__   sX     !$8<!%
.2
 )-,0	D 	D& 668,r%   c                    | j                   t        dd      S | j                   j                         \  }}}}t        ||      S )zU
        Callable that returns the current `Size`, required by Vt100_Output.
           O   )rowscolumns)r   r   get_terminal_sizer   widthheightpixwidth	pixheights        r   	_get_sizez!PromptToolkitSSHSession._get_size@   sC     ::R,,151M1M1O.E68YVU33r%   c                    || _         y r'   )r   )r   chans     r   connection_madez'PromptToolkitSSHSession.connection_madeJ   s	    
r%   c                     yr!   r"   r7   s    r   shell_requestedz'PromptToolkitSSHSession.shell_requestedM   s    r%   c                \    t               j                  | j                               | _        y r'   )r   create_task	_interactr;   r7   s    r   session_startedz'PromptToolkitSSHSession.session_startedP   s    -/;;DNN<LMr%   c                |  K   | j                   t        d      t        | j                   d      r1| j                   j                  | j                   j	                  d       | j                   j                         }t        | j                  | j                  || j                        | _
        t               5 | _        t        | j                  | j                        5 }|| _        	 | j                  |        d {    | j                   j'                          | j                  j'                          	 d d d        d d d        y 7 J# t         $ r t#        j$                          Y gw xY w# | j                   j'                          | j                  j'                          w xY w# 1 sw Y   pxY w# 1 sw Y   y xY ww)Nz,`_interact` called before `connection_made`.set_line_modeF)termr:   )inputoutput)r   	Exceptionhasattr_editorrW   get_terminal_typer   r?   rL   r:   r>   r   r=   r   r<   r9   BaseException	traceback	print_excclose)r   rX   sessions      r   rT   z!PromptToolkitSSHSession._interactS   sR    ::JKK4::/DJJ4F4F4R JJ$$U+zz++-#KKdt
   
	(DK#$++dllK 	(w#* (-----
 JJ$$&KK%%'	(
	( 
	( .$ *'')* JJ$$&KK%%'	( 	(
	( 
	(sx   B5F<7'F0F$'E;E<E 4F$5F0=	F<EE(%E+'E((E++6F!!F$$F-	)F00F95F<c                    | j                   r<| j                   j                  r%| j                   j                  j                          y y y r'   )r<   app
_on_resizerG   s        r   terminal_size_changedz-PromptToolkitSSHSession.terminal_size_changedo   s;      0 0 4 4  ++- !5r%   c                T    | j                   y | j                   j                  |       y r'   )r=   	send_text)r   r   datatypes      r   data_receivedz%PromptToolkitSSHSession.data_receivedv   s!    ;;d#r%   Nr9   z>Callable[[PromptToolkitSSHSession], Coroutine[Any, Any, None]]r:   r1   r.   r/   )r.   r   )rN   r   r.   r/   r0   r2   )
rH   intrI   rm   rJ   objectrK   rn   r.   r/   )r   r*   rj   rn   r.   r/   )r3   r4   r5   r@   rL   rO   rQ   rU   rT   rg   rk   r"   r%   r   r   r      sp    '-P'- 	'-
 
'-R4N(8.."%.17.DJ.	.$r%   c                  8    e Zd ZdZdd	 	 	 	 	 ddZd	dZd
dZy)r   aZ  
    Run a prompt_toolkit application over an asyncssh server.

    This takes one argument, an `interact` function, which is called for each
    connection. This should be an asynchronous function that runs the
    prompt_toolkit applications. This function runs in an `AppSession`, which
    means that we can have multiple UI interactions concurrently.

    Example usage:

    .. code:: python

        async def interact(ssh_session: PromptToolkitSSHSession) -> None:
            await yes_no_dialog("my title", "my text").run_async()

            prompt_session = PromptSession()
            text = await prompt_session.prompt_async("Type something: ")
            print_formatted_text('You said: ', text)

        server = PromptToolkitSSHServer(interact=interact)
        loop = get_running_loop()
        loop.run_until_complete(
            asyncssh.create_server(
                lambda: MySSHServer(interact),
                "",
                port,
                server_host_keys=["/etc/ssh/..."],
            )
        )
        loop.run_forever()

    :param enable_cpr: When `True`, the default, try to detect whether the SSH
        client runs in a terminal that responds to "cursor position requests".
        That way, we can properly determine how much space there is available
        for the UI (especially for drop down menus) to render.
    Tr:   c                    || _         || _        y r'   )r9   r:   )r   r9   r:   s      r   r@   zPromptToolkitSSHServer.__init__   s     !$r%   c                     y)NFr"   )r   usernames     r   
begin_authz!PromptToolkitSSHServer.begin_auth   s    r%   c                D    t        | j                  | j                        S )Nrp   )r   r9   r:   r7   s    r   session_requestedz(PromptToolkitSSHServer.session_requested   s    &t}}QQr%   Nrl   )rs   r*   r.   r1   )r.   r   )r3   r4   r5   __doc__r@   rt   rv   r"   r%   r   r   r   ~   s9    #R  	%P% 	%
 
%Rr%   )rw   
__future__r   asyncior`   r   typingr   r   r   r   r	   asyncssh"prompt_toolkit.application.currentr
   r   prompt_toolkit.data_structuresr   prompt_toolkit.inputr   r   prompt_toolkit.output.vt100r   __all__SSHServerSessionr   	SSHServerr   r"   r%   r   <module>r      sa    #   $ 9 9  M / = 4$&>
?e$h77 e$P4RX// 4Rr%   