a
    h"                     @   s   d dl Z d dlZd dlZddlmZ dZdZd Zedd d d dZ	dZ
dZd ZG d	d
 d
ZG dd deZG dd dZG dd dZG dd deZG dd deZG dd deZG dd deZG dd dZe ddZG dd dejZdS )    N   )
compat_ordz"Timo Schmid <coding@timoschmid.de>   z!BBBB      c                   @   s   e Zd ZdZdZdS )Socks4Commandr      N)__name__
__module____qualname__CMD_CONNECTZCMD_BIND r   r   A/mnt/pikpak/tmp/myenv/lib/python3.9/site-packages/yt_dlp/socks.pyr      s   r   c                   @   s   e Zd ZdZdS )Socks5Command   N)r	   r
   r   ZCMD_UDP_ASSOCIATEr   r   r   r   r   #   s   r   c                   @   s   e Zd ZdZdZdZdZdS )
Socks5Authr   r   r   r   N)r	   r
   r   	AUTH_NONEZAUTH_GSSAPIAUTH_USER_PASSAUTH_NO_ACCEPTABLEr   r   r   r   r   '   s   r   c                   @   s   e Zd ZdZdZdZdS )Socks5AddressTyper   r   r   N)r	   r
   r   	ATYP_IPV4ATYP_DOMAINNAME	ATYP_IPV6r   r   r   r   r   .   s   r   c                       s"   e Zd ZdZd fdd	Z  ZS )
ProxyErrorr   Nc                    s2   |d ur |d u r | j |pd}t || d S )Nzunknown error)CODESgetsuper__init__)selfcodemsg	__class__r   r   r   7   s    zProxyError.__init__)NN)r	   r
   r   ERR_SUCCESSr   __classcell__r   r   r!   r   r   4   s   r   c                       s   e Zd Z fddZ  ZS )InvalidVersionErrorc                    s&   d|dd|d}t  d| d S )Nz/Invalid response version from server. Expected Z02xz got r   )r   r   )r   expected_versiongot_versionr    r!   r   r   r   >   s    
zInvalidVersionError.__init__)r	   r
   r   r   r$   r   r   r!   r   r%   =   s   r%   c                   @   s   e Zd ZdZddddZdS )Socks4ErrorZ   zrequest rejected or failedzLrequest rejected because SOCKS server cannot connect to identd on the clientzPrequest rejected because the client program and identd report different user-ids)[   \   ]   N)r	   r
   r   r#   r   r   r   r   r   r(   D   s
   r(   c                   @   s*   e Zd ZdZdddddddd	d
dd
ZdS )Socks5Errorr   zgeneral SOCKS server failurez!connection not allowed by rulesetzNetwork unreachablezHost unreachablezConnection refusedzTTL expiredzCommand not supportedzAddress type not supportedz$unknown username or invalid passwordz0all offered authentication methods were rejected)
r   r   r   r   r               r   N)r	   r
   r   ERR_GENERAL_FAILUREr   r   r   r   r   r-   N   s   r-   c                   @   s   e Zd ZdZdZdZdS )	ProxyTyper   r   r   N)r	   r
   r   SOCKS4SOCKS4ASOCKS5r   r   r   r   r3   _   s   r3   Proxy)typehostportusernamepassword
remote_dnsc                       s   e Zd Z fddZd ddZdd Zd	d
 Zedd Zdd Z	d!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  ZS )#sockssocketc                    s   d | _ t j|i | d S N)_proxyr   r   )r   argskwargsr!   r   r   r   j   s    zsockssocket.__init__TNc                 C   s0   |t jt jt jfv sJ t||||||| _d S r?   )r3   r4   r5   r6   r7   r@   )r   Z	proxytypeaddrr:   Zrdnsr;   r<   r   r   r   setproxyn   s    zsockssocket.setproxyc                 C   sJ   d}t ||k rF| |t | }|s<t|t |  d||7 }q|S )N    z bytes missing)lenrecvEOFError)r   cntdatacurr   r   r   recvalls   s    
