o
    �õ±jfF  ã                   @   sþ   d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlZd dlm	Z	m
Z
 d dl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mZmZ d dlmZ e   d¡Z!e  "¡ Z#e  $d	¡Z%e# &e%¡ e! 'e#¡ e! (e j)¡ G d
d„ dƒZ*dS )é    N)Úurlparse)ÚSocksServerVersionÚSocksCommsMode)ÚHTTPRequest)ÚSOCKS4RequestÚSOCKS4ReplyÚSOCKS4CDCode)ÚSOCKS5CommandÚSOCKS5AddressTypeÚSOCKS5MethodÚ
SOCKS5NegoÚSOCKS5NegoReplyÚSOCKS5RequestÚSOCKS5ReplyÚSOCKS5ReplyTypeÚSOCKS5PlainAuthÚSOCKS5PlainAuthReplyÚSOCKS5ServerErrorReplyÚSOCKS5AuthFailed)ÚBaseMonitorzasysocks.proxyserverz3%(asctime)s %(name)-12s %(levelname)-8s %(message)sc                   @   sf   e Zd Zdddg d¢dfdd„Zdd„ Zdd	d
„Zdd„ Zdd„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚSOCKSServerNé
   i (  )ÚSOCKS4ÚSOCKS5ÚHTTPc                 C   s4   || _ || _|| _|| _|| _|| _|| _d| _d S )Nr   )Ú	listen_ipÚlisten_portÚssl_ctxÚclient_timeoutÚbuffer_sizeÚsupported_protocolsÚmonitor_dispatch_qÚ
session_id)Úselfr   r   r   r   r   r    r!   © r$   ú‚/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/asysocks/server.pyÚ__init__   s   
zSOCKSServer.__init__c                 C   s   | j }|  j d7  _ |S )Né   )r"   )r#   Útr$   r$   r%   Úget_session_id$   s   zSOCKSServer.get_session_idc           
   
   ƒ   s�  �‡ ‡fdd„}z¶zq|d urHt  |ˆ || jƒ¡ ˆ ¡ sG| ¡ I d H }|dks+|d u r7W W | ¡  ˆ ¡  d S | |¡ | ¡ I d H  ˆ ¡ rn1ˆ ¡ syˆ  	| j¡I d H }|dks]|d u riW W | ¡  ˆ ¡  d S | |¡ | ¡ I d H  ˆ ¡ rLW n. t j
yŽ   Y W | ¡  ˆ ¡  d S  ty¨ }	 zt d||	f ¡ W Y d }	~	nd }	~	ww W | ¡  ˆ ¡  d S W | ¡  ˆ ¡  d S | ¡  ˆ ¡  w )Nc                 “   s˜   �zEz2ˆ  ¡ s3ˆ  |¡I d H }|dks|d u r'| |¡I d H  W W ˆ ¡  d S | |¡I d H  ˆ  ¡ rW n   Y W ˆ ¡  d S W ˆ ¡  d S ˆ ¡  w )Nó    )Úis_setÚreadÚputÚset)ÚreaderÚin_qr   Údata©Úreader_aÚstop_evtr$   r%   Úpi*   s    €üû€€ zSOCKSServer.__proxy.<locals>.pir*   z+[%s][TCPPROXY] Connection ended. Reason: %s)ÚasyncioÚcreate_taskr   r+   ÚgetÚcloser.   ÚwriteÚdrainr,   ÚCancelledErrorÚ	ExceptionÚ	srvloggerÚdebug)
r#   r3   Úwriter_br4   Ú
src_moduleÚmonitor_in_qÚmonitor_out_qr5   r1   Úer$   r2   r%   Ú__proxy)   sR   €
ïù€
	
øú€ü€ÿ€ýÿ
zSOCKSServer.__proxyc              
   ƒ   s~  ��zš|j tjk�r
