o
    �õ±j8R  ã                   @   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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mZ d dlmZmZ d dlmZmZ d dlmZ d dlmZmZ d d	l m!Z! d d
l"m#Z# d dl$m%Z% d dl&Z&G dd„ de'ƒZ(G dd„ dƒZ)dd„ Z*dd„ Z+e,dkrŽe+ƒ  dS dS )é    N)ÚCallable)
ÚSOCKS5MethodÚ
SOCKS5NegoÚSOCKS5NegoReplyÚSOCKS5PlainAuthÚSOCKS5AuthFailedÚSOCKS5PlainAuthReplyÚSOCKS5ReplyTypeÚSOCKS5RequestÚSOCKS5ReplyÚSOCKS5ServerErrorReply)Ú	UniTargetÚUniProto)ÚUniProxyProtoÚUniProxyTarget)Ú
PacketizerÚStreamPacketizer)ÚPacketizerSSL)ÚUniConnectionÚUniUDPConnection)Úlogger)Ú	UniClient©ÚUDPProtocolc                       s   e Zd Zd‡ fdd„	Z‡  ZS )ÚProxyChainErrorúPSomething failed setting up the proxy chain! 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/unicomm/server.pyr       s   zProxyChainError.__init__)r   )Ú__name__Ú
__module__Ú__qualname__r    Ú__classcell__r$   r$   r"   r%   r      s    r   c                   @   s  e Zd Zd0dededefdd„Zdd„ Zd1d
edefdd„Z	d0de
dedefdd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'eegdf fd(d)„Zd'eegdf fd*d+„Zd'eegdf fd,d-„Zd'eegdf fd.d/„ZdS )2Ú	UniServerNÚtargetÚ
packetizerÚbindtypec                 C   s<   || _ || _|| _t ¡ | _t ¡ | _d | _d | _	d | _
d S r   )r+   r-   r,   ÚasyncioÚEventÚbind_progress_evtÚQueueÚconnection_queueÚudpprotocolÚudptransportÚ	udpsocket)r!   r+   r,   r-   r$   r$   r%   r        s   


zUniServer.__init__c                 C   sÄ   zdd l }W n   tdƒ g  Y S g }| ¡ D ]G}| |¡}|j|v r?||j D ]}|d | jjks9| jjdv r>| |¡ q)|j|v r_||j D ]}|d | jjksY| jjdv r^| |¡ qIq|S )Nr   ú=netifaces not found! Install it with "pip install netifaces"	Úaddr)Ú ú0.0.0.0z::z::0)	Ú	netifacesÚprintÚ
interfacesÚifaddressesÚAF_INETr+   ÚipÚappendÚAF_INET6)r!   r:   r<   Ú	interfaceÚ	addressesÚ	addr_infor$   r$   r%   Úget_interface_from_ip*   s&   


€

€zUniServer.get_interface_from_ipé   rB   Ú
ip_versionc                 C   s¤   zdd l }W n   tdƒ g  Y S g }|dkr3| |¡}|j|v r1||j D ]	}| |d ¡ q'|S |dkrP| |¡}|j|v rP||j D ]	}| |d ¡ qF|S )Nr   r6   rF   r7   é   )r:   r;   r=   r>   r@   rA   )r!   rB   rG   r:   ÚipsrC   rD   r$   r$   r%   Úget_ips_from_interface@   s$   

û

z UniServer.get_ips_from_interfaceÚproxyÚ
connectionÚtimeoutc              
   Ã   sd  �t  | ¡ ¡}| ¡ }| ¡ }tjg}|jdur+|jjdur+|jj	dur+| 
