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r�e+ƒ  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 )ÚProxyChainErrorúPSomething 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  �zìt  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r’t  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rèt 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råt  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r°tƒ ‚t |
¡}	|	jtjkr¾tƒ ‚n|	jtj krËtd	| ƒ‚t d
||f ¡ |j!du rÜW 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*| ¡  zìt | 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 r¤dd	lm} | |j|j|j|j
|j|j¡I d H \}}nq|jtjtjfv rÑd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 �r›zt%j&|  +|||¡| jjd j!d�I d H }W n t%j,�yu   t-dƒ‚w |\}}
|
d u�r™t| jjƒdk�r—|t| jjƒd k�r—t.|
ƒ‚|
‚�q(|jtj/tj0fv �rîzt%j&|  1|||¡| jjd j!d�I d H }W n t%j,�yÈ   t-dƒ‚w |\}}
|
d u�rìt| jjƒdk�rê|t| jjƒd k�rêt.|
ƒ‚|
‚�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r©t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r»t	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   /
ÿ