zsockssocket.recvallc                 C   s   |  |}td| d|S )N!B)rL   structunpack)r   rI   rJ   r   r   r   _recv_bytes|   s    
zsockssocket._recv_bytesc                 C   s   t dt| |  S )N!B)rO   packrF   )rJ   r   r   r   _len_and_data   s    zsockssocket._len_and_datac                 C   s   ||kr|    t||d S r?   )closer%   )r   r&   r'   r   r   r   _check_response_version   s    z#sockssocket._check_response_versionc           	   	   C   s   |r
|fn
t jt jfD ]2}z|t ||fW   S  tyF   Y qY q0 q|r^| jjr^d|fS t j|d |pldd}|d \}}}}}|t ||d fS d S )Nr   )family)socketAF_INETAF_INET6	inet_ptonOSErrorr@   r=   getaddrinfo)	r   destaddrdefaultuse_remote_dnsrW   fres_ipaddrr   r   r   _resolve_address   s    zsockssocket._resolve_addressFc                 C   s   |\}}| j |t|tjd\}}tdttj|| }| j	j
p@d }||d 7 }|rv| j	jrv|tkrv|| d 7 }| | td| d\}	}
}}| t|	 |
tjkr|   t|
||fS )N)r`   rW   z!BBH     z!BBHIr0   )re   SOCKS4_DEFAULT_DSTIPrX   rY   rO   rS   SOCKS4_VERSIONr   r   r@   r;   encoder=   sendallrP   rL   rV   SOCKS4_REPLY_VERSIONr(   r#   rU   )r   addressis_4ar^   r:   rc   rd   packetr;   versionZ	resp_codeZdstportZdsthostr   r   r   _setup_socks4   s    

zsockssocket._setup_socks4c                 C   s   | j |dd d S )NT)rn   )rq   r   rm   r   r   r   _setup_socks4a   s    zsockssocket._setup_socks4ac                 C   sL  t dt}tjg}| jjr0| jjr0|tj	 |t dt
|7 }|t jdt
| dg|R  7 }| | | d\}}| t| |tjks|tj	kr| jjr| jjs|   ttj|tj	krH| jj }| jj }t dt}|| || | 7 }| | | d\}}| t| |tkrH|   ttjd S )NrR   rM   rN   r   )rO   rS   SOCKS5_VERSIONr   r   r@   r;   r<   appendr   rF   rk   rQ   rV   r   rU   r-   rj   SOCKS5_USER_AUTH_VERSIONrT   SOCKS5_USER_AUTH_SUCCESSr2   )r   ro   Zauth_methodsrp   methodr;   r<   statusr   r   r   _socks5_auth   s:    "




zsockssocket._socks5_authc                 C   st  |\}}| j |d dd\}}|   d}tdttj|}|d u rl| }|tdtj	7 }|| 
|7 }nB|tjkr|tdtj| 7 }n |tjkr|tdtj| 7 }|td|7 }| | | d\}}	}}
| t| |	tjkr|   t|	|
tjkr| d}n<|
tj	kr@t| d}| |}n|
tjkrV| d	}td| d
d }||fS )NT)r`   r   z!BBBrR   z!Hr   r      r   )re   rz   rO   rS   rt   r   r   rj   r   r   rT   rX   rY   r   rZ   r   rk   rQ   rV   r-   r#   rU   rL   r   rG   rP   )r   rm   r^   r:   rW   rd   reservedro   rp   ry   atypealenZdestportr   r   r   _setup_socks5   s:    



zsockssocket._setup_socks5c                 C   sj   | j s|| |S || | j j| j jf}|dkr:|d ur:|S tj| jtj| jtj| j	i}|| j j
 | |S )Nr   )r@   r9   r:   r3   r4   rq   r5   rs   r6   r   r8   )r   Zconnect_funcrm   resultZsetup_funcsr   r   r   _make_proxy   s    
zsockssocket._make_proxyc                 C   s   |  tjj| d S r?   )r   rX   connectrr   r   r   r   r     s    zsockssocket.connectc                 C   s   |  tjj|S r?   )r   rX   
connect_exrr   r   r   r   r     s    zsockssocket.connect_ex)TNN)N)F)r	   r
   r   r   rD   rL   rQ   staticmethodrT   rV   re   rq   rs   rz   r   r   r   r   r$   r   r   r!   r   r>   i   s   
	


$(r>   )collectionsrX   rO   compatr   
__author__ri   rl   rS   rh   rt   rv   rw   r   r   r   r   r\   r   r%   r(   r-   r3   
namedtupler7   r>   r   r   r   r   <module>	   s*   	
