o
    j`G                     @   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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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$m%Z% G dd d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)HTTPProxyAuthRequiredExceptionHTTPResponseHTTPProxyAuthFailed)SOCKS4ARequestSOCKS4AReplySOCKS4ACDCode)
SOCKS5Method
SOCKS5NegoSOCKS5NegoReplySOCKS5PlainAuthSOCKS5AuthFailedSOCKS5PlainAuthReplySOCKS5ReplyTypeSOCKS5RequestSOCKS5ReplySOCKS5ServerErrorReply)	UniTargetUniProto)UniProxyProtoUniProxyTarget)
Packetizer)PacketizerSSL)UniConnection)loggerc                   @   sF   e Zd ZdefddZdd Zddedefd	d
Zdde	fddZ
dS )UniClientFactorytargetc                 C   s
   || _ d S N)r   )selfr    r   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/asysocks/unicomm/client.py__init__   s   
zUniClientFactory.__init__c                 C   s   t | jS r   )copydeepcopyr   )r   r   r   r   
get_target   s   zUniClientFactory.get_targetNip_or_hostnameportc                 C   s<   |   }|d ur||_z	t||_W |S    ||_Y |S r   )r#   r%   	ipaddress
ip_addressiphostname)r   r$   r%   	newtargetr   r   r   get_newtarget   s   zUniClientFactory.get_newtarget
packetizerc                 C   s   |d u rt  }t|  |S r   )r   	UniClientr#   )r   r,   r   r   r   
get_client%   s   zUniClientFactory.get_clientr   )__name__
__module____qualname__r   r    r#   strintr+   r   r.   r   r   r   r   r      s
    
r   c                       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 r   )innerexceptionmessagesuperr    )r   r6   r7   	__class__r   r   r    +   s   zProxyChainError.__init__)r5   )r/   r0   r1   r    __classcell__r   r   r9   r   r4   *   s    r4   c                   @   s   e Zd ZdedefddZddedejdej	d	e
d
ef
ddZddedejdej	d	e
fddZddedejdej	d	e
fddZdd Zdd Zdd ZdS )r-   r   r,   c                 C   s    || _ || _t | _d | _d S r   )r   r,   asyncioEventbind_progress_evthttp_auth_ctx)r   r   r,   r   r   r   r    2   s   

zUniClient.__init__Nproxyremote_readerremote_writertimeoutr?   c              
      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   
rC      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   debugendpoint_ipendpoint_portencodewriter<   wait_fordrainr   from_streamreaderstatus
credential	Exceptionheaders_uppergetsplitupperr   base64	b64encodeusernamepasswordr   )r   r@   rA   rB   rC   r?   connect_cmdresperr	auth_type_	auth_dataauth_connecter   r   r   rI   8   sX   







zUniClient.run_httpc           	   
      s  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
		z1[SOCKS4A %s:%s] Opening channel to %s:%s (target)NrD   z0Socks server failed to reply to CONNECT request!z*Socks server returned error on CONNECT! %sz[SOCKS4A] Channel openedTNrun_socks4aF)r   rJ   	server_ipserver_portrK   rL   r   from_targetrS   r[   USERIDrN   to_bytesr<   rO   rP   r   rQ   rT   CDr   REP_GRANTEDvalue)	r   r@   rA   rB   rC   reqrepr_   rd   r   r   r   rg   t   s,   



zUniClient.run_socks4ac              
      s  |  }| }tjg}|jdur$|jjdur$|jjdur$|tj zIt	
|}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(j)ddu r,td||f  W dS td||j*f  |j*| _+| j,-  |j.du rHW dS tjt$||dI dH }|j%tjkrlt&d||j%jf  t'|j%W dS  ty } ztd||f  d|fW  Y d}~S d}~ww )re   Nz8[SOCKS5 %s][SETUP] Sending negotiation command to serverrD   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 %sTrf   z<[SOCKS5 %s] remote end failed to connect to proxy! Reson: %sSERVERFzB[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   NOAUTHrS   r[   r\   appendPLAINr	   from_methodsr   rJ   rN   rl   r<   rO   rP   r
   rQ   METHODnamerT   r   	constructreadr   r   
from_bytesSTATUSr   	SUCCEEDEDGSSAPI	only_authr   rj   r   REPinfor   protocol
startswith	BIND_PORT	bind_portr>   set	only_bind)r   r@   rA   rB   rC   snametnamemethodsnegorep_negorep_datarq   rd   r   r   r   
run_socks5   s   "
"




zUniClient.run_socks5c              
      s>  d }d }zzt d t| jjdkrt d tdddD ][}|d ur*|  zt| jjd }t| jjdkrG| j	 |_
| jj|_|jtjkrcddlm} ||j
|j|jI d H \}}n|jtjkrddlm} ||j
|j|jI d H \}}n|jtjtjfv rdd	lm} ||j|j|j|j
|j|jI d H \}}nq|jtjtjfv rdd
lm} ||j
|j|j|j|j|j |j!I d H \}}|d u r|nD|jtj"kr|# \}	}
|
d ur|
|	$|j
|j|jI d H \}}}
|
d ur|
nt%j&t%j|j|j|j'd|j!dI d H \}}t d W n	   t d  zMt(| jjD ]B\}}t|}|t| jjd krH| j	 |_
| jj|_|jtj)tj*fv rzt%j&| +|||| jjd j!dI d H }W n t%j,yu   t-dw |\}}
|
d urt| jjdkr|t| jjd krt.|
|
q(|jtj/tj0fv rzt%j&| 1|||| jjd j!dI d H }W n t%j,y   t-dw |\}}
|
d urt| jjdkr|t| jjd krt.|
|
q(|jtj2tj3fv rFzt%j&| j4|||| j5d| jjd j!dI d H }W n t%j,y   t-dw |\}| _5}
|
d urDt| jjdkrB|t| jjd krBt.|
|
q(|jtjtjtjtjtj"tjtjfv re|dkrct-dq(t-d|j W  n t6yx   Y q    ||fW S  t-y } zt d|  |d ur|   d }~ww )Nz![handle_client] Client connected!rG   zStart chaining...   r   )WSNETNetwork)WSNETNetworkTest)WSNetworkDirect)WSNETNetworkWS)sslrD   zConnected to socks server!z"Failed to connect to SOCKS server!z&Proxy Connection establishment timeout)r?   z1WSNET only supported as the first proxy in chain!zUnknown SOCKS version! "%s"z[handle_client] Exception: %s)7r   rJ   lenr   proxiesrangecloser!   r"   get_ip_or_hostnamerK   r%   rL   r   r   CLIENT_WSNETasysocks.network.wsnetr   open_connectionwsnet_reuseCLIENT_WSNETTESTr   CLIENT_WSNETDIRECTCLIENT_SSL_WSNETDIRECTasysocks.network.wsnetdirectr   rh   ri   CLIENT_WSNETWSCLIENT_SSL_WSNETWSasysocks.network.wsnetwsr   agentidrC   CLIENT_CUSTOMcustomproxyfactoryconnectr<   rO   ssl_ctx	enumerateCLIENT_SOCKS4CLIENT_SSL_SOCKS4rg   TimeoutErrorrT   r4   CLIENT_SOCKS5_TCPCLIENT_SSL_SOCKS5_TCPr   CLIENT_HTTPCLIENT_SSL_HTTPrI   r?   r   )r   rB   rA   ra   r@   r   r   r   r   proxyconnectionr_   ixrd   r   r   r   create_link   s  


	



,
(,
(2
((


zUniClient.create_linkc                    s  t dD ]}z)dtddf}tjtj| j | jj|d| jj	dI d H \}}||d fW   S  t
yI } zd d |fW  Y d }~  S d }~w tyl } z|jdkr[W Y d }~qd d |fW  Y d }~  S d }~w ty } zd d |fW  Y d }~  S d }~ww d d tdfS )N
   z0.0.0.0i  )
local_addrrD   b   z#Failed to connect after 10 attempts)r   randomrandintr<   rO   r   r   r   r%   rC   PermissionErrorOSErrorerrnorT   )r   attemptr   readerwriterrd   r   r   r   open_privileged_connection  s&   2
z$UniClient.open_privileged_connectionc                    s"  t | j}| jjtjkrot| jjdkrBt| jjdkr"t	d| jjd }|jt
jkr2t	dddlm} || jI d H S ddlm m} t }|| j fdd}|j|| j | j d	I d H \}}S t| jjdkrtj|  | jjd
I d H \}}| jjtjkr| j }	t|	|}tj|||| jjd
I d H  nb| jjtjtjfvrt	d| jj | jjdu r|  I d H \}}}
|
d ur|
ntjt | j! | jj"| jjd
I d H \}}| jjtjkr| j }	t|	|}tj|||| jjd
I d H  t#|||S )Nr   rG   z%Proxy chaining not supported for UDP!z#Only WSNET proxy supported for UDP!)create_udp_client)DatagramEndpointProtocolEndpointc                      s    S r   r   r   r   endpointr   r   <lambda>  s    z#UniClient.connect.<locals>.<lambda>)r   remote_addrrD   zUnsupported protocol "%s"T)$r!   r"   r,   r   r   r   
CLIENT_UDPr   r   rT   r   r   r   r   "asysocks.unicomm.common.connectionr   r   r<   get_event_loopcreate_datagram_endpointget_sockaddrget_peeraddrrO   r   rC   CLIENT_SSL_TCPget_ssl_contextr   do_handshake
CLIENT_TCPuse_privileged_source_portr   r   r   r%   r   )r   r,   r@   r   r   loopprotocol_factoryr   r   r   r_   r   r   r   r     sT   
 

 .

 zUniClient.connect)NNr   )r/   r0   r1   r   r   r    r   r<   StreamReaderStreamWriterr3   r2   rI   rg   r   r   r   r   r   r   r   r   r-   1   s    $ < l r-   c                     s   dd l } t| j t }d|_d|_tj|_	d|_
d |_t }t||}| I d H }|dI d H  | 2 z
3 d H W }t| q96 d S )Nr   z
google.comi  r   s$   GET / HTTP/1.1
Host: google.com

)loggingr   setLevelDEBUGr   r)   r%   r   r   r   rC   r   r   r-   r   rN   r~   print)r   r   r,   client
connectiondatar   r   r   amain  s    

r   c                   C   s   t t  d S r   )r<   runr   r   r   r   r   main  s   r   __main__)-r<   r!   r   rY   r&   asysocks.unicomm.protocol.httpr   r   r   !asysocks.unicomm.protocol.socks4ar   r   r    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   'asysocks.unicomm.common.packetizers.sslr   r   r   asysocks.unicommr   r   rT   r4   r-   r   r   r/   r   r   r   r   <module>   s2    0   /