t dt|jƒ|jf ¡ zt 	t|jƒ|j¡I d H \}}W n? t
yg } z3t dt|jƒ|j|f ¡ tƒ }tj|_ |j|_|j|_ˆ | ¡ ¡ ˆ ¡ I d H  W Y d }~W d S d }~ww t dt|jƒ|jf ¡ tƒ }tj|_ |j|_|j|_ˆ | ¡ ¡ ˆ ¡ I d H  t ¡ }d }	d }
d }d }ˆjd urÑ| d¡\}}ˆ d¡\}}t||||dˆ ¡ ƒ}|j}	|j}
|j}|j}ˆj |¡I d H  t ˆ ˆ ||d|	|
¡¡}t ˆ |ˆ|d||¡¡}| ¡ I d H  t dt|jƒ|jf ¡ | ¡  | ¡  W d S |j tjk�r–‡ ‡‡fdd„}zJt   t j!t j"¡}| #t|jƒd	f¡ | $d
¡ | %¡ \}}tƒ }tj|_ ||_t& '|¡|_ˆ | ¡ ¡ ˆ ¡ I d H  tj(||d
d�I d H  W W d S  t
�y• } z%tƒ }tj|_ |j|_|j|_ˆ | ¡ ¡ ˆ ¡ I d H  W Y d }~W d S d }~ww t
d|j  ƒ‚ t
�y¾ } zd	d l)}| *¡  t+d| ƒ W Y d }~d S d }~ww )Nz*[SOCKS4] Client wants to connect to: %s:%sz/[SOCKS4] Could not connect to: %s:%s Reason: %sz<[SOCKS4] Sucsessfully connected to: %s:%s Starting TCP proxyÚpeernamer   z[SOCKS4] Connection ended %s:%sc           	   
   “   sà   �zU|  d¡\}}tƒ }tj|_||_t |¡|_ˆ 	| 
¡ ¡ ˆ ¡ I d H  t ¡ }t ˆ ˆ ||d¡¡}t ˆ | ˆ|d¡¡}| ¡ I d H  tdƒ | ¡  | ¡  W d S  tyo } ztd| ƒ W Y d }~d S d }~ww )NrF   r   zConnection terminatedz__handle_remote %s)Úget_extra_infor   r   ÚREP_GRANTEDÚCDÚDSTPORTÚ	ipaddressÚIPv4AddressÚDSTIPr:   Úto_bytesr;   r6   ÚEventr7   Ú_SOCKSServer__proxyÚwaitÚprintÚcancelr=   ©	Ú
dst_readerÚ
dst_writerÚrem_ipÚrem_portÚreplyr4   Útask_1Útask_2rD   ©r/   r#   Úwriterr$   r%   Ú__handle_remoteƒ   s(   €€ÿz2SOCKSServer.handle_socks4.<locals>.__handle_remoter   r'   ©ÚsockÚbacklogzUnknown client request! %szhandle_socks4 %s),rI   r   ÚREQ_CONNECTr>   r?   ÚstrrM   rJ   r6   Úopen_connectionr=   r   Ú
REP_FAILEDr:   rN   r;   rH   rO   r!   rG   r   r)   Úc2d_inÚc2d_outÚd2c_inÚd2c_outr-   r7   rP   rQ   rS   ÚREQ_BINDÚsocketÚAF_INETÚSOCK_STREAMÚbindÚlistenÚgetsocknamerK   rL   Ústart_serverÚ	tracebackÚ	print_excrR   )r#   Úinit_cmdr/   r]   rU   rV   rD   rY   r4   rf   rg   rh   ri   rW   rX   Ú	client_ipÚclient_portÚmonitorrZ   r[   Ú_SOCKSServer__handle_remoteÚserversocketÚserversocket_ipÚserversocket_portrr   r$   r\   r%   Úhandle_socks4S   s˜   €"€ø


€ù	€ýzSOCKSServer.handle_socks4c              
   ƒ   sØ  ��zNt  dd dd„ |jD ƒ¡ ¡ tj|jvr0t tj¡}ˆ 	| 
