o
    �õ±j÷a  ã                   @   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 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  G d	d
„ d
e!ƒZ"G dd„ dƒZ#dS )é    N)Úlogger)ÚSocksServerVersionÚSocksCommsMode)ÚHTTPResponseÚHTTPProxyAuthRequiredExceptionÚHTTPProxyAuthFailed)ÚSOCKS4RequestÚSOCKS4ReplyÚSOCKS4CDCode)ÚSOCKS4ARequestÚSOCKS4AReplyÚSOCKS4ACDCode)
ÚSOCKS5MethodÚ
SOCKS5NegoÚSOCKS5NegoReplyÚSOCKS5RequestÚSOCKS5ReplyÚSOCKS5ReplyTypeÚSOCKS5PlainAuthÚSOCKS5PlainAuthReplyÚSOCKS5ServerErrorReplyÚSOCKS5AuthFailed)Ú
SSLWrapperc                       s   e Zd Zd‡ fdd„	Z‡  ZS )ÚSocksTunnelErrorúKSomething failed setting up the tunnel! See innerexception for more detailsc                    s   || _ || _tƒ  | j¡ d S ©N)ÚinnerexceptionÚmessageÚsuperÚ__init__)Úselfr   r   ©Ú	__class__© ú‚/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/asysocks/client.pyr      s   zSocksTunnelError.__init__)r   )Ú__name__Ú
__module__Ú__qualname__r   Ú__classcell__r#   r#   r!   r$   r      s    r   c                   @   s’   e Zd Zddd„Zdd„ Zdd„ Zedd	d
„ƒZed dd„ƒZeddd„ƒZ	ddd„Z
d!dd„Zd!dd„Zd!dd„Zdd„ Zdd„ Zd"dd„ZdS )#ÚSOCKSClientNc                 C   sb   || _ t|tƒdu r|g| _ || _d | _d | _d | _d | _d | _d | _	|| _
d | _d | _|| _d S )NF)ÚproxiesÚ
isinstanceÚlistÚcommsÚserver_taskÚproxytask_inÚproxytask_outÚproxy_stopped_evtÚproxy_running_evtÚhttp_auth_ctxÚbind_progress_evtÚ	bind_portÚssl_wrapperÚchannel_open_evt)r    r-   r*   Úbind_evtr7   r#   r#   r$   r      s   
zSOCKSClient.__init__c                 Ã   sF   �| j d ur| j  ¡  | jd ur| j ¡  | jd ur!| j ¡  d S d S r   )r1   Úsetr/   Úcancelr0   ©r    r#   r#   r$   Ú	terminate%   s   €




ÿzSOCKSClient.terminatec                 C   s   | j d ur
| j  ¡ S d S r   )r6   Úget_server_certr;   r#   r#   r$   Úget_peercert-   s   

ÿzSOCKSClient.get_peercerté   c              
   Ã   sö  �zðz™	 t  t j|  |¡|d�¡}t  | ¡ ¡}t j||gt jd�I d H \}}|D ]q}	|	I d H }
d}|
du roz|D ]}t j|dd�I d H }q9W n   Y n|dkr]| |
¡ | ¡ I d H  t 	d¡  W W | 
¡  | ¡  d S |
dkr…t 	d¡  W W | 
¡  | ¡  d S | |
¡ | ¡ I d H  |D ]}| ¡  q“q)q t jy¯   Y W | 
¡  | ¡  d S  t jyÁ   t 	dt|ƒ ¡ Y n tyÛ } zt 	d	t|ƒ ¡ W Y d }~nd }~ww W | 
¡  | ¡  d S W | 
¡  | ¡  d S | 
¡  | ¡  w )
NT©Útimeout)Úreturn_whenó    g      à?zother side disconnected!zStream channel broken!z"proxy_stream timeout! (timeout=%s)zproxy_stream err: %s)ÚasyncioÚcreate_taskÚwait_forÚreadÚwaitÚFIRST_COMPLETEDÚwriteÚdrainr   ÚdebugÚcloser9   r:   ÚCancelledErrorÚTimeoutErrorÚstrÚ	Exception)Ú	in_streamÚ
out_streamr1   Úbuffer_sizerA   Ú	read_taskÚ	wait_taskÚfinished_tasksÚpending_tasksÚtaskÚresultÚ	last_dataÚptÚer#   r#   r$   Úproxy_stream1   sn   €þ
ÿ

ñ

