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}zzt 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peernameI[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zd}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rW W |dur|
  d
S d
S t||}
||
  t j| |dI dH  t j|d|dI dH }|dkrW W |dur|
  d
S d
S t|}	|	jtjkrW 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 rW W |dur|
  dS dS || j) t j| |dI dH  |dI dH }|*| j+dkrW 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:%s8[SOCKS5] Sending connect request to SOCKS server @ %s:%dFL[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rW W |dur|
  d
S d
S | jdu rW 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rt|tr|jtjtj tj!tj"fv r|d|fW S |jtj#fv rd|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