¡ ¡ ˆ ¡ I d H  W d S t tj¡}ˆ 	| 
¡ ¡ ˆ ¡ I d H  tjt ˆ ¡ˆjd�I d H }|jtjk�r_t  dt|jƒ|jf ¡ zt t|jƒ|j¡I d H \}}W n: ty± } z.t  dt|jƒ|j|f ¡ t tj|j|j¡}ˆ 	| 
¡ ¡ ˆ ¡ I d H  W Y d }~W d S d }~ww t  dt|jƒ|jf ¡ t tj|j|j¡}ˆ 	| 
¡ ¡ ˆ ¡ I d H  t ¡ }	d }
d }d }d }ˆjd u�r&| d	¡\}}ˆ d	¡\}}t ||||d
ˆ !¡ ƒ}|j"t#j$k�r| %t|jƒ¡ ˆj &|¡I d H  |j'}
|j(}|j)}|j*}t +ˆ ,ˆ ||	d
|
|¡¡}t +ˆ ,|ˆ|	d
||¡¡}|	 -¡ I d H  t  dt|jƒ|jf ¡ | .¡  | .¡  W d S |jtj/k�r:t  dt|jƒ|jf ¡ ‡ ‡‡fdd„}zƒ|j"t#j0k�r—t1 1t1j2t1j3¡}| 4t|jƒ|jf¡ n5|j"t#j5k�r²t1 1t1j6t1j3¡}| 4t|jƒ|jf¡ n|j"t#j$k�rÌt1 1t1j2t1j3¡}| 4t|jƒ|jf¡ | 7d¡ | 8¡ \}}t tjt9 :|¡|¡}ˆ 	| 
¡ ¡ ˆ ¡ I d H  tj;||dd�I d H  W W d S  t�y9 } z.t  dt|jƒ|j|f ¡ t tj|j|j¡}ˆ 	| 
¡ ¡ ˆ ¡ I d H  W Y d }~W d S d }~ww |jtj<k�rJt  d¡ tdƒ‚td|j ƒ‚ t�yk } zt  =d| ¡ W Y d }~d S d }~ww )Nz2[SOCKS5] Authentication supported by the client %sú,c                 S   s   g | ]}|j ‘qS r$   )Úname)Ú.0Úxr$   r$   r%   Ú
<listcomp>¸   s    z-SOCKSServer.handle_socks5.<locals>.<listcomp>©Útimeoutz*[SOCKS5] Client wants to connect to: %s:%sz/[SOCKS5] Could not connect to: %s:%s Reason: %sz<[SOCKS5] Sucsessfully connected to: %s:%s Starting TCP proxyrF   r   z[SOCKS5] Connection ended %s:%sz'[SOCKS5] Client wants to BIND to: %s:%sc           	   
   “   s  �zm|  d¡\}}t dt|ƒ|f ¡ t tjt 	|¡|¡}ˆ 
| ¡ ¡ ˆ ¡ I d H  t dt|ƒ|f ¡ t ¡ }t ˆ ˆ ||d¡¡}t ˆ | ˆ|d¡¡}| ¡ I d H  t dt|ƒ|f ¡ | ¡  | ¡  W d S  ty† } zt d¡ W Y d }~d S d }~ww )NrF   zL[SOCKS5] Client BIND server get a connection from: %s:%s Notifying client...z-[SOCKS5] Client BIND starting TCP proxy %s:%sr   z+[SOCKS5] Client BIND connection ended %s:%sz[SOCKS5] Client BIND error)rG   r>   r?   rc   r   Ú	constructr   Ú	SUCCEEDEDrK   Ú
ip_addressr:   rN   r;   r6   rO   r7   rP   rQ   rS   r=   Ú	exceptionrT   r\   r$   r%   r^   ò   s&   €€ÿz2SOCKSServer.handle_socks5.<locals>.__handle_remoter'   r_   z3[SOCKS5] Error! Could not bind to: %s:%s Reason: %szJ[SOCKS5] Error! Client requested UDP Associate, but it is not implemented!z,UDP assoc requested, but is not implemented!z6Client requested something that was not understood. %sz[SOCKS5] Generic error: %s)>r>   r?   ÚjoinÚMETHODSr   ÚNOAUTHr   r„   ÚNOTACCEPTABLEr:   rN   r;   r6   Úwait_forr   Úfrom_streamreaderr   ÚCMDr	   ÚCONNECTrc   ÚDST_ADDRÚDST_PORTrd   r=   r   r   ÚFAILUREr…   rO   r!   rG   r   r)   ÚATYPr
   Ú