ô
ÿâ ú€ÿÿýÿ
zSOCKSClient.proxy_streamc                 Ã   s,  �z„z:|  ¡ s;|  ¡ I d H }|d u r+t d¡ W W | ¡  z| ¡  W d S    Y d S | |¡ | ¡ I d H  |  ¡ rW n6 tj	yX   Y W | ¡  z| ¡  W d S    Y d S  t
yr } zt dt|ƒ ¡ W Y d }~nd }~ww W | ¡  z| ¡  W d S    Y d S | ¡  z| ¡  W w    Y w )Nz"proxy_queue_in client disconncted!zproxy_queue_in err: %s)Úis_setÚgetr   rL   r9   rM   rJ   rK   rD   rN   rQ   rP   )Úin_queueÚwriterr1   rT   Údatar]   r#   r#   r$   Úproxy_queue_in^   sL   €

õú€ù€ÿ€üzSOCKSClient.proxy_queue_inc              
   Ã   s4  �z“zFt |dƒ}	 |r| |¡I d H }ntj| |¡|d�I d H }|dkr>t d¡ |  d tdƒf¡I d H  W W | ¡  d S |  |d f¡I d H  q	 tj	yd   |  d tdƒf¡I d H  Y W | ¡  d S  ty� } zt d| ¡ z|  d |f¡I d H  W n   Y W Y d }~nd }~ww W | ¡  d S | ¡  w )	NÚwsnet_reader_typeTr@   rC   z%proxy_queue_out endpoint disconncted!z0proxy_queue_out endpoint disconncted gracefully!zproxy_queue_out got cancelled!zproxy_queue_out exception %s)
ÚhasattrrG   rD   rF   r   rL   ÚputrQ   r9   rN   )Ú	out_queueÚreaderr1   rT   rA   Úis_wsnetrc   r]   r#   r#   r$   Úproxy_queue_outs   s>   €
þ
õôù€û€zSOCKSClient.proxy_queue_outc              
   Ã   s  �zìt  d|j|jf ¡ d|j|j|j|jf }| ¡ }|d u r•| |d ¡ tj| ¡ |d�I d H  t	j
||d�I d H \}}|d urF|‚|jdkrVt  d¡ d|d fW S |jdkr’t  d	¡ |jd u ritd
ƒ‚|j dd ¡}	|	d u rxtdƒ‚|	 dd¡\}	}
t  d|	 ¡ |	 ¡ }d|tƒ fW S W d S |dkrèt d|jj|jjf  ¡ ¡}|d | d }| |d ¡ tj| ¡ |d�I d H  t	j
||d�I d H \}}|d urÕ|‚|jdkråt  d¡ d|d fW S tƒ ‚td| ƒ‚ t�y
 } zt  d¡ dd |fW  Y d }~S d }~ww )Nz[HTTP] Opening channel to %s:%sz%CONNECT %s:%s HTTP/1.1
