U
    wi%                     @   s  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  Z ZZdZG d	d
 d
e jZG dd de jZG dd de jZG dd de jZejdejdejdejdejdejdejdejdejdi	ZeG dd dZ eG dd dZ!eG dd dZ"eG d d! d!Z#eG d"d# d#Z$eG d$d% d%Z%G d&d' d'Z&eG d(d) d)Z'eG d*d+ d+Z(eG d,d- d-Z)eG d.d/ d/Z*eG d0d1 d1Z+eG d2d3 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 d4d5 d5Z0dS )6    N)OptionalUnion)	dataclassfield   )
ReplyError   )is_ip_address   c                   @   s   e Zd ZdZdZdZdZdS )
AuthMethodr   r   r      N)__name__
__module____qualname__	ANONYMOUSZGSSAPIUSERNAME_PASSWORDNO_ACCEPTABLE r   r   B/tmp/pip-unpacked-wheel-kpmwgv_b/python_socks/_protocols/socks5.pyr      s   r   c                   @   s*   e Zd ZdZdZdZeedddZdS )AddressTyper         )verc                 C   s(   |dkr| j S |dkr| jS tdd S )Nr      zInvalid IP version)IPV4IPV6
ValueError)clsr   r   r   r   from_ip_ver   s
    zAddressType.from_ip_verN)	r   r   r   r   DOMAINr   classmethodintr   r   r   r   r   r      s
   r   c                   @   s   e Zd ZdZdZdZdS )Commandr   r   r   N)r   r   r   CONNECTZBINDZUDP_ASSOCIATEr   r   r   r   r"   %   s   r"   c                   @   s0   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
S )	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$   +   s   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                   @   sN   e Zd ZU ee ed< ee ed< eddZeed< dd Z	e
dd	d
ZdS )AuthMethodsRequestusernamepasswordF)initmethodsc                 C   s.   t tjg}| jr$| jr$|tj || _d S N)	bytearrayr   r   r1   r2   appendr   r4   )selfr4   r   r   r   __post_init__J   s    z AuthMethodsRequest.__post_init__returnc                 C   s   t tt| jg| j S r5   )bytes	SOCKS_VERlenr4   r8   r   r   r   dumpsR   s    zAuthMethodsRequest.dumpsN)r   r   r   r   str__annotations__r   r4   r6   r9   r<   r@   r   r   r   r   r0   D   s
   
r0   c                   @   sD   e Zd ZU dZeed< eed< edddZe	e
d ddd	Zd
S )AuthMethodReplyr   r   method)requestc                 C   s    | j |jkrtd| j  d S )Nz(Unexpected SOCKS authentication method: )rD   r4   r   r8   rE   r   r   r   validate]   s    zAuthMethodReply.validatedatar;   c                 C   s   t || jkrtd|d }|tkr4td| zt|d }W n( tk
rl   td|d dY nX |tjkrtd| ||dS )	Nz%Malformed authentication method replyr   !Unexpected SOCKS version number: r   zInvalid authentication method: #02Xz1No acceptable authentication methods were offered)r   rD   )r>   SIZEr   r=   r   r   r   )r   rI   r   rD   r   r   r   loadsa   s    
zAuthMethodReply.loadsN)r   r   r   rL   r!   rB   r   r0   rG   r    r<   rM   r   r   r   r   rC   V   s   
rC   c                   @   s0   e Zd ZU dZeed< eed< edddZdS )AuthRequestr   r1   r2   r:   c                 C   sZ   t  }|| j |t| j || jd7 }|t| j || jd7 }t|S )Nascii)r6   r7   VERr>   r1   encoder2   r<   r8   rI   r   r   r   r@   |   s    zAuthRequest.dumpsN)r   r   r   rP   rA   rB   r<   r@   r   r   r   r   rN   u   s   
rN   c                   @   s6   e Zd ZU dZeed< eed< eed dddZdS )	AuthReplyr   r   statusrH   c                 C   sT   t || jkrtd|d }|tjkr0td|d }|tkrHtd| ||dS )NzMalformed auth replyr   zInvalid authentication responser   z,Username and password authentication failure)r   rT   )r>   rL   r   rN   rP   AUTH_GRANTED)r   rI   r   rT   r   r   r   rM      s    
zAuthReply.loadsN)	r   r   r   rL   r!   rB   r    r<   rM   r   r   r   r   rS      s
   
rS   c                   @   s:   e Zd ZU eed< eed< edddZedddZdS )	ConnectRequesthostportr:   c                 C   s$   t ttjtg}||  7 }t|S r5   )r6   r=   r"   r#   RSV_build_addr_requestr<   rR   r   r   r   r@      s    zConnectRequest.dumpsc                 C   sr   | j dd}t| jrDt| j}t|j}t	|g|j
 | S tj}| jd}t	|t|g| | S d S )Nr   bigidna)rX   to_bytesr	   rW   	ipaddress
