
    mg              
           d Z ddlmZ ddlmZmZmZ ddlmZm	Z	 ddl
mZ erddlmZ eeegdf      Zd	Zd
ZdZdZdZdZdZdZd	Z ededdddddf      Z eeedf      Zed	ediZ G d de	      Zy)zSOCKS forwarding support    )
ip_address)TYPE_CHECKINGCallableOptional   )SSHForwarderCoroSSHLocalForwarder)DataType)SSHConnectionN      Z         c                        e Zd ZdZdddef fdZddZdd	Zdd
Zde	ddfdZ
de	ddfdZde	ddfdZde	ddfdZde	ddfdZde	ddfdZde	ddfdZde	ddfdZde	ddfdZde	ddfdZdde	deddf fdZ xZS )SSHSOCKSForwarderz0SOCKS dynamic port forwarding connection handlerconnr   coroc                     t         |   ||       d| _        d| _        | j                  | _        d| _        d| _        d| _        y )N       r    )	super__init___inpbuf_bytes_needed_recv_version_recv_handler	_addrtype_host_port)selfr   r   	__class__s      .lib/python3.12/site-packages/asyncssh/socks.pyr   zSSHSOCKSForwarder.__init__=   sD    t$+/+=+=

r   returnNc                     | j                   J d| _        | j                   j                  d      dd \  }}| j                  | j                  | j
                  ||       y)z,Send request to open a new tunnel connectionNpeernamer   )
_transportr   get_extra_infoforwardr    r!   )r"   	orig_host	orig_ports      r$   _connectzSSHSOCKSForwarder._connectG   sV     ***!#==jI"1M	9TZZY	Br   c                 ^    | j                   J | j                   j                  t               y)zSend SOCKS4 success responseN)r(   writeSOCKS4_OK_RESPONSE)r"   s    r$   _send_socks4_okz!SSHSOCKSForwarder._send_socks4_okQ   s'     ***01r   c                     | j                   J t        | j                     dz   }| j                   j                  t        t        | j                  f      z   |dz  z          y)zSend SOCKS5 success responseNr       )r(   _socks5_addr_lenr   r/   SOCKS5_OK_RESPONSE_HDRbytes)r"   addrlens     r$   _send_socks5_okz!SSHSOCKSForwarder._send_socks5_okX   s\     ***"4>>2Q64#T^^$567%o. 	/r   datac                     |d   t         k(  r6|d   t        k(  rd| _        | j                  | _        y| j                          y|d   t        k(  r|d   | _        | j                  | _        y| j                          y)zParse SOCKS versionr   r      N)SOCKS4SOCKS_CONNECTr   _recv_socks4_addrr   closeSOCKS5_recv_socks5_authlistr"   r9   s     r$   r   zSSHSOCKSForwarder._recv_versionc   sj     7fAw-'%&"%)%;%;"

