o
    �õ±j2  ã                   @   sº   d dl Z d dlZd dlZd dlmZ d dlmZmZ d dlm	Z	m
Z
mZ d dlmZmZmZmZmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZ d d	lmZ G d
d„ dƒZdS )é    N)Úlogger)ÚSocksServerVersionÚSocksCommsMode)ÚSOCKS4RequestÚSOCKS4ReplyÚSOCKS4CDCode)
ÚSOCKS5MethodÚ
SOCKS5NegoÚSOCKS5NegoReplyÚSOCKS5RequestÚSOCKS5ReplyÚSOCKS5ReplyTypeÚSOCKS5CommandÚSOCKS5PlainAuthÚSOCKS5PlainAuthReplyÚSOCKS5ServerErrorReply)ÚSocksTarget)ÚSocksCredential)ÚSocksQueueComms)ÚSOCKSClientc                   @   sh   e Zd Zdd„ Zdd„ Zejejejgdfdd„Z	ddd	„Z
dd
d„Zddd„Zddd„Zddd„ZdS )ÚSocksSecurityc                 C   s4   d | _ d | _d | _d | _d | _d | _d | _d | _d S ©N)Ú	server_ipÚserver_portÚserver_sslctxÚtimeoutÚverify_hostÚverify_portÚverify_sendÚverify_recv©Úself© r"   ú„/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/asysocks/security.pyÚ__init__   s   
zSocksSecurity.__init__c                 C   s   d S r   r"   r    r"   r"   r#   Úsocks4_noauth   s   zSocksSecurity.socks4_noauthNc                 Ã   sî  �g }g }g }|D ]è}d}d}zØz¡t  d|j ¡ ztjtj| j| j| jd�| j	d�I dH \}}t  d¡ W n+ t
ya }	 zt  d¡ dd|	fW  Y d}	~	W W |durZ| ¡    S   S d}	~	ww t |g¡}
t  d| d¡ ¡ | |
 ¡ ¡ tj| ¡ |d�I dH  tjt |¡|d�I dH }t  d	| d¡|jjf ¡ |j|kr«| |¡ n| |¡ W n, t
yÝ }	 z t  d
|j|	f ¡ | ||	f¡ W Y d}	~	W |durØ| ¡  q	d}	~	ww W |durç| ¡  q	|durñ| ¡  w w |||fS )z;
		Checks which auth methods are supported by the server
		Nz	method %s©Ússl©r   úConnected to socks server!ú"Failed to connect to SOCKS server!ú6[SOCKS5] Sending negotiation command to server @ %s:%dÚpeernameúI[SOCKS5] Got negotiation reply from from %s! Server choosen auth type: %sz+Failed proto test for method %s. Reason: %s)r   ÚdebugÚnameÚasyncioÚwait_forÚopen_connectionr   r   r   r   Ú	ExceptionÚcloser	   Úfrom_methodsÚget_extra_infoÚwriteÚto_bytesÚdrainr
   Úfrom_streamreaderÚMETHODÚappend)r!   Úmethodsr   Ú	supportedÚnotsupportedÚerrorsÚmethodÚremote_readerÚremote_writerÚeÚnegoÚrep_negor"   r"   r#   Úsocks5_authmethods    s~   €ýú
ÿ€àþþÿÿ

€
€ù€€ÿ
ÿ
z SocksSecurity.socks5_authmethodsc              
   Ã   s  ��zó�zÏd}d}zt jt j| j| j| jd�| jd�I dH \}}t d¡ W n& t	yL } zt d¡ d|fW  Y d}~W W |durG| 
¡  S S d}~ww t d¡ tjg}t |¡}t d| d¡ ¡ | | ¡ ¡ t j| ¡ |d�I dH  t jt |¡|d�I dH }	t d	| d¡|	jjf ¡ |	jtjkr§W W |dur¥| 
¡  d
S d
S t ||¡}
| |
 ¡ ¡ t j| ¡ |d�I dH  t j| d¡|d�I dH }|dkrßW W |durÝ| 