DOMAINNAMEÚset_hostnamer-   rf   rg   rh   ri   r7   rP   rQ   rS   ÚBINDÚIP_V4rk   rl   rm   rn   ÚIP_V6ÚAF_INET6ro   rp   rK   r†   rq   ÚUDP_ASSOCIATEr‡   )r#   rt   r/   r]   rY   ÚreqrU   rV   rD   r4   rf   rg   rh   ri   rW   rX   ru   rv   rw   rZ   r[   rx   ry   rz   r{   r$   r\   r%   Úhandle_socks5µ   s¬   € "€û
€û
€ÿzSOCKSServer.handle_socks5c              
   Ã   s  �zí|j  ¡ dkrtd|j  ƒ‚|j d¡\}}t|ƒ}t d||f ¡ zt 	||¡I d H \}}W n, ty^ } z t d|||f ¡ d}	| 
|	¡ | ¡ I d H  W Y d }~W d S d }~ww t d||f ¡ d}
| 
|
¡ | ¡ I d H  t ¡ }d }d }d }d }| jd urº| d	¡\}}| d	¡\}}t||||d
|  ¡ ƒ}| |¡ | j |¡I d H  |j}|j}|j}|j}t |  |||d
||¡¡}t |  |||d
||¡¡}| ¡ I d H  t d||f ¡ | ¡  | ¡  W d S  t�y	 } zt d| ¡ W Y d }~d S d }~ww )Nr�   zUnknown request type! %sú:z/[HTTPCONNECT] Client wants to connect to: %s:%sz4[HTTPCONNECT] Could not connect to %s:%s. Reason: %só   HTTP/1.1 500 Error

zB[HTTPCONNECT] Sucsessfully connected to %s:%s. Starting tcp proxy.s   HTTP/1.1 200 OK

rF   ÚHTTPCONNECTz'[HTTPCONNECT] Connection ended @ %s:%s.ú[HTTP] Generic error: %s)ÚmethodÚupperr=   ÚuriÚsplitÚintr>   r?   r6   rd   r:   r;   rO   r!   rG   r   r)   r•   r-   rf   rg   rh   ri   r7   rP   rQ   rS   r‡   )r#   rt   r/   r]   ÚhostÚportrU   rV   rD   ÚfailÚokr4   rf   rg   rh   ri   rW   rX   ru   rv   rw   rZ   r[   r$   r$   r%   Úhandle_http_connect,  s^   €
€û


€ÿzSOCKSServer.handle_http_connectc              
   Ã   s*  �zøt |jƒ}|j}|j}|d u s|dkr |j ¡ dkrdnd}zt ||¡I d H \}}W n, tyY }	 z t	 
