
    i%                        d dl Z d dlZd dl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 xZxZZdZ G d	 d
e j"                        Z G d de j"                        Z G d de j"                        Z G d de j"                        Zej,                  dej.                  dej0                  dej2                  dej4                  dej6                  dej8                  dej:                  dej<                  di	Ze G d d             Z e G d d             Z!e G d d             Z"e G d  d!             Z#e G d" d#             Z$e G d$ d%             Z% G d& d'      Z&e G d( d)             Z'e G d* d+             Z(e G d, d-             Z)e G d. d/             Z*e G d0 d1             Z+e G d2 d3             Z,ee e"e$f   Z-ee!e#e%f   Z.ee&e'e(e*e)e+e,f   Z/ G d4 d5      Z0y)6    N)OptionalUnion)	dataclassfield   )
ReplyError   )is_ip_address   c                       e Zd ZdZdZdZdZy)
AuthMethodr   r   r	      N)__name__
__module____qualname__	ANONYMOUSGSSAPIUSERNAME_PASSWORDNO_ACCEPTABLE     Q/root/searxng-venv/lib/python3.12/site-packages/python_socks/_protocols/socks5.pyr   r      s    IFMr   r   c                   .    e Zd ZdZdZdZedefd       Zy)AddressTyper         verc                 \    |dk(  r| j                   S |dk(  r| j                  S t        d      )Nr      zInvalid IP version)IPV4IPV6
ValueError)clsr   s     r   from_ip_verzAddressType.from_ip_ver   s.    !888O!888O-..r   N)	r   r   r   r    DOMAINr!   classmethodintr$   r   r   r   r   r      s*    DFD/c / /r   r   c                       e Zd ZdZdZdZy)Commandr   r	   r   N)r   r   r   CONNECTBINDUDP_ASSOCIATEr   r   r   r)   r)   %   s    GDMr   r)   c                   0    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zy
)	ReplyCoder   r   r	   r   r   r   r         N)r   r   r   	SUCCEEDEDGENERAL_FAILURECONNECTION_NOT_ALLOWEDNETWORK_UNREACHABLEHOST_UNREACHABLECONNECTION_REFUSEDTTL_EXPIREDCOMMAND_NOT_SUPPORTEDADDRESS_TYPE_NOT_SUPPORTEDr   r   r   r.   r.   +   s5    IO!K !%r   r.   zRequest grantedzGeneral SOCKS server failurez!Connection not allowed by rulesetzNetwork unreachablezHost unreachablez&Connection refused by destination hostzTTL expiredz'Command not supported or protocol errorzAddress type not supportedc                   \    e Zd ZU ee   ed<   ee   ed<    ed      Zeed<   d Z	de
fdZy	)
AuthMethodsRequestusernamepasswordF)initmethodsc                     t        t        j                  g      }| j                  r+| j                  r|j                  t        j                         || _        y N)	bytearrayr   r   r<   r=   appendr   r?   )selfr?   s     r   __post_init__z AuthMethodsRequest.__post_init__J   s;    Z1123==T]]NN:778r   returnc                 d    t        t        t        | j                        g      | j                  z   S rA   )bytes	SOCKS_VERlenr?   rD   s    r   dumpszAuthMethodsRequest.dumpsR   s$    iT\\!234t||CCr   N)r   r   r   r   str__annotations__r   r?   rB   rE   rH   rL   r   r   r   r;   r;   D   s8    smsmE*GY*Du Dr   r;   c                   L    e Zd ZU dZeed<   eed<   defdZe	de
dd fd       Zy	)
AuthMethodReplyr	   r   methodrequestc                 d    | j                   |j                  vrt        d| j                          y )Nz(Unexpected SOCKS authentication method: )rQ   r?   r   rD   rR   s     r   validatezAuthMethodReply.validate]   s.    ;;goo-G}UVV .r   datarF   c                 ,   t        |      | j                  k7  rt        d      |d   }|t        k7  rt        d|       	 t	        |d         }|t        j                  k(  rt        d       | ||      S # t
        $ r t        d|d   d      w xY w)	Nz%Malformed authentication method replyr   !Unexpected SOCKS version number: r   zInvalid authentication method: #02Xz1No acceptable authentication methods were offered)r   rQ   )rJ   SIZEr   rI   r   r"   r   )r#   rV   r   rQ   s       r   loadszAuthMethodReply.loadsa   s    t9 DEE1g)@FGG	OQ(F Z---PQQs6**  	O>tAwtnMNN	Os   A7 7BN)r   r   r   rZ   r'   rN   r   r;   rU   r&   rH   r[   r   r   r   rP   rP   V   sD    D	HW 2 W + +#4 + +r   rP   c                   2    e Zd ZU dZeed<   eed<   defdZy)AuthRequestr   r<   r=   rF   c                 j   t               }|j                  | j                         |j                  t        | j                               || j                  j                  d      z  }|j                  t        | j                               || j                  j                  d      z  }t        |      S )Nascii)rB   rC   VERrJ   r<   encoder=   rH   rD   rV   s     r   rL   zAuthRequest.dumps|   s    {DHHC&'$$W--C&'$$W--T{r   N)r   r   r   r`   rM   rN   rH   rL   r   r   r   r]   r]   u   s    