tj¡ �zz�zMt |¡}t d| ¡ | | ¡ ¡I dH  t jt |j¡|d�I dH }	t d||	jjf ¡ |	jtjkr¸|jdu su|jjdu su|jj	du r{td| ƒ‚t d| ¡ | t |jj|jj	¡ ¡ ¡I dH  t j|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 ¡ | t# $|¡ ¡ ¡I dH  t jt% |j¡|d�I dH }|j&t j!krþt 'd||j&jf ¡ t(|j&ƒ‚|j)j *d¡du �r t d||f ¡ W W |du�r| +¡  dS dS t d||j,f ¡ |j,| _-| j. /¡  |j0du �rHW W |du�rF| +¡  dS dS t jt% |j¡|d�I dH }|j&t j!k�rmt 'd||j&jf ¡ t(|j&ƒ‚W W |du�rz| +¡  dS dS  t�y¦ } zt d||f ¡ d|fW  Y d}~W |du�r¡| +¡  S S d}~ww |du�r±| +¡  w w )zh
		Does the intial "handshake" instructing the remote server to set up the connection to the endpoint
		Nz8[SOCKS5 %s][SETUP] Sending negotiation command to server©rM   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é   ó    zW[SOCKS5 %s] server requires GSSAPI authentication, but it's not supported at the momentz![SOCKS5 %s] Opening channel to %sz<[SOCKS5 %s] remote end failed to connect to proxy! Reson: %sÚSERVERFzB[SOCKS5 %s] Successfully set up the connection to the endpoint %s ©TNz8[SOCKS5 %s] BIND first set completed, port %s available!Tz"[SOCKS5 %s] Error in run_socks5 %s)1r.   Úcreate_taskÚstreamÚ	get_snameÚ	get_tnamer   ÚNOAUTHÚ
credentialÚusernameÚpasswordr@   ÚPLAINr   Úfrom_methodsr   ÚdebugÚwriteÚto_bytesÚwait_forr   Úfrom_streamreaderr,   ÚMETHODÚnameÚ	Exceptionr   Ú	constructÚreadexactlyr   r   Ú
from_bytesÚSTATUSr	   Ú	SUCCEEDEDÚGSSAPIr
   Úfrom_targetr   ÚREPÚinfor   ÚprotocolÚ
startswithÚcancelÚ	BIND_PORTÚ	bind_portr0   ÚsetÚ	only_bind)r!   rK   rL   rM   Ústream_taskÚsnameÚtnameÚmethodsÚnegoÚrep_negoÚrep_dataÚrepÚer$   r$   r%   Ú
run_socks5T   s¶   €"

þÿ"þ
ü
þ
ÿÿ
ý
þ

ÿê

ÿò
þ

ÿü

ÿ€ü

ÿzUniServer.run_socks5c              
   Ã   sž  �d }d }�z,t | jjƒdkrt d¡ t | jjƒdk�r0| jjd jtjkrmddlm	} | jjt
