
    Iic&                          S SK Jr  S SKrS SKrS SKrS SKrS SKr\R                  " \	5      r
 " S S5      r " S S5      rg! \ a	    S SKJr   NIf = f)    )urlparseNc                   8    \ rS rSrSrSrSrSrSrSr	Sr
S	rS
rSrg)ProxyConnectionStates   z<disconnected>z<connecting>z<negotiate_propose>z<negotiating>z<authenticating>z<request_submit>z<requesting>z<read_address>z
<complete> N)__name__
__module____qualname____firstlineno__DISCONNECTED
CONNECTINGNEGOTIATE_PROPOSENEGOTIATINGAUTHENTICATINGREQUEST_SUBMIT
REQUESTINGREAD_ADDRESSCOMPLETE__static_attributes__r       :/venv/lib/python3.13/site-packages/kafka/socks5_wrapper.pyr   r      s0    #LJ-!K'N'NJ#LHr   r   c                   v    \ rS rSrSrS r\S 5       r\\R                  4S j5       r
S rS rS rS	 rS
 rSrg)Socks5Wrapper   zqSocks5 proxy wrapper

Manages connection through socks5 proxy with support for username/password
authentication.
c                 N   SU l         SU l        [        U5      U l        S U l        [
        R                  U l        [        R                  U l
        U R                  U R                  R                  U R                  R                  U5      n[        R                  " U5      U l        g )Nr   )
_buffer_in_buffer_outr   
_proxy_url_sockr   r   _statesocket	AF_UNSPEC_target_afi
dns_lookuphostnameportrandomchoice_proxy_addr)self	proxy_urlafiproxy_addrss       r   __init__Socks5Wrapper.__init__"   sw    "9-
+88!++oodoo&>&>@T@TVYZ!==5r   c                 N    US   [         R                  [         R                  4;   $ )z8Given a getaddrinfo struct, return True iff ipv4 or ipv6r   )r!   AF_INETAF_INET6)clsgais     r   is_inet_4_or_6Socks5Wrapper.is_inet_4_or_6.   s      1v&..&//:::r   c                      [        [        U R                  [        R                  " XU[        R
                  5      5      5      $ ! [        R                   a#  n[        R                  SXU5        / s SnA$ SnAff = f)zRReturns a list of getaddrinfo structs, optionally filtered to an afi (ipv4 / ipv6)z%DNS lookup failed for proxy %s:%d, %rN)	listfilterr5   r!   getaddrinfoSOCK_STREAMgaierrorlogwarning)r3   hostr&   r,   exs        r   r$   Socks5Wrapper.dns_lookup3   sn    	s11%11$c282D2D FG H H  	KK?RPI	s   AA A<A71A<7A<c                     Xl         U R                  u  n      n[        R                  " X25      U l        U R                  $ )zOpen and record a socket.

Returns the actual underlying socket
object to ensure e.g. selects and ssl wrapping works as expected.
)r#   r)   r!   r   )r*   family	sock_typer,   _s        r   r!   Socks5Wrapper.socketC   s9     "**Q1a]]32
zzr   c                     U R                   (       aM  U R                  R                  U R                   5      nU R                   US U l         U R                   (       a  ML  gg)zSend out all data that is stored in the outgoing buffer.

It is expected that the caller handles error handling, including non-blocking
as well as connection failure exceptions.
N)r   r   send)r*   
sent_bytess     r   
_flush_bufSocks5Wrapper._flush_bufN   sH     )9)9:J#//
<D r   c                      U[        U R                  5      -
  nUS::  a  O9U R                  R                  U5      nU(       d  OU R                  U-   U l        MX  U R                  SU $ )zEnsure local inbound buffer has enough data, and return that data without
consuming the local buffer

It's expected that the caller handles e.g. blocking exceptionsr   N)lenr   r   recv)r*   datalenbytes_remainingdatas       r   	_peek_bufSocks5Wrapper._peek_bufX   se    
 %DOO(<<O!#::???3D"oo4DO  x((r   c                 p    U R                  U5      nU(       a  U R                  [        U5      S U l        U$ )zmRead and consume bytes from socket connection

It's expected that the caller handles e.g. blocking exceptionsN)rR   r   rM   )r*   rO   bufs      r   	_read_bufSocks5Wrapper._read_bufh   s0     nnW%"ooc#hi8DO
r   c                    U R                   [        R                  :X  a  [        R                  U l         U R                   [        R                  :X  a_  U R                  u        p#U R
                  R                  U5      nU(       a  U[        R                  :X  a  [        R                  U l         OU$ U R                   [        R                  :X  aZ  U R                  R                  (       a#  U R                  R                  (       a  SU l        OSU l        [        R                  U l         U R                   [        R                  :X  Ga  U R                  5         U R!                  S5      nUSS S:w  aT  ["        R%                  S5        [        R                  U l         U R
                  R'                  5         [        R(                  $ USS S:X  a  [        R*                  U l         GO$USS S	:X  a  [-        U R                  R                  5      n[-        U R                  R                  5      n[.        R0                  " S
R3                  Xg5      SUU R                  R                  R5                  5       UU R                  R                  R5                  5       5      U l        [        R6                  U l         OT["        R%                  S5        [        R                  U l         U R
                  R'                  5         [        R(                  $ U R                   [        R6                  :X  a  U R                  5         U R!                  S5      nUS:X  a  [        R*                  U l         OT["        R%                  S5        [        R                  U l         U R
                  R'                  5         [        R(                  $ U R                   [        R*                  :X  Ga  U R8                  [:        R<                  :X  a  SnSn	OU R8                  [:        R>                  :X  a  SnSn	O_["        R%                  SU R8                  5        [        R                  U l         U R
                  R'                  5         [        R(                  $ [.        R0                  " SR3                  U	5      SSSU[:        R@                  " U R8                  US   5      US   5      U l        [        RB                  U l         U R                   [        RB                  :X  a  U R                  5         U R!                  S5      nUSS S:X  a  [        RD                  U l         OX["        R%                  SUSS 5        [        R                  U l         U R
                  R'                  5         [        R(                  $ U R                   [        RD                  :X  a  U RG                  S5      nUSS S:X  a  U R!                  S5      nOsUSS S:X  a  U R!                  S5      nOX["        R%                  SUSS 5        [        R                  U l         U R
                  R'                  5         [        R(                  $ [        RH                  U l         U R                   [        RH                  :X  a  g["        R%                  SU R                   5        [        R                  U l         U R
                  (       a  U R
                  R'                  5         [        R(                  $ )a  Runs a state machine through connection to authentication to
proxy connection request.

The somewhat strange setup is to facilitate non-intrusive use from
BrokerConnection state machine.

This function is called with a socket in non-blocking mode. Both
send and receive calls can return in EWOULDBLOCK/EAGAIN which we
specifically avoid handling here. These are handled in main
BrokerConnection connection loop, which then would retry calls
to this function.s   s       r         zUnrecognized SOCKS version       z
!bb{}sb{}sz(Unrecognized SOCKS authentication methods    z#Socks5 proxy authentication failure      zUnknown address family, %rz	!bbbb{}sh   s    zProxy request failed: %rs       s       z#Unrecognized remote address type %rz.Internal error, state %r not handled correctly)%r    r   r   r   r)   r   
connect_exerrnoEISCONNr   r   usernamepasswordr   r   rJ   rV   r=   errorcloseECONNREFUSEDr   rM   structpackformatencoder   r#   r!   r1   r2   	inet_ptonr   r   rR   r   )
r*   addrrE   sockaddrretrU   userlenpasslen	addr_typeaddr_lens
             r   rc   Socks5Wrapper.connect_exq   s     ;;/<<</::DK;;/:::#'#3#3 Aq!Q**''1C#.3EE
;;/AAA''DOO,D,D#2  $3 /;;DK;;/;;;OO..#C1Qx7"		673@@

  ")))1Qx7"3BBQqW$doo667doo667#);; ''9OO,,335OO,,335$  4BB		DE3@@

  ")));;/>>>OO..#Ck!3BB		?@3@@

  ")));;/>>>6>>1	!!V__4			68H8HI3@@

  ")))%{{""8,  !1!147;Q D 0::DK;;/:::OO..#C1Qx;&3@@		4c!Ah?3@@

  ")));;/<<<..#C1Qx;&NN9-Qq[(NN:.		?QqJ3@@

  ")))/88DK;;/888
 			BDKKP+88::JJ!!!r   )r   r   r)   r   r   r    r#   N)r   r	   r
   r   __doc__r.   classmethodr5   r!   r"   r$   rJ   rR   rV   rc   r   r   r   r   r   r      sW    
6 ; ; (.(8(8  	=) G"r   r   )urllib.parser   ImportErrorrd   loggingr'   r!   rk   	getLoggerr   r=   r   r   r   r   r   <module>r~      sX   "%     !	 	]" ]"1  "!"s   A AA