¡  d
S d
S t |¡}	|	jtjkrøW W |durö| 
¡  d
S d
S | jdu �rW W |du�r| 
¡  dS dS t d| j| j f ¡ t d| d¡ ¡ zt! "| j¡}W n   | j}Y | t# t$j%|t&| j ƒ¡ ¡ ¡ t j| ¡ |d�I dH  t jt' |¡|d�I dH }|j(tjk�rtd|j(jfW W |du�rs| 
¡  S S t d| d¡ ¡ | j)du �r“W W |du�r‘| 
¡  dS dS | | j)¡ t j| ¡ |d�I dH  | d¡I dH }| *| j+¡dk�rÅW W |du�rÃ| 
¡  d
S d
S W W |du�rÒ| 
¡  dS dS  t	�yõ } zd|fW  Y d}~W |du�rð| 
¡  S S d}~ww |du�r | 
¡  w w )z‡
		Tries to open connection to a remote endpoint using the socks proxy server using plaintext auth method with username and password
		Nr&   r(   r)   r*   ú[SOCKS5] invokedr+   r,   r-   ©FNé   ó    ©TNú![SOCKS5] Opening channel to %s:%sú8[SOCKS5] Sending connect request to SOCKS server @ %s:%dFúL[SOCKS5] Server @ %s:%d successfully set up the connection to the endpoint! é   éÿÿÿÿ),r0   r1   r2   r   r   r   r   r   r.   r3   r4   r   ÚPLAINr	   r5   r6   r7   r8   r9   r
   r:   r;   r/   r   Ú	constructÚreadr   Ú
from_bytesÚSTATUSr   Ú	SUCCEEDEDr   r   Ú	ipaddressÚ
ip_addressr   r   ÚCONNECTÚintr   ÚREPr   Úfindr   )r!   ÚusernameÚpasswordr   rB   rC   rD   r=   rE   rF   ÚauthÚrep_dataÚtargetÚrepÚdatar"   r"   r#   Úsocks5_login]   s  €ýú
d
ÿ€š

þþÿÿLÿ¶þþ<ÿ
Æ7ÿÌ
3ÿÏýûþþ

ÿì
ÿðþ
ÿú
ÿü

ÿ€ü

ÿzSocksSecurity.socks5_loginc              
   Ã   s\  ��z �z|d}d}zt jt j| j| j| jd�| jd�I dH \}}t d¡ W n& t	yL } zt d¡ d|fW  Y d}~W W |durG| 
¡  S S d}~ww t d¡ tjg}t |¡}t d| d¡ ¡ | | ¡ ¡ t j| ¡ |d�I dH  t jt |¡|d�I dH }t d	| d¡|jjf ¡ |jtjkr§W W |dur¥| 
¡  d
S d
S | jdu rºW W |dur¸| 
¡  dS dS t d| j| jf ¡ t d| d¡ ¡ zt | j¡}W n   | j}Y | t tj|t| jƒ¡ ¡ ¡ t j| ¡ |d�I dH  t jt  |¡|d�I dH }	|	j!t"j#k�r!d|	j!jfW W |du�r | 
¡  S S t d| d¡ ¡ | j$du �r@W W |du�r>| 
¡  dS dS | | j$¡ t j| ¡ |d�I dH  | %d¡I dH }
|
 &| j'¡dk�rrW W |du�rp| 
¡  d
S d
S W W |du�r| 
¡  dS dS  t	�y¢ } zd|fW  Y d}~W |du�r�| 
¡  S S d}~ww |du�r­| 
¡  w w )zg
		Tries to open connection to a remote endpoint using the socks proxy server without authentication
		Nr&   r(   r)   r*   rH   r+   r,   r-   rI   rL   rM   rN   FrO   rP   rQ   )(r0   r1   r2   r   r   r   r   r   r.   r3   r4   r   ÚNOAUTHr	   r5   r6   r7   r8   r9   r
   r:   r;   r/   r   r   rX   rY   r   rS   r   rZ   r[   r   r\   r   rW   r   rT   r]   r   )r!   r   rB   rC   rD   r=   rE   rF   rb   rc   rd   r"   r"   r#   Úsocks5_noauth×   sØ   €ýú
P
ÿ€®

þþÿÿ8ÿ
Ë4ÿÎýûþþ

ÿë
ÿïþ
	ÿù
ÿü