jkrI|| j| j ¡ | jjddd� ¡ I d H W S | jjt
jkre|| j| j ¡ | jjddd� ¡ I d H W S td| jj ƒ‚| jjd jtjtjtjtjfv �r%z˜t| jjd j| jjd jt
jd�}t|tƒ ƒ}| ¡ I d H }tj|   | jjd |¡| jjd	 j!d
�I d H \}}|d ur¾|‚| jjt
jkrÝ| "t# $| j%¡¡ | j& '|¡I d H  |d fW W S | jjt
jk�r| j (t)j*¡}	t+|	|
ƒ}
|
j,|j%|dd�I d H  t-|j%||
ƒ}| j& '|¡I d H  |d fW W S W tdƒ‚ tj.�y$   tdƒ‚w td| jjd j ƒ‚t/ƒ ‚ t�yN } zt 2d¡ |d u�rI| 3¡  ‚ d }~ww )Né   zStart chaining...r   )ÚWSNetworkTCPServerT©r-   Úreuse_wszWSNET unimplemented proto %s)rn   éÿÿÿÿrN   ©Úserver_sidez&Proxy Connection establishment timeoutzUnsupported proxy protocol %szShould not be here!z[create_link])4Úlenr+   Úproxiesr   r]   rn   r   ÚSERVER_WSNETÚwsnet.pyodide.tcpserverr€   r   Ú
SERVER_TCPÚ_UniServer__handle_connectionÚget_ip_or_hostnameÚportÚrunÚSERVER_SSL_TCPÚ!_UniServer__handle_connection_sslrd   ÚSERVER_SOCKS5_TCPÚCLIENT_SSL_SOCKS5_TCPÚSERVER_SOCKS5_UDPÚSERVER_SSL_SOCKS5_UDPr   Ú	server_ipÚserver_portÚ
CLIENT_TCPr   r   Úconnectr.   r`   r~   rM   Úchange_packetizerÚcopyÚdeepcopyr,   r2   ÚputÚget_ssl_contextÚsslÚPROTOCOL_TLS_SERVERr   Údo_handshaker   ÚTimeoutErrorÚNotImplementedErrorÚget_preproxyr   Ú	exceptionÚclose)r!   Úremote_writerÚremote_readerr€   ÚttargetÚclientrL   Ú_ÚerrÚssl_ctxr,   Úclient_targetr}   r$   r$   r%   Úcreate_link³   s^   €
**$$2
úöÿ

€üzUniServer.create_linkc                 Ã   s0   �t  | j¡}t|||ƒ}| j |¡I d H  d S r   )rš   r›   r,   r   r2   rœ   )r!   ÚreaderÚwriterr,   rL   r$   r$   r%   Ú__handle_connectionê   s   €zUniServer.__handle_connectionc                 Ã   s€   �d }z6t  | j¡}| j tj¡}t||ƒ}|j||dd�I d H  t	|||ƒ}| j
 |¡I d H  W |d ur8~d S d S |d ur?~w )NTr„   )rš   r›   r,   r+   r�   rž   rŸ   r   r    r   r2   rœ   )r!   r¯   r°   r¬   r,   rL   r$   r$   r%   Ú__handle_connection_sslð   s   €
ÿz!UniServer.__handle_connection_sslc           
   
   ƒ   s  �ztt  ¡ ‰ t ¡ dkr>ddlm} ‡ fdd„}||| j ¡ | jjddd�}| 	¡ I d H \}}}|d ur6|‚|||j
d fW S dd l}| |j|j¡}| | j ¡ | jjf¡ | d	¡ ‡ fd
d„}t  ¡ j||d�I d H \}}|||d fW S  ty� }	 zd d d |	fW  Y d }	~	S d }	~	ww )NÚ
Emscriptenr   ©ÚWSNetworkUDPServerc                      ó   t ˆ ƒS r   r   r$   ©Úin_queuer$   r%   Ú<lambda>  ó    z4UniServer.start_generic_udp_server.<locals>.<lambda>r   Tr�   Fc                      r¶   r   r   r$   r·   r$   r%   r¹     rº   ©Úsock)r.   r1   ÚplatformÚsystemÚwsnet.pyodide.udpserverrµ   r+   rŒ   r�   rŽ   r°   Úsocketr>   Ú
SOCK_DGRAMÚbindÚsetblockingÚget_event_loopÚcreate_datagram_endpointrd   )
r!   rµ   ÚprotofactoryÚwsnetserverÚservertransportÚserverprotor«   rÀ   r¼   r}   r$   r·   r%   Ústart_generic_udp_serverþ   s,   €
€ÿz"UniServer.start_generic_udp_serverc              
   ƒ   sÜ  �zÔt  ¡ ‰ t ¡ dkr;ddlm} ‡ fdd„}||| jjdddd	�}| ¡ I d H \}}}|d ur3|‚|||j	d fW S dd l
}dd l}| 
|j|j¡}	|	 |j|jd
¡ |	 |j|jd¡ |	 d¡ d}
d}|  | jjd¡D ]}| |
¡| |¡ }|	 |j|j|¡ qnz| | jj¡}| |j|¡| d|¡ }|	 |j|j|¡ W n tyµ } zW Y d }~nd }~ww |	 d¡ ‡ fdd„}t  ¡ j ||	d�I d H \}}|||	d fW S  tyí } zd d d |fW  Y d }~S d }~ww )Nr³   r   r´   c                      r¶   r   r   r$   r·   r$   r%   r¹     rº   z.UniServer.start_llmnr_server.<locals>.<lambda>éë  rO   Fr�   r   éÿ   )r8   rË   z224.0.0.252zFF02:0:0:0:0:0:1:3rF   ú@Ic                      r¶   r   r   r$   r·   r$   r%   r¹   7  rº   r»   ©!r.   r1   r½   r¾   r¿   rµ   r+   ÚhostnamerŽ   r°   rÀ   Ústructr>   rÁ   Ú
setsockoptÚ
SOL_SOCKETÚSO_REUSEADDRÚ
IPPROTO_IPÚIP_MULTICAST_TTLrÂ   rJ   Ú	inet_atonÚIP_ADD_MEMBERSHIPÚif_nametoindexÚ	inet_ptonrA   ÚpackÚIPPROTO_IPV6ÚIPV6_JOIN_GROUPrd   rÃ   rÄ   rÅ   )r!   rµ   rÆ   rÇ   rÈ   rÉ   r«   rÀ   rÐ   r¼   Ú
llmnr_addrÚllmnr_addr6r?   ÚmreqÚif_indexÚmreq6r}   r$   r·   r%   Ústart_llmnr_server  sL   €
€ÿ
€ÿzUniServer.start_llmnr_serverc              
   ƒ   sÜ  �zÔt  ¡ ‰ t ¡ dkr;ddlm} ‡ fdd„}||| jjdddd	�}| ¡ I d H \}}}|d ur3|‚|||j	d fW S dd l
}dd l}| 
|j|j¡}	|	 |j|jd
¡ |	 |j|jd¡ d}
d}|	 d¡ |  | jjd¡D ]}| |
¡| |¡ }|	 |j|j|¡ qnz| | jj¡}| |j|¡| d|¡ }|	 |j|j|¡ W n tyµ } zW Y d }~nd }~ww |	 d¡ ‡ fdd„}t  ¡ j ||	d�I d H \}}|||	d fW S  tyí } zd d d |fW  Y d }~S d }~ww )Nr³   r   r´   c                      r¶   r   r   r$   r·   r$   r%   r¹   B  rº   z-UniServer.start_mdns_server.<locals>.<lambda>éé  rF   Fr�   r   rÌ   z224.0.0.251zFF02::FB)r8   rã   rÍ   c                      r¶   r   r   r$   r·   r$   r%   r¹   `  rº   r»   rÎ   )r!   rµ   rÆ   rÇ   rÈ   rÉ   r«   rÀ   rÐ   r¼   Ú	mdns_addrÚ
mdns_addr6r?   rß   rà   rá   r}   r$   r·   r%   Ústart_mdns_server=  sL   €
€ÿ
€ÿzUniServer.start_mdns_serverc              
   ƒ   s4  �z€t  ¡ ‰ t ¡ dkr;ddlm} ‡ fdd„}||| jjdddd	�}| ¡ I d H \}}}|d ur3|‚|||j	d fW S dd l
}| 
|j|j¡}| |j|jd
¡ |  | jjd¡D ]	}	| |	df¡  | d¡ ‡ fdd„}t  ¡ j||d�I d H \}}|||d fW S  ty™ }
 zd d d |