Host: %s:%s
s   
r@   éÈ   z&[HTTP] Server succsessfully connected!Ti—  z"[HTTP] Server proxy auth required!z/HTTP proxy auth required but no credential set!zPROXY-AUTHENTICATEzSHTTP proxy requires authentication, but requested auth type could not be determinedú é   zHTTP proxy requires %s authFÚBASICz%s:%ss   Proxy-Authorization: Basic z"[HTTP] Server proxy auth succsess!z?HTTP proxy requires %s authentication, but it's not implementedÚrun_http)r   rL   Úendpoint_ipÚendpoint_portÚencoderJ   rD   rF   rK   r   Úfrom_streamreaderÚstatusÚ
credentialrQ   Úheaders_upperr`   ÚsplitÚupperr   Úbase64Ú	b64encodeÚusernameÚpasswordr   )r    ÚproxyÚremote_readerÚremote_writerrA   r3   Úconnect_cmdÚrespÚerrÚ	auth_typeÚ_Ú	auth_dataÚauth_connectr]   r#   r#   r$   rp   ‘   sX   €




ò


€þzSOCKSClient.run_httpc           	   
   Ã   ó  �zjt  d|j|j|j|jf ¡ t |¡}|jdur&|jj	dur&|jj	|_
| | ¡ ¡ tj| ¡ |d�I dH  tjt |¡|d�I dH \}}|durN|‚|du rVtdƒ‚|jtjkrdtd|jj ƒ‚t  d¡ W dS  ty† } zt  d¡ d	|fW  Y d}~S d}~ww )
úh
		Does the intial "handshake" instructing the remote server to set up the connection to the endpoint
		z0[SOCKS4 %s:%s] Opening channel to %s:%s (target)Nr@   ú0Socks server failed to reply to CONNECT request!ú*Socks server returned error on CONNECT! %sz[SOCKS4] Channel opened©TNÚ
run_socks4F)r   rL   Ú	server_ipÚserver_portrq   rr   r   Úfrom_targetrv   r|   ÚUSERIDrJ   Úto_bytesrD   rF   rK   r	   rt   rQ   ÚCDr
   ÚREP_GRANTEDÚvalue©	r    r~   r   r€   rA   ÚreqÚreprƒ   r]   r#   r#   r$   r�   Í   ó,   €



€þzSOCKSClient.run_socks4c           	   
   Ã   rˆ   )
r‰   z1[SOCKS4A %s:%s] Opening channel to %s:%s (target)Nr@   rŠ   r‹   z[SOCKS4A] Channel openedrŒ   Úrun_socks4aF)r   rL   rŽ   r�   rq   rr   r   r�   rv   r|   r‘   rJ   r’   rD   rF   rK   r   rt   rQ   r“   r   r”   r•   r–   r#   r#   r$   rš   ç   r™   zSOCKSClient.run_socks4ac              
   Ã   s  �|  ¡ }| ¡ }tjg}|jdur$|jjdur$|jjdur$| tj¡ �zEt	 
|¡}t d| ¡ | | ¡ ¡ tj| ¡ |d�I dH  tjt |¡|d�I dH }	t d||	jjf ¡ |	jtjkr¿|jdu st|jjdu st|jjdu rztd| ƒ‚t d| ¡ | t |jj|jj¡ ¡ ¡ tj| ¡ dd�I dH  tj| d¡|d�I dH }
|
dkr°tƒ ‚t |
¡}	|	jtjkr¾tƒ ‚n|	jtj krËtd	| ƒ‚t d
||f ¡ |j!du rÜW dS | t" #|¡ ¡ ¡ tj| ¡ |d�I dH  tjt$ |¡|d�I dH }|j%tjk�rt &d||j%jf ¡ t'|j%ƒ‚|j(du �r(t d||f ¡ W dS t d||j)f ¡ |j)| _*| j+ ,¡  |j-du �rDW dS tjt$ |¡|d�I dH }|j%tjk�rht &d||j%jf ¡ t'|j%ƒ‚W dS  t�yŠ } zt d||f ¡ d|fW  Y d}~S d}~ww )r‰   Nz8[SOCKS5 %s][SETUP] Sending negotiation command to serverr@   z?[SOCKS5 %s] Got negotiation reply! Server choosen auth type: %szRSOCKS5 %s] server requires PLAIN authentication, but no credentials were supplied!z$[SOCKS5 %s]Preforming plaintext authé   rC   zW[SOCKS5 %s] server requires GSSAPI authentication, but it's not supported at the momentz![SOCKS5 %s] Opening channel to %sTrŒ   z<[SOCKS5 %s] remote end failed to connect to proxy! Reson: %sFzB[SOCKS5 %s] Successfully set up the connection to the endpoint %s z8[SOCKS5 %s] BIND first set completed, port %s available!z"[SOCKS5 %s] Error in run_socks5 %s).Ú	get_snameÚ	get_tnamer   ÚNOAUTHrv   r|   r}   ÚappendÚPLAINr   Úfrom_methodsr   rL   rJ   r’   rD   rF   rK   r   rt   ÚMETHODÚnamerQ   r   Ú	constructrG   r   r   Ú
from_bytesÚSTATUSr   Ú	SUCCEEDEDÚGSSAPIÚ	only_authr   r�   r   ÚREPÚinfor   Úis_bindÚ	BIND_PORTr5   r4   r9   Ú	only_bind)r    r~   r   r€   rA   ÚsnameÚtnameÚmethodsÚnegoÚrep_negoÚrep_datar˜   r]   r#   r#   r$   Ú
run_socks5  s²   €"
þþÿ"þüþþ
ÿ
ÿýþþ

þ
€þzSOCKSClient.run_socks5c                 Ã   sœ  �d }d }�z¼�z”t  d¡ t| jƒdkrt  d¡ tdddƒD �] }|d ur+| ¡  z–| jd jtjkrTddl	m
} | | jd j| jd j| jd j¡I d H \}}nl| jd jtjtjfv r™ddlm} | | jd j| jd j| jd j| jd j| jd j| jd j| jd j¡I d H \}}|d u r˜|‚n'tjtj| jd j| jd j| jd jd	�| jd jd
�I d H \}}t  d¡ W n	   t  d¡ ‚ �zht| jƒD �]^\}}	|	jtjtjfv �r&ztj|  |	||¡| jd jd
�I d H }
W n tj�y   tdƒ‚w |
\}}|d u�r%t| jƒdk�r#|t| jƒd k�r#t |ƒ‚|‚qÒ|	jtj!tj"fv �ruztj|  #|	||¡| jd jd
�I d H }
W n tj�yR   tdƒ‚w |
\}}|d u�rtt| jƒdk�rr|t| jƒd k�rrt |ƒ‚|‚qÒ|	jtj$tj%fv �rÄztj|  &|	||¡| jd jd
�I d H }
W n tj�y¡   tdƒ‚w |
\}}|d u�rÃt| jƒdk�rÁ|t| jƒd k�rÁt |ƒ‚|‚qÒ|	jtj'tj(fv �rztj| j)|	||| j*d�| jd jd
�I d H }
W n tj�yó   tdƒ‚w |
\}| _*}|d u�rt| jƒdk�r|t| jƒd k�rt |ƒ‚|‚qÒ|	jtjtjtjfv �r.|dk�r-tdƒ‚qÒtdƒ‚W  n t+�y>   Y q    ‚ t  d¡ | j, -¡  t .¡ | _/t 0t1j2||| j/| jd j3| jd j4d�¡| _5t 0t1j2||| j/| jd j3| jd j4d�¡| _6t  d¡ | j/ 7¡ I d H  t  d¡ | j5 8¡  | j6 8¡  W n t�y´ } zt  9d¡ W Y d }~nd }~ww W |d u�rÁ| ¡  d S d S |d u�rÍ| ¡  w w )Nz![handle_client] Client connected!rn   úStart chaining...é   r   éÿÿÿÿ©ÚWSNETNetwork©ÚWSNETNetworkWS)Ússlr@   zConnected to socks server!ú"Failed to connect to SOCKS server!z&Proxy Connection establishment timeout©r3   ú1WSNET only supported as the first proxy in chain!úUnknown SOCKS version!z![handle_client] Starting proxy...©rT   rA   z[handle_client] Proxy started!z[handle_client] Proxy stopped!z[handle_client]):r   rL   Úlenr*   ÚrangerM   Úversionr   ÚWSNETÚasysocks.network.wsnetrº   Úopen_connectionrq   rr   Úwsnet_reuseÚWSNETWSÚWSNETWSSÚasysocks.network.wsnetwsr¼   rŽ   r�   ÚagentidrA   rD   rF   Ússl_ctxÚ	enumerateÚSOCKS4ÚSOCKS4Sr�   rO   rQ   r   ÚSOCKS4AÚSOCKS4ASrš   ÚSOCKS5ÚSOCKS5Srµ   ÚHTTPÚHTTPSrp   r3   r   r7   r9   ÚEventr1   rE   r)   r^   rT   Úendpoint_timeoutr/   r0   rH   r:   Ú	exception)r    ri   rb   r€   r   r…   rº   r¼   Úir~   Úxrƒ   r]   r#   r#   r$   Úhandle_clientm  s  €




ý






ù	ÿ


ý
ú
€
*ÿ
$*ÿ
$*ÿ
$0ÿ
$





ûÿ	

ûÿ
	

€ÿ€
ÿ
ÿzSOCKSClient.handle_clientc                 Ã   sZ  �t  d¡ d }d }| jd u rt ¡ | _�z‡�zFt| jƒdkr$t  d¡ tdddƒD �]}|d ur5| ¡  z‹| jd j	t
jkr^ddlm} | | jd j| jd j| jd j¡I d H \}}na| jd j	t
jt
jfv r£ddlm} | | jd j| jd j| jd j| jd j| jd j	| jd j| jd j¡I d H \}}|d u r¢|‚ntjt | jd j| jd j¡| jd jd	�I d H \}}W n	   t  d
¡ ‚ t  d¡ �zht| jƒD �]^\}}|j	t
jt
jfv �r*ztj|  |||¡| jd jd	�I d H }W n tj�y   t dƒ‚w |\}}	|	d u�r)t| jƒdk�r'|t| jƒd k�r't!|	ƒ‚|	‚qÖ|j	t
j"t
jfv �ryztj|  #|||¡| jd jd	�I d H }W n tj�yV   t dƒ‚w |\}}	|	d u�rxt| jƒdk�rv|t| jƒd k�rvt!|	ƒ‚|	‚qÖ|j	t
j$t
j%fv �rÈztj|  &|||¡| jd jd	�I d H }W n tj�y¥   t dƒ‚w |\}}	|	d u�rÇt| jƒdk�rÅ|t| jƒd k�rÅt!|	ƒ‚|	‚qÖ|j	t
j't
j(fv �rztj| j)|||| j*d�| jd jd	�I d H }W n tj�y÷   t dƒ‚w |\}| _*}	|	d u�rt| jƒdk�r|t| jƒd k�rt!|	ƒ‚|	‚qÖ|j	t
jt
jt
jfv �r2|dk�r1t dƒ‚qÖt dƒ‚W  n t+�yB   Y q*   ‚ | jd j,du �rcW W | j- .¡  |d u�ra| ¡  dS dS | jd j/du �su| jd j0du �r‰W W | j- .¡  |d u�r‡| ¡  dS dS | j1d u�r”| j1 .¡  t  d¡ t ¡ | _2| j3j4du �rÓt 5t6j7| j3j8|| j2| jd j9d�¡| _:t 5t6j;| j3j<|| j2| jd j9| jd j=d�¡| _>nVt ?¡ }
t ?¡ }t 5t6j7||| j2| jd j9d�¡| _:t 5t6j;|
|| j2| jd j9| jd j=d�¡| _>t@ A| j3|
|¡I d H \| _B}	|	d u�r|	‚tj| jBjC D¡ | j3jEd	�I d H  | j- .¡  t  d¡ | j2 D¡ I d H  t  d¡ | j: F¡  | j> F¡  W W | j- .¡  |d u�r\| ¡  dS dS  t �yœ } z2| j3j8 Gd |f¡I d H  | j3j< Gd |f¡I d H  d|fW  Y d }~W | j- .¡  |d u�r—| ¡  S S d }~ww | j- .¡  |d u�r¬| ¡  w w )Nz%[queue] Connecting to socks server...rn   r¶   r·   r   r¸   r¹   r»   r@   r¾   z"[queue] Connected to socks server!z'SOCKS4 Connection establishment timeoutz(SOCKS4A Connection establishment timeoutz'SOCKS5 Connection establishment timeoutr¿   z%HTTP Connection establishment timeoutrÀ   rÁ   TrŒ   z[queue] Starting proxy...F)rT   rÂ   z[queue] Proxy started!z[queue] Proxy stopped!)Hr   rL   r4   rD   rØ   rÃ   r*   rÄ   rM   rÅ   r   rÆ   rÇ   rº   rÈ   rq   rr   rÉ   rÊ   rË   rÌ   r¼   rŽ   r�   rÍ   rA   rF   rÏ   rÐ   rÑ   r�   rO   rQ   r   rÒ   rš   rÔ   rÕ   rµ   rÖ   r×   rp   r3   r   r®   r2   r9   Ú	only_openr©   r7   r1   r-   Úwrap_sslrE   r)   rd   ra   rT   r/   rk   rh   rÙ   r0   ÚQueuer   Úfrom_commsettingsr6   Úhandshake_done_evtrH   Úhandshake_timeoutr:   rg   )r    r€   r   r…   rº   r¼   rÛ   r~   rÜ   rƒ   Útransport_inÚtransport_outr]   r#   r#   r$   Úhandle_queue  sx  €






ý






ù	ÿ

þ
û€

*ÿ
$*ÿ
$*ÿ
$0ÿ
$

F
ÿ$»
B
ÿ¿



üÿ

ûÿ

üÿ

ûÿ

 






ÿù


ÿ€ù


ÿzSOCKSClient.handle_queueFc                 Ã   sÐ   �t  ¡ | _t| jtƒdu r| jjdu r| jd u rt  ¡ | _| jd u r(t  ¡ | _| j	j
tjkrWt  | j| j	j| j	j¡I d H }t d¡ | j ¡  |du rS| ¡ I d H  | ¡ S |du rd|  ¡ I d H  d S |  ¡ S )NFTz#[PROXY] Awaiting server task now...)rD   rØ   r2   r+   r*   r,   r¬   r4   r7   r-   Úmoder   ÚLISTENERÚstart_serverrÝ   Ú	listen_ipÚlisten_portr   rL   r9   Úserve_foreverræ   )r    ÚnoblockÚserverr#   r#   r$   ÚrunÃ  s(   €
&



ý

zSOCKSClient.run)NN)r?   N)r?   r   )F)r%   r&   r'   r   r<   r>   Ústaticmethodr^   rd   rk   rp   r�   rš   rµ   rÝ   ræ   rï   r#   r#   r#   r$   r)      s&    
,

<

l  ?r)   )$rD   rz   Ú	tracebackÚasysocksr   Úasysocks.common.constantsr   r   Úasysocks.protocol.httpr   r   r   Úasysocks.protocol.socks4r   r	   r
   Úasysocks.protocol.socks4ar   r   r   Úasysocks.protocol.socks5r   r   r   r   r   r   r   r   r   r   Úasysocks.utils.sslwrapperr   rQ   r   r)   r#   r#   r#   r$   Ú<module>   s   0