ip_addressr   r   versionr<   packedr   rQ   r>   )r8   rX   ipZaddress_typerW   r   r   r   rZ      s    
z"ConnectRequest._build_addr_requestN)	r   r   r   rA   rB   r!   r<   r@   rZ   r   r   r   r   rV      s   
rV   c                   @   sR   e Zd ZU eed< eed< eed< eed< eed< dd Zee	d dd	d
Z
dS )ConnectReplyr   replyrsv
bound_host
bound_portc                 C   s   d S r5   r   r?   r   r   r   rG      s    zConnectReply.validaterH   c                 C   s  |st d|d }|tkr,t d|dzt|d }W nB tk
rX   t dY n( tk
r~   t d|d dY nX |tjkrt|d}t ||d	z|d
 }W n tk
r   t dY nX |tkrt dtdz$|d }|dd }|dd  }W n tk
r&   t dY nX |t	j
krDttj|}	nJ|t	jkr`ttj|}	n.|t	jkr~|dd   }	nt d|dt|d}
| ||||	|
dS )NzEmpty connect replyr   rJ   rK   r   zMalformed connect replyzInvalid reply code: zUnknown error)Z
error_coder   zThe reserved byte must be r   r   zInvalid address type: r[   )r   rd   re   rf   rg   )r   r=   r$   
IndexErrorr   r'   ReplyMessagesgetrY   r   r   socket	inet_ntopAF_INETr   AF_INET6r   decoder!   
from_bytes)r   rI   r   rd   msgre   Z	addr_typeZbnd_host_dataZbnd_port_dataZbnd_hostZbnd_portr   r   r   rM      sR    
zConnectReply.loadsN)r   r   r   r!   rB   r$   rA   rG   r    r<   rM   r   r   r   r   rc      s   
rc   c                   @   s   e Zd ZdS ) StateServerWaitingForAuthMethodsN)r   r   r   r   r   r   r   rs      s   rs   c                   @   s   e Zd ZU eed< dS )StateClientSentAuthMethodsrI   N)r   r   r   r0   rB   r   r   r   r   rt      s   
rt   c                   @   s   e Zd ZU eed< dS )StateServerWaitingForAuthrI   N)r   r   r   rC   rB   r   r   r   r   ru      s   
ru   c                   @   s   e Zd ZU dZee ed< dS )StateClientAuthenticatedNrI   )r   r   r   rI   r   rS   rB   r   r   r   r   rv     s   
rv   c                   @   s   e Zd ZU eed< dS )StateClientSentAuthRequestrI   N)r   r   r   rN   rB   r   r   r   r   rw   
  s   
rw   c                   @   s   e Zd ZU eed< dS )StateClientSentConnectRequestrI   N)r   r   r   rV   rB   r   r   r   r   rx     s   
rx   c                   @   s   e Zd ZU eed< dS )StateServerConnectedrI   N)r   r   r   rc   rB   r   r   r   r   ry     s   
ry   c                   @   sJ   e Zd ZU eed< dd ZeedddZee	ddd	Z
ed
d ZdS )
Connection_statec                 C   s   t  | _d S r5   )rs   r{   r?   r   r   r   __init__3  s    zConnection.__init__)rE   r;   c                 C   s   t |tkr4t | jtk	r"tdt|| _| S t |tkrht | jtk	rVtdt	|| _| S t |t
krt | jtk	rtdt|| _| S tdt | d S )Nz0Server is not currently waiting for auth methodsz2Server is not currently waiting for authenticationzClient is not authenticatedzInvalid request type: )typer0   r{   rs   RuntimeErrorrt   r@   rN   ru   rw   rV   rv   rx   rF   r   r   r   send6  s     


zConnection.sendrH   c                 C   s   t | jtkrLt|}|| jj |jtj	kr@t
|d| _nt | _|S t | jtkrtt|}t|d| _|S t | jtkrt|}t|d| _|S td| j d S )N)rI   zInvalid connection state: )r}   r{   rt   rC   rM   rG   rI   rD   r   r   ru   rv   rw   rS   rx   rc   ry   r~   )r8   rI   rd   r   r   r   receiveK  s     


zConnection.receivec                 C   s   | j S r5   )r{   r?   r   r   r   statea  s    zConnection.stateN)r   r   r   ConnectionStaterB   r|   Requestr<   r   Replyr   propertyr   r   r   r   r   rz   0  s   
rz   )1enumr^   rl   typingr   r   Zdataclassesr   r   errorsr   Z_helpersr	   rY   ZNULLrU   r=   IntEnumr   r   r"   r$   r'   r(   r)   r*   r+   r,   r-   r.   r/   rj   r0   rC   rN   rS   rV   rc   rs   rt   ru   rv   rw   rx   ry   r   r   r   rz   r   r   r   r   <module>   s            B