fW  Y d }
~
S d }
~
ww )Nr³   r   r´   c                      r¶   r   r   r$   r·   r$   r%   r¹   k  rº   z.UniServer.start_nbtns_server.<locals>.<lambda>é‰   é   Fr�   r   rF   c                      r¶   r   r   r$   r·   r$   r%   r¹   z  rº   r»   )r.   r1   r½   r¾   r¿   rµ   r+   rÏ   rŽ   r°   rÀ   r>   rÁ   rÑ   rÒ   ÚSO_BROADCASTrJ   rÂ   rÃ   rÄ   rÅ   rd   )r!   rµ   rÆ   rÇ   rÈ   rÉ   r«   rÀ   r¼   r?   r}   r$   r·   r%   Ústart_nbtns_serverf  s2   €
€ÿzUniServer.start_nbtns_serverc                 Ã   sP   �| j d u r
tdƒ‚t | j j¡du r| j  ||¡I d H  d S | j  ||¡ d S )NzUDP Server not started!T)r5   rd   r.   ÚiscoroutineÚsendto)r!   Údatar7   r$   r$   r%   rì   €  s   €
zUniServer.sendtoc              
   Ã   s,  �| j d urdS zw| jdkr%|  ¡ I d H \| _| _| _ }|d ur"|‚W dS | jdkrA|  ¡ I d H \| _| _| _ }|d ur>|‚W dS | jdkr]|  ¡ I d H \| _| _| _ }|d urZ|‚W dS | jdkry|  ¡ I d H \| _| _| _ }|d urv|‚W dS td| j ƒ‚ ty• } z
d |fW  Y d }~S d }~ww )NrR   r   rO   rè   rF   zUnsupported bindtype %s)	r5   r-   rÊ   r4   r3   râ   rê   ræ   rd   )r!   r«   r}   r$   r$   r%   Ústart_udp_serverˆ  s:   €


î
ó

øþ€ÿzUniServer.start_udp_serverc           	      C  s>  �d }d }zä| j jtjkr1|  ¡ I d H \}}|d ur|‚	 | jj ¡ I d H \}}}t|||ƒV  qt	| j j
ƒdkr^|  ¡ I d H \}}|d urH|‚|j ¡ s]| j ¡ I d H }|V  |j ¡ rMnU| j jtjtjfv r«| j jtjkr€t | j| j  ¡ | j j¡I d H }n| j jtjkr—t | j| j  ¡ | j j¡I d H }| ¡ rª| j ¡ I d H }|V  | ¡ s›ntd| j j ƒ‚W |d urÃz| ¡  W n   Y | jd urÔz| j ¡  W n   Y | jd urèz| j ¡  W d S    Y d S d S |d urùz| ¡  W n   Y | jd u�rz| j ¡  W n   Y | jd u�rz| j ¡  W w    Y w w )NTr   úUnknown protocol "%s")r+   rn   r   Ú
SERVER_UDPrî   r3   r¸   Úgetr   r†   r‡   r®   Ú
closed_evtÚis_setr2   rŠ   r�   r.   Ústart_serverr‹   rŒ   r�   r�   Ú
is_servingrd   r¥   r5   )	r!   ÚserverÚ	serverobjrª   r«   rÀ   rí   r7   rL   r$   r$   r%   Úserve¨  s‚   €þ

