U
    wi                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZ ddlmZ ddl	m
Z
 d  ZZd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iZeG dd dZeG dd dZG dd dZdS )    N)	dataclass)Optional   )
ReplyError   )is_ipv4_address   c                   @   s   e Zd ZdZdZdS )Commandr   r   N)__name__
__module____qualname__CONNECTZBIND r   r   B/tmp/pip-unpacked-wheel-kpmwgv_b/python_socks/_protocols/socks4.pyr	      s   r	   c                   @   s   e Zd ZdZdZdZdZdS )	ReplyCodeZ   [   \   ]   N)r
   r   r   REQUEST_GRANTEDREQUEST_REJECTED_OR_FAILEDCONNECTION_FAILEDAUTHENTICATION_FAILEDr   r   r   r   r      s   r   zRequest grantedzRequest rejected or failedzLRequest rejected because SOCKS server cannot connect to identd on the clientzPRequest rejected because the client program and identd report different user-idsc                   @   s2   e Zd ZU eed< eed< ee ed< dd ZdS )ConnectRequesthostportuser_idc                 C   s   | j dd}d}t| jr,t| jj}nd}ttttdg}t	t
tjg}||7 }||7 }| jrt|| jd7 }|t |r|| jd7 }|t t|S )Nr   bigFTr   asciiidna)r   to_bytesr   r   	ipaddressIPv4AddresspackedbytesNULL	bytearray	SOCKS_VERr	   r   r   encodeappend)selfZ
port_bytesZinclude_hostnameZ
host_bytesdatar   r   r   dumps,   s     


zConnectRequest.dumpsN)r
   r   r   str__annotations__intr   r,   r   r   r   r   r   &   s   
r   c                   @   sF   e Zd ZU dZeed< eed< eed< eed< ee	d dddZ
d	S )
ConnectReply   rsvreplyr   r   r+   returnc                 C   s  t || jkrtd|d }|tkr:td|d dzt|d }W n( tk
rr   td|d dY nX |tjkrt|d}t||dzt	j
|d	d
 dd}W n tk
r   tdY nX zttj|d
d }W n tk
r   tdY nX | ||||dS )NzMalformed connect replyr   zUnexpected reply version: z#02Xr   zInvalid reply code: zUnknown error)Z
error_coder   r   r   )	byteorderzInvalid port datar1   )r2   r3   r   r   )lenSIZEr   RSVr   
ValueErrorr   ReplyMessagesgetr/   
from_bytessocket	inet_ntopAF_INET)clsr+   r2   r3   msgr   r   r   r   r   loadsO   s*    
zConnectReply.loadsN)r
   r   r   r8   r/   r.   r   r-   classmethodr$   rC   r   r   r   r   r0   F   s   
r0   c                   @   s,   e Zd ZeedddZeedddZdS )
Connection)requestr5   c                 C   s   |  S N)r,   )r*   rF   r   r   r   sendp   s    zConnection.sendr4   c                 C   s
   t |S rG   )r0   rC   )r*   r+   r   r   r   receives   s    zConnection.receiveN)r
   r   r   r   r$   rH   r0   rI   r   r   r   r   rE   o   s   rE   )enumr!   r>   Zdataclassesr   typingr   errorsr   Z_helpersr   r9   r%   r'   IntEnumr	   r   r   r   r   r   r;   r   r0   rE   r   r   r   r   <module>   s0     (