ÿ€ü

ÿzSocksSecurity.socks5_noauthc              
   Ã   s  �zjt ƒ }tj|_| j|_| j|_d|_d|_d|_| j	|_
d|_t dd¡|_d|_d|_tƒ }||_||_t ¡ }t ¡ }t||ƒ}t||ƒ}	|	 ¡ I dH \}
}|du rYW dS t|tƒrg|jtjkrgW d	S |
|fW S  ty� } z
d|fW  Y d}~S d}~ww )
ú<
		Tests if port binding is supported by the socks server
		Té
   rP   z0.0.0.0i¸ˆ  iPÃ  NrL   rI   )r   r   ÚSOCKS5Úversionr   r   Úis_bindr   Úbuffer_sizer   Ússl_ctxÚendpoint_ipÚrandomÚrandintÚendpoint_portÚendpoint_timeoutÚ	only_bindr   r^   r_   r0   ÚQueuer   r   Úhandle_queueÚ
isinstancer   Úreplyr   ÚCOMMAND_NOT_SUPPORTEDr3   ©r!   r^   r_   r   rb   Ú
credentialÚin_qÚout_qÚcommsÚclientÚresÚerrrD   r"   r"   r#   Úsocks5_bind>  s@   €



€ÿzSocksSecurity.socks5_bindc              
   Ã   s  �zut ƒ }tj|_| j|_| j|_d|_d|_d|_| j	|_
| j|_| jdur*| jnd|_d|_d|_tƒ }||_||_||_t ¡ }t ¡ }t||ƒ}t||ƒ}	|	 ¡ I dH \}
}|du raW dS t|tƒrr|jtjtjfv rrW dS |
|fW S  tyŒ } z
d|fW  Y d}~S d}~ww )	rh   Fri   rP   Né   TrL   rI   ) r   r   rj   rk   r   r   rl   r   rm   r   rn   ro   r   rr   rs   Ú	only_openr   r^   r_   r{   r0   ru   r   r   rv   rw   r   rx   r   ÚFAILUREÚCONN_NOT_ALLOWEDr3   rz   r"   r"   r#   Úsocks5_localf  sB   €



€ÿzSocksSecurity.socks5_localrQ   c              
   Ã   sR  �z‘|dkrŒ|d8 }t ƒ }tj|_| j|_| j|_d|_d|_d|_| j	|_
| j|_| j|_d|_d|_tƒ }||_||_||_t ¡ }t ¡ }t||ƒ}	t ¡ }
t|	||
d�}| ¡ I dH \}}|dur‰t|tƒrˆ|jtjtj tj!tj"fv r|d|fW S |jtj#fv rˆd|fW S qW d	S dt$d
ƒfW S  t$y¨ } z
d|fW  Y d}~S d}~ww )rh   r   é   Fri   rP   NT)Úbind_evtrL   zMax retries reached!)%r   r   rj   rk   r   r   rl   r   rm   r   rn   r   ro   r   rr   rs   r„   r   r^   r_   r{   r0   ru   r   ÚEventr   rv   rw   r   rx   r   ÚTTL_EXPIREDÚCONN_REFUSEDÚHOST_UNREACHABLEr†   ÚADDRESS_TYPE_NOT_SUPPORTEDr3   )r!   r^   r_   r   Úretriesrb   r{   r|   r}   r~   Úchannel_open_evtr   r€   r�   rD   r"   r"   r#   Úsocks5_test_port�  sN   €



€ÿzSocksSecurity.socks5_test_portr   )NNN)NNNrQ   )Ú__name__Ú
__module__Ú__qualname__r$   r%   r   rf   rR   ÚGSSAPIrG   re   rg   r‚   r‡   r‘   r"   r"   r"   r#   r      s    
=
z
g
()r   ) r0   rX   rp   Úasysocksr   Úasysocks.common.constantsr   r   Úasysocks.protocol.socks4r   r   r   Úasysocks.protocol.socks5r   r	   r
   r   r   r   r   r   r   r   Úasysocks.common.targetr   Úasysocks.common.credentialsr   Úasysocks.common.commsr   Úasysocks.clientr   r   r"   r"   r"   r#   Ú<module>   s   0