!W!%aD!%!;!;DJJLr   c                     |d   dz  |d   z   | _         |dd dk7  s|d   dk(  rt        t        |dd             | _        d| _        | j
                  | _        y)	zParse SOCKSv4 address and portr      r   r   r   s      N)r!   strr   r    r   _recv_socks4_userr   rB   s     r$   r>   z#SSHSOCKSForwarder._recv_socks4_addrr   sc     1gld1g-
 !9	!T!W\ZQR12DJ!33r   c                     | j                   r!| j                          | j                          yd| _        | j                  | _        y)zParse SOCKSv4 usernamerE   N)r    r1   r-   r   _recv_socks4_hostnamer   rB   s     r$   rG   z#SSHSOCKSForwarder._recv_socks4_user~   s6    
 ::  "MMO!#D!%!;!;Dr   c                     	 |j                  d      | _        | j	                          | j                          y# t        $ r | j                          Y yw xY w)zParse SOCKSv4 hostnameutf-8N)decoder    UnicodeDecodeErrorr?   r1   r-   rB   s     r$   rI   z'SSHSOCKSForwarder._recv_socks4_hostname   sK    	W-DJ
 	 " 	JJL	s   9 AAc                     | j                   J t        |v rG| j                   j                  t        t        t        f             d| _        | j                  | _        y| j                          y)z,Parse SOCKSv5 list of authentication methodsNr   )	r(   SOCKS5_AUTH_NONEr/   r6   r@   r   _recv_socks5_commandr   r?   rB   s     r$   rA   z'SSHSOCKSForwarder._recv_socks5_authlist   sX     ***t#OO!!%1A(B"CD!"D!%!:!:DJJLr   c                 `   |d   t         k(  r|d   t        k(  r|d   dk(  r~|d   t        k(  r$d| _        | j                  | _        t        | _        yt        j                  |d         }|r#|| _        | j                  | _        |d   | _        y| j                          y| j                          y)zParse SOCKSv5 commandr   r   r   r   N)r@   r=   SOCKS5_ADDR_HOSTNAMEr   _recv_socks5_hostlenr   SOCKS5_ADDR_IPV4r   r4   get_recv_socks5_addrr?   )r"   r9   r7   s      r$   rP   z&SSHSOCKSForwarder._recv_socks5_command   s     7faM!9d1glAw..%&"%)%>%>"!1*..tAw7)0D&)-)?)?D&%)!WDNJJLJJLr   c                 f    t        t        |            | _        d| _        | j                  | _        y)zParse SOCKSv5 addressr   N)rF   r   r    r   _recv_socks5_portr   rB   s     r$   rV   z#SSHSOCKSForwarder._recv_socks5_addr   s+     D)*
!33r   c                 :    |d   | _         | j                  | _        y)zParse SOCKSv5 host lengthr   N)r   _recv_socks5_hostr   rB   s     r$   rS   z&SSHSOCKSForwarder._recv_socks5_hostlen   s     "!W!33r   c                     	 |j                  d      | _        d| _        | j
                  | _        y# t        $ r | j                          Y yw xY w)zParse SOCKSv5 hostrK   Nr   )rL   r    rM   r?   r   rX   r   rB   s     r$   rZ   z#SSHSOCKSForwarder._recv_socks5_host   sL    	W-DJ
 !33 " 	JJL	s   1 AAc                 j    |d   dz  |d   z   | _         | j                          | j                          y)zParse SOCKSv5 portr   rD   r   N)r!   r8   r-   rB   s     r$   rX   z#SSHSOCKSForwarder._recv_socks5_port   s1     1gld1g-
r   datatypec                    | j                   r@| xj                  |z  c_        | j                   r| j                  dk  r| j                  j                  d      }|dk\  r8| j                  d| }| j                  |dz   d | _        | j                  |       nt	        | j                        dkD  r| j                          yyt	        | j                        | j                  k\  rI| j                  d| j                   }| j                  | j                  d | _        | j                  |       ny| j                   r| j                  }d| _        |rt        |   ||       yy)z*Handle incoming data from the SOCKS clientr   r3   Nr      r   )r   r   r   findlenr?   r   data_received)r"   r9   r]   idxr#   s       r$   rb   zSSHSOCKSForwarder.data_received   s.    LLD L$$%%),,++E2Cax#||DS1'+||CEF';**40T\\*S0

4<<(D,>,>>#||,?T-?-?@'+||D4F4F4G'H**40' $$* <<DDLG!$1 r   )r%   N)N)__name__
__module____qualname____doc__r   r   r-   r1   r8   r6   r   r>   rG   rI   rA   rP   rV   rS   rZ   rX   r
   rb   __classcell__)r#   s   @r$   r   r   :   s   :_ 4D C2	/% D 
4e 
4 
4
<e 
< 
<
% 
D 
% D  4 (4e 4 44 44 4
4e 
4 
4e  2% 28 2t 2 2r   r   )rg   	ipaddressr   typingr   r   r   r*   r   r	   sessionr
   
connectionr   r6   _RecvHandlerr<   r@   r=   	SOCKS4_OK	SOCKS5_OKrO   rT   rR   SOCKS5_ADDR_IPV6r0   r5   r4   r    r   r$   <module>rr      s   *    4 4 8  ) %$/0 		    Iq!Q1a @A A 67 %q*:B@ }2) }2r   