o
    ja                     @   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 )SocksTunnelErrorKSomething 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  zz	 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rt	d  W W |
  |  d S ||
 | I d H  |D ]}|  qq)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,  zz:|  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  zzFt |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  zt 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rt 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rt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rt 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rt t|
}	|	jtjkrt n|	jtj krtd	| td
||f  |j!du rW 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zt 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 rd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 rztj| &|	||| jd jd
I d H }
W n tjy   tdw |
\}}|d urt| jdkr|t| jd krt ||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qt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 | j58  | j68  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 rd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 rztj| &|||| jd jd	I d H }W n tjy   t dw |\}}	|	d urt| jdkr|t| jd krt!|	|	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qt 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 rW W | j-.  |d ur|  dS dS | j1d ur| j1.  t d t | _2| j3j4du rt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| jBjCD | j3jEd	I d H  | j-.  t d | j2D I d H  t d | j:F  | j>F  W W | j-.  |d ur\|  dS dS  t y } z2| j3j8Gd |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