d|||	f ¡ d}
| |
¡ | ¡ I d H  W Y d }	~	W d S d }	~	ww t |¡}|j|j |_d }d }| jd urª| d¡\}}| d¡\}}t||||d|  ¡ ƒ}| |¡ | j |¡I d H  |j | ¡ ¡I d H  |j ¡ I d H }n| ¡ }| |¡ | ¡ I d H  d }tj|| jd	�I d H \}}|d urÏ|‚|d urç|j | ¡ ¡I d H  |j ¡ I d H }n| ¡ }| |¡ | ¡ I d H  W d S  t�y }	 zt	  d
|	 ¡ W Y d }	~	d S d }	~	ww )NÚ ÚhttpéP   i»  z-[HTTP] Could not connect to %s:%s. Reason: %srž   rF   rŸ   r‚   r    )!r   r£   Úhostnamer§   ÚschemeÚlowerr6   rd   r=   r>   r?   r:   r;   ÚcopyÚdeepcopyÚpathÚqueryr!   rG   r   r)   r•   r-   rf   rN   rg   r8   r   r�   r   rh   ri   r‡   )r#   rt   r/   r]   Úor¦   r§   rU   rV   rD   r¨   Úc_cmdr1   rw   rW   rX   ru   rv   rY   Úerrr$   r$   r%   Úhandle_http_genericb  s\   €

€û




€ÿzSOCKSServer.handle_http_genericc              
   Ã   sd  ��zzt j| d¡| jd�I d H }W n t jjy. } zt d¡ W Y d }~W d S d }~ww |dkrnd| jvr<t	dƒ‚t j| d¡| jd�I d H }t j| 
d¡| jd�I d H }t || | ¡}|  |||¡I d H  W d S |d	krµd
| jvr{t	dƒ‚t j| d¡| jd�I d H }tj|ddd�}	t j| |	¡| jd�I d H }
t || |
 ¡}|  |||¡I d H  W d S |dv rãd| jvrÂt	dƒ‚tj|| j|d�I d H \}}|d urÖ|‚|  |||¡I d H  W d S |dv �rd| jvrñt	dƒ‚tj|| j|d�I d H \}}|d u�r|‚|  |||¡I d H  W d S t	d| ƒ‚ t	�y1 } zt d¡ W Y d }~d S d }~ww )Nr'   r‚   z>Client terminated the socket before socks/http proxy handshakeó   r   z<Client tried to use SOCKS4, but it is disabled on the serveré   ó    ó   r   z<Client tried to use SOCKS5, but it is disabled on the serverÚbigF)Ú	byteorderÚsigned)ó   Có   cr   z@Client tried to use HTTP proxy, but it is disabled on the server)rƒ   Úpre_data)ó   gó   Gó   pó   Pó   oó   Oz'Unknwon protocol used by the client! %sÚhandle_client)r6   rŒ   Úreadexactlyr   Ú
exceptionsÚIncompleteReadErrorr>   r?   r    r=   Ú	readuntilr   Ú
from_bytesr|   r¥   r   rœ   r   r�   rª   r¸   r‡   )r#   r/   r]   Útempr·   Útemp2Úrestrt   ÚnmethodsÚ
t_nmethodsÚmethodsrD   r$   r$   r%   rÉ   ™  s\   € 
€þ





€ÿzSOCKSServer.handle_clientc                 Ã   s4   �t j| j| j| j| jd�I d H }| ¡ I d H  d S )N)Ússl)r6   rq   rÉ   r   r   r   Úwait_closed)r#   Úserverr$   r$   r%   ÚrunÒ  s   € zSOCKSServer.run)NN)Ú__name__Ú
__module__Ú__qualname__r&   r)   rP   r|   rœ   rª   r¸   rÉ   rØ   r$   r$   r$   r%   r      s    

*bw679r   )+Úloggingr6   rk   r±   rK   Úurllib.parser   rÕ   Úasysocks.common.constantsr   r   Úasysocks.protocol.httpr   Úasysocks.protocol.socks4r   r   r   Úasysocks.protocol.socks5r	   r
   r   r   r   r   r   r   r   r   r   r   Ú#asysocks.intercepting.monitors.baser   Ú	getLoggerr>   ÚStreamHandlerÚhandlerÚ	FormatterÚ	formatterÚsetFormatterÚ
addHandlerÚsetLevelÚINFOr   r$   r$   r$   r%   Ú<module>   s*   8
ÿ

