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re+  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 )ProxyChainErrorPSomething 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rt t|
}	|	jt j!krt n|	jtj"krtd	| td
||f  |t#$| I dH  t jt%|j|dI dH }|j&t j!krt'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%zt| 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  zt   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  zt   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  zt   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rt| j| j  | j jI d H }n| j jtjkrt| j| j  | j jI d H }| r| j I d H }|V  | sntd| j j W |d urz|  W n   Y | jd urz| j  W n   Y | jd urz| j  W d S    Y d S d S |d urz|  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    