CMMu r   r]   c                   @    e Zd ZU dZeed<   eed<   ededd fd       Zy)	AuthReplyr	   r   statusrV   rF   c                     t        |      | j                  k7  rt        d      |d   }|t        j                  k7  rt        d      |d   }|t
        k7  rt        d       | ||      S )NzMalformed auth replyr   zInvalid authentication responser   z,Username and password authentication failure)r   re   )rJ   rZ   r   r]   r`   AUTH_GRANTED)r#   rV   r   re   s       r   r[   zAuthReply.loads   si    t9 3441g+//!>??a\!KLLs6**r   N)	r   r   r   rZ   r'   rN   r&   rH   r[   r   r   r   rd   rd      s1    D	HK+ +; + +r   rd   c                   :    e Zd ZU eed<   eed<   defdZdefdZy)ConnectRequesthostportrF   c                     t        t        t        j                  t        g      }|| j                         z  }t        |      S rA   )rB   rI   r)   r*   RSV_build_addr_requestrH   rb   s     r   rL   zConnectRequest.dumps   s4    )W__c:;((**T{r   c                    | j                   j                  dd      }t        | j                        rZt	        j
                  | j                        }t        j                  |j                        }t        |g      |j                  z   |z   S t        j                  }| j                  j                  d      }t        |t        |      g      |z   |z   S )Nr	   bigidna)rk   to_bytesr
   rj   	ipaddress
ip_addressr   r$   versionrH   packedr%   ra   rJ   )rD   rk   ipaddress_typerj   s        r   rn   z"ConnectRequest._build_addr_request   s    yy!!!U+#%%dii0B&222::>L,(2994t;;&--L99##F+D,D	23d:TAAr   N)	r   r   r   rM   rN   r'   rH   rL   rn   r   r   r   ri   ri      s&    
I
Iu 

BU 
Br   ri   c                   `    e Zd ZU eed<   eed<   eed<   eed<   eed<   d Zede	dd fd	       Z
y
)ConnectReplyr   replyrsv
bound_host
bound_portc                      y rA   r   rK   s    r   rU   zConnectReply.validate   s    r   rV   rF   c                    |st        d      |d   }|t        k7  rt        d|d      	 t        |d         }|t        j
                  k7  r#t        j                  |d      }t        ||	      	 |d
   }|t        k7  rt        dt        d      	 |d   }|dd }|dd  }|t        j                  k(  r%t        j                  t        j                  |      }	nn|t        j                  k(  r%t        j                  t        j                  |      }	n6|t        j                   k(  r|dd  j#                         }	nt        d|d      t$        j'                  |d      }
 | ||||	|
      S # t        $ r t        d      t        $ r t        d|d   d      w xY w# t        $ r t        d      w xY w# t        $ r t        d      w xY w)NzEmpty connect replyr   rX   rY   r   zMalformed connect replyzInvalid reply code: zUnknown error)
error_coder	   zThe reserved byte must be r   r   zInvalid address type: rp   )r   r{   r|   r}   r~   )r   rI   r.   
IndexErrorr"   r1   ReplyMessagesgetrm   r   r    socket	inet_ntopAF_INETr!   AF_INET6r%   decoder'   
from_bytes)r#   rV   r   r{   msgr|   	addr_typebnd_host_databnd_port_databnd_hostbnd_ports              r   r[   zConnectReply.loads   s   2331g)@T
KLL	Dd1g&E I'''##E?;CSU33	8q'C #:9#dDEE	8QI 2JM IM (((''FH+***''GH+,,,$QR(//1H5i5EFGG>>-7
 	
I  	8677 	D3DGD>BCC	D  	8677	8  	8677	8s#   E+ 1F F5 +/FF25G
N)r   r   r   r'   rN   r.   rM   rU   r&   rH   r[   r   r   r   rz   rz      sC    	H	HOO 4
 4
> 4
 4
r   rz   c                       e Zd Zy) StateServerWaitingForAuthMethodsN)r   r   r   r   r   r   r   r      s    r   r   c                       e Zd ZU eed<   y)StateClientSentAuthMethodsrV   N)r   r   r   r;   rN   r   r   r   r   r      s    
r   r   c                       e Zd ZU eed<   y)StateServerWaitingForAuthrV   N)r   r   r   rP   rN   r   r   r   r   r      s    
r   r   c                   "    e Zd ZU dZee   ed<   y)StateClientAuthenticatedNrV   )r   r   r   rV   r   rd   rN   r   r   r   r   r     s     $D(9
$r   r   c                       e Zd ZU eed<   y)StateClientSentAuthRequestrV   N)r   r   r   r]   rN   r   r   r   r   r   
  s    
r   r   c                       e Zd ZU eed<   y)StateClientSentConnectRequestrV   N)r   r   r   ri   rN   r   r   r   r   r     s    
r   r   c                       e Zd ZU eed<   y)StateServerConnectedrV   N)r   r   r   rz   rN   r   r   r   r   r     s    
r   r   c                   N    e Zd ZU eed<   d ZdedefdZdede	fdZ
ed        Zy	)

Connection_statec                 "    t               | _        y rA   )r   r   rK   s    r   __init__zConnection.__init__3  s    68r   rR   rF   c                 :   t        |      t        u rFt        | j                        t        urt	        d      t        |      | _        |j                         S t        |      t        u rFt        | j                        t        urt	        d      t        |      | _        |j                         S t        |      t        u rFt        | j                        t        urt	        d      t        |      | _        |j                         S t	        dt        |             )Nz0Server is not currently waiting for auth methodsz2Server is not currently waiting for authenticationzClient is not authenticatedzInvalid request type: )typer;   r   r   RuntimeErrorr   rL   r]   r   r   ri   r   r   rT   s     r   sendzConnection.send6  s    =..DKK (HH"#UVV4W=DK==?"=K'DKK (AA"#WXX4W=DK==?"=N*DKK (@@"#@AA7@DK==?"3DM?CDDr   rV   c                 j   t        | j                        t        u r{t        j	                  |      }|j                  | j                  j                         |j                  t        j                  k(  rt        |      | _        |S t               | _        |S t        | j                        t        u r(t        j	                  |      }t        |      | _        |S t        | j                        t        u r(t        j	                  |      }t!        |      | _        |S t#        d| j                         )N)rV   zInvalid connection state: )r   r   r   rP   r[   rU   rV   rQ   r   r   r   r   r   rd   r   rz   r   r   )rD   rV   r{   s      r   receivezConnection.receiveK  s     ::#))$/ENN4;;++,||z;;;7UC L 78L ::OOD)E2>DKL == &&t,E.E:DKL7}EFFr   c                     | j                   S rA   )r   rK   s    r   statezConnection.statea  s    {{r   N)r   r   r   ConnectionStaterN   r   RequestrH   r   Replyr   propertyr   r   r   r   r   r   0  sM    9EG E E*GE Ge G,  r   r   )1enumrs   r   typingr   r   dataclassesr   r   errorsr   _helpersr
   rm   NULLrg   rI   IntEnumr   r   r)   r.   r1   r2   r3   r4   r5   r6   r7   r8   r9   r   r;   rP   r]   rd   ri   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>r      s      " (  $ !    d\	 /$,, /dll 	& 	& *=$$&I!!#8 2  "J=##%N((*F
 D D D" + + +<     + + +, B B B, ?
 ?
 ?
D	 	       % % %           		 $!3 3r   