þ€" þ€€

üöüzUniServer.serveÚconnection_callbackc                 Ã   sò   �z	 | j j ¡ I d H \}}}t |t|||ƒƒ¡}q| jd ur:z| j ¡  W n ty9 } zW Y d }~nd }~ww | j d urYz| j  ¡  W n tyX } zW Y d }~nd }~ww | j	d urxz| j	 ¡  W w  tyw } zW Y d }~w d }~ww w r   )
r3   r¸   rñ   r.   rS   r   r4   r¥   rd   r5   )r!   rù   rÀ   rí   r7   Úxr}   r$   r$   r%   Úudp_dispatcherÜ  s8   €þ
€ÿ
€ÿ
€ÿýzUniServer.udp_dispatcherc                 Ã   s‚   �z.|j  ¡ s| j ¡ I d H }t ||ƒ¡}|j  ¡ rW |d ur.z| ¡  W d S    Y d S d S |d ur@z| ¡  W w    Y w w r   )rò   ró   r2   rñ   r.   rS   r¥   ©r!   rö   rù   rL   rú   r$   r$   r%   Útcp_dispatcherò  s$   €

þ€üüzUniServer.tcp_dispatcherc                 Ã   s~   �z,|  ¡ r| j ¡ I d H }t ||ƒ¡}|  ¡ sW |d ur,z| ¡  W d S    Y d S d S |d ur>z| ¡  W w    Y w w r   )rõ   r2   rñ   r.   rS   r¥   rü   r$   r$   r%   Útcp_dispatcher_builtinþ  s$   €þ€üüz UniServer.tcp_dispatcher_builtinc              
   Ã   sT  �d }z�| j jtjkr#|  ¡ I d H \}}|d ur|‚t |  |¡¡}nlt| j j	ƒdkrD|  
¡ I d H \}}|d ur:|‚t |  ||¡¡}nK| j jtjtjfv r‡| j jtjkrft | j| j  ¡ | j j¡I d H }n| j jtjkr}t | j| j  ¡ | j j¡I d H }t |  ||¡¡}ntd| j j ƒ‚|d fW S  ty© } z
d |fW  Y d }~S d }~ww )Nr   rï   )r+   rn   r   rð   rî   r.   rS   rû   r†   r‡   r®   rý   rŠ   r�   rô   r‹   rŒ   r�   r�   rþ   rd   )r!   rù   rö   rª   r«   Údispatcher_taskr}   r$   r$   r%   Úserve_callback  s2   €" 
€ÿzUniServer.serve_callbackr   )rF   )r&   r'   r(   r   r   Úintr    rE   ÚstrrJ   r   r   r~   r®   r‹   r�   rÊ   râ   ræ   rê   rì   rî   rø   r   r   rû   rý   rþ   r   r$   r$   r$   r%   r*      s&    
_7*) 4r*   c                  Ã   s˜   �dd l } t | j¡ tƒ }d|_d|_tj|_	t
ddtj|gd�}tƒ }t||ƒ}| ¡ 2 z3 d H W }tdƒ | ¡ 2 z
3 d H W }t|ƒ q<6 q.6 d S )Nr   z	127.0.0.1i8  r9   i'  )r‡   zClient connected!)Úloggingr   ÚsetLevelÚDEBUGr   r•   r–   r   r‘   rn   r   r   rŠ   r   r*   rø   r;   Úread)r  rK   r+   r,   rö   rL   rí   r$   r$   r%   Úamain-  s    €

ÿþr  c                   C   s   t  tƒ ¡ d S r   )r.   rŽ   r  r$   r$   r$   r%   ÚmainA  s   r  Ú__main__)-r.   rš   rž   r½   Ú	tracebackÚtypingr   Ú asysocks.unicomm.protocol.socks5r   r   r   r   r   r   r	   r
   r   r   Úasysocks.unicomm.common.targetr   r   Úasysocks.unicomm.common.proxyr   r   Ú#asysocks.unicomm.common.packetizersr   r   Ú'asysocks.unicomm.common.packetizers.sslr   Ú"asysocks.unicomm.common.connectionr   r   Úasysocks.unicommr   Úasysocks.unicomm.clientr   Ú$asysocks.unicomm.protocol.server.udpr   Ú	ipaddressrd   r   r*   r  r  r&   r$   r$   r$   r%   Ú<module>   s